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 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 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 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 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 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 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 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 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 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 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