From 9080a4cd8c4e22ddae0350c0c51a20cea1a41016 Mon Sep 17 00:00:00 2001 From: Paul McLean Date: Thu, 18 Jun 2015 08:24:02 -0700 Subject: Fixing no rates, chans & encodings on input devices for device enum API. Filtering digital attributes for non-digital audio devices. Bug: 21876072 21903975 Change-Id: Ia5c81a8160f4b4ebf5941dd0c5dfb68d01699ca6 --- .../managerdefault/AudioPolicyManager.cpp | 25 ++++++++++++++++------ .../managerdefault/AudioPolicyManager.h | 2 +- 2 files changed, 20 insertions(+), 7 deletions(-) (limited to 'services/audiopolicy/managerdefault') diff --git a/services/audiopolicy/managerdefault/AudioPolicyManager.cpp b/services/audiopolicy/managerdefault/AudioPolicyManager.cpp index deebc23..a0de34d 100644 --- a/services/audiopolicy/managerdefault/AudioPolicyManager.cpp +++ b/services/audiopolicy/managerdefault/AudioPolicyManager.cpp @@ -213,7 +213,7 @@ status_t AudioPolicyManager::setDeviceConnectionStateInt(audio_devices_t device, device); return INVALID_OPERATION; } - if (checkInputsForDevice(device, state, inputs, devDesc->mAddress) != NO_ERROR) { + if (checkInputsForDevice(devDesc, state, inputs, devDesc->mAddress) != NO_ERROR) { return INVALID_OPERATION; } @@ -247,7 +247,7 @@ status_t AudioPolicyManager::setDeviceConnectionStateInt(audio_devices_t device, param.addInt(String8(AUDIO_PARAMETER_DEVICE_DISCONNECT), device); mpClientInterface->setParameters(AUDIO_IO_HANDLE_NONE, param.toString()); - checkInputsForDevice(device, state, inputs, devDesc->mAddress); + checkInputsForDevice(devDesc, state, inputs, devDesc->mAddress); mAvailableInputDevices.remove(devDesc); // Propagate device availability to Engine @@ -3196,7 +3196,9 @@ status_t AudioPolicyManager::checkOutputsForDevice(const sp de if (!desc->isDuplicated() && desc->mProfile == profile) { // matching profile: save the sample rates, format and channel masks supported // by the profile in our device descriptor - devDesc->importAudioPort(profile); + if (audio_device_is_digital(device)) { + devDesc->importAudioPort(profile); + } break; } } @@ -3359,7 +3361,10 @@ status_t AudioPolicyManager::checkOutputsForDevice(const sp de profile_index--; } else { outputs.add(output); - devDesc->importAudioPort(profile); + // Load digital format info only for digital devices + if (audio_device_is_digital(device)) { + devDesc->importAudioPort(profile); + } if (device_distinguishes_on_address(device)) { ALOGV("checkOutputsForDevice(): setOutputDevice(dev=0x%x, addr=%s)", @@ -3422,11 +3427,13 @@ status_t AudioPolicyManager::checkOutputsForDevice(const sp de return NO_ERROR; } -status_t AudioPolicyManager::checkInputsForDevice(audio_devices_t device, +status_t AudioPolicyManager::checkInputsForDevice(const sp devDesc, audio_policy_dev_state_t state, SortedVector& inputs, const String8 address) { + audio_devices_t device = devDesc->type(); + sp desc; if (state == AUDIO_POLICY_DEVICE_STATE_AVAILABLE) { // first list already open inputs that can be routed to this device @@ -3477,6 +3484,9 @@ status_t AudioPolicyManager::checkInputsForDevice(audio_devices_t device, for (input_index = 0; input_index < mInputs.size(); input_index++) { desc = mInputs.valueAt(input_index); if (desc->mProfile == profile) { + if (audio_device_is_digital(device)) { + devDesc->importAudioPort(profile); + } break; } } @@ -3562,6 +3572,9 @@ status_t AudioPolicyManager::checkInputsForDevice(audio_devices_t device, profile_index--; } else { inputs.add(input); + if (audio_device_is_digital(device)) { + devDesc->importAudioPort(profile); + } ALOGV("checkInputsForDevice(): adding input %d", input); } } // end scan profiles @@ -3591,7 +3604,7 @@ status_t AudioPolicyManager::checkInputsForDevice(audio_devices_t device, profile_index < mHwModules[module_index]->mInputProfiles.size(); profile_index++) { sp profile = mHwModules[module_index]->mInputProfiles[profile_index]; - if (profile->mSupportedDevices.types() & device & ~AUDIO_DEVICE_BIT_IN) { + if (profile->mSupportedDevices.types() & (device & ~AUDIO_DEVICE_BIT_IN)) { ALOGV("checkInputsForDevice(): clearing direct input profile %zu on module %zu", profile_index, module_index); if (profile->mSamplingRates[0] == 0) { diff --git a/services/audiopolicy/managerdefault/AudioPolicyManager.h b/services/audiopolicy/managerdefault/AudioPolicyManager.h index f9d1198..cf64154 100644 --- a/services/audiopolicy/managerdefault/AudioPolicyManager.h +++ b/services/audiopolicy/managerdefault/AudioPolicyManager.h @@ -456,7 +456,7 @@ protected: SortedVector& outputs, const String8 address); - status_t checkInputsForDevice(audio_devices_t device, + status_t checkInputsForDevice(const sp devDesc, audio_policy_dev_state_t state, SortedVector& inputs, const String8 address); -- cgit v1.1