IVolume.cpp revision 18abcc4b70fab1f84d6fbebac3a8e34480a6c4d3
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 { 29ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten IVolume *this = (IVolume *) self; 30ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten interface_lock_exclusive(this); 31ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten SLmillibel oldLevel = this->mLevel; 32ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten if (oldLevel != level) { 33ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten this->mLevel = level; 34ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten interface_unlock_exclusive_attributes(this, ATTR_GAIN); 35ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten } else 36ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten interface_unlock_exclusive(this); 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 { 51ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten IVolume *this = (IVolume *) self; 52ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten interface_lock_peek(this); 53ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten SLmillibel level = this->mLevel; 54ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten interface_unlock_peek(this); 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 820b167267bda99b68346045ccab14e810121d5de4Glenn Kasten IVolume *this = (IVolume *) self; 83d2a7f0d6883a6d3835642e7b282f05ed1c54fe63Glenn Kasten mute = SL_BOOLEAN_FALSE != mute; // normalize 84cefec35685b74cec33db426e11111ba49a5c2e25Jean-Michel Trivi interface_lock_exclusive(this); 85e5bf0d2c9531a7064eb3ddcafaf93ac1b0974037Glenn Kasten SLboolean oldMute = this->mMute; 86e5bf0d2c9531a7064eb3ddcafaf93ac1b0974037Glenn Kasten if (oldMute != mute) { 8718abcc4b70fab1f84d6fbebac3a8e34480a6c4d3Glenn Kasten this->mMute = (SLuint8) mute; 88e5bf0d2c9531a7064eb3ddcafaf93ac1b0974037Glenn Kasten interface_unlock_exclusive_attributes(this, ATTR_GAIN); 89e5bf0d2c9531a7064eb3ddcafaf93ac1b0974037Glenn Kasten } else 90e5bf0d2c9531a7064eb3ddcafaf93ac1b0974037Glenn Kasten interface_unlock_exclusive(this); 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 { 104ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten IVolume *this = (IVolume *) self; 105ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten interface_lock_peek(this); 106ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten SLboolean mute = this->mMute; 107ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten interface_unlock_peek(this); 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 1200b167267bda99b68346045ccab14e810121d5de4Glenn Kasten IVolume *this = (IVolume *) self; 121d2a7f0d6883a6d3835642e7b282f05ed1c54fe63Glenn Kasten enable = SL_BOOLEAN_FALSE != enable; // normalize 122cefec35685b74cec33db426e11111ba49a5c2e25Jean-Michel Trivi interface_lock_exclusive(this); 123e5bf0d2c9531a7064eb3ddcafaf93ac1b0974037Glenn Kasten SLboolean oldEnable = this->mEnableStereoPosition; 124e5bf0d2c9531a7064eb3ddcafaf93ac1b0974037Glenn Kasten if (oldEnable != enable) { 12518abcc4b70fab1f84d6fbebac3a8e34480a6c4d3Glenn Kasten this->mEnableStereoPosition = (SLuint8) enable; 126e5bf0d2c9531a7064eb3ddcafaf93ac1b0974037Glenn Kasten interface_unlock_exclusive_attributes(this, ATTR_GAIN); 12718abcc4b70fab1f84d6fbebac3a8e34480a6c4d3Glenn Kasten } else { 128e5bf0d2c9531a7064eb3ddcafaf93ac1b0974037Glenn Kasten interface_unlock_exclusive(this); 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 { 143ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten IVolume *this = (IVolume *) self; 144ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten interface_lock_peek(this); 145ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten SLboolean enable = this->mEnableStereoPosition; 146ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten interface_unlock_peek(this); 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 { 162ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten IVolume *this = (IVolume *) self; 163ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten interface_lock_exclusive(this); 164ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten SLpermille oldStereoPosition = this->mStereoPosition; 165ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten if (oldStereoPosition != stereoPosition) { 166ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten this->mStereoPosition = stereoPosition; 167ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten interface_unlock_exclusive_attributes(this, ATTR_GAIN); 168ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten } else 169ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten interface_unlock_exclusive(this); 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 { 184ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten IVolume *this = (IVolume *) self; 185ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten interface_lock_peek(this); 186ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten SLpermille stereoPosition = this->mStereoPosition; 187ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten interface_unlock_peek(this); 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{ 2100b167267bda99b68346045ccab14e810121d5de4Glenn Kasten IVolume *this = (IVolume *) self; 2110b167267bda99b68346045ccab14e810121d5de4Glenn Kasten this->mItf = &IVolume_Itf; 2120b167267bda99b68346045ccab14e810121d5de4Glenn Kasten this->mLevel = 0; 2130b167267bda99b68346045ccab14e810121d5de4Glenn Kasten this->mMute = SL_BOOLEAN_FALSE; 2140b167267bda99b68346045ccab14e810121d5de4Glenn Kasten this->mEnableStereoPosition = SL_BOOLEAN_FALSE; 2150b167267bda99b68346045ccab14e810121d5de4Glenn Kasten this->mStereoPosition = 0; 2160b167267bda99b68346045ccab14e810121d5de4Glenn Kasten} 217