Transport AudioPort to HAL
This CL is part of a chain of CLs to make
AudioManager#setWiredDeviceConnectionState contain information about the
device's supported capabilities. This CL takes care of some required
downstream changes:
- Adapt arguments of AudioSystem#setDeviceConnectionState to AudioPort,
which contains the device type, address, name and supported capabilities
- Adapt arguments of downstream methods as well,
until AudioPolicyManager#setDeviceConnectionStateInt
In AudioPolicyManager#setDeviceConnectionStateInt, AudioPort is
converted back to the previously used arguments (type, address, name)
before calling into mHwModules. In a follow-up change, mHwModules will
need to be adapted to take on the AudioPort argument as well.
Bug: 199846845
Test: atest audio_health_tests && atest audiopolicy_tests
Change-Id: I4f6b038f863aaadf2e3e05c37c181f9ae41c9e2f
diff --git a/media/libaudioclient/AudioSystem.cpp b/media/libaudioclient/AudioSystem.cpp
index be81481..40efb38 100644
--- a/media/libaudioclient/AudioSystem.cpp
+++ b/media/libaudioclient/AudioSystem.cpp
@@ -834,33 +834,18 @@
aps->onNewAudioModulesAvailable();
}
-status_t AudioSystem::setDeviceConnectionState(audio_devices_t device,
- audio_policy_dev_state_t state,
- const char* device_address,
- const char* device_name,
+status_t AudioSystem::setDeviceConnectionState(audio_policy_dev_state_t state,
+ const android::media::audio::common::AudioPort& port,
audio_format_t encodedFormat) {
const sp<IAudioPolicyService>& aps = AudioSystem::get_audio_policy_service();
- const char* address = "";
- const char* name = "";
if (aps == 0) return PERMISSION_DENIED;
- if (device_address != NULL) {
- address = device_address;
- }
- if (device_name != NULL) {
- name = device_name;
- }
-
- AudioDevice deviceAidl = VALUE_OR_RETURN_STATUS(
- legacy2aidl_audio_device_AudioDevice(device, address));
-
return statusTFromBinderStatus(
aps->setDeviceConnectionState(
- deviceAidl,
VALUE_OR_RETURN_STATUS(
legacy2aidl_audio_policy_dev_state_t_AudioPolicyDeviceState(state)),
- name,
+ port,
VALUE_OR_RETURN_STATUS(
legacy2aidl_audio_format_t_AudioFormatDescription(encodedFormat))));
}
diff --git a/media/libaudioclient/aidl/android/media/IAudioPolicyService.aidl b/media/libaudioclient/aidl/android/media/IAudioPolicyService.aidl
index c3e8dfb..69328a7 100644
--- a/media/libaudioclient/aidl/android/media/IAudioPolicyService.aidl
+++ b/media/libaudioclient/aidl/android/media/IAudioPolicyService.aidl
@@ -50,6 +50,7 @@
import android.media.audio.common.AudioMode;
import android.media.audio.common.AudioProfile;
import android.media.audio.common.AudioOffloadInfo;
+import android.media.audio.common.AudioPort;
import android.media.audio.common.AudioSource;
import android.media.audio.common.AudioStreamType;
import android.media.audio.common.AudioUsage;
@@ -64,9 +65,8 @@
interface IAudioPolicyService {
oneway void onNewAudioModulesAvailable();
- void setDeviceConnectionState(in AudioDevice device,
- in AudioPolicyDeviceState state,
- @utf8InCpp String deviceName,
+ void setDeviceConnectionState(in AudioPolicyDeviceState state,
+ in android.media.audio.common.AudioPort port,
in AudioFormatDescription encodedFormat);
AudioPolicyDeviceState getDeviceConnectionState(in AudioDevice device);
diff --git a/media/libaudioclient/include/media/AudioSystem.h b/media/libaudioclient/include/media/AudioSystem.h
index 4280a6a..e0cb47e 100644
--- a/media/libaudioclient/include/media/AudioSystem.h
+++ b/media/libaudioclient/include/media/AudioSystem.h
@@ -30,6 +30,7 @@
#include <android/media/ISpatializer.h>
#include <android/media/audio/common/AudioMMapPolicyInfo.h>
#include <android/media/audio/common/AudioMMapPolicyType.h>
+#include <android/media/audio/common/AudioPort.h>
#include <media/AidlConversionUtil.h>
#include <media/AudioContainers.h>
#include <media/AudioDeviceTypeAddr.h>
@@ -263,8 +264,8 @@
// IAudioPolicyService interface (see AudioPolicyInterface for method descriptions)
//
static void onNewAudioModulesAvailable();
- static status_t setDeviceConnectionState(audio_devices_t device, audio_policy_dev_state_t state,
- const char *device_address, const char *device_name,
+ static status_t setDeviceConnectionState(audio_policy_dev_state_t state,
+ const android::media::audio::common::AudioPort& port,
audio_format_t encodedFormat);
static audio_policy_dev_state_t getDeviceConnectionState(audio_devices_t device,
const char *device_address);
diff --git a/services/audiopolicy/AudioPolicyInterface.h b/services/audiopolicy/AudioPolicyInterface.h
index e8e478b..3e8f7aa 100644
--- a/services/audiopolicy/AudioPolicyInterface.h
+++ b/services/audiopolicy/AudioPolicyInterface.h
@@ -105,10 +105,8 @@
virtual void onNewAudioModulesAvailable() = 0;
// indicate a change in device connection status
- virtual status_t setDeviceConnectionState(audio_devices_t device,
- audio_policy_dev_state_t state,
- const char *device_address,
- const char *device_name,
+ virtual status_t setDeviceConnectionState(audio_policy_dev_state_t state,
+ const android::media::audio::common::AudioPort& port,
audio_format_t encodedFormat) = 0;
// retrieve a device connection status
virtual audio_policy_dev_state_t getDeviceConnectionState(audio_devices_t device,
diff --git a/services/audiopolicy/managerdefault/Android.bp b/services/audiopolicy/managerdefault/Android.bp
index 0165dc8..4b4817e 100644
--- a/services/audiopolicy/managerdefault/Android.bp
+++ b/services/audiopolicy/managerdefault/Android.bp
@@ -36,6 +36,8 @@
"libaudiopolicyenginedefault",
"framework-permission-aidl-cpp",
"libaudioclient_aidl_conversion",
+ "android.media.audio.common.types-V1-cpp",
+ "audioclient-types-aidl-cpp",
],
header_libs: [
diff --git a/services/audiopolicy/managerdefault/AudioPolicyManager.cpp b/services/audiopolicy/managerdefault/AudioPolicyManager.cpp
index bd295ce..438d567 100644
--- a/services/audiopolicy/managerdefault/AudioPolicyManager.cpp
+++ b/services/audiopolicy/managerdefault/AudioPolicyManager.cpp
@@ -38,6 +38,7 @@
#include <vector>
#include <Serializer.h>
+#include <android/media/audio/common/AudioPort.h>
#include <cutils/bitops.h>
#include <cutils/properties.h>
#include <media/AudioParameter.h>
@@ -53,6 +54,10 @@
namespace android {
+using android::media::audio::common::AudioDevice;
+using android::media::audio::common::AudioDeviceAddress;
+using android::media::audio::common::AudioPortDeviceExt;
+using android::media::audio::common::AudioPortExt;
using content::AttributionSourceState;
//FIXME: workaround for truncated touch sounds
@@ -97,18 +102,28 @@
// AudioPolicyInterface implementation
// ----------------------------------------------------------------------------
-status_t AudioPolicyManager::setDeviceConnectionState(audio_devices_t device,
- audio_policy_dev_state_t state,
- const char *device_address,
- const char *device_name,
- audio_format_t encodedFormat)
-{
- status_t status = setDeviceConnectionStateInt(device, state, device_address,
- device_name, encodedFormat);
+status_t AudioPolicyManager::setDeviceConnectionState(audio_policy_dev_state_t state,
+ const android::media::audio::common::AudioPort& port, audio_format_t encodedFormat) {
+ status_t status = setDeviceConnectionStateInt(state, port, encodedFormat);
nextAudioPortGeneration();
return status;
}
+status_t AudioPolicyManager::setDeviceConnectionState(audio_devices_t device,
+ audio_policy_dev_state_t state,
+ const char* device_address,
+ const char* device_name,
+ audio_format_t encodedFormat) {
+ media::AudioPort aidlPort;
+ if (status_t status = deviceToAudioPort(device, device_address, device_name, &aidlPort);
+ status == OK) {
+ return setDeviceConnectionState(state, aidlPort.hal, encodedFormat);
+ } else {
+ ALOGE("Failed to convert to AudioPort Parcelable: %s", statusToString(status).c_str());
+ return status;
+ }
+}
+
void AudioPolicyManager::broadcastDeviceConnectionState(const sp<DeviceDescriptor> &device,
audio_policy_dev_state_t state)
{
@@ -119,22 +134,45 @@
mpClientInterface->setParameters(AUDIO_IO_HANDLE_NONE, param.toString());
}
+status_t AudioPolicyManager::setDeviceConnectionStateInt(
+ audio_policy_dev_state_t state, const android::media::audio::common::AudioPort& port,
+ audio_format_t encodedFormat) {
+ // TODO: b/211601178 Forward 'port' to Audio HAL via mHwModules. For now, only device_type,
+ // device_address and device_name are forwarded.
+ if (port.ext.getTag() != AudioPortExt::device) {
+ return BAD_VALUE;
+ }
+ audio_devices_t device_type;
+ std::string device_address;
+ if (status_t status = aidl2legacy_AudioDevice_audio_device(
+ port.ext.get<AudioPortExt::device>().device, &device_type, &device_address);
+ status != OK) {
+ return status;
+ };
+ const char* device_name = port.name.c_str();
+ // connect/disconnect only 1 device at a time
+ if (!audio_is_output_device(device_type) && !audio_is_input_device(device_type))
+ return BAD_VALUE;
+
+ sp<DeviceDescriptor> device = mHwModules.getDeviceDescriptor(
+ device_type, device_address.c_str(), device_name, encodedFormat,
+ state == AUDIO_POLICY_DEVICE_STATE_AVAILABLE);
+ return device ? setDeviceConnectionStateInt(device, state) : INVALID_OPERATION;
+}
+
status_t AudioPolicyManager::setDeviceConnectionStateInt(audio_devices_t deviceType,
audio_policy_dev_state_t state,
- const char *device_address,
- const char *device_name,
- audio_format_t encodedFormat)
-{
- ALOGV("setDeviceConnectionStateInt() device: 0x%X, state %d, address %s name %s format 0x%X",
- deviceType, state, device_address, device_name, encodedFormat);
-
- // connect/disconnect only 1 device at a time
- if (!audio_is_output_device(deviceType) && !audio_is_input_device(deviceType)) return BAD_VALUE;
-
- sp<DeviceDescriptor> device =
- mHwModules.getDeviceDescriptor(deviceType, device_address, device_name, encodedFormat,
- state == AUDIO_POLICY_DEVICE_STATE_AVAILABLE);
- return device ? setDeviceConnectionStateInt(device, state) : INVALID_OPERATION;
+ const char* device_address,
+ const char* device_name,
+ audio_format_t encodedFormat) {
+ media::AudioPort aidlPort;
+ if (status_t status = deviceToAudioPort(deviceType, device_address, device_name, &aidlPort);
+ status == OK) {
+ return setDeviceConnectionStateInt(state, aidlPort.hal, encodedFormat);
+ } else {
+ ALOGE("Failed to convert to AudioPort Parcelable: %s", statusToString(status).c_str());
+ return status;
+ }
}
status_t AudioPolicyManager::setDeviceConnectionStateInt(const sp<DeviceDescriptor> &device,
@@ -399,6 +437,14 @@
return BAD_VALUE;
}
+status_t AudioPolicyManager::deviceToAudioPort(audio_devices_t device, const char* device_address,
+ const char* device_name,
+ media::AudioPort* aidlPort) {
+ DeviceDescriptorBase devDescr(device, device_address);
+ devDescr.setName(device_name);
+ return devDescr.writeToParcelable(aidlPort);
+}
+
void AudioPolicyManager::setEngineDeviceConnectionState(const sp<DeviceDescriptor> device,
audio_policy_dev_state_t state) {
diff --git a/services/audiopolicy/managerdefault/AudioPolicyManager.h b/services/audiopolicy/managerdefault/AudioPolicyManager.h
index 165ac13..a145c70 100644
--- a/services/audiopolicy/managerdefault/AudioPolicyManager.h
+++ b/services/audiopolicy/managerdefault/AudioPolicyManager.h
@@ -35,6 +35,7 @@
#include <media/PatchBuilder.h>
#include "AudioPolicyInterface.h"
+#include <android/media/audio/common/AudioPort.h>
#include <AudioPolicyManagerObserver.h>
#include <AudioPolicyConfig.h>
#include <PolicyAudioPort.h>
@@ -95,11 +96,8 @@
virtual ~AudioPolicyManager();
// AudioPolicyInterface
- virtual status_t setDeviceConnectionState(audio_devices_t device,
- audio_policy_dev_state_t state,
- const char *device_address,
- const char *device_name,
- audio_format_t encodedFormat);
+ virtual status_t setDeviceConnectionState(audio_policy_dev_state_t state,
+ const android::media::audio::common::AudioPort& port, audio_format_t encodedFormat);
virtual audio_policy_dev_state_t getDeviceConnectionState(audio_devices_t device,
const char *device_address);
virtual status_t handleDeviceConfigChange(audio_devices_t device,
@@ -911,6 +909,16 @@
PatchBuilder buildMsdPatch(bool msdIsSource, const sp<DeviceDescriptor> &device) const;
status_t setMsdOutputPatches(const DeviceVector *outputDevices = nullptr);
void releaseMsdOutputPatches(const DeviceVector& devices);
+
+ // Overload of setDeviceConnectionState()
+ status_t setDeviceConnectionState(audio_devices_t deviceType,
+ audio_policy_dev_state_t state,
+ const char* device_address, const char* device_name,
+ audio_format_t encodedFormat);
+
+ // Called by setDeviceConnectionState()
+ status_t deviceToAudioPort(audio_devices_t deviceType, const char* device_address,
+ const char* device_name, media::AudioPort* aidPort);
private:
void onNewAudioModulesAvailableInt(DeviceVector *newDevices);
@@ -1030,6 +1038,9 @@
bool isValidAttributes(const audio_attributes_t *paa);
// Called by setDeviceConnectionState().
+ status_t setDeviceConnectionStateInt(audio_policy_dev_state_t state,
+ const android::media::audio::common::AudioPort& port,
+ audio_format_t encodedFormat);
status_t setDeviceConnectionStateInt(audio_devices_t deviceType,
audio_policy_dev_state_t state,
const char *device_address,
diff --git a/services/audiopolicy/service/AudioPolicyInterfaceImpl.cpp b/services/audiopolicy/service/AudioPolicyInterfaceImpl.cpp
index 87a350f..582c048 100644
--- a/services/audiopolicy/service/AudioPolicyInterfaceImpl.cpp
+++ b/services/audiopolicy/service/AudioPolicyInterfaceImpl.cpp
@@ -119,14 +119,9 @@
}
Status AudioPolicyService::setDeviceConnectionState(
- const AudioDevice& deviceAidl,
media::AudioPolicyDeviceState stateAidl,
- const std::string& deviceNameAidl,
+ const android::media::audio::common::AudioPort& port,
const AudioFormatDescription& encodedFormatAidl) {
- audio_devices_t device;
- std::string address;
- RETURN_BINDER_STATUS_IF_ERROR(
- aidl2legacy_AudioDevice_audio_device(deviceAidl, &device, &address));
audio_policy_dev_state_t state = VALUE_OR_RETURN_BINDER_STATUS(
aidl2legacy_AudioPolicyDeviceState_audio_policy_dev_state_t(stateAidl));
audio_format_t encodedFormat = VALUE_OR_RETURN_BINDER_STATUS(
@@ -147,7 +142,7 @@
Mutex::Autolock _l(mLock);
AutoCallerClear acc;
status_t status = mAudioPolicyManager->setDeviceConnectionState(
- device, state, address.c_str(), deviceNameAidl.c_str(), encodedFormat);
+ state, port, encodedFormat);
if (status == NO_ERROR) {
onCheckSpatializer_l();
}
diff --git a/services/audiopolicy/service/AudioPolicyService.h b/services/audiopolicy/service/AudioPolicyService.h
index ac5af6b..6c1d1a9 100644
--- a/services/audiopolicy/service/AudioPolicyService.h
+++ b/services/audiopolicy/service/AudioPolicyService.h
@@ -82,9 +82,8 @@
//
binder::Status onNewAudioModulesAvailable() override;
binder::Status setDeviceConnectionState(
- const AudioDevice& device,
media::AudioPolicyDeviceState state,
- const std::string& deviceName,
+ const android::media::audio::common::AudioPort& port,
const AudioFormatDescription& encodedFormat) override;
binder::Status getDeviceConnectionState(const AudioDevice& device,
media::AudioPolicyDeviceState* _aidl_return) override;