summaryrefslogtreecommitdiffstats
path: root/services
diff options
context:
space:
mode:
authorJean-Michel Trivi <jmtrivi@google.com>2014-08-11 17:22:38 +0000
committerAndroid (Google) Code Review <android-gerrit@google.com>2014-08-11 17:09:02 +0000
commitedf103987d71f09dc2acb0a971cb40ff6608f1a5 (patch)
tree94e22d3b8a0ea060abe33016bb14cb896ca17636 /services
parent2dfe8ea7c131a045067c123efc934ef6ccdb8821 (diff)
parentf17026dfef596cf1c8008fda20f1f2ad23a3df3a (diff)
downloadframeworks_av-edf103987d71f09dc2acb0a971cb40ff6608f1a5.zip
frameworks_av-edf103987d71f09dc2acb0a971cb40ff6608f1a5.tar.gz
frameworks_av-edf103987d71f09dc2acb0a971cb40ff6608f1a5.tar.bz2
Merge "Update audio ports with profile capabilities" into lmp-dev
Diffstat (limited to 'services')
-rw-r--r--services/audiopolicy/AudioPolicyManager.cpp81
-rw-r--r--services/audiopolicy/AudioPolicyManager.h5
2 files changed, 78 insertions, 8 deletions
diff --git a/services/audiopolicy/AudioPolicyManager.cpp b/services/audiopolicy/AudioPolicyManager.cpp
index 850fe86..9e59488 100644
--- a/services/audiopolicy/AudioPolicyManager.cpp
+++ b/services/audiopolicy/AudioPolicyManager.cpp
@@ -254,7 +254,7 @@ status_t AudioPolicyManager::setDeviceConnectionState(audio_devices_t device,
return NO_MEMORY;
}
- if (checkOutputsForDevice(device, state, outputs, address) != NO_ERROR) {
+ if (checkOutputsForDevice(devDesc, state, outputs, address) != NO_ERROR) {
mAvailableOutputDevices.remove(devDesc);
return INVALID_OPERATION;
}
@@ -275,7 +275,7 @@ status_t AudioPolicyManager::setDeviceConnectionState(audio_devices_t device,
// remove device from available output devices
mAvailableOutputDevices.remove(devDesc);
- checkOutputsForDevice(device, state, outputs, address);
+ checkOutputsForDevice(devDesc, state, outputs, address);
} break;
default:
@@ -2983,7 +2983,7 @@ void AudioPolicyManager::findIoHandlesByAddress(sp<AudioOutputDescriptor> desc /
patchDesc->mPatch.sinks[j].ext.device.address;
if (strncmp(patchAddr,
address.string(), AUDIO_DEVICE_MAX_ADDRESS_LEN) == 0) {
- ALOGV("checkOutputsForDevice(): adding opened output %d on same address %s",
+ ALOGV("findIoHandlesByAddress(): adding opened output %d on same address %s",
desc->mIoHandle, patchDesc->mPatch.sinks[j].ext.device.address);
outputs.add(desc->mIoHandle);
break;
@@ -2993,12 +2993,15 @@ void AudioPolicyManager::findIoHandlesByAddress(sp<AudioOutputDescriptor> desc /
}
}
-status_t AudioPolicyManager::checkOutputsForDevice(audio_devices_t device,
+status_t AudioPolicyManager::checkOutputsForDevice(const sp<DeviceDescriptor> devDesc,
audio_policy_dev_state_t state,
SortedVector<audio_io_handle_t>& outputs,
const String8 address)
{
+ audio_devices_t device = devDesc->mDeviceType;
sp<AudioOutputDescriptor> desc;
+ // erase all current sample rates, formats and channel masks
+ devDesc->clearCapabilities();
if (state == AUDIO_POLICY_DEVICE_STATE_AVAILABLE) {
// first list already open outputs that can be routed to this device
@@ -3047,6 +3050,9 @@ status_t AudioPolicyManager::checkOutputsForDevice(audio_devices_t device,
for (j = 0; j < outputs.size(); j++) {
desc = mOutputs.valueFor(outputs.itemAt(j));
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);
break;
}
}
@@ -3196,6 +3202,8 @@ status_t AudioPolicyManager::checkOutputsForDevice(audio_devices_t device,
profile_index--;
} else {
outputs.add(output);
+ devDesc->importAudioPort(profile);
+
if (deviceDistinguishesOnAddress(device)) {
ALOGV("checkOutputsForDevice(): setOutputDevice(dev=0x%x, addr=%s)",
device, address.string());
@@ -5575,15 +5583,21 @@ void AudioPolicyManager::AudioPort::toAudioPort(struct audio_port *port) const
port->type = mType;
unsigned int i;
for (i = 0; i < mSamplingRates.size() && i < AUDIO_PORT_MAX_SAMPLING_RATES; i++) {
- port->sample_rates[i] = mSamplingRates[i];
+ if (mSamplingRates[i] != 0) {
+ port->sample_rates[i] = mSamplingRates[i];
+ }
}
port->num_sample_rates = i;
for (i = 0; i < mChannelMasks.size() && i < AUDIO_PORT_MAX_CHANNEL_MASKS; i++) {
- port->channel_masks[i] = mChannelMasks[i];
+ if (mChannelMasks[i] != 0) {
+ port->channel_masks[i] = mChannelMasks[i];
+ }
}
port->num_channel_masks = i;
for (i = 0; i < mFormats.size() && i < AUDIO_PORT_MAX_FORMATS; i++) {
- port->formats[i] = mFormats[i];
+ if (mFormats[i] != 0) {
+ port->formats[i] = mFormats[i];
+ }
}
port->num_formats = i;
@@ -5595,6 +5609,59 @@ void AudioPolicyManager::AudioPort::toAudioPort(struct audio_port *port) const
port->num_gains = i;
}
+void AudioPolicyManager::AudioPort::importAudioPort(const sp<AudioPort> port) {
+ for (size_t k = 0 ; k < port->mSamplingRates.size() ; k++) {
+ const uint32_t rate = port->mSamplingRates.itemAt(k);
+ if (rate != 0) { // skip "dynamic" rates
+ bool hasRate = false;
+ for (size_t l = 0 ; l < mSamplingRates.size() ; l++) {
+ if (rate == mSamplingRates.itemAt(l)) {
+ hasRate = true;
+ break;
+ }
+ }
+ if (!hasRate) { // never import a sampling rate twice
+ mSamplingRates.add(rate);
+ }
+ }
+ }
+ for (size_t k = 0 ; k < port->mChannelMasks.size() ; k++) {
+ const audio_channel_mask_t mask = port->mChannelMasks.itemAt(k);
+ if (mask != 0) { // skip "dynamic" masks
+ bool hasMask = false;
+ for (size_t l = 0 ; l < mChannelMasks.size() ; l++) {
+ if (mask == mChannelMasks.itemAt(l)) {
+ hasMask = true;
+ break;
+ }
+ }
+ if (!hasMask) { // never import a channel mask twice
+ mChannelMasks.add(mask);
+ }
+ }
+ }
+ for (size_t k = 0 ; k < port->mFormats.size() ; k++) {
+ const audio_format_t format = port->mFormats.itemAt(k);
+ if (format != 0) { // skip "dynamic" formats
+ bool hasFormat = false;
+ for (size_t l = 0 ; l < mFormats.size() ; l++) {
+ if (format == mFormats.itemAt(l)) {
+ hasFormat = true;
+ break;
+ }
+ }
+ if (!hasFormat) { // never import a channel mask twice
+ mFormats.add(format);
+ }
+ }
+ }
+}
+
+void AudioPolicyManager::AudioPort::clearCapabilities() {
+ mChannelMasks.clear();
+ mFormats.clear();
+ mSamplingRates.clear();
+}
void AudioPolicyManager::AudioPort::loadSamplingRates(char *name)
{
diff --git a/services/audiopolicy/AudioPolicyManager.h b/services/audiopolicy/AudioPolicyManager.h
index 95aab65..f071675 100644
--- a/services/audiopolicy/AudioPolicyManager.h
+++ b/services/audiopolicy/AudioPolicyManager.h
@@ -238,6 +238,9 @@ protected:
virtual void toAudioPort(struct audio_port *port) const;
+ void importAudioPort(const sp<AudioPort> port);
+ void clearCapabilities();
+
void loadSamplingRates(char *name);
void loadFormats(char *name);
void loadOutChannels(char *name);
@@ -628,7 +631,7 @@ protected:
// when a device is disconnected, checks if an output is not used any more and
// returns its handle if any.
// transfers the audio tracks and effects from one output thread to another accordingly.
- status_t checkOutputsForDevice(audio_devices_t device,
+ status_t checkOutputsForDevice(const sp<DeviceDescriptor> devDesc,
audio_policy_dev_state_t state,
SortedVector<audio_io_handle_t>& outputs,
const String8 address);