IDeviceVolume.c revision 7a79f519d89eb0e1a5b3f4005484b16d6854d7e2
161ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten/* 261ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten * Copyright (C) 2010 The Android Open Source Project 361ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten * 461ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten * Licensed under the Apache License, Version 2.0 (the "License"); 561ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten * you may not use this file except in compliance with the License. 661ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten * You may obtain a copy of the License at 761ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten * 861ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten * http://www.apache.org/licenses/LICENSE-2.0 961ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten * 1061ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten * Unless required by applicable law or agreed to in writing, software 1161ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten * distributed under the License is distributed on an "AS IS" BASIS, 1261ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 1361ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten * See the License for the specific language governing permissions and 1461ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten * limitations under the License. 1561ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten */ 1661ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten 1761ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten/* DeviceVolume implementation */ 1861ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten 1961ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten#include "sles_allinclusive.h" 2061ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten 21ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten 22d2a7f0d6883a6d3835642e7b282f05ed1c54fe63Glenn Kastenstatic SLresult IDeviceVolume_GetVolumeScale(SLDeviceVolumeItf self, SLuint32 deviceID, 23d2a7f0d6883a6d3835642e7b282f05ed1c54fe63Glenn Kasten SLint32 *pMinValue, SLint32 *pMaxValue, SLboolean *pIsMillibelScale) 2461ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten{ 25ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten SL_ENTER_INTERFACE 26ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten 27d2a7f0d6883a6d3835642e7b282f05ed1c54fe63Glenn Kasten switch (deviceID) { 28d2a7f0d6883a6d3835642e7b282f05ed1c54fe63Glenn Kasten case SL_DEFAULTDEVICEID_AUDIOINPUT: 29d2a7f0d6883a6d3835642e7b282f05ed1c54fe63Glenn Kasten case SL_DEFAULTDEVICEID_AUDIOOUTPUT: 30d2a7f0d6883a6d3835642e7b282f05ed1c54fe63Glenn Kasten case DEVICE_ID_HEADSET: 31d2a7f0d6883a6d3835642e7b282f05ed1c54fe63Glenn Kasten case DEVICE_ID_HANDSFREE: 32ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten if (NULL != pMinValue) 33ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten *pMinValue = 0; 34ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten if (NULL != pMaxValue) 35ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten *pMaxValue = 10; 36ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten if (NULL != pIsMillibelScale) 37ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten *pIsMillibelScale = SL_BOOLEAN_FALSE; 38ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten result = SL_RESULT_SUCCESS; 39d2a7f0d6883a6d3835642e7b282f05ed1c54fe63Glenn Kasten break; 40d2a7f0d6883a6d3835642e7b282f05ed1c54fe63Glenn Kasten default: 41ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten result = SL_RESULT_PARAMETER_INVALID; 42ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten break; 43d2a7f0d6883a6d3835642e7b282f05ed1c54fe63Glenn Kasten } 44ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten 45ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten SL_LEAVE_INTERFACE 4661ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten} 4761ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten 48ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten 49d2a7f0d6883a6d3835642e7b282f05ed1c54fe63Glenn Kastenstatic SLresult IDeviceVolume_SetVolume(SLDeviceVolumeItf self, SLuint32 deviceID, SLint32 volume) 5061ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten{ 51ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten SL_ENTER_INTERFACE 52ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten 5361ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten switch (deviceID) { 547a79f519d89eb0e1a5b3f4005484b16d6854d7e2Glenn Kasten // These are treated same as generic audio output for now 55d2a7f0d6883a6d3835642e7b282f05ed1c54fe63Glenn Kasten case DEVICE_ID_HEADSET: 56d2a7f0d6883a6d3835642e7b282f05ed1c54fe63Glenn Kasten case DEVICE_ID_HANDSFREE: 57a438eb1cf1ae602afab00336528dd230bd929206Glenn Kasten deviceID = SL_DEFAULTDEVICEID_AUDIOOUTPUT; 58ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten // fall through 59ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten case SL_DEFAULTDEVICEID_AUDIOINPUT: 60ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten case SL_DEFAULTDEVICEID_AUDIOOUTPUT: 61ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten { 62ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten IDeviceVolume *this = (IDeviceVolume *) self; 63ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten interface_lock_poke(this); 64ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten this->mVolume[~deviceID] = volume; 65ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten interface_unlock_poke(this); 66ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten result = SL_RESULT_SUCCESS; 67ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten } 68a438eb1cf1ae602afab00336528dd230bd929206Glenn Kasten break; 6961ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten default: 70ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten result = SL_RESULT_PARAMETER_INVALID; 71ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten break; 7261ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten } 73ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten 74ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten SL_LEAVE_INTERFACE 7561ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten} 7661ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten 77ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten 78e5bf0d2c9531a7064eb3ddcafaf93ac1b0974037Glenn Kastenstatic SLresult IDeviceVolume_GetVolume(SLDeviceVolumeItf self, SLuint32 deviceID, SLint32 *pVolume) 7961ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten{ 80ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten SL_ENTER_INTERFACE 81ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten 82ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten if (NULL == pVolume) { 83ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten result = SL_RESULT_PARAMETER_INVALID; 84ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten } else { 85ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten switch (deviceID) { 867a79f519d89eb0e1a5b3f4005484b16d6854d7e2Glenn Kasten // These are treated same as generic audio output for now 87ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten case DEVICE_ID_HEADSET: 88ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten case DEVICE_ID_HANDSFREE: 89ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten deviceID = SL_DEFAULTDEVICEID_AUDIOOUTPUT; 90ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten // fall through 91ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten case SL_DEFAULTDEVICEID_AUDIOINPUT: 92ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten case SL_DEFAULTDEVICEID_AUDIOOUTPUT: 93ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten { 94ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten IDeviceVolume *this = (IDeviceVolume *) self; 95ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten interface_lock_peek(this); 96ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten SLint32 volume = this->mVolume[~deviceID]; 97ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten interface_unlock_peek(this); 98ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten *pVolume = volume; 99ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten result = SL_RESULT_SUCCESS; 100ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten } 101ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten break; 102ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten default: 103ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten result = SL_RESULT_PARAMETER_INVALID; 104ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten break; 105ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten } 10661ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten } 107ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten 108ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten SL_LEAVE_INTERFACE 10961ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten} 11061ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten 111ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten 11261ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kastenstatic const struct SLDeviceVolumeItf_ IDeviceVolume_Itf = { 11361ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten IDeviceVolume_GetVolumeScale, 11461ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten IDeviceVolume_SetVolume, 11561ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten IDeviceVolume_GetVolume 11661ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten}; 11761ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten 11861ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kastenvoid IDeviceVolume_init(void *self) 11961ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten{ 12061ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten IDeviceVolume *this = (IDeviceVolume *) self; 12161ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten this->mItf = &IDeviceVolume_Itf; 1227a79f519d89eb0e1a5b3f4005484b16d6854d7e2Glenn Kasten // hard-coded array size for default in/out 12361ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten this->mVolume[0] = 10; 12461ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten this->mVolume[1] = 10; 12561ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten} 126