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 int level = level_; 27 if (!((SL_MILLIBEL_MIN <= level) && (level <= PLATFORM_MILLIBEL_MAX_VOLUME))) { 28 result = SL_RESULT_PARAMETER_INVALID; 29 } else { 30 IVolume *thiz = (IVolume *) self; 31 interface_lock_exclusive(thiz); 32 SLmillibel oldLevel = thiz->mLevel; 33 if (oldLevel != level) { 34 thiz->mLevel = level; 35 interface_unlock_exclusive_attributes(thiz, ATTR_GAIN); 36 } else { 37 interface_unlock_exclusive(thiz); 38 } 39 result = SL_RESULT_SUCCESS; 40 } 41 42 SL_LEAVE_INTERFACE 43 } 44 45 46 static SLresult IVolume_GetVolumeLevel(SLVolumeItf self, SLmillibel *pLevel) 47 { 48 SL_ENTER_INTERFACE 49 50 if (NULL == pLevel) { 51 result = SL_RESULT_PARAMETER_INVALID; 52 } else { 53 IVolume *thiz = (IVolume *) self; 54 interface_lock_shared(thiz); 55 SLmillibel level = thiz->mLevel; 56 interface_unlock_shared(thiz); 57 *pLevel = level; 58 result = SL_RESULT_SUCCESS; 59 } 60 61 SL_LEAVE_INTERFACE 62 } 63 64 65 static SLresult IVolume_GetMaxVolumeLevel(SLVolumeItf self, SLmillibel *pMaxLevel) 66 { 67 SL_ENTER_INTERFACE 68 69 if (NULL == pMaxLevel) { 70 result = SL_RESULT_PARAMETER_INVALID; 71 } else { 72 *pMaxLevel = PLATFORM_MILLIBEL_MAX_VOLUME; 73 result = SL_RESULT_SUCCESS; 74 } 75 76 SL_LEAVE_INTERFACE 77 } 78 79 80 static SLresult IVolume_SetMute(SLVolumeItf self, SLboolean mute) 81 { 82 SL_ENTER_INTERFACE 83 84 IVolume *thiz = (IVolume *) self; 85 mute = SL_BOOLEAN_FALSE != mute; // normalize 86 interface_lock_exclusive(thiz); 87 SLboolean oldMute = thiz->mMute; 88 if (oldMute != mute) { 89 thiz->mMute = (SLuint8) mute; 90 interface_unlock_exclusive_attributes(thiz, ATTR_GAIN); 91 } else { 92 interface_unlock_exclusive(thiz); 93 } 94 result = SL_RESULT_SUCCESS; 95 96 SL_LEAVE_INTERFACE 97 } 98 99 100 static SLresult IVolume_GetMute(SLVolumeItf self, SLboolean *pMute) 101 { 102 SL_ENTER_INTERFACE 103 104 if (NULL == pMute) { 105 result = SL_RESULT_PARAMETER_INVALID; 106 } else { 107 IVolume *thiz = (IVolume *) self; 108 interface_lock_shared(thiz); 109 SLboolean mute = thiz->mMute; 110 interface_unlock_shared(thiz); 111 *pMute = mute; 112 result = SL_RESULT_SUCCESS; 113 } 114 115 SL_LEAVE_INTERFACE 116 } 117 118 119 static SLresult IVolume_EnableStereoPosition(SLVolumeItf self, SLboolean enable) 120 { 121 SL_ENTER_INTERFACE 122 123 IVolume *thiz = (IVolume *) self; 124 enable = SL_BOOLEAN_FALSE != enable; // normalize 125 interface_lock_exclusive(thiz); 126 SLboolean oldEnable = thiz->mEnableStereoPosition; 127 if (oldEnable != enable) { 128 thiz->mEnableStereoPosition = (SLuint8) enable; 129 interface_unlock_exclusive_attributes(thiz, ATTR_GAIN); 130 } else { 131 interface_unlock_exclusive(thiz); 132 } 133 result = SL_RESULT_SUCCESS; 134 135 SL_LEAVE_INTERFACE 136 } 137 138 139 static SLresult IVolume_IsEnabledStereoPosition(SLVolumeItf self, SLboolean *pEnable) 140 { 141 SL_ENTER_INTERFACE 142 143 if (NULL == pEnable) { 144 result = SL_RESULT_PARAMETER_INVALID; 145 } else { 146 IVolume *thiz = (IVolume *) self; 147 interface_lock_shared(thiz); 148 SLboolean enable = thiz->mEnableStereoPosition; 149 interface_unlock_shared(thiz); 150 *pEnable = enable; 151 result = SL_RESULT_SUCCESS; 152 } 153 154 SL_LEAVE_INTERFACE 155 } 156 157 158 static SLresult IVolume_SetStereoPosition(SLVolumeItf self, SLpermille stereoPosition) 159 { 160 SL_ENTER_INTERFACE 161 162 if (!((-1000 <= stereoPosition) && (1000 >= stereoPosition))) { 163 result = SL_RESULT_PARAMETER_INVALID; 164 } else { 165 IVolume *thiz = (IVolume *) self; 166 interface_lock_exclusive(thiz); 167 SLpermille oldStereoPosition = thiz->mStereoPosition; 168 if (oldStereoPosition != stereoPosition) { 169 thiz->mStereoPosition = stereoPosition; 170 interface_unlock_exclusive_attributes(thiz, ATTR_GAIN); 171 } else { 172 interface_unlock_exclusive(thiz); 173 } 174 result = SL_RESULT_SUCCESS; 175 } 176 177 SL_LEAVE_INTERFACE 178 } 179 180 181 static SLresult IVolume_GetStereoPosition(SLVolumeItf self, SLpermille *pStereoPosition) 182 { 183 SL_ENTER_INTERFACE 184 185 if (NULL == pStereoPosition) { 186 result = SL_RESULT_PARAMETER_INVALID; 187 } else { 188 IVolume *thiz = (IVolume *) self; 189 interface_lock_shared(thiz); 190 SLpermille stereoPosition = thiz->mStereoPosition; 191 interface_unlock_shared(thiz); 192 *pStereoPosition = stereoPosition; 193 result = SL_RESULT_SUCCESS; 194 } 195 196 SL_LEAVE_INTERFACE 197 } 198 199 200 static const struct SLVolumeItf_ IVolume_Itf = { 201 IVolume_SetVolumeLevel, 202 IVolume_GetVolumeLevel, 203 IVolume_GetMaxVolumeLevel, 204 IVolume_SetMute, 205 IVolume_GetMute, 206 IVolume_EnableStereoPosition, 207 IVolume_IsEnabledStereoPosition, 208 IVolume_SetStereoPosition, 209 IVolume_GetStereoPosition 210 }; 211 212 void IVolume_init(void *self) 213 { 214 IVolume *thiz = (IVolume *) self; 215 thiz->mItf = &IVolume_Itf; 216 thiz->mLevel = 0; 217 thiz->mMute = SL_BOOLEAN_FALSE; 218 thiz->mEnableStereoPosition = SL_BOOLEAN_FALSE; 219 thiz->mStereoPosition = 0; 220 } 221