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
gugelfrei
Eric Laurent 5 years ago
parent b7a56c52e0
commit 9487603487

@ -48,12 +48,13 @@ AudioEffect::AudioEffect(const effect_uuid_t *type,
effect_callback_t cbf, effect_callback_t cbf,
void* user, void* user,
audio_session_t sessionId, audio_session_t sessionId,
audio_io_handle_t io audio_io_handle_t io,
const AudioDeviceTypeAddr& device
) )
: mStatus(NO_INIT), mOpPackageName(opPackageName) : mStatus(NO_INIT), mOpPackageName(opPackageName)
{ {
AutoMutex lock(mConstructLock); 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, AudioEffect::AudioEffect(const char *typeStr,
@ -63,7 +64,8 @@ AudioEffect::AudioEffect(const char *typeStr,
effect_callback_t cbf, effect_callback_t cbf,
void* user, void* user,
audio_session_t sessionId, audio_session_t sessionId,
audio_io_handle_t io audio_io_handle_t io,
const AudioDeviceTypeAddr& device
) )
: mStatus(NO_INIT), mOpPackageName(opPackageName) : mStatus(NO_INIT), mOpPackageName(opPackageName)
{ {
@ -87,7 +89,7 @@ AudioEffect::AudioEffect(const char *typeStr,
} }
AutoMutex lock(mConstructLock); 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, 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, effect_callback_t cbf,
void* user, void* user,
audio_session_t sessionId, audio_session_t sessionId,
audio_io_handle_t io) audio_io_handle_t io,
const AudioDeviceTypeAddr& device)
{ {
sp<IEffect> iEffect; sp<IEffect> iEffect;
sp<IMemory> cblk; sp<IMemory> cblk;
@ -109,6 +112,10 @@ status_t AudioEffect::set(const effect_uuid_t *type,
return INVALID_OPERATION; 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<IAudioFlinger>& audioFlinger = AudioSystem::get_audio_flinger(); const sp<IAudioFlinger>& audioFlinger = AudioSystem::get_audio_flinger();
if (audioFlinger == 0) { if (audioFlinger == 0) {
ALOGE("set(): Could not get audioflinger"); ALOGE("set(): Could not get audioflinger");
@ -133,7 +140,7 @@ status_t AudioEffect::set(const effect_uuid_t *type,
mClientPid = IPCThreadState::self()->getCallingPid(); mClientPid = IPCThreadState::self()->getCallingPid();
iEffect = audioFlinger->createEffect((effect_descriptor_t *)&mDescriptor, iEffect = audioFlinger->createEffect((effect_descriptor_t *)&mDescriptor,
mIEffectClient, priority, io, mSessionId, mOpPackageName, mClientPid, mIEffectClient, priority, io, mSessionId, device, mOpPackageName, mClientPid,
&mStatus, &mId, &enabled); &mStatus, &mId, &enabled);
if (iEffect == 0 || (mStatus != NO_ERROR && mStatus != ALREADY_EXISTS)) { if (iEffect == 0 || (mStatus != NO_ERROR && mStatus != ALREADY_EXISTS)) {

@ -658,6 +658,7 @@ public:
int32_t priority, int32_t priority,
audio_io_handle_t output, audio_io_handle_t output,
audio_session_t sessionId, audio_session_t sessionId,
const AudioDeviceTypeAddr& device,
const String16& opPackageName, const String16& opPackageName,
pid_t pid, pid_t pid,
status_t *status, status_t *status,
@ -666,12 +667,11 @@ public:
{ {
Parcel data, reply; Parcel data, reply;
sp<IEffect> effect; sp<IEffect> effect;
if (pDesc == NULL) { if (pDesc == NULL) {
if (status != NULL) { if (status != NULL) {
*status = BAD_VALUE; *status = BAD_VALUE;
} }
return effect; return nullptr;
} }
data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());
@ -680,6 +680,12 @@ public:
data.writeInt32(priority); data.writeInt32(priority);
data.writeInt32((int32_t) output); data.writeInt32((int32_t) output);
data.writeInt32(sessionId); data.writeInt32(sessionId);
if (data.writeParcelable(device) != NO_ERROR) {
if (status != NULL) {
*status = NO_INIT;
}
return nullptr;
}
data.writeString16(opPackageName); data.writeString16(opPackageName);
data.writeInt32((int32_t) pid); data.writeInt32((int32_t) pid);
@ -1380,14 +1386,18 @@ status_t BnAudioFlinger::onTransact(
int32_t priority = data.readInt32(); int32_t priority = data.readInt32();
audio_io_handle_t output = (audio_io_handle_t) data.readInt32(); audio_io_handle_t output = (audio_io_handle_t) data.readInt32();
audio_session_t sessionId = (audio_session_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(); const String16 opPackageName = data.readString16();
pid_t pid = (pid_t)data.readInt32(); pid_t pid = (pid_t)data.readInt32();
status_t status = NO_ERROR;
int id = 0; int id = 0;
int enabled = 0; int enabled = 0;
sp<IEffect> effect = createEffect(&desc, client, priority, output, sessionId, sp<IEffect> effect = createEffect(&desc, client, priority, output, sessionId, device,
opPackageName, pid, &status, &id, &enabled); opPackageName, pid, &status, &id, &enabled);
reply->writeInt32(status); reply->writeInt32(status);
reply->writeInt32(id); reply->writeInt32(id);

@ -362,17 +362,21 @@ public:
* (AudioTrack or MediaPLayer) within the same audio session. * (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 * io: HAL audio output or input stream to which this effect must be attached. Leave at 0 for
* automatic output selection by AudioFlinger. * 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, AudioEffect(const effect_uuid_t *type,
const String16& opPackageName, const String16& opPackageName,
const effect_uuid_t *uuid = NULL, const effect_uuid_t *uuid = NULL,
int32_t priority = 0, int32_t priority = 0,
effect_callback_t cbf = NULL, effect_callback_t cbf = NULL,
void* user = NULL, void* user = NULL,
audio_session_t sessionId = AUDIO_SESSION_OUTPUT_MIX, 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 = {}
);
/* Constructor. /* Constructor.
* Same as above but with type and uuid specified by character strings * Same as above but with type and uuid specified by character strings
@ -384,7 +388,8 @@ public:
effect_callback_t cbf = NULL, effect_callback_t cbf = NULL,
void* user = NULL, void* user = NULL,
audio_session_t sessionId = AUDIO_SESSION_OUTPUT_MIX, 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. /* Terminates the AudioEffect and unregisters it from AudioFlinger.
@ -406,7 +411,8 @@ public:
effect_callback_t cbf = NULL, effect_callback_t cbf = NULL,
void* user = NULL, void* user = NULL,
audio_session_t sessionId = AUDIO_SESSION_OUTPUT_MIX, 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 /* Result of constructing the AudioEffect. This must be checked

@ -465,6 +465,7 @@ public:
// AudioFlinger doesn't take over handle reference from client // AudioFlinger doesn't take over handle reference from client
audio_io_handle_t output, audio_io_handle_t output,
audio_session_t sessionId, audio_session_t sessionId,
const AudioDeviceTypeAddr& device,
const String16& callingPackage, const String16& callingPackage,
pid_t pid, pid_t pid,
status_t *status, status_t *status,

@ -3319,6 +3319,7 @@ sp<IEffect> AudioFlinger::createEffect(
int32_t priority, int32_t priority,
audio_io_handle_t io, audio_io_handle_t io,
audio_session_t sessionId, audio_session_t sessionId,
const AudioDeviceTypeAddr& device __unused,
const String16& opPackageName, const String16& opPackageName,
pid_t pid, pid_t pid,
status_t *status, status_t *status,
@ -3377,6 +3378,11 @@ sp<IEffect> AudioFlinger::createEffect(
lStatus = PERMISSION_DENIED; lStatus = PERMISSION_DENIED;
goto Exit; 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 //TODO: add check on device ID when added to arguments
} else { } else {
// general sessionId. // general sessionId.

@ -232,6 +232,7 @@ public:
int32_t priority, int32_t priority,
audio_io_handle_t io, audio_io_handle_t io,
audio_session_t sessionId, audio_session_t sessionId,
const AudioDeviceTypeAddr& device,
const String16& opPackageName, const String16& opPackageName,
pid_t pid, pid_t pid,
status_t *status /*non-NULL*/, status_t *status /*non-NULL*/,

@ -24,6 +24,7 @@ LOCAL_SHARED_LIBRARIES := \
libbinder \ libbinder \
libaudioclient \ libaudioclient \
libaudioutils \ libaudioutils \
libaudiofoundation \
libhardware_legacy \ libhardware_legacy \
libaudiopolicymanager \ libaudiopolicymanager \
libmedia_helper \ libmedia_helper \

Loading…
Cancel
Save