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