IVolume.cpp revision bcc5c7225e3b7a1dbf2e9e830987f69167acf06f
10b167267bda99b68346045ccab14e810121d5de4Glenn Kasten/* 20b167267bda99b68346045ccab14e810121d5de4Glenn Kasten * Copyright (C) 2010 The Android Open Source Project 30b167267bda99b68346045ccab14e810121d5de4Glenn Kasten * 40b167267bda99b68346045ccab14e810121d5de4Glenn Kasten * Licensed under the Apache License, Version 2.0 (the "License"); 50b167267bda99b68346045ccab14e810121d5de4Glenn Kasten * you may not use this file except in compliance with the License. 60b167267bda99b68346045ccab14e810121d5de4Glenn Kasten * You may obtain a copy of the License at 70b167267bda99b68346045ccab14e810121d5de4Glenn Kasten * 80b167267bda99b68346045ccab14e810121d5de4Glenn Kasten * http://www.apache.org/licenses/LICENSE-2.0 90b167267bda99b68346045ccab14e810121d5de4Glenn Kasten * 100b167267bda99b68346045ccab14e810121d5de4Glenn Kasten * Unless required by applicable law or agreed to in writing, software 110b167267bda99b68346045ccab14e810121d5de4Glenn Kasten * distributed under the License is distributed on an "AS IS" BASIS, 120b167267bda99b68346045ccab14e810121d5de4Glenn Kasten * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 130b167267bda99b68346045ccab14e810121d5de4Glenn Kasten * See the License for the specific language governing permissions and 140b167267bda99b68346045ccab14e810121d5de4Glenn Kasten * limitations under the License. 150b167267bda99b68346045ccab14e810121d5de4Glenn Kasten */ 160b167267bda99b68346045ccab14e810121d5de4Glenn Kasten 170b167267bda99b68346045ccab14e810121d5de4Glenn Kasten/* Volume implementation */ 180b167267bda99b68346045ccab14e810121d5de4Glenn Kasten 19979a3f8743646af9999a89dff9e13b972b7efd87Glenn Kasten#include "sles_allinclusive.h" 20979a3f8743646af9999a89dff9e13b972b7efd87Glenn Kasten 21ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten 220b167267bda99b68346045ccab14e810121d5de4Glenn Kastenstatic SLresult IVolume_SetVolumeLevel(SLVolumeItf self, SLmillibel level) 230b167267bda99b68346045ccab14e810121d5de4Glenn Kasten{ 24ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten SL_ENTER_INTERFACE 25ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten 26ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten if (!((SL_MILLIBEL_MIN <= level) && (level <= PLATFORM_MILLIBEL_MAX_VOLUME))) { 27ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten result = SL_RESULT_PARAMETER_INVALID; 28ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten } else { 29bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten IVolume *thiz = (IVolume *) self; 30bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten interface_lock_exclusive(thiz); 31bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten SLmillibel oldLevel = thiz->mLevel; 32ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten if (oldLevel != level) { 33bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten thiz->mLevel = level; 34bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten interface_unlock_exclusive_attributes(thiz, ATTR_GAIN); 35ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten } else 36bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten interface_unlock_exclusive(thiz); 37ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten result = SL_RESULT_SUCCESS; 38ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten } 39ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten 40ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten SL_LEAVE_INTERFACE 410b167267bda99b68346045ccab14e810121d5de4Glenn Kasten} 420b167267bda99b68346045ccab14e810121d5de4Glenn Kasten 43ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten 440b167267bda99b68346045ccab14e810121d5de4Glenn Kastenstatic SLresult IVolume_GetVolumeLevel(SLVolumeItf self, SLmillibel *pLevel) 450b167267bda99b68346045ccab14e810121d5de4Glenn Kasten{ 46ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten SL_ENTER_INTERFACE 47ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten 48ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten if (NULL == pLevel) { 49ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten result = SL_RESULT_PARAMETER_INVALID; 50ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten } else { 51bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten IVolume *thiz = (IVolume *) self; 52bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten interface_lock_peek(thiz); 53bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten SLmillibel level = thiz->mLevel; 54bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten interface_unlock_peek(thiz); 55ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten *pLevel = level; 56ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten result = SL_RESULT_SUCCESS; 57ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten } 58ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten 59ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten SL_LEAVE_INTERFACE 600b167267bda99b68346045ccab14e810121d5de4Glenn Kasten} 610b167267bda99b68346045ccab14e810121d5de4Glenn Kasten 62ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten 63d2a7f0d6883a6d3835642e7b282f05ed1c54fe63Glenn Kastenstatic SLresult IVolume_GetMaxVolumeLevel(SLVolumeItf self, SLmillibel *pMaxLevel) 640b167267bda99b68346045ccab14e810121d5de4Glenn Kasten{ 65ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten SL_ENTER_INTERFACE 66ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten 67ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten if (NULL == pMaxLevel) { 68ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten result = SL_RESULT_PARAMETER_INVALID; 69ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten } else { 70ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten *pMaxLevel = PLATFORM_MILLIBEL_MAX_VOLUME; 71ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten result = SL_RESULT_SUCCESS; 72ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten } 73ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten 74ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten SL_LEAVE_INTERFACE 750b167267bda99b68346045ccab14e810121d5de4Glenn Kasten} 760b167267bda99b68346045ccab14e810121d5de4Glenn Kasten 77ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten 780b167267bda99b68346045ccab14e810121d5de4Glenn Kastenstatic SLresult IVolume_SetMute(SLVolumeItf self, SLboolean mute) 790b167267bda99b68346045ccab14e810121d5de4Glenn Kasten{ 80ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten SL_ENTER_INTERFACE 81ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten 82bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten IVolume *thiz = (IVolume *) self; 83d2a7f0d6883a6d3835642e7b282f05ed1c54fe63Glenn Kasten mute = SL_BOOLEAN_FALSE != mute; // normalize 84bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten interface_lock_exclusive(thiz); 85bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten SLboolean oldMute = thiz->mMute; 86e5bf0d2c9531a7064eb3ddcafaf93ac1b0974037Glenn Kasten if (oldMute != mute) { 87bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten thiz->mMute = (SLuint8) mute; 88bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten interface_unlock_exclusive_attributes(thiz, ATTR_GAIN); 89e5bf0d2c9531a7064eb3ddcafaf93ac1b0974037Glenn Kasten } else 90bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten interface_unlock_exclusive(thiz); 91ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten result = SL_RESULT_SUCCESS; 92ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten 93ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten SL_LEAVE_INTERFACE 940b167267bda99b68346045ccab14e810121d5de4Glenn Kasten} 950b167267bda99b68346045ccab14e810121d5de4Glenn Kasten 96ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten 970b167267bda99b68346045ccab14e810121d5de4Glenn Kastenstatic SLresult IVolume_GetMute(SLVolumeItf self, SLboolean *pMute) 980b167267bda99b68346045ccab14e810121d5de4Glenn Kasten{ 99ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten SL_ENTER_INTERFACE 100ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten 101ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten if (NULL == pMute) { 102ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten result = SL_RESULT_PARAMETER_INVALID; 103ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten } else { 104bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten IVolume *thiz = (IVolume *) self; 105bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten interface_lock_peek(thiz); 106bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten SLboolean mute = thiz->mMute; 107bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten interface_unlock_peek(thiz); 108ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten *pMute = mute; 109ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten result = SL_RESULT_SUCCESS; 110ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten } 111ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten 112ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten SL_LEAVE_INTERFACE 1130b167267bda99b68346045ccab14e810121d5de4Glenn Kasten} 1140b167267bda99b68346045ccab14e810121d5de4Glenn Kasten 115ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten 1160b167267bda99b68346045ccab14e810121d5de4Glenn Kastenstatic SLresult IVolume_EnableStereoPosition(SLVolumeItf self, SLboolean enable) 1170b167267bda99b68346045ccab14e810121d5de4Glenn Kasten{ 118ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten SL_ENTER_INTERFACE 119ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten 120bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten IVolume *thiz = (IVolume *) self; 121d2a7f0d6883a6d3835642e7b282f05ed1c54fe63Glenn Kasten enable = SL_BOOLEAN_FALSE != enable; // normalize 122bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten interface_lock_exclusive(thiz); 123bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten SLboolean oldEnable = thiz->mEnableStereoPosition; 124e5bf0d2c9531a7064eb3ddcafaf93ac1b0974037Glenn Kasten if (oldEnable != enable) { 125bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten thiz->mEnableStereoPosition = (SLuint8) enable; 126bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten interface_unlock_exclusive_attributes(thiz, ATTR_GAIN); 12718abcc4b70fab1f84d6fbebac3a8e34480a6c4d3Glenn Kasten } else { 128bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten interface_unlock_exclusive(thiz); 12918abcc4b70fab1f84d6fbebac3a8e34480a6c4d3Glenn Kasten } 130ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten result = SL_RESULT_SUCCESS; 131ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten 132ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten SL_LEAVE_INTERFACE 1330b167267bda99b68346045ccab14e810121d5de4Glenn Kasten} 1340b167267bda99b68346045ccab14e810121d5de4Glenn Kasten 135ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten 136f8acf4b469cdc9d2fe08fb7f6ca007365efc8bc1Jean-Michel Trivistatic SLresult IVolume_IsEnabledStereoPosition(SLVolumeItf self, SLboolean *pEnable) 1370b167267bda99b68346045ccab14e810121d5de4Glenn Kasten{ 138ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten SL_ENTER_INTERFACE 139ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten 140ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten if (NULL == pEnable) { 141ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten result = SL_RESULT_PARAMETER_INVALID; 142ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten } else { 143bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten IVolume *thiz = (IVolume *) self; 144bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten interface_lock_peek(thiz); 145bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten SLboolean enable = thiz->mEnableStereoPosition; 146bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten interface_unlock_peek(thiz); 147ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten *pEnable = enable; 148ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten result = SL_RESULT_SUCCESS; 149ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten } 150ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten 151ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten SL_LEAVE_INTERFACE 1520b167267bda99b68346045ccab14e810121d5de4Glenn Kasten} 1530b167267bda99b68346045ccab14e810121d5de4Glenn Kasten 154ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten 155f8acf4b469cdc9d2fe08fb7f6ca007365efc8bc1Jean-Michel Trivistatic SLresult IVolume_SetStereoPosition(SLVolumeItf self, SLpermille stereoPosition) 1560b167267bda99b68346045ccab14e810121d5de4Glenn Kasten{ 157ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten SL_ENTER_INTERFACE 158ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten 159ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten if (!((-1000 <= stereoPosition) && (1000 >= stereoPosition))) { 160ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten result = SL_RESULT_PARAMETER_INVALID; 161ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten } else { 162bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten IVolume *thiz = (IVolume *) self; 163bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten interface_lock_exclusive(thiz); 164bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten SLpermille oldStereoPosition = thiz->mStereoPosition; 165ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten if (oldStereoPosition != stereoPosition) { 166bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten thiz->mStereoPosition = stereoPosition; 167bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten interface_unlock_exclusive_attributes(thiz, ATTR_GAIN); 168ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten } else 169bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten interface_unlock_exclusive(thiz); 170ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten result = SL_RESULT_SUCCESS; 171ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten } 172ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten 173ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten SL_LEAVE_INTERFACE 1740b167267bda99b68346045ccab14e810121d5de4Glenn Kasten} 1750b167267bda99b68346045ccab14e810121d5de4Glenn Kasten 176ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten 177d2a7f0d6883a6d3835642e7b282f05ed1c54fe63Glenn Kastenstatic SLresult IVolume_GetStereoPosition(SLVolumeItf self, SLpermille *pStereoPosition) 1780b167267bda99b68346045ccab14e810121d5de4Glenn Kasten{ 179ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten SL_ENTER_INTERFACE 180ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten 181ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten if (NULL == pStereoPosition) { 182ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten result = SL_RESULT_PARAMETER_INVALID; 183ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten } else { 184bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten IVolume *thiz = (IVolume *) self; 185bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten interface_lock_peek(thiz); 186bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten SLpermille stereoPosition = thiz->mStereoPosition; 187bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten interface_unlock_peek(thiz); 188ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten *pStereoPosition = stereoPosition; 189ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten result = SL_RESULT_SUCCESS; 190ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten } 191ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten 192ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten SL_LEAVE_INTERFACE 1930b167267bda99b68346045ccab14e810121d5de4Glenn Kasten} 1940b167267bda99b68346045ccab14e810121d5de4Glenn Kasten 195ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten 1960b167267bda99b68346045ccab14e810121d5de4Glenn Kastenstatic const struct SLVolumeItf_ IVolume_Itf = { 1970b167267bda99b68346045ccab14e810121d5de4Glenn Kasten IVolume_SetVolumeLevel, 1980b167267bda99b68346045ccab14e810121d5de4Glenn Kasten IVolume_GetVolumeLevel, 1990b167267bda99b68346045ccab14e810121d5de4Glenn Kasten IVolume_GetMaxVolumeLevel, 2000b167267bda99b68346045ccab14e810121d5de4Glenn Kasten IVolume_SetMute, 2010b167267bda99b68346045ccab14e810121d5de4Glenn Kasten IVolume_GetMute, 2020b167267bda99b68346045ccab14e810121d5de4Glenn Kasten IVolume_EnableStereoPosition, 2030b167267bda99b68346045ccab14e810121d5de4Glenn Kasten IVolume_IsEnabledStereoPosition, 2040b167267bda99b68346045ccab14e810121d5de4Glenn Kasten IVolume_SetStereoPosition, 2050b167267bda99b68346045ccab14e810121d5de4Glenn Kasten IVolume_GetStereoPosition 2060b167267bda99b68346045ccab14e810121d5de4Glenn Kasten}; 2070b167267bda99b68346045ccab14e810121d5de4Glenn Kasten 2080b167267bda99b68346045ccab14e810121d5de4Glenn Kastenvoid IVolume_init(void *self) 2090b167267bda99b68346045ccab14e810121d5de4Glenn Kasten{ 210bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten IVolume *thiz = (IVolume *) self; 211bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten thiz->mItf = &IVolume_Itf; 212bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten thiz->mLevel = 0; 213bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten thiz->mMute = SL_BOOLEAN_FALSE; 214bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten thiz->mEnableStereoPosition = SL_BOOLEAN_FALSE; 215bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten thiz->mStereoPosition = 0; 2160b167267bda99b68346045ccab14e810121d5de4Glenn Kasten} 217