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#include "sles_allinclusive.h" 1861ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten 1961ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten/* AudioIODeviceCapabilities implementation */ 2061ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten 217a79f519d89eb0e1a5b3f4005484b16d6854d7e2Glenn Kasten// NTH make it platform-configurable 227a79f519d89eb0e1a5b3f4005484b16d6854d7e2Glenn Kasten 23ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten 2461ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kastenstatic SLresult IAudioIODeviceCapabilities_GetAvailableAudioInputs( 25d2a7f0d6883a6d3835642e7b282f05ed1c54fe63Glenn Kasten SLAudioIODeviceCapabilitiesItf self, SLint32 *pNumInputs, SLuint32 *pInputDeviceIDs) 2661ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten{ 27ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten SL_ENTER_INTERFACE 28ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten 29ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten if (NULL == pNumInputs) { 30ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten result = SL_RESULT_PARAMETER_INVALID; 31ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten } else { 32ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten result = SL_RESULT_SUCCESS; 33ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten if (NULL != pInputDeviceIDs) { 34ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten if (1 > *pNumInputs) { 35ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten result = SL_RESULT_BUFFER_INSUFFICIENT; 36ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten } else { 37ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten pInputDeviceIDs[0] = SL_DEFAULTDEVICEID_AUDIOINPUT; 38ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten } 39ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten } 40ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten *pNumInputs = 1; 4161ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten } 42ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten 43ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten SL_LEAVE_INTERFACE 4461ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten} 4561ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten 46ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten 4761ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kastenstatic SLresult IAudioIODeviceCapabilities_QueryAudioInputCapabilities( 48d2a7f0d6883a6d3835642e7b282f05ed1c54fe63Glenn Kasten SLAudioIODeviceCapabilitiesItf self, SLuint32 deviceID, SLAudioInputDescriptor *pDescriptor) 4961ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten{ 50ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten SL_ENTER_INTERFACE 51ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten 52ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten if (NULL == pDescriptor) { 53ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten result = SL_RESULT_PARAMETER_INVALID; 54ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten } else { 55ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten result = SL_RESULT_SUCCESS; 56ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten switch (deviceID) { 57ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten case SL_DEFAULTDEVICEID_AUDIOINPUT: 58ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten *pDescriptor = *AudioInput_id_descriptors[0].descriptor; 59ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten break; 60ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten default: 61ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten result = SL_RESULT_IO_ERROR; 62ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten break; 63ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten } 6461ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten } 65ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten 66ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten SL_LEAVE_INTERFACE 6761ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten} 6861ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten 69ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten 70d2a7f0d6883a6d3835642e7b282f05ed1c54fe63Glenn Kastenstatic SLresult IAudioIODeviceCapabilities_RegisterAvailableAudioInputsChangedCallback( 71d2a7f0d6883a6d3835642e7b282f05ed1c54fe63Glenn Kasten SLAudioIODeviceCapabilitiesItf self, slAvailableAudioInputsChangedCallback callback, 72d2a7f0d6883a6d3835642e7b282f05ed1c54fe63Glenn Kasten void *pContext) 7361ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten{ 74ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten SL_ENTER_INTERFACE 75ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten 76f6c0c2346b2ca1ac01c2d68a2cd2a7f1d9ff3427Glenn Kasten IAudioIODeviceCapabilities * thiz = (IAudioIODeviceCapabilities *) self; 77bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten interface_lock_exclusive(thiz); 78bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten thiz->mAvailableAudioInputsChangedCallback = callback; 79bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten thiz->mAvailableAudioInputsChangedContext = pContext; 80bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten interface_unlock_exclusive(thiz); 81ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten result = SL_RESULT_SUCCESS; 82ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten 83ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten SL_LEAVE_INTERFACE 8461ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten} 8561ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten 86ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten 8761ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kastenstatic SLresult IAudioIODeviceCapabilities_GetAvailableAudioOutputs( 88d2a7f0d6883a6d3835642e7b282f05ed1c54fe63Glenn Kasten SLAudioIODeviceCapabilitiesItf self, SLint32 *pNumOutputs, SLuint32 *pOutputDeviceIDs) 8961ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten{ 90ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten SL_ENTER_INTERFACE 91ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten 92ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten if (NULL == pNumOutputs) { 93ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten result = SL_RESULT_PARAMETER_INVALID; 94ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten } else { 95ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten result = SL_RESULT_SUCCESS; 96ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten if (NULL != pOutputDeviceIDs) { 97ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten if (2 > *pNumOutputs) { 98ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten result = SL_RESULT_BUFFER_INSUFFICIENT; 997a79f519d89eb0e1a5b3f4005484b16d6854d7e2Glenn Kasten // if 1 slot available, should still fill that 100ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten } else { 101ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten pOutputDeviceIDs[0] = DEVICE_ID_HEADSET; 102ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten pOutputDeviceIDs[1] = DEVICE_ID_HANDSFREE; 1037a79f519d89eb0e1a5b3f4005484b16d6854d7e2Glenn Kasten // SL_DEFAULTDEVICEID_AUDIOOUTPUT? 104ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten } 105ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten } 106ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten *pNumOutputs = 2; 10761ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten } 108ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten 109ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten SL_LEAVE_INTERFACE 11061ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten} 11161ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten 112ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten 11361ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kastenstatic SLresult IAudioIODeviceCapabilities_QueryAudioOutputCapabilities( 114d2a7f0d6883a6d3835642e7b282f05ed1c54fe63Glenn Kasten SLAudioIODeviceCapabilitiesItf self, SLuint32 deviceID, SLAudioOutputDescriptor *pDescriptor) 11561ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten{ 116ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten SL_ENTER_INTERFACE 117ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten 118ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten if (NULL == pDescriptor) { 119ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten result = SL_RESULT_PARAMETER_INVALID; 120ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten } else { 121ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten result = SL_RESULT_SUCCESS; 122ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten switch (deviceID) { 123ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten case DEVICE_ID_HEADSET: 124ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten *pDescriptor = *AudioOutput_id_descriptors[1].descriptor; 125ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten break; 126ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten case DEVICE_ID_HANDSFREE: 127ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten *pDescriptor = *AudioOutput_id_descriptors[2].descriptor; 128ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten break; 1297a79f519d89eb0e1a5b3f4005484b16d6854d7e2Glenn Kasten // SL_DEFAULTDEVICEID_AUDIOOUTPUT? 130ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten default: 131ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten result = SL_RESULT_IO_ERROR; 132ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten break; 133ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten } 13461ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten } 135ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten 136ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten SL_LEAVE_INTERFACE 13761ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten} 13861ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten 139ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten 140d2a7f0d6883a6d3835642e7b282f05ed1c54fe63Glenn Kastenstatic SLresult IAudioIODeviceCapabilities_RegisterAvailableAudioOutputsChangedCallback( 141d2a7f0d6883a6d3835642e7b282f05ed1c54fe63Glenn Kasten SLAudioIODeviceCapabilitiesItf self, slAvailableAudioOutputsChangedCallback callback, 142d2a7f0d6883a6d3835642e7b282f05ed1c54fe63Glenn Kasten void *pContext) 14361ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten{ 144ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten SL_ENTER_INTERFACE 145ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten 146f6c0c2346b2ca1ac01c2d68a2cd2a7f1d9ff3427Glenn Kasten IAudioIODeviceCapabilities * thiz = (IAudioIODeviceCapabilities *) self; 147bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten interface_lock_exclusive(thiz); 148bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten thiz->mAvailableAudioOutputsChangedCallback = callback; 149bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten thiz->mAvailableAudioOutputsChangedContext = pContext; 150bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten interface_unlock_exclusive(thiz); 151ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten result = SL_RESULT_SUCCESS; 152ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten 153ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten SL_LEAVE_INTERFACE 15461ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten} 15561ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten 156ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten 157d2a7f0d6883a6d3835642e7b282f05ed1c54fe63Glenn Kastenstatic SLresult IAudioIODeviceCapabilities_RegisterDefaultDeviceIDMapChangedCallback( 158d2a7f0d6883a6d3835642e7b282f05ed1c54fe63Glenn Kasten SLAudioIODeviceCapabilitiesItf self, slDefaultDeviceIDMapChangedCallback callback, 159d2a7f0d6883a6d3835642e7b282f05ed1c54fe63Glenn Kasten void *pContext) 16061ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten{ 161ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten SL_ENTER_INTERFACE 162ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten 163f6c0c2346b2ca1ac01c2d68a2cd2a7f1d9ff3427Glenn Kasten IAudioIODeviceCapabilities * thiz = (IAudioIODeviceCapabilities *) self; 164bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten interface_lock_exclusive(thiz); 165bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten thiz->mDefaultDeviceIDMapChangedCallback = callback; 166bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten thiz->mDefaultDeviceIDMapChangedContext = pContext; 167bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten interface_unlock_exclusive(thiz); 168ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten result = SL_RESULT_SUCCESS; 169ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten 170ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten SL_LEAVE_INTERFACE 17161ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten} 17261ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten 173ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten 17461ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kastenstatic SLresult IAudioIODeviceCapabilities_GetAssociatedAudioInputs( 17561ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten SLAudioIODeviceCapabilitiesItf self, SLuint32 deviceID, 17661ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten SLint32 *pNumAudioInputs, SLuint32 *pAudioInputDeviceIDs) 17761ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten{ 178ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten SL_ENTER_INTERFACE 179ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten 180ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten if (NULL == pNumAudioInputs) { 181ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten result = SL_RESULT_PARAMETER_INVALID; 182ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten } else { 1837a79f519d89eb0e1a5b3f4005484b16d6854d7e2Glenn Kasten // Incomplete 184ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten *pNumAudioInputs = 0; 185ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten result = SL_RESULT_SUCCESS; 186ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten } 187ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten 188ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten SL_LEAVE_INTERFACE 18961ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten} 19061ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten 191ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten 19261ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kastenstatic SLresult IAudioIODeviceCapabilities_GetAssociatedAudioOutputs( 19361ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten SLAudioIODeviceCapabilitiesItf self, SLuint32 deviceID, 19461ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten SLint32 *pNumAudioOutputs, SLuint32 *pAudioOutputDeviceIDs) 19561ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten{ 196ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten SL_ENTER_INTERFACE 197ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten 198ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten if (NULL == pNumAudioOutputs) { 199ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten result = SL_RESULT_PARAMETER_INVALID; 200ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten } else { 2017a79f519d89eb0e1a5b3f4005484b16d6854d7e2Glenn Kasten // Incomplete 202ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten *pNumAudioOutputs = 0; 203ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten result = SL_RESULT_SUCCESS; 204ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten } 205ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten 206ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten SL_LEAVE_INTERFACE 20761ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten} 20861ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten 209ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten 21061ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kastenstatic SLresult IAudioIODeviceCapabilities_GetDefaultAudioDevices( 21161ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten SLAudioIODeviceCapabilitiesItf self, SLuint32 defaultDeviceID, 21261ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten SLint32 *pNumAudioDevices, SLuint32 *pAudioDeviceIDs) 21361ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten{ 214ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten SL_ENTER_INTERFACE 215ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten 216ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten if (NULL == pNumAudioDevices) { 217ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten result = SL_RESULT_PARAMETER_INVALID; 218ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten } else { 219a438eb1cf1ae602afab00336528dd230bd929206Glenn Kasten switch (defaultDeviceID) { 220a438eb1cf1ae602afab00336528dd230bd929206Glenn Kasten case SL_DEFAULTDEVICEID_AUDIOINPUT: 221a438eb1cf1ae602afab00336528dd230bd929206Glenn Kasten case SL_DEFAULTDEVICEID_AUDIOOUTPUT: 222ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten result = SL_RESULT_SUCCESS; 223ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten if (NULL != pAudioDeviceIDs) { 224ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten switch (defaultDeviceID) { 225ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten case SL_DEFAULTDEVICEID_AUDIOINPUT: 226ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten if (1 > *pNumAudioDevices) { 227ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten result = SL_RESULT_BUFFER_INSUFFICIENT; 228ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten } else { 229ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten pAudioDeviceIDs[0] = SL_DEFAULTDEVICEID_AUDIOINPUT; 230ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten } 231ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten *pNumAudioDevices = 1; 232ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten break; 233ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten case SL_DEFAULTDEVICEID_AUDIOOUTPUT: 234ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten if (2 > *pNumAudioDevices) { 235ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten result = SL_RESULT_BUFFER_INSUFFICIENT; 236ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten } else { 237ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten pAudioDeviceIDs[0] = DEVICE_ID_HEADSET; 238ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten pAudioDeviceIDs[1] = DEVICE_ID_HANDSFREE; 2397a79f519d89eb0e1a5b3f4005484b16d6854d7e2Glenn Kasten // should be capable of returning first item if 1 slot 240ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten } 241ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten *pNumAudioDevices = 2; 242ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten break; 243ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten default: 244ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten assert(SL_BOOLEAN_FALSE); 245ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten *pNumAudioDevices = 0; 246ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten break; 247ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten } 248ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten } 249a438eb1cf1ae602afab00336528dd230bd929206Glenn Kasten break; 250a438eb1cf1ae602afab00336528dd230bd929206Glenn Kasten default: 251ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten result = SL_RESULT_IO_ERROR; 252a438eb1cf1ae602afab00336528dd230bd929206Glenn Kasten break; 253a438eb1cf1ae602afab00336528dd230bd929206Glenn Kasten } 25461ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten } 255ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten 256ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten SL_LEAVE_INTERFACE 25761ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten} 25861ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten 259ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten 26061ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kastenstatic SLresult IAudioIODeviceCapabilities_QuerySampleFormatsSupported( 261d2a7f0d6883a6d3835642e7b282f05ed1c54fe63Glenn Kasten SLAudioIODeviceCapabilitiesItf self, SLuint32 deviceID, SLmilliHertz samplingRate, 262d2a7f0d6883a6d3835642e7b282f05ed1c54fe63Glenn Kasten SLint32 *pSampleFormats, SLint32 *pNumOfSampleFormats) 26361ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten{ 264ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten SL_ENTER_INTERFACE 265ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten 266ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten if (NULL == pNumOfSampleFormats) { 267ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten result = SL_RESULT_PARAMETER_INVALID; 268ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten } else { 269ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten switch (deviceID) { 270ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten case SL_DEFAULTDEVICEID_AUDIOINPUT: 271ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten case SL_DEFAULTDEVICEID_AUDIOOUTPUT: 272ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten result = SL_RESULT_SUCCESS; 2737a79f519d89eb0e1a5b3f4005484b16d6854d7e2Glenn Kasten // incomplete 274ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten switch (samplingRate) { 275ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten case SL_SAMPLINGRATE_44_1: 276ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten break; 277ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten default: 278ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten result = SL_RESULT_IO_ERROR; 279ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten break; 280ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten } 281ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten if (NULL != pSampleFormats) { 282ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten if (1 > *pNumOfSampleFormats) 283ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten result = SL_RESULT_BUFFER_INSUFFICIENT; 2847a79f519d89eb0e1a5b3f4005484b16d6854d7e2Glenn Kasten // incomplete 285ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten pSampleFormats[0] = SL_PCMSAMPLEFORMAT_FIXED_16; 286ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten } 287ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten *pNumOfSampleFormats = 1; 288ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten break; 289ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten default: 290ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten result = SL_RESULT_IO_ERROR; 291ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten break; 292ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten } 29361ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten } 294ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten 295ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten SL_LEAVE_INTERFACE 29661ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten} 29761ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten 298ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten 29961ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kastenstatic const struct SLAudioIODeviceCapabilitiesItf_ IAudioIODeviceCapabilities_Itf = { 30061ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten IAudioIODeviceCapabilities_GetAvailableAudioInputs, 30161ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten IAudioIODeviceCapabilities_QueryAudioInputCapabilities, 30261ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten IAudioIODeviceCapabilities_RegisterAvailableAudioInputsChangedCallback, 30361ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten IAudioIODeviceCapabilities_GetAvailableAudioOutputs, 30461ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten IAudioIODeviceCapabilities_QueryAudioOutputCapabilities, 30561ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten IAudioIODeviceCapabilities_RegisterAvailableAudioOutputsChangedCallback, 30661ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten IAudioIODeviceCapabilities_RegisterDefaultDeviceIDMapChangedCallback, 30761ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten IAudioIODeviceCapabilities_GetAssociatedAudioInputs, 30861ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten IAudioIODeviceCapabilities_GetAssociatedAudioOutputs, 30961ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten IAudioIODeviceCapabilities_GetDefaultAudioDevices, 31061ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten IAudioIODeviceCapabilities_QuerySampleFormatsSupported 31161ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten}; 31261ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten 31361ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kastenvoid IAudioIODeviceCapabilities_init(void *self) 31461ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten{ 315bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten IAudioIODeviceCapabilities *thiz = (IAudioIODeviceCapabilities *) self; 316bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten thiz->mItf = &IAudioIODeviceCapabilities_Itf; 317bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten thiz->mAvailableAudioInputsChangedCallback = NULL; 318bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten thiz->mAvailableAudioInputsChangedContext = NULL; 319bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten thiz->mAvailableAudioOutputsChangedCallback = NULL; 320bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten thiz->mAvailableAudioOutputsChangedContext = NULL; 321bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten thiz->mDefaultDeviceIDMapChangedCallback = NULL; 322bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten thiz->mDefaultDeviceIDMapChangedContext = NULL; 32361ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten} 324