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,
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> iEffect;
sp<IMemory> 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<IAudioFlinger>& 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)) {

@ -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<IEffect> 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<IEffect> effect = createEffect(&desc, client, priority, output, sessionId,
sp<IEffect> effect = createEffect(&desc, client, priority, output, sessionId, device,
opPackageName, pid, &status, &id, &enabled);
reply->writeInt32(status);
reply->writeInt32(id);

@ -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

@ -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,

@ -3319,6 +3319,7 @@ sp<IEffect> 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<IEffect> 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.

@ -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*/,

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

Loading…
Cancel
Save