IDeviceVolume.c revision ed46c29d6a09112dbbf584c82953f63289596fd6
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 // FIXME move these to device-specific or platform-specific file 31d2a7f0d6883a6d3835642e7b282f05ed1c54fe63Glenn Kasten case DEVICE_ID_HEADSET: 32d2a7f0d6883a6d3835642e7b282f05ed1c54fe63Glenn Kasten case DEVICE_ID_HANDSFREE: 33ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten if (NULL != pMinValue) 34ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten *pMinValue = 0; 35ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten if (NULL != pMaxValue) 36ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten *pMaxValue = 10; 37ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten if (NULL != pIsMillibelScale) 38ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten *pIsMillibelScale = SL_BOOLEAN_FALSE; 39ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten result = SL_RESULT_SUCCESS; 40d2a7f0d6883a6d3835642e7b282f05ed1c54fe63Glenn Kasten break; 41d2a7f0d6883a6d3835642e7b282f05ed1c54fe63Glenn Kasten default: 42ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten result = SL_RESULT_PARAMETER_INVALID; 43ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten break; 44d2a7f0d6883a6d3835642e7b282f05ed1c54fe63Glenn Kasten } 45ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten 46ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten SL_LEAVE_INTERFACE 4761ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten} 4861ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten 49ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten 50d2a7f0d6883a6d3835642e7b282f05ed1c54fe63Glenn Kastenstatic SLresult IDeviceVolume_SetVolume(SLDeviceVolumeItf self, SLuint32 deviceID, SLint32 volume) 5161ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten{ 52ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten SL_ENTER_INTERFACE 53ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten 5461ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten switch (deviceID) { 55a438eb1cf1ae602afab00336528dd230bd929206Glenn Kasten // FIXME These are treated same as generic audio output for now 56d2a7f0d6883a6d3835642e7b282f05ed1c54fe63Glenn Kasten case DEVICE_ID_HEADSET: 57d2a7f0d6883a6d3835642e7b282f05ed1c54fe63Glenn Kasten case DEVICE_ID_HANDSFREE: 58a438eb1cf1ae602afab00336528dd230bd929206Glenn Kasten deviceID = SL_DEFAULTDEVICEID_AUDIOOUTPUT; 59ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten // fall through 60ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten case SL_DEFAULTDEVICEID_AUDIOINPUT: 61ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten case SL_DEFAULTDEVICEID_AUDIOOUTPUT: 62ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten { 63ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten IDeviceVolume *this = (IDeviceVolume *) self; 64ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten interface_lock_poke(this); 65ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten this->mVolume[~deviceID] = volume; 66ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten interface_unlock_poke(this); 67ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten result = SL_RESULT_SUCCESS; 68ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten } 69a438eb1cf1ae602afab00336528dd230bd929206Glenn Kasten break; 7061ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten default: 71ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten result = SL_RESULT_PARAMETER_INVALID; 72ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten break; 7361ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten } 74ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten 75ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten SL_LEAVE_INTERFACE 7661ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten} 7761ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten 78ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten 79e5bf0d2c9531a7064eb3ddcafaf93ac1b0974037Glenn Kastenstatic SLresult IDeviceVolume_GetVolume(SLDeviceVolumeItf self, SLuint32 deviceID, SLint32 *pVolume) 8061ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten{ 81ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten SL_ENTER_INTERFACE 82ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten 83ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten if (NULL == pVolume) { 84ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten result = SL_RESULT_PARAMETER_INVALID; 85ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten } else { 86ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten switch (deviceID) { 87ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten // FIXME These are treated same as generic audio output for now 88ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten case DEVICE_ID_HEADSET: 89ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten case DEVICE_ID_HANDSFREE: 90ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten deviceID = SL_DEFAULTDEVICEID_AUDIOOUTPUT; 91ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten // fall through 92ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten case SL_DEFAULTDEVICEID_AUDIOINPUT: 93ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten case SL_DEFAULTDEVICEID_AUDIOOUTPUT: 94ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten { 95ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten IDeviceVolume *this = (IDeviceVolume *) self; 96ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten interface_lock_peek(this); 97ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten SLint32 volume = this->mVolume[~deviceID]; 98ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten interface_unlock_peek(this); 99ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten *pVolume = volume; 100ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten result = SL_RESULT_SUCCESS; 101ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten } 102ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten break; 103ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten default: 104ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten result = SL_RESULT_PARAMETER_INVALID; 105ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten break; 106ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten } 10761ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten } 108ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten 109ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten SL_LEAVE_INTERFACE 11061ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten} 11161ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten 112ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten 11361ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kastenstatic const struct SLDeviceVolumeItf_ IDeviceVolume_Itf = { 11461ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten IDeviceVolume_GetVolumeScale, 11561ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten IDeviceVolume_SetVolume, 11661ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten IDeviceVolume_GetVolume 11761ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten}; 11861ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten 11961ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kastenvoid IDeviceVolume_init(void *self) 12061ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten{ 12161ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten IDeviceVolume *this = (IDeviceVolume *) self; 12261ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten this->mItf = &IDeviceVolume_Itf; 1230b167267bda99b68346045ccab14e810121d5de4Glenn Kasten // FIXME hard-coded array size for default in/out 12461ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten this->mVolume[0] = 10; 12561ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten this->mVolume[1] = 10; 12661ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten} 127