xref: /aosp_15_r20/frameworks/wilhelm/src/itf/IVolume.cpp (revision bebae9c0e76121f8312ccb50385c080b3a0b023c)
1*bebae9c0SAndroid Build Coastguard Worker /*
2*bebae9c0SAndroid Build Coastguard Worker  * Copyright (C) 2010 The Android Open Source Project
3*bebae9c0SAndroid Build Coastguard Worker  *
4*bebae9c0SAndroid Build Coastguard Worker  * Licensed under the Apache License, Version 2.0 (the "License");
5*bebae9c0SAndroid Build Coastguard Worker  * you may not use this file except in compliance with the License.
6*bebae9c0SAndroid Build Coastguard Worker  * You may obtain a copy of the License at
7*bebae9c0SAndroid Build Coastguard Worker  *
8*bebae9c0SAndroid Build Coastguard Worker  *      http://www.apache.org/licenses/LICENSE-2.0
9*bebae9c0SAndroid Build Coastguard Worker  *
10*bebae9c0SAndroid Build Coastguard Worker  * Unless required by applicable law or agreed to in writing, software
11*bebae9c0SAndroid Build Coastguard Worker  * distributed under the License is distributed on an "AS IS" BASIS,
12*bebae9c0SAndroid Build Coastguard Worker  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13*bebae9c0SAndroid Build Coastguard Worker  * See the License for the specific language governing permissions and
14*bebae9c0SAndroid Build Coastguard Worker  * limitations under the License.
15*bebae9c0SAndroid Build Coastguard Worker  */
16*bebae9c0SAndroid Build Coastguard Worker 
17*bebae9c0SAndroid Build Coastguard Worker /* Volume implementation */
18*bebae9c0SAndroid Build Coastguard Worker 
19*bebae9c0SAndroid Build Coastguard Worker #include "sles_allinclusive.h"
20*bebae9c0SAndroid Build Coastguard Worker 
21*bebae9c0SAndroid Build Coastguard Worker 
IVolume_SetVolumeLevel(SLVolumeItf self,SLmillibel level_)22*bebae9c0SAndroid Build Coastguard Worker static SLresult IVolume_SetVolumeLevel(SLVolumeItf self, SLmillibel level_)
23*bebae9c0SAndroid Build Coastguard Worker {
24*bebae9c0SAndroid Build Coastguard Worker     SL_ENTER_INTERFACE
25*bebae9c0SAndroid Build Coastguard Worker 
26*bebae9c0SAndroid Build Coastguard Worker     int level = level_;
27*bebae9c0SAndroid Build Coastguard Worker     if (!((SL_MILLIBEL_MIN <= level) && (level <= PLATFORM_MILLIBEL_MAX_VOLUME))) {
28*bebae9c0SAndroid Build Coastguard Worker         result = SL_RESULT_PARAMETER_INVALID;
29*bebae9c0SAndroid Build Coastguard Worker     } else {
30*bebae9c0SAndroid Build Coastguard Worker         IVolume *thiz = (IVolume *) self;
31*bebae9c0SAndroid Build Coastguard Worker         interface_lock_exclusive(thiz);
32*bebae9c0SAndroid Build Coastguard Worker         SLmillibel oldLevel = thiz->mLevel;
33*bebae9c0SAndroid Build Coastguard Worker         if (oldLevel != level) {
34*bebae9c0SAndroid Build Coastguard Worker             thiz->mLevel = level;
35*bebae9c0SAndroid Build Coastguard Worker             interface_unlock_exclusive_attributes(thiz, ATTR_GAIN);
36*bebae9c0SAndroid Build Coastguard Worker         } else {
37*bebae9c0SAndroid Build Coastguard Worker             interface_unlock_exclusive(thiz);
38*bebae9c0SAndroid Build Coastguard Worker         }
39*bebae9c0SAndroid Build Coastguard Worker         result = SL_RESULT_SUCCESS;
40*bebae9c0SAndroid Build Coastguard Worker     }
41*bebae9c0SAndroid Build Coastguard Worker 
42*bebae9c0SAndroid Build Coastguard Worker     SL_LEAVE_INTERFACE
43*bebae9c0SAndroid Build Coastguard Worker }
44*bebae9c0SAndroid Build Coastguard Worker 
45*bebae9c0SAndroid Build Coastguard Worker 
IVolume_GetVolumeLevel(SLVolumeItf self,SLmillibel * pLevel)46*bebae9c0SAndroid Build Coastguard Worker static SLresult IVolume_GetVolumeLevel(SLVolumeItf self, SLmillibel *pLevel)
47*bebae9c0SAndroid Build Coastguard Worker {
48*bebae9c0SAndroid Build Coastguard Worker     SL_ENTER_INTERFACE
49*bebae9c0SAndroid Build Coastguard Worker 
50*bebae9c0SAndroid Build Coastguard Worker     if (NULL == pLevel) {
51*bebae9c0SAndroid Build Coastguard Worker         result = SL_RESULT_PARAMETER_INVALID;
52*bebae9c0SAndroid Build Coastguard Worker     } else {
53*bebae9c0SAndroid Build Coastguard Worker         IVolume *thiz = (IVolume *) self;
54*bebae9c0SAndroid Build Coastguard Worker         interface_lock_shared(thiz);
55*bebae9c0SAndroid Build Coastguard Worker         SLmillibel level = thiz->mLevel;
56*bebae9c0SAndroid Build Coastguard Worker         interface_unlock_shared(thiz);
57*bebae9c0SAndroid Build Coastguard Worker         *pLevel = level;
58*bebae9c0SAndroid Build Coastguard Worker         result = SL_RESULT_SUCCESS;
59*bebae9c0SAndroid Build Coastguard Worker     }
60*bebae9c0SAndroid Build Coastguard Worker 
61*bebae9c0SAndroid Build Coastguard Worker     SL_LEAVE_INTERFACE
62*bebae9c0SAndroid Build Coastguard Worker }
63*bebae9c0SAndroid Build Coastguard Worker 
64*bebae9c0SAndroid Build Coastguard Worker 
IVolume_GetMaxVolumeLevel(SLVolumeItf self,SLmillibel * pMaxLevel)65*bebae9c0SAndroid Build Coastguard Worker static SLresult IVolume_GetMaxVolumeLevel(SLVolumeItf self, SLmillibel *pMaxLevel)
66*bebae9c0SAndroid Build Coastguard Worker {
67*bebae9c0SAndroid Build Coastguard Worker     SL_ENTER_INTERFACE
68*bebae9c0SAndroid Build Coastguard Worker 
69*bebae9c0SAndroid Build Coastguard Worker     if (NULL == pMaxLevel) {
70*bebae9c0SAndroid Build Coastguard Worker         result = SL_RESULT_PARAMETER_INVALID;
71*bebae9c0SAndroid Build Coastguard Worker     } else {
72*bebae9c0SAndroid Build Coastguard Worker         *pMaxLevel = PLATFORM_MILLIBEL_MAX_VOLUME;
73*bebae9c0SAndroid Build Coastguard Worker         result = SL_RESULT_SUCCESS;
74*bebae9c0SAndroid Build Coastguard Worker     }
75*bebae9c0SAndroid Build Coastguard Worker 
76*bebae9c0SAndroid Build Coastguard Worker     SL_LEAVE_INTERFACE
77*bebae9c0SAndroid Build Coastguard Worker }
78*bebae9c0SAndroid Build Coastguard Worker 
79*bebae9c0SAndroid Build Coastguard Worker 
IVolume_SetMute(SLVolumeItf self,SLboolean mute)80*bebae9c0SAndroid Build Coastguard Worker static SLresult IVolume_SetMute(SLVolumeItf self, SLboolean mute)
81*bebae9c0SAndroid Build Coastguard Worker {
82*bebae9c0SAndroid Build Coastguard Worker     SL_ENTER_INTERFACE
83*bebae9c0SAndroid Build Coastguard Worker 
84*bebae9c0SAndroid Build Coastguard Worker     IVolume *thiz = (IVolume *) self;
85*bebae9c0SAndroid Build Coastguard Worker     mute = SL_BOOLEAN_FALSE != mute; // normalize
86*bebae9c0SAndroid Build Coastguard Worker     interface_lock_exclusive(thiz);
87*bebae9c0SAndroid Build Coastguard Worker     SLboolean oldMute = thiz->mMute;
88*bebae9c0SAndroid Build Coastguard Worker     if (oldMute != mute) {
89*bebae9c0SAndroid Build Coastguard Worker         thiz->mMute = (SLuint8) mute;
90*bebae9c0SAndroid Build Coastguard Worker         interface_unlock_exclusive_attributes(thiz, ATTR_GAIN);
91*bebae9c0SAndroid Build Coastguard Worker     } else {
92*bebae9c0SAndroid Build Coastguard Worker         interface_unlock_exclusive(thiz);
93*bebae9c0SAndroid Build Coastguard Worker     }
94*bebae9c0SAndroid Build Coastguard Worker     result = SL_RESULT_SUCCESS;
95*bebae9c0SAndroid Build Coastguard Worker 
96*bebae9c0SAndroid Build Coastguard Worker     SL_LEAVE_INTERFACE
97*bebae9c0SAndroid Build Coastguard Worker }
98*bebae9c0SAndroid Build Coastguard Worker 
99*bebae9c0SAndroid Build Coastguard Worker 
IVolume_GetMute(SLVolumeItf self,SLboolean * pMute)100*bebae9c0SAndroid Build Coastguard Worker static SLresult IVolume_GetMute(SLVolumeItf self, SLboolean *pMute)
101*bebae9c0SAndroid Build Coastguard Worker {
102*bebae9c0SAndroid Build Coastguard Worker     SL_ENTER_INTERFACE
103*bebae9c0SAndroid Build Coastguard Worker 
104*bebae9c0SAndroid Build Coastguard Worker     if (NULL == pMute) {
105*bebae9c0SAndroid Build Coastguard Worker         result = SL_RESULT_PARAMETER_INVALID;
106*bebae9c0SAndroid Build Coastguard Worker     } else {
107*bebae9c0SAndroid Build Coastguard Worker         IVolume *thiz = (IVolume *) self;
108*bebae9c0SAndroid Build Coastguard Worker         interface_lock_shared(thiz);
109*bebae9c0SAndroid Build Coastguard Worker         SLboolean mute = thiz->mMute;
110*bebae9c0SAndroid Build Coastguard Worker         interface_unlock_shared(thiz);
111*bebae9c0SAndroid Build Coastguard Worker         *pMute = mute;
112*bebae9c0SAndroid Build Coastguard Worker         result = SL_RESULT_SUCCESS;
113*bebae9c0SAndroid Build Coastguard Worker     }
114*bebae9c0SAndroid Build Coastguard Worker 
115*bebae9c0SAndroid Build Coastguard Worker     SL_LEAVE_INTERFACE
116*bebae9c0SAndroid Build Coastguard Worker }
117*bebae9c0SAndroid Build Coastguard Worker 
118*bebae9c0SAndroid Build Coastguard Worker 
IVolume_EnableStereoPosition(SLVolumeItf self,SLboolean enable)119*bebae9c0SAndroid Build Coastguard Worker static SLresult IVolume_EnableStereoPosition(SLVolumeItf self, SLboolean enable)
120*bebae9c0SAndroid Build Coastguard Worker {
121*bebae9c0SAndroid Build Coastguard Worker     SL_ENTER_INTERFACE
122*bebae9c0SAndroid Build Coastguard Worker 
123*bebae9c0SAndroid Build Coastguard Worker     IVolume *thiz = (IVolume *) self;
124*bebae9c0SAndroid Build Coastguard Worker     enable = SL_BOOLEAN_FALSE != enable; // normalize
125*bebae9c0SAndroid Build Coastguard Worker     interface_lock_exclusive(thiz);
126*bebae9c0SAndroid Build Coastguard Worker     SLboolean oldEnable = thiz->mEnableStereoPosition;
127*bebae9c0SAndroid Build Coastguard Worker     if (oldEnable != enable) {
128*bebae9c0SAndroid Build Coastguard Worker         thiz->mEnableStereoPosition = (SLuint8) enable;
129*bebae9c0SAndroid Build Coastguard Worker         interface_unlock_exclusive_attributes(thiz, ATTR_GAIN);
130*bebae9c0SAndroid Build Coastguard Worker     } else {
131*bebae9c0SAndroid Build Coastguard Worker         interface_unlock_exclusive(thiz);
132*bebae9c0SAndroid Build Coastguard Worker     }
133*bebae9c0SAndroid Build Coastguard Worker     result = SL_RESULT_SUCCESS;
134*bebae9c0SAndroid Build Coastguard Worker 
135*bebae9c0SAndroid Build Coastguard Worker     SL_LEAVE_INTERFACE
136*bebae9c0SAndroid Build Coastguard Worker }
137*bebae9c0SAndroid Build Coastguard Worker 
138*bebae9c0SAndroid Build Coastguard Worker 
IVolume_IsEnabledStereoPosition(SLVolumeItf self,SLboolean * pEnable)139*bebae9c0SAndroid Build Coastguard Worker static SLresult IVolume_IsEnabledStereoPosition(SLVolumeItf self, SLboolean *pEnable)
140*bebae9c0SAndroid Build Coastguard Worker {
141*bebae9c0SAndroid Build Coastguard Worker     SL_ENTER_INTERFACE
142*bebae9c0SAndroid Build Coastguard Worker 
143*bebae9c0SAndroid Build Coastguard Worker     if (NULL == pEnable) {
144*bebae9c0SAndroid Build Coastguard Worker         result = SL_RESULT_PARAMETER_INVALID;
145*bebae9c0SAndroid Build Coastguard Worker     } else {
146*bebae9c0SAndroid Build Coastguard Worker         IVolume *thiz = (IVolume *) self;
147*bebae9c0SAndroid Build Coastguard Worker         interface_lock_shared(thiz);
148*bebae9c0SAndroid Build Coastguard Worker         SLboolean enable = thiz->mEnableStereoPosition;
149*bebae9c0SAndroid Build Coastguard Worker         interface_unlock_shared(thiz);
150*bebae9c0SAndroid Build Coastguard Worker         *pEnable = enable;
151*bebae9c0SAndroid Build Coastguard Worker         result = SL_RESULT_SUCCESS;
152*bebae9c0SAndroid Build Coastguard Worker     }
153*bebae9c0SAndroid Build Coastguard Worker 
154*bebae9c0SAndroid Build Coastguard Worker     SL_LEAVE_INTERFACE
155*bebae9c0SAndroid Build Coastguard Worker }
156*bebae9c0SAndroid Build Coastguard Worker 
157*bebae9c0SAndroid Build Coastguard Worker 
IVolume_SetStereoPosition(SLVolumeItf self,SLpermille stereoPosition)158*bebae9c0SAndroid Build Coastguard Worker static SLresult IVolume_SetStereoPosition(SLVolumeItf self, SLpermille stereoPosition)
159*bebae9c0SAndroid Build Coastguard Worker {
160*bebae9c0SAndroid Build Coastguard Worker     SL_ENTER_INTERFACE
161*bebae9c0SAndroid Build Coastguard Worker 
162*bebae9c0SAndroid Build Coastguard Worker     if (!((-1000 <= stereoPosition) && (1000 >= stereoPosition))) {
163*bebae9c0SAndroid Build Coastguard Worker         result = SL_RESULT_PARAMETER_INVALID;
164*bebae9c0SAndroid Build Coastguard Worker     } else {
165*bebae9c0SAndroid Build Coastguard Worker         IVolume *thiz = (IVolume *) self;
166*bebae9c0SAndroid Build Coastguard Worker         interface_lock_exclusive(thiz);
167*bebae9c0SAndroid Build Coastguard Worker         SLpermille oldStereoPosition = thiz->mStereoPosition;
168*bebae9c0SAndroid Build Coastguard Worker         if (oldStereoPosition != stereoPosition) {
169*bebae9c0SAndroid Build Coastguard Worker             thiz->mStereoPosition = stereoPosition;
170*bebae9c0SAndroid Build Coastguard Worker             interface_unlock_exclusive_attributes(thiz, ATTR_GAIN);
171*bebae9c0SAndroid Build Coastguard Worker         } else {
172*bebae9c0SAndroid Build Coastguard Worker             interface_unlock_exclusive(thiz);
173*bebae9c0SAndroid Build Coastguard Worker         }
174*bebae9c0SAndroid Build Coastguard Worker         result = SL_RESULT_SUCCESS;
175*bebae9c0SAndroid Build Coastguard Worker     }
176*bebae9c0SAndroid Build Coastguard Worker 
177*bebae9c0SAndroid Build Coastguard Worker     SL_LEAVE_INTERFACE
178*bebae9c0SAndroid Build Coastguard Worker }
179*bebae9c0SAndroid Build Coastguard Worker 
180*bebae9c0SAndroid Build Coastguard Worker 
IVolume_GetStereoPosition(SLVolumeItf self,SLpermille * pStereoPosition)181*bebae9c0SAndroid Build Coastguard Worker static SLresult IVolume_GetStereoPosition(SLVolumeItf self, SLpermille *pStereoPosition)
182*bebae9c0SAndroid Build Coastguard Worker {
183*bebae9c0SAndroid Build Coastguard Worker     SL_ENTER_INTERFACE
184*bebae9c0SAndroid Build Coastguard Worker 
185*bebae9c0SAndroid Build Coastguard Worker     if (NULL == pStereoPosition) {
186*bebae9c0SAndroid Build Coastguard Worker         result = SL_RESULT_PARAMETER_INVALID;
187*bebae9c0SAndroid Build Coastguard Worker     } else {
188*bebae9c0SAndroid Build Coastguard Worker         IVolume *thiz = (IVolume *) self;
189*bebae9c0SAndroid Build Coastguard Worker         interface_lock_shared(thiz);
190*bebae9c0SAndroid Build Coastguard Worker         SLpermille stereoPosition = thiz->mStereoPosition;
191*bebae9c0SAndroid Build Coastguard Worker         interface_unlock_shared(thiz);
192*bebae9c0SAndroid Build Coastguard Worker         *pStereoPosition = stereoPosition;
193*bebae9c0SAndroid Build Coastguard Worker         result = SL_RESULT_SUCCESS;
194*bebae9c0SAndroid Build Coastguard Worker     }
195*bebae9c0SAndroid Build Coastguard Worker 
196*bebae9c0SAndroid Build Coastguard Worker     SL_LEAVE_INTERFACE
197*bebae9c0SAndroid Build Coastguard Worker }
198*bebae9c0SAndroid Build Coastguard Worker 
199*bebae9c0SAndroid Build Coastguard Worker 
200*bebae9c0SAndroid Build Coastguard Worker static const struct SLVolumeItf_ IVolume_Itf = {
201*bebae9c0SAndroid Build Coastguard Worker     IVolume_SetVolumeLevel,
202*bebae9c0SAndroid Build Coastguard Worker     IVolume_GetVolumeLevel,
203*bebae9c0SAndroid Build Coastguard Worker     IVolume_GetMaxVolumeLevel,
204*bebae9c0SAndroid Build Coastguard Worker     IVolume_SetMute,
205*bebae9c0SAndroid Build Coastguard Worker     IVolume_GetMute,
206*bebae9c0SAndroid Build Coastguard Worker     IVolume_EnableStereoPosition,
207*bebae9c0SAndroid Build Coastguard Worker     IVolume_IsEnabledStereoPosition,
208*bebae9c0SAndroid Build Coastguard Worker     IVolume_SetStereoPosition,
209*bebae9c0SAndroid Build Coastguard Worker     IVolume_GetStereoPosition
210*bebae9c0SAndroid Build Coastguard Worker };
211*bebae9c0SAndroid Build Coastguard Worker 
IVolume_init(void * self)212*bebae9c0SAndroid Build Coastguard Worker void IVolume_init(void *self)
213*bebae9c0SAndroid Build Coastguard Worker {
214*bebae9c0SAndroid Build Coastguard Worker     IVolume *thiz = (IVolume *) self;
215*bebae9c0SAndroid Build Coastguard Worker     thiz->mItf = &IVolume_Itf;
216*bebae9c0SAndroid Build Coastguard Worker     thiz->mLevel = 0;
217*bebae9c0SAndroid Build Coastguard Worker     thiz->mMute = SL_BOOLEAN_FALSE;
218*bebae9c0SAndroid Build Coastguard Worker     thiz->mEnableStereoPosition = SL_BOOLEAN_FALSE;
219*bebae9c0SAndroid Build Coastguard Worker     thiz->mStereoPosition = 0;
220*bebae9c0SAndroid Build Coastguard Worker }
221