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