Implement AudioTrack.isDirectPlaybackSupported method
The method checks whether the provided AudioFormat can be played
via currently connected output devices w/o SRC or downmixing
by the framework.
The implementation methods are called 'isDirectOutputSupported'
to match APM's terminology.
Bug: 120044865
Test: atest CtsMediaTestCases:AudioTrackTest#testBuilderValidate
Change-Id: I11769f796c34583fb2641415d2faab00ac526123
diff --git a/media/libaudioclient/IAudioPolicyService.cpp b/media/libaudioclient/IAudioPolicyService.cpp
index a406658..5f47761 100644
--- a/media/libaudioclient/IAudioPolicyService.cpp
+++ b/media/libaudioclient/IAudioPolicyService.cpp
@@ -62,6 +62,7 @@
SET_EFFECT_ENABLED,
IS_STREAM_ACTIVE_REMOTELY,
IS_OFFLOAD_SUPPORTED,
+ IS_DIRECT_OUTPUT_SUPPORTED,
LIST_AUDIO_PORTS,
GET_AUDIO_PORT,
CREATE_AUDIO_PATCH,
@@ -526,6 +527,16 @@
return reply.readInt32();
}
+ virtual bool isDirectOutputSupported(const audio_config_base_t& config,
+ const audio_attributes_t& attributes) {
+ Parcel data, reply;
+ data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor());
+ data.write(&config, sizeof(audio_config_base_t));
+ data.write(&attributes, sizeof(audio_attributes_t));
+ status_t status = remote()->transact(IS_DIRECT_OUTPUT_SUPPORTED, data, &reply);
+ return status == NO_ERROR ? static_cast<bool>(reply.readInt32()) : false;
+ }
+
virtual status_t listAudioPorts(audio_port_role_t role,
audio_port_type_t type,
unsigned int *num_ports,
@@ -1393,6 +1404,18 @@
return NO_ERROR;
}
+ case IS_DIRECT_OUTPUT_SUPPORTED: {
+ CHECK_INTERFACE(IAudioPolicyService, data, reply);
+ audio_config_base_t config = {};
+ audio_attributes_t attributes = {};
+ status_t status = data.read(&config, sizeof(audio_config_base_t));
+ if (status != NO_ERROR) return status;
+ status = data.read(&attributes, sizeof(audio_attributes_t));
+ if (status != NO_ERROR) return status;
+ reply->writeInt32(isDirectOutputSupported(config, attributes));
+ return NO_ERROR;
+ }
+
case LIST_AUDIO_PORTS: {
CHECK_INTERFACE(IAudioPolicyService, data, reply);
audio_port_role_t role = (audio_port_role_t)data.readInt32();