summaryrefslogtreecommitdiffstats
path: root/audio
diff options
context:
space:
mode:
Diffstat (limited to 'audio')
-rw-r--r--audio/AudioPolicyCompatClient.cpp6
-rw-r--r--audio/AudioPolicyCompatClient.h2
-rw-r--r--audio/AudioPolicyManagerBase.cpp305
-rw-r--r--audio/audio_policy_hal.cpp4
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);
}