Merge "AudioFlinger: provide downstream sink device to software patch source"
diff --git a/media/libaudiohal/impl/DeviceHalHidl.cpp b/media/libaudiohal/impl/DeviceHalHidl.cpp
index 7a9e843..a1e869f 100644
--- a/media/libaudiohal/impl/DeviceHalHidl.cpp
+++ b/media/libaudiohal/impl/DeviceHalHidl.cpp
@@ -268,6 +268,8 @@
audio_input_flags_t flags,
const char *address,
audio_source_t source,
+ audio_devices_t outputDevice,
+ const char *outputDeviceAddress,
sp<StreamInHalInterface> *inStream) {
if (mDevice == 0) return NO_INIT;
DeviceAddress hidlDevice;
@@ -283,6 +285,17 @@
// for now, only send the main source at 1dbfs
SinkMetadata sinkMetadata = {{{ .source = AudioSource(source), .gain = 1 }}};
#endif
+#if MAJOR_VERSION < 5
+ (void)outputDevice;
+ (void)outputDeviceAddress;
+#else
+ if (outputDevice != AUDIO_DEVICE_NONE) {
+ DeviceAddress hidlOutputDevice;
+ status = deviceAddressFromHal(outputDevice, outputDeviceAddress, &hidlOutputDevice);
+ if (status != OK) return status;
+ sinkMetadata.tracks[0].destination.device(std::move(hidlOutputDevice));
+ }
+#endif
Return<void> ret = mDevice->openInputStream(
handle,
hidlDevice,
diff --git a/media/libaudiohal/impl/DeviceHalHidl.h b/media/libaudiohal/impl/DeviceHalHidl.h
index 291c88f..f7d465f 100644
--- a/media/libaudiohal/impl/DeviceHalHidl.h
+++ b/media/libaudiohal/impl/DeviceHalHidl.h
@@ -86,6 +86,8 @@
audio_input_flags_t flags,
const char *address,
audio_source_t source,
+ audio_devices_t outputDevice,
+ const char *outputDeviceAddress,
sp<StreamInHalInterface> *inStream);
// Returns whether createAudioPatch and releaseAudioPatch operations are supported.
diff --git a/media/libaudiohal/impl/DeviceHalLocal.cpp b/media/libaudiohal/impl/DeviceHalLocal.cpp
index dffe9da..ee68252 100644
--- a/media/libaudiohal/impl/DeviceHalLocal.cpp
+++ b/media/libaudiohal/impl/DeviceHalLocal.cpp
@@ -131,6 +131,8 @@
audio_input_flags_t flags,
const char *address,
audio_source_t source,
+ audio_devices_t /*outputDevice*/,
+ const char */*outputDeviceAddress*/,
sp<StreamInHalInterface> *inStream) {
audio_stream_in_t *halStream;
ALOGV("open_input_stream handle: %d devices: %x flags: %#x "
diff --git a/media/libaudiohal/impl/DeviceHalLocal.h b/media/libaudiohal/impl/DeviceHalLocal.h
index 18bd879..36db72e 100644
--- a/media/libaudiohal/impl/DeviceHalLocal.h
+++ b/media/libaudiohal/impl/DeviceHalLocal.h
@@ -79,6 +79,8 @@
audio_input_flags_t flags,
const char *address,
audio_source_t source,
+ audio_devices_t outputDevice,
+ const char *outputDeviceAddress,
sp<StreamInHalInterface> *inStream);
// Returns whether createAudioPatch and releaseAudioPatch operations are supported.
diff --git a/media/libaudiohal/include/media/audiohal/DeviceHalInterface.h b/media/libaudiohal/include/media/audiohal/DeviceHalInterface.h
index 7de8eb3..e565237 100644
--- a/media/libaudiohal/include/media/audiohal/DeviceHalInterface.h
+++ b/media/libaudiohal/include/media/audiohal/DeviceHalInterface.h
@@ -84,6 +84,8 @@
audio_input_flags_t flags,
const char *address,
audio_source_t source,
+ audio_devices_t outputDevice,
+ const char *outputDeviceAddress,
sp<StreamInHalInterface> *inStream) = 0;
// Returns whether createAudioPatch and releaseAudioPatch operations are supported.
diff --git a/services/audioflinger/AudioFlinger.cpp b/services/audioflinger/AudioFlinger.cpp
index 26f76c0..0d6ef46 100644
--- a/services/audioflinger/AudioFlinger.cpp
+++ b/services/audioflinger/AudioFlinger.cpp
@@ -2379,7 +2379,8 @@
return BAD_VALUE;
}
- sp<ThreadBase> thread = openInput_l(module, input, config, *devices, address, source, flags);
+ sp<ThreadBase> thread = openInput_l(
+ module, input, config, *devices, address, source, flags, AUDIO_DEVICE_NONE, String8{});
if (thread != 0) {
// notify client processes of the new input creation
@@ -2395,7 +2396,9 @@
audio_devices_t devices,
const String8& address,
audio_source_t source,
- audio_input_flags_t flags)
+ audio_input_flags_t flags,
+ audio_devices_t outputDevice,
+ const String8& outputDeviceAddress)
{
AudioHwDevice *inHwDev = findSuitableHwDev_l(module, devices);
if (inHwDev == NULL) {
@@ -2424,7 +2427,8 @@
sp<DeviceHalInterface> inHwHal = inHwDev->hwDevice();
sp<StreamInHalInterface> inStream;
status_t status = inHwHal->openInputStream(
- *input, devices, &halconfig, flags, address.string(), source, &inStream);
+ *input, devices, &halconfig, flags, address.string(), source,
+ outputDevice, outputDeviceAddress, &inStream);
ALOGV("openInput_l() openInputStream returned input %p, devices %#x, SamplingRate %d"
", Format %#x, Channels %#x, flags %#x, status %d addr %s",
inStream.get(),
@@ -2447,7 +2451,8 @@
ALOGV("openInput_l() reopening with proposed sampling rate and channel mask");
inStream.clear();
status = inHwHal->openInputStream(
- *input, devices, &halconfig, flags, address.string(), source, &inStream);
+ *input, devices, &halconfig, flags, address.string(), source,
+ outputDevice, outputDeviceAddress, &inStream);
// FIXME log this new status; HAL should not propose any further changes
}
diff --git a/services/audioflinger/AudioFlinger.h b/services/audioflinger/AudioFlinger.h
index 4c0a5bc..c1169d2 100644
--- a/services/audioflinger/AudioFlinger.h
+++ b/services/audioflinger/AudioFlinger.h
@@ -624,7 +624,9 @@
audio_devices_t device,
const String8& address,
audio_source_t source,
- audio_input_flags_t flags);
+ audio_input_flags_t flags,
+ audio_devices_t outputDevice,
+ const String8& outputDeviceAddress);
sp<ThreadBase> openOutput_l(audio_module_handle_t module,
audio_io_handle_t *output,
audio_config_t *config,
diff --git a/services/audioflinger/PatchPanel.cpp b/services/audioflinger/PatchPanel.cpp
index 63a9ec4..3381e4d 100644
--- a/services/audioflinger/PatchPanel.cpp
+++ b/services/audioflinger/PatchPanel.cpp
@@ -211,6 +211,8 @@
((patch->sinks[0].type == AUDIO_PORT_TYPE_DEVICE) &&
((patch->sinks[0].ext.device.hw_module != srcModule) ||
!audioHwDevice->supportsAudioPatches()))) {
+ audio_devices_t outputDevice = AUDIO_DEVICE_NONE;
+ String8 outputDeviceAddress;
if (patch->num_sources == 2) {
if (patch->sources[1].type != AUDIO_PORT_TYPE_MIX ||
(patch->num_sinks != 0 && patch->sinks[0].ext.device.hw_module !=
@@ -261,6 +263,8 @@
goto exit;
}
newPatch.mPlayback.setThread(reinterpret_cast<PlaybackThread*>(thread.get()));
+ outputDevice = device;
+ outputDeviceAddress = address;
}
audio_devices_t device = patch->sources[0].ext.device.type;
String8 address = String8(patch->sources[0].ext.device.address);
@@ -293,7 +297,9 @@
device,
address,
AUDIO_SOURCE_MIC,
- flags);
+ flags,
+ outputDevice,
+ outputDeviceAddress);
ALOGV("mAudioFlinger.openInput_l() returned %p inChannelMask %08x",
thread.get(), config.channel_mask);
if (thread == 0) {