diff options
Diffstat (limited to 'audio')
-rw-r--r-- | audio/AudioPolicyCompatClient.cpp | 6 | ||||
-rw-r--r-- | audio/AudioPolicyCompatClient.h | 2 | ||||
-rw-r--r-- | audio/AudioPolicyManagerBase.cpp | 305 | ||||
-rw-r--r-- | audio/audio_policy_hal.cpp | 4 |
4 files changed, 166 insertions, 151 deletions
diff --git a/audio/AudioPolicyCompatClient.cpp b/audio/AudioPolicyCompatClient.cpp index 162968c..9d02d98 100644 --- a/audio/AudioPolicyCompatClient.cpp +++ b/audio/AudioPolicyCompatClient.cpp @@ -85,11 +85,9 @@ status_t AudioPolicyCompatClient::closeInput(audio_io_handle_t input) return mServiceOps->close_input(mService, input); } -status_t AudioPolicyCompatClient::setStreamOutput(AudioSystem::stream_type stream, - audio_io_handle_t output) +status_t AudioPolicyCompatClient::invalidateStream(AudioSystem::stream_type stream) { - return mServiceOps->set_stream_output(mService, (audio_stream_type_t)stream, - output); + return mServiceOps->invalidate_stream(mService, (audio_stream_type_t)stream); } status_t AudioPolicyCompatClient::moveEffects(int session, audio_io_handle_t srcOutput, diff --git a/audio/AudioPolicyCompatClient.h b/audio/AudioPolicyCompatClient.h index 494c8af..19f76e1 100644 --- a/audio/AudioPolicyCompatClient.h +++ b/audio/AudioPolicyCompatClient.h @@ -56,7 +56,7 @@ public: audio_format_t *pFormat, audio_channel_mask_t *pChannelMask); virtual status_t closeInput(audio_io_handle_t input); - virtual status_t setStreamOutput(AudioSystem::stream_type stream, audio_io_handle_t output); + virtual status_t invalidateStream(AudioSystem::stream_type stream); virtual status_t moveEffects(int session, audio_io_handle_t srcOutput, audio_io_handle_t dstOutput); diff --git a/audio/AudioPolicyManagerBase.cpp b/audio/AudioPolicyManagerBase.cpp index af24dbd..ff99e90 100644 --- a/audio/AudioPolicyManagerBase.cpp +++ b/audio/AudioPolicyManagerBase.cpp @@ -55,7 +55,7 @@ status_t AudioPolicyManagerBase::setDeviceConnectionState(audio_devices_t device { SortedVector <audio_io_handle_t> outputs; - ALOGV("setDeviceConnectionState() device: %x, state %d, address %s", device, state, device_address); + ALOGV("setDeviceConnectionState() device: 0x%X, state %d, address %s", device, state, device_address); // connect/disconnect only 1 device at a time if (!audio_is_output_device(device) && !audio_is_input_device(device)) return BAD_VALUE; @@ -84,6 +84,7 @@ status_t AudioPolicyManagerBase::setDeviceConnectionState(audio_devices_t device // save a copy of the opened output descriptors before any output is opened or closed // by checkOutputsForDevice(). This will be needed by checkOutputForAllStrategies() mPreviousOutputs = mOutputs; + String8 paramStr; switch (state) { // handle output device connection @@ -94,7 +95,17 @@ status_t AudioPolicyManagerBase::setDeviceConnectionState(audio_devices_t device } ALOGV("setDeviceConnectionState() connecting device %x", device); - if (checkOutputsForDevice(device, state, outputs) != NO_ERROR) { + if (mHasA2dp && audio_is_a2dp_device(device)) { + // handle A2DP device connection + AudioParameter param; + param.add(String8(AUDIO_PARAMETER_A2DP_SINK_ADDRESS), String8(device_address)); + paramStr = param.toString(); + } else if (mHasUsb && audio_is_usb_device(device)) { + // handle USB device connection + paramStr = String8(device_address, MAX_DEVICE_ADDRESS_LEN); + } + + if (checkOutputsForDevice(device, state, outputs, paramStr) != NO_ERROR) { return INVALID_OPERATION; } ALOGV("setDeviceConnectionState() checkOutputsForDevice() returned %zu outputs", @@ -102,31 +113,18 @@ status_t AudioPolicyManagerBase::setDeviceConnectionState(audio_devices_t device // register new device as available mAvailableOutputDevices = (audio_devices_t)(mAvailableOutputDevices | device); - if (!outputs.isEmpty()) { - String8 paramStr; - if (mHasA2dp && audio_is_a2dp_device(device)) { - // handle A2DP device connection - AudioParameter param; - param.add(String8(AUDIO_PARAMETER_A2DP_SINK_ADDRESS), String8(device_address)); - paramStr = param.toString(); - mA2dpDeviceAddress = String8(device_address, MAX_DEVICE_ADDRESS_LEN); - mA2dpSuspended = false; - } else if (audio_is_bluetooth_sco_device(device)) { - // handle SCO device connection - mScoDeviceAddress = String8(device_address, MAX_DEVICE_ADDRESS_LEN); - } else if (mHasUsb && audio_is_usb_device(device)) { - // handle USB device connection - mUsbCardAndDevice = String8(device_address, MAX_DEVICE_ADDRESS_LEN); - paramStr = mUsbCardAndDevice; - } - // not currently handling multiple simultaneous submixes: ignoring remote submix - // case and address - if (!paramStr.isEmpty()) { - for (size_t i = 0; i < outputs.size(); i++) { - mpClientInterface->setParameters(outputs[i], paramStr); - } - } + if (mHasA2dp && audio_is_a2dp_device(device)) { + // handle A2DP device connection + mA2dpDeviceAddress = String8(device_address, MAX_DEVICE_ADDRESS_LEN); + mA2dpSuspended = false; + } else if (audio_is_bluetooth_sco_device(device)) { + // handle SCO device connection + mScoDeviceAddress = String8(device_address, MAX_DEVICE_ADDRESS_LEN); + } else if (mHasUsb && audio_is_usb_device(device)) { + // handle USB device connection + mUsbCardAndDevice = String8(device_address, MAX_DEVICE_ADDRESS_LEN); } + break; // handle output device disconnection case AudioSystem::DEVICE_STATE_UNAVAILABLE: { @@ -139,7 +137,7 @@ status_t AudioPolicyManagerBase::setDeviceConnectionState(audio_devices_t device // remove device from available output devices mAvailableOutputDevices = (audio_devices_t)(mAvailableOutputDevices & ~device); - checkOutputsForDevice(device, state, outputs); + checkOutputsForDevice(device, state, outputs, paramStr); if (mHasA2dp && audio_is_a2dp_device(device)) { // handle A2DP device disconnection mA2dpDeviceAddress = ""; @@ -498,8 +496,8 @@ void AudioPolicyManagerBase::setSystemProperty(const char* property, const char* AudioPolicyManagerBase::IOProfile *AudioPolicyManagerBase::getProfileForDirectOutput( audio_devices_t device, uint32_t samplingRate, - uint32_t format, - uint32_t channelMask, + audio_format_t format, + audio_channel_mask_t channelMask, audio_output_flags_t flags) { for (size_t i = 0; i < mHwModules.size(); i++) { @@ -532,8 +530,8 @@ AudioPolicyManagerBase::IOProfile *AudioPolicyManagerBase::getProfileForDirectOu audio_io_handle_t AudioPolicyManagerBase::getOutput(AudioSystem::stream_type stream, uint32_t samplingRate, - uint32_t format, - uint32_t channelMask, + audio_format_t format, + audio_channel_mask_t channelMask, AudioSystem::output_flags flags, const audio_offload_info_t *offloadInfo) { @@ -625,8 +623,8 @@ audio_io_handle_t AudioPolicyManagerBase::getOutput(AudioSystem::stream_type str outputDesc = new AudioOutputDescriptor(profile); outputDesc->mDevice = device; outputDesc->mSamplingRate = samplingRate; - outputDesc->mFormat = (audio_format_t)format; - outputDesc->mChannelMask = (audio_channel_mask_t)channelMask; + outputDesc->mFormat = format; + outputDesc->mChannelMask = channelMask; outputDesc->mLatency = 0; outputDesc->mFlags =(audio_output_flags_t) (outputDesc->mFlags | flags); outputDesc->mRefCount[stream] = 0; @@ -644,7 +642,7 @@ audio_io_handle_t AudioPolicyManagerBase::getOutput(AudioSystem::stream_type str // only accept an output with the requested parameters if (output == 0 || (samplingRate != 0 && samplingRate != outputDesc->mSamplingRate) || - (format != 0 && format != outputDesc->mFormat) || + (format != AUDIO_FORMAT_DEFAULT && format != outputDesc->mFormat) || (channelMask != 0 && channelMask != outputDesc->mChannelMask)) { ALOGV("getOutput() failed opening direct output: output %d samplingRate %d %d," "format %d %d, channelMask %04x %04x", output, samplingRate, @@ -672,7 +670,7 @@ audio_io_handle_t AudioPolicyManagerBase::getOutput(AudioSystem::stream_type str // open a non direct output // for non direct outputs, only PCM is supported - if (audio_is_linear_pcm((audio_format_t)format)) { + if (audio_is_linear_pcm(format)) { // get which output is suitable for the specified stream. The actual // routing change will happen when startOutput() will be called SortedVector<audio_io_handle_t> outputs = getOutputsForDevice(device, mOutputs); @@ -740,7 +738,7 @@ status_t AudioPolicyManagerBase::startOutput(audio_io_handle_t output, ALOGV("startOutput() output %d, stream %d, session %d", output, stream, session); ssize_t index = mOutputs.indexOfKey(output); if (index < 0) { - ALOGW("startOutput() unknow output %d", output); + ALOGW("startOutput() unknown output %d", output); return BAD_VALUE; } @@ -808,7 +806,7 @@ status_t AudioPolicyManagerBase::stopOutput(audio_io_handle_t output, ALOGV("stopOutput() output %d, stream %d, session %d", output, stream, session); ssize_t index = mOutputs.indexOfKey(output); if (index < 0) { - ALOGW("stopOutput() unknow output %d", output); + ALOGW("stopOutput() unknown output %d", output); return BAD_VALUE; } @@ -903,8 +901,8 @@ void AudioPolicyManagerBase::releaseOutput(audio_io_handle_t output) audio_io_handle_t AudioPolicyManagerBase::getInput(int inputSource, uint32_t samplingRate, - uint32_t format, - uint32_t channelMask, + audio_format_t format, + audio_channel_mask_t channelMask, AudioSystem::audio_in_acoustics acoustics) { audio_io_handle_t input = 0; @@ -921,13 +919,13 @@ audio_io_handle_t AudioPolicyManagerBase::getInput(int inputSource, // adapt channel selection to input source switch(inputSource) { case AUDIO_SOURCE_VOICE_UPLINK: - channelMask = AudioSystem::CHANNEL_IN_VOICE_UPLINK; + channelMask = AUDIO_CHANNEL_IN_VOICE_UPLINK; break; case AUDIO_SOURCE_VOICE_DOWNLINK: - channelMask = AudioSystem::CHANNEL_IN_VOICE_DNLINK; + channelMask = AUDIO_CHANNEL_IN_VOICE_DNLINK; break; case AUDIO_SOURCE_VOICE_CALL: - channelMask = (AudioSystem::CHANNEL_IN_VOICE_UPLINK | AudioSystem::CHANNEL_IN_VOICE_DNLINK); + channelMask = AUDIO_CHANNEL_IN_VOICE_UPLINK | AUDIO_CHANNEL_IN_VOICE_DNLINK; break; default: break; @@ -938,7 +936,7 @@ audio_io_handle_t AudioPolicyManagerBase::getInput(int inputSource, format, channelMask); if (profile == NULL) { - ALOGW("getInput() could not find profile for device %04x, samplingRate %d, format %d," + ALOGW("getInput() could not find profile for device %04x, samplingRate %d, format %d, " "channelMask %04x", device, samplingRate, format, channelMask); return 0; @@ -954,8 +952,8 @@ audio_io_handle_t AudioPolicyManagerBase::getInput(int inputSource, inputDesc->mInputSource = inputSource; inputDesc->mDevice = device; inputDesc->mSamplingRate = samplingRate; - inputDesc->mFormat = (audio_format_t)format; - inputDesc->mChannelMask = (audio_channel_mask_t)channelMask; + inputDesc->mFormat = format; + inputDesc->mChannelMask = channelMask; inputDesc->mRefCount = 0; input = mpClientInterface->openInput(profile->mModule->mHandle, &inputDesc->mDevice, @@ -968,7 +966,7 @@ audio_io_handle_t AudioPolicyManagerBase::getInput(int inputSource, (samplingRate != inputDesc->mSamplingRate) || (format != inputDesc->mFormat) || (channelMask != inputDesc->mChannelMask)) { - ALOGV("getInput() failed opening input: samplingRate %d, format %d, channelMask %d", + ALOGI("getInput() failed opening input: samplingRate %d, format %d, channelMask %x", samplingRate, format, channelMask); if (input != 0) { mpClientInterface->closeInput(input); @@ -985,7 +983,7 @@ status_t AudioPolicyManagerBase::startInput(audio_io_handle_t input) ALOGV("startInput() input %d", input); ssize_t index = mInputs.indexOfKey(input); if (index < 0) { - ALOGW("startInput() unknow input %d", input); + ALOGW("startInput() unknown input %d", input); return BAD_VALUE; } AudioInputDescriptor *inputDesc = mInputs.valueAt(index); @@ -1004,7 +1002,7 @@ status_t AudioPolicyManagerBase::startInput(audio_io_handle_t input) stopInput(activeInput); releaseInput(activeInput); } else { - ALOGW("startInput() input %d failed: other input already started..", input); + ALOGW("startInput() input %d failed: other input already started", input); return INVALID_OPERATION; } } @@ -1041,7 +1039,7 @@ status_t AudioPolicyManagerBase::stopInput(audio_io_handle_t input) ALOGV("stopInput() input %d", input); ssize_t index = mInputs.indexOfKey(input); if (index < 0) { - ALOGW("stopInput() unknow input %d", input); + ALOGW("stopInput() unknown input %d", input); return BAD_VALUE; } AudioInputDescriptor *inputDesc = mInputs.valueAt(index); @@ -1821,7 +1819,8 @@ void AudioPolicyManagerBase::addOutput(audio_io_handle_t id, AudioOutputDescript status_t AudioPolicyManagerBase::checkOutputsForDevice(audio_devices_t device, AudioSystem::device_connection_state state, - SortedVector<audio_io_handle_t>& outputs) + SortedVector<audio_io_handle_t>& outputs, + const String8 paramStr) { AudioOutputDescriptor *desc; @@ -1872,7 +1871,7 @@ status_t AudioPolicyManagerBase::checkOutputsForDevice(audio_devices_t device, continue; } - ALOGV("opening output for device %08x", device); + ALOGV("opening output for device %08x with params %s", device, paramStr.string()); desc = new AudioOutputDescriptor(profile); desc->mDevice = device; audio_offload_info_t offloadInfo = AUDIO_INFO_INITIALIZER; @@ -1889,80 +1888,97 @@ status_t AudioPolicyManagerBase::checkOutputsForDevice(audio_devices_t device, desc->mFlags, &offloadInfo); if (output != 0) { - if (desc->mFlags & AUDIO_OUTPUT_FLAG_DIRECT) { - String8 reply; - char *value; - if (profile->mSamplingRates[0] == 0) { - reply = mpClientInterface->getParameters(output, - String8(AUDIO_PARAMETER_STREAM_SUP_SAMPLING_RATES)); - ALOGV("checkOutputsForDevice() direct output sup sampling rates %s", - reply.string()); - value = strpbrk((char *)reply.string(), "="); - if (value != NULL) { - loadSamplingRates(value + 1, profile); - } - } - if (profile->mFormats[0] == 0) { - reply = mpClientInterface->getParameters(output, - String8(AUDIO_PARAMETER_STREAM_SUP_FORMATS)); - ALOGV("checkOutputsForDevice() direct output sup formats %s", - reply.string()); - value = strpbrk((char *)reply.string(), "="); - if (value != NULL) { - loadFormats(value + 1, profile); - } + if (!paramStr.isEmpty()) { + mpClientInterface->setParameters(output, paramStr); + } + + String8 reply; + char *value; + if (profile->mSamplingRates[0] == 0) { + reply = mpClientInterface->getParameters(output, + String8(AUDIO_PARAMETER_STREAM_SUP_SAMPLING_RATES)); + ALOGV("checkOutputsForDevice() direct output sup sampling rates %s", + reply.string()); + value = strpbrk((char *)reply.string(), "="); + if (value != NULL) { + loadSamplingRates(value + 1, profile); } - if (profile->mChannelMasks[0] == 0) { - reply = mpClientInterface->getParameters(output, - String8(AUDIO_PARAMETER_STREAM_SUP_CHANNELS)); - ALOGV("checkOutputsForDevice() direct output sup channel masks %s", - reply.string()); - value = strpbrk((char *)reply.string(), "="); - if (value != NULL) { - loadOutChannels(value + 1, profile); - } + } + if (profile->mFormats[0] == AUDIO_FORMAT_DEFAULT) { + reply = mpClientInterface->getParameters(output, + String8(AUDIO_PARAMETER_STREAM_SUP_FORMATS)); + ALOGV("checkOutputsForDevice() direct output sup formats %s", + reply.string()); + value = strpbrk((char *)reply.string(), "="); + if (value != NULL) { + loadFormats(value + 1, profile); } - if (((profile->mSamplingRates[0] == 0) && - (profile->mSamplingRates.size() < 2)) || - ((profile->mFormats[0] == 0) && - (profile->mFormats.size() < 2)) || - ((profile->mFormats[0] == 0) && - (profile->mChannelMasks.size() < 2))) { - ALOGW("checkOutputsForDevice() direct output missing param"); - mpClientInterface->closeOutput(output); - output = 0; - } else { - addOutput(output, desc); + } + if (profile->mChannelMasks[0] == 0) { + reply = mpClientInterface->getParameters(output, + String8(AUDIO_PARAMETER_STREAM_SUP_CHANNELS)); + ALOGV("checkOutputsForDevice() direct output sup channel masks %s", + reply.string()); + value = strpbrk((char *)reply.string(), "="); + if (value != NULL) { + loadOutChannels(value + 1, profile); } - } else { - audio_io_handle_t duplicatedOutput = 0; - // add output descriptor + } + if (((profile->mSamplingRates[0] == 0) && + (profile->mSamplingRates.size() < 2)) || + ((profile->mFormats[0] == 0) && + (profile->mFormats.size() < 2)) || + ((profile->mChannelMasks[0] == 0) && + (profile->mChannelMasks.size() < 2))) { + ALOGW("checkOutputsForDevice() direct output missing param"); + mpClientInterface->closeOutput(output); + output = 0; + } else if (profile->mSamplingRates[0] == 0) { + mpClientInterface->closeOutput(output); + desc->mSamplingRate = profile->mSamplingRates[1]; + offloadInfo.sample_rate = desc->mSamplingRate; + output = mpClientInterface->openOutput( + profile->mModule->mHandle, + &desc->mDevice, + &desc->mSamplingRate, + &desc->mFormat, + &desc->mChannelMask, + &desc->mLatency, + desc->mFlags, + &offloadInfo); + } + + if (output != 0) { addOutput(output, desc); - // set initial stream volume for device - applyStreamVolumes(output, device, 0, true); - - //TODO: configure audio effect output stage here - - // open a duplicating output thread for the new output and the primary output - duplicatedOutput = mpClientInterface->openDuplicateOutput(output, - mPrimaryOutput); - if (duplicatedOutput != 0) { - // add duplicated output descriptor - AudioOutputDescriptor *dupOutputDesc = new AudioOutputDescriptor(NULL); - dupOutputDesc->mOutput1 = mOutputs.valueFor(mPrimaryOutput); - dupOutputDesc->mOutput2 = mOutputs.valueFor(output); - dupOutputDesc->mSamplingRate = desc->mSamplingRate; - dupOutputDesc->mFormat = desc->mFormat; - dupOutputDesc->mChannelMask = desc->mChannelMask; - dupOutputDesc->mLatency = desc->mLatency; - addOutput(duplicatedOutput, dupOutputDesc); - applyStreamVolumes(duplicatedOutput, device, 0, true); - } else { - ALOGW("checkOutputsForDevice() could not open dup output for %d and %d", - mPrimaryOutput, output); - mpClientInterface->closeOutput(output); - mOutputs.removeItem(output); - output = 0; + if ((desc->mFlags & AUDIO_OUTPUT_FLAG_DIRECT) == 0) { + audio_io_handle_t duplicatedOutput = 0; + + // set initial stream volume for device + applyStreamVolumes(output, device, 0, true); + + //TODO: configure audio effect output stage here + + // open a duplicating output thread for the new output and the primary output + duplicatedOutput = mpClientInterface->openDuplicateOutput(output, + mPrimaryOutput); + if (duplicatedOutput != 0) { + // add duplicated output descriptor + AudioOutputDescriptor *dupOutputDesc = new AudioOutputDescriptor(NULL); + dupOutputDesc->mOutput1 = mOutputs.valueFor(mPrimaryOutput); + dupOutputDesc->mOutput2 = mOutputs.valueFor(output); + dupOutputDesc->mSamplingRate = desc->mSamplingRate; + dupOutputDesc->mFormat = desc->mFormat; + dupOutputDesc->mChannelMask = desc->mChannelMask; + dupOutputDesc->mLatency = desc->mLatency; + addOutput(duplicatedOutput, dupOutputDesc); + applyStreamVolumes(duplicatedOutput, device, 0, true); + } else { + ALOGW("checkOutputsForDevice() could not open dup output for %d and %d", + mPrimaryOutput, output); + mpClientInterface->closeOutput(output); + mOutputs.removeItem(output); + output = 0; + } } } } @@ -1999,21 +2015,20 @@ status_t AudioPolicyManagerBase::checkOutputsForDevice(audio_devices_t device, for (size_t j = 0; j < mHwModules[i]->mOutputProfiles.size(); j++) { IOProfile *profile = mHwModules[i]->mOutputProfiles[j]; - if ((profile->mSupportedDevices & device) && - (profile->mFlags & AUDIO_OUTPUT_FLAG_DIRECT)) { + if (profile->mSupportedDevices & device) { ALOGV("checkOutputsForDevice(): clearing direct output profile %zu on module %zu", j, i); if (profile->mSamplingRates[0] == 0) { profile->mSamplingRates.clear(); profile->mSamplingRates.add(0); } - if (profile->mFormats[0] == 0) { + if (profile->mFormats[0] == AUDIO_FORMAT_DEFAULT) { profile->mFormats.clear(); - profile->mFormats.add((audio_format_t)0); + profile->mFormats.add(AUDIO_FORMAT_DEFAULT); } if (profile->mChannelMasks[0] == 0) { profile->mChannelMasks.clear(); - profile->mChannelMasks.add((audio_channel_mask_t)0); + profile->mChannelMasks.add(0); } } } @@ -2143,9 +2158,7 @@ void AudioPolicyManagerBase::checkOutputForStrategy(routing_strategy strategy) // Move tracks associated to this strategy from previous output to new output for (int i = 0; i < (int)AudioSystem::NUM_STREAM_TYPES; i++) { if (getStrategy((AudioSystem::stream_type)i) == strategy) { - //FIXME see fixme on name change - mpClientInterface->setStreamOutput((AudioSystem::stream_type)i, - dstOutputs[0] /* ignored */); + mpClientInterface->invalidateStream((AudioSystem::stream_type)i); } } } @@ -2664,8 +2677,8 @@ uint32_t AudioPolicyManagerBase::setOutputDevice(audio_io_handle_t output, AudioPolicyManagerBase::IOProfile *AudioPolicyManagerBase::getInputProfile(audio_devices_t device, uint32_t samplingRate, - uint32_t format, - uint32_t channelMask) + audio_format_t format, + audio_channel_mask_t channelMask) { // Choose an input profile based on the requested capture parameters: select the first available // profile supporting all requested parameters. @@ -2679,7 +2692,7 @@ AudioPolicyManagerBase::IOProfile *AudioPolicyManagerBase::getInputProfile(audio { IOProfile *profile = mHwModules[i]->mInputProfiles[j]; if (profile->isCompatibleProfile(device, samplingRate, format, - channelMask,(audio_output_flags_t)0)) { + channelMask, AUDIO_OUTPUT_FLAG_NONE)) { return profile; } } @@ -3251,8 +3264,8 @@ uint32_t AudioPolicyManagerBase::getMaxEffectsMemory() AudioPolicyManagerBase::AudioOutputDescriptor::AudioOutputDescriptor( const IOProfile *profile) - : mId(0), mSamplingRate(0), mFormat((audio_format_t)0), - mChannelMask((audio_channel_mask_t)0), mLatency(0), + : mId(0), mSamplingRate(0), mFormat(AUDIO_FORMAT_DEFAULT), + mChannelMask(0), mLatency(0), mFlags((audio_output_flags_t)0), mDevice(AUDIO_DEVICE_NONE), mOutput1(0), mOutput2(0), mProfile(profile), mDirectOpenCount(0) { @@ -3403,7 +3416,7 @@ status_t AudioPolicyManagerBase::AudioOutputDescriptor::dump(int fd) // --- AudioInputDescriptor class implementation AudioPolicyManagerBase::AudioInputDescriptor::AudioInputDescriptor(const IOProfile *profile) - : mSamplingRate(0), mFormat((audio_format_t)0), mChannelMask((audio_channel_mask_t)0), + : mSamplingRate(0), mFormat(AUDIO_FORMAT_DEFAULT), mChannelMask(0), mDevice(AUDIO_DEVICE_NONE), mRefCount(0), mInputSource(0), mProfile(profile) { @@ -3521,7 +3534,7 @@ void AudioPolicyManagerBase::HwModule::dump(int fd) result.append(buffer); write(fd, result.string(), result.size()); if (mOutputProfiles.size()) { - write(fd, " - outputs:\n", sizeof(" - outputs:\n")); + write(fd, " - outputs:\n", strlen(" - outputs:\n")); for (size_t i = 0; i < mOutputProfiles.size(); i++) { snprintf(buffer, SIZE, " output %zu:\n", i); write(fd, buffer, strlen(buffer)); @@ -3529,7 +3542,7 @@ void AudioPolicyManagerBase::HwModule::dump(int fd) } } if (mInputProfiles.size()) { - write(fd, " - inputs:\n", sizeof(" - inputs:\n")); + write(fd, " - inputs:\n", strlen(" - inputs:\n")); for (size_t i = 0; i < mInputProfiles.size(); i++) { snprintf(buffer, SIZE, " input %zu:\n", i); write(fd, buffer, strlen(buffer)); @@ -3552,11 +3565,11 @@ AudioPolicyManagerBase::IOProfile::~IOProfile() // get a valid a match bool AudioPolicyManagerBase::IOProfile::isCompatibleProfile(audio_devices_t device, uint32_t samplingRate, - uint32_t format, - uint32_t channelMask, + audio_format_t format, + audio_channel_mask_t channelMask, audio_output_flags_t flags) const { - if (samplingRate == 0 || format == 0 || channelMask == 0) { + if (samplingRate == 0 || !audio_is_valid_format(format) || channelMask == 0) { return false; } @@ -3684,6 +3697,10 @@ const struct StringToEnum sFlagNameToEnumTable[] = { const struct StringToEnum sFormatNameToEnumTable[] = { STRING_TO_ENUM(AUDIO_FORMAT_PCM_16_BIT), STRING_TO_ENUM(AUDIO_FORMAT_PCM_8_BIT), + STRING_TO_ENUM(AUDIO_FORMAT_PCM_32_BIT), + STRING_TO_ENUM(AUDIO_FORMAT_PCM_8_24_BIT), + STRING_TO_ENUM(AUDIO_FORMAT_PCM_FLOAT), + STRING_TO_ENUM(AUDIO_FORMAT_PCM_24_BIT_PACKED), STRING_TO_ENUM(AUDIO_FORMAT_MP3), STRING_TO_ENUM(AUDIO_FORMAT_AAC), STRING_TO_ENUM(AUDIO_FORMAT_VORBIS), @@ -3791,7 +3808,7 @@ void AudioPolicyManagerBase::loadFormats(char *name, IOProfile *profile) // by convention, "0' in the first entry in mFormats indicates the supported formats // should be read from the output stream after it is opened for the first time if (str != NULL && strcmp(str, DYNAMIC_VALUE_TAG) == 0) { - profile->mFormats.add((audio_format_t)0); + profile->mFormats.add(AUDIO_FORMAT_DEFAULT); return; } @@ -3799,7 +3816,7 @@ void AudioPolicyManagerBase::loadFormats(char *name, IOProfile *profile) audio_format_t format = (audio_format_t)stringToEnum(sFormatNameToEnumTable, ARRAY_SIZE(sFormatNameToEnumTable), str); - if (format != 0) { + if (format != AUDIO_FORMAT_DEFAULT) { profile->mFormats.add(format); } str = strtok(NULL, "|"); @@ -3814,7 +3831,7 @@ void AudioPolicyManagerBase::loadInChannels(char *name, IOProfile *profile) ALOGV("loadInChannels() %s", name); if (str != NULL && strcmp(str, DYNAMIC_VALUE_TAG) == 0) { - profile->mChannelMasks.add((audio_channel_mask_t)0); + profile->mChannelMasks.add(0); return; } @@ -3841,7 +3858,7 @@ void AudioPolicyManagerBase::loadOutChannels(char *name, IOProfile *profile) // by convention, "0' in the first entry in mChannelMasks indicates the supported channel // masks should be read from the output stream after it is opened for the first time if (str != NULL && strcmp(str, DYNAMIC_VALUE_TAG) == 0) { - profile->mChannelMasks.add((audio_channel_mask_t)0); + profile->mChannelMasks.add(0); return; } diff --git a/audio/audio_policy_hal.cpp b/audio/audio_policy_hal.cpp index e44bc48..87c4131 100644 --- a/audio/audio_policy_hal.cpp +++ b/audio/audio_policy_hal.cpp @@ -145,7 +145,7 @@ static audio_io_handle_t ap_get_output(struct audio_policy *pol, ALOGV("%s: tid %d", __func__, gettid()); return lap->apm->getOutput((AudioSystem::stream_type)stream, - sampling_rate, (int) format, channelMask, + sampling_rate, format, channelMask, (AudioSystem::output_flags)flags, offloadInfo); } @@ -180,7 +180,7 @@ static audio_io_handle_t ap_get_input(struct audio_policy *pol, audio_source_t i audio_in_acoustics_t acoustics) { struct legacy_audio_policy *lap = to_lap(pol); - return lap->apm->getInput((int) inputSource, sampling_rate, (int) format, channelMask, + return lap->apm->getInput((int) inputSource, sampling_rate, format, channelMask, (AudioSystem::audio_in_acoustics)acoustics); } |