From 94876034876afd6f642dd1a0ad7c60aee05504d9 Mon Sep 17 00:00:00 2001 From: Eric Laurent Date: Wed, 13 Nov 2019 12:45:28 -0800 Subject: [PATCH] AudioEffect: add device descriptor to AudioEffect constructor Add the possibility to specify a target audio device when creating an audio effect by passing its type and address to AudioEffect constructor. When doing so, the session ID must be AUDIO_SESSION_DEVICE. Bug: 136294538 Test: make Change-Id: I2a2eba340d3c2537285c091e9a53f305ff161a2b --- media/libaudioclient/AudioEffect.cpp | 19 +++++++++++----- media/libaudioclient/IAudioFlinger.cpp | 18 +++++++++++---- .../include/media/AudioEffect.h | 22 ++++++++++++------- .../include/media/IAudioFlinger.h | 1 + services/audioflinger/AudioFlinger.cpp | 6 +++++ services/audioflinger/AudioFlinger.h | 1 + services/audiopolicy/service/Android.mk | 1 + 7 files changed, 50 insertions(+), 18 deletions(-) diff --git a/media/libaudioclient/AudioEffect.cpp b/media/libaudioclient/AudioEffect.cpp index b3862beeca..7d5b690b49 100644 --- a/media/libaudioclient/AudioEffect.cpp +++ b/media/libaudioclient/AudioEffect.cpp @@ -48,12 +48,13 @@ AudioEffect::AudioEffect(const effect_uuid_t *type, effect_callback_t cbf, void* user, audio_session_t sessionId, - audio_io_handle_t io + audio_io_handle_t io, + const AudioDeviceTypeAddr& device ) : mStatus(NO_INIT), mOpPackageName(opPackageName) { AutoMutex lock(mConstructLock); - mStatus = set(type, uuid, priority, cbf, user, sessionId, io); + mStatus = set(type, uuid, priority, cbf, user, sessionId, io, device); } AudioEffect::AudioEffect(const char *typeStr, @@ -63,7 +64,8 @@ AudioEffect::AudioEffect(const char *typeStr, effect_callback_t cbf, void* user, audio_session_t sessionId, - audio_io_handle_t io + audio_io_handle_t io, + const AudioDeviceTypeAddr& device ) : mStatus(NO_INIT), mOpPackageName(opPackageName) { @@ -87,7 +89,7 @@ AudioEffect::AudioEffect(const char *typeStr, } AutoMutex lock(mConstructLock); - mStatus = set(pType, pUuid, priority, cbf, user, sessionId, io); + mStatus = set(pType, pUuid, priority, cbf, user, sessionId, io, device); } status_t AudioEffect::set(const effect_uuid_t *type, @@ -96,7 +98,8 @@ status_t AudioEffect::set(const effect_uuid_t *type, effect_callback_t cbf, void* user, audio_session_t sessionId, - audio_io_handle_t io) + audio_io_handle_t io, + const AudioDeviceTypeAddr& device) { sp iEffect; sp cblk; @@ -109,6 +112,10 @@ status_t AudioEffect::set(const effect_uuid_t *type, return INVALID_OPERATION; } + if (sessionId == AUDIO_SESSION_DEVICE && io != AUDIO_IO_HANDLE_NONE) { + ALOGW("IO handle should not be specified for device effect"); + return BAD_VALUE; + } const sp& audioFlinger = AudioSystem::get_audio_flinger(); if (audioFlinger == 0) { ALOGE("set(): Could not get audioflinger"); @@ -133,7 +140,7 @@ status_t AudioEffect::set(const effect_uuid_t *type, mClientPid = IPCThreadState::self()->getCallingPid(); iEffect = audioFlinger->createEffect((effect_descriptor_t *)&mDescriptor, - mIEffectClient, priority, io, mSessionId, mOpPackageName, mClientPid, + mIEffectClient, priority, io, mSessionId, device, mOpPackageName, mClientPid, &mStatus, &mId, &enabled); if (iEffect == 0 || (mStatus != NO_ERROR && mStatus != ALREADY_EXISTS)) { diff --git a/media/libaudioclient/IAudioFlinger.cpp b/media/libaudioclient/IAudioFlinger.cpp index 04ef3dd902..cbc98bd1a0 100644 --- a/media/libaudioclient/IAudioFlinger.cpp +++ b/media/libaudioclient/IAudioFlinger.cpp @@ -658,6 +658,7 @@ public: int32_t priority, audio_io_handle_t output, audio_session_t sessionId, + const AudioDeviceTypeAddr& device, const String16& opPackageName, pid_t pid, status_t *status, @@ -666,12 +667,11 @@ public: { Parcel data, reply; sp effect; - if (pDesc == NULL) { if (status != NULL) { *status = BAD_VALUE; } - return effect; + return nullptr; } data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); @@ -680,6 +680,12 @@ public: data.writeInt32(priority); data.writeInt32((int32_t) output); data.writeInt32(sessionId); + if (data.writeParcelable(device) != NO_ERROR) { + if (status != NULL) { + *status = NO_INIT; + } + return nullptr; + } data.writeString16(opPackageName); data.writeInt32((int32_t) pid); @@ -1380,14 +1386,18 @@ status_t BnAudioFlinger::onTransact( int32_t priority = data.readInt32(); audio_io_handle_t output = (audio_io_handle_t) data.readInt32(); audio_session_t sessionId = (audio_session_t) data.readInt32(); + AudioDeviceTypeAddr device; + status_t status = NO_ERROR; + if ((status = data.readParcelable(&device)) != NO_ERROR) { + return status; + } const String16 opPackageName = data.readString16(); pid_t pid = (pid_t)data.readInt32(); - status_t status = NO_ERROR; int id = 0; int enabled = 0; - sp effect = createEffect(&desc, client, priority, output, sessionId, + sp effect = createEffect(&desc, client, priority, output, sessionId, device, opPackageName, pid, &status, &id, &enabled); reply->writeInt32(status); reply->writeInt32(id); diff --git a/media/libaudioclient/include/media/AudioEffect.h b/media/libaudioclient/include/media/AudioEffect.h index 6bd4137569..f17d7377ab 100644 --- a/media/libaudioclient/include/media/AudioEffect.h +++ b/media/libaudioclient/include/media/AudioEffect.h @@ -362,17 +362,21 @@ public: * (AudioTrack or MediaPLayer) within the same audio session. * io: HAL audio output or input stream to which this effect must be attached. Leave at 0 for * automatic output selection by AudioFlinger. + * device: An audio device descriptor. Only used when "sessionID" is AUDIO_SESSION_DEVICE. + * Specifies the audio device type and address the effect must be attached to. + * If "sessionID" is AUDIO_SESSION_DEVICE then "io" must be AUDIO_IO_HANDLE_NONE. */ AudioEffect(const effect_uuid_t *type, const String16& opPackageName, const effect_uuid_t *uuid = NULL, - int32_t priority = 0, - effect_callback_t cbf = NULL, - void* user = NULL, - audio_session_t sessionId = AUDIO_SESSION_OUTPUT_MIX, - audio_io_handle_t io = AUDIO_IO_HANDLE_NONE - ); + int32_t priority = 0, + effect_callback_t cbf = NULL, + void* user = NULL, + audio_session_t sessionId = AUDIO_SESSION_OUTPUT_MIX, + audio_io_handle_t io = AUDIO_IO_HANDLE_NONE, + const AudioDeviceTypeAddr& device = {} + ); /* Constructor. * Same as above but with type and uuid specified by character strings @@ -384,7 +388,8 @@ public: effect_callback_t cbf = NULL, void* user = NULL, audio_session_t sessionId = AUDIO_SESSION_OUTPUT_MIX, - audio_io_handle_t io = AUDIO_IO_HANDLE_NONE + audio_io_handle_t io = AUDIO_IO_HANDLE_NONE, + const AudioDeviceTypeAddr& device = {} ); /* Terminates the AudioEffect and unregisters it from AudioFlinger. @@ -406,7 +411,8 @@ public: effect_callback_t cbf = NULL, void* user = NULL, audio_session_t sessionId = AUDIO_SESSION_OUTPUT_MIX, - audio_io_handle_t io = AUDIO_IO_HANDLE_NONE + audio_io_handle_t io = AUDIO_IO_HANDLE_NONE, + const AudioDeviceTypeAddr& device = {} ); /* Result of constructing the AudioEffect. This must be checked diff --git a/media/libaudioclient/include/media/IAudioFlinger.h b/media/libaudioclient/include/media/IAudioFlinger.h index 97155e4da2..8703f55fc1 100644 --- a/media/libaudioclient/include/media/IAudioFlinger.h +++ b/media/libaudioclient/include/media/IAudioFlinger.h @@ -465,6 +465,7 @@ public: // AudioFlinger doesn't take over handle reference from client audio_io_handle_t output, audio_session_t sessionId, + const AudioDeviceTypeAddr& device, const String16& callingPackage, pid_t pid, status_t *status, diff --git a/services/audioflinger/AudioFlinger.cpp b/services/audioflinger/AudioFlinger.cpp index 7b016905f1..496aec14dc 100644 --- a/services/audioflinger/AudioFlinger.cpp +++ b/services/audioflinger/AudioFlinger.cpp @@ -3319,6 +3319,7 @@ sp AudioFlinger::createEffect( int32_t priority, audio_io_handle_t io, audio_session_t sessionId, + const AudioDeviceTypeAddr& device __unused, const String16& opPackageName, pid_t pid, status_t *status, @@ -3377,6 +3378,11 @@ sp AudioFlinger::createEffect( lStatus = PERMISSION_DENIED; goto Exit; } + if (io != AUDIO_IO_HANDLE_NONE) { + ALOGE("%s: io handle should not be specified for device effect", __func__); + lStatus = BAD_VALUE; + goto Exit; + } //TODO: add check on device ID when added to arguments } else { // general sessionId. diff --git a/services/audioflinger/AudioFlinger.h b/services/audioflinger/AudioFlinger.h index 3b6bbdb244..eb851ec886 100644 --- a/services/audioflinger/AudioFlinger.h +++ b/services/audioflinger/AudioFlinger.h @@ -232,6 +232,7 @@ public: int32_t priority, audio_io_handle_t io, audio_session_t sessionId, + const AudioDeviceTypeAddr& device, const String16& opPackageName, pid_t pid, status_t *status /*non-NULL*/, diff --git a/services/audiopolicy/service/Android.mk b/services/audiopolicy/service/Android.mk index c4f4c56087..583e076e2d 100644 --- a/services/audiopolicy/service/Android.mk +++ b/services/audiopolicy/service/Android.mk @@ -24,6 +24,7 @@ LOCAL_SHARED_LIBRARIES := \ libbinder \ libaudioclient \ libaudioutils \ + libaudiofoundation \ libhardware_legacy \ libaudiopolicymanager \ libmedia_helper \