Skip to content

Commit

Permalink
Add sound trigger control by audio policy
Browse files Browse the repository at this point in the history
Audio policy:
- Added active capture indication to sound trigger service:
recognition stops if concurrent capture is not supported.
- Added generation of reserved I/O handle and session ID for
utterance capture.

Sound trigger service
- Added sound model update callback handling.
- Added service state callback
- Simplified callback shared memory allocation.

Bug: 12378680.

Change-Id: Ib0292c2733e6df90fdae480633dd9953d0016ef1
  • Loading branch information
Eric Laurent committed Aug 5, 2014
1 parent d0fded3 commit df3dc7e
Show file tree
Hide file tree
Showing 22 changed files with 715 additions and 166 deletions.
6 changes: 6 additions & 0 deletions include/media/AudioSystem.h
Expand Up @@ -309,6 +309,12 @@ class AudioSystem
/* Set audio port configuration */
static status_t setAudioPortConfig(const struct audio_port_config *config);


static status_t acquireSoundTriggerSession(audio_session_t *session,
audio_io_handle_t *ioHandle,
audio_devices_t *device);
static status_t releaseSoundTriggerSession(audio_session_t session);

// ----------------------------------------------------------------------------

class AudioPortCallback : public RefBase
Expand Down
6 changes: 6 additions & 0 deletions include/media/IAudioPolicyService.h
Expand Up @@ -136,6 +136,12 @@ class IAudioPolicyService : public IInterface
virtual status_t setAudioPortConfig(const struct audio_port_config *config) = 0;

virtual void registerClient(const sp<IAudioPolicyServiceClient>& client) = 0;

virtual status_t acquireSoundTriggerSession(audio_session_t *session,
audio_io_handle_t *ioHandle,
audio_devices_t *device) = 0;

virtual status_t releaseSoundTriggerSession(audio_session_t session) = 0;
};


Expand Down
4 changes: 4 additions & 0 deletions include/soundtrigger/ISoundTriggerClient.h
Expand Up @@ -31,6 +31,10 @@ class ISoundTriggerClient : public IInterface

virtual void onRecognitionEvent(const sp<IMemory>& eventMemory) = 0;

virtual void onSoundModelEvent(const sp<IMemory>& eventMemory) = 0;

virtual void onServiceStateChange(const sp<IMemory>& eventMemory) = 0;

};

// ----------------------------------------------------------------------------
Expand Down
2 changes: 2 additions & 0 deletions include/soundtrigger/ISoundTriggerHwService.h
Expand Up @@ -39,6 +39,8 @@ class ISoundTriggerHwService : public IInterface
virtual status_t attach(const sound_trigger_module_handle_t handle,
const sp<ISoundTriggerClient>& client,
sp<ISoundTrigger>& module) = 0;

virtual status_t setCaptureState(bool active) = 0;
};

// ----------------------------------------------------------------------------
Expand Down
8 changes: 7 additions & 1 deletion include/soundtrigger/SoundTrigger.h
Expand Up @@ -18,6 +18,7 @@
#define ANDROID_HARDWARE_SOUNDTRIGGER_H

#include <binder/IBinder.h>
#include <utils/threads.h>
#include <soundtrigger/SoundTriggerCallback.h>
#include <soundtrigger/ISoundTrigger.h>
#include <soundtrigger/ISoundTriggerHwService.h>
Expand All @@ -32,12 +33,15 @@ class SoundTrigger : public BnSoundTriggerClient,
public IBinder::DeathRecipient
{
public:

virtual ~SoundTrigger();

static status_t listModules(struct sound_trigger_module_descriptor *modules,
uint32_t *numModules);
static sp<SoundTrigger> attach(const sound_trigger_module_handle_t module,
const sp<SoundTriggerCallback>& callback);

virtual ~SoundTrigger();
static status_t setCaptureState(bool active);

void detach();

Expand All @@ -51,6 +55,8 @@ class SoundTrigger : public BnSoundTriggerClient,

// BpSoundTriggerClient
virtual void onRecognitionEvent(const sp<IMemory>& eventMemory);
virtual void onSoundModelEvent(const sp<IMemory>& eventMemory);
virtual void onServiceStateChange(const sp<IMemory>& eventMemory);

//IBinder::DeathRecipient
virtual void binderDied(const wp<IBinder>& who);
Expand Down
4 changes: 4 additions & 0 deletions include/soundtrigger/SoundTriggerCallback.h
Expand Up @@ -31,6 +31,10 @@ class SoundTriggerCallback : public RefBase

virtual void onRecognitionEvent(struct sound_trigger_recognition_event *event) = 0;

virtual void onSoundModelEvent(struct sound_trigger_model_event *event) = 0;

virtual void onServiceStateChange(sound_trigger_service_state_t state) = 0;

virtual void onServiceDied() = 0;

};
Expand Down
15 changes: 15 additions & 0 deletions media/libmedia/AudioSystem.cpp
Expand Up @@ -913,6 +913,21 @@ void AudioSystem::setAudioPortCallback(sp<AudioPortCallback> callBack)
gAudioPortCallback = callBack;
}

status_t AudioSystem::acquireSoundTriggerSession(audio_session_t *session,
audio_io_handle_t *ioHandle,
audio_devices_t *device)
{
const sp<IAudioPolicyService>& aps = AudioSystem::get_audio_policy_service();
if (aps == 0) return PERMISSION_DENIED;
return aps->acquireSoundTriggerSession(session, ioHandle, device);
}

status_t AudioSystem::releaseSoundTriggerSession(audio_session_t session)
{
const sp<IAudioPolicyService>& aps = AudioSystem::get_audio_policy_service();
if (aps == 0) return PERMISSION_DENIED;
return aps->releaseSoundTriggerSession(session);
}
// ---------------------------------------------------------------------------

void AudioSystem::AudioPolicyServiceClient::binderDied(const wp<IBinder>& who __unused)
Expand Down
67 changes: 66 additions & 1 deletion media/libmedia/IAudioPolicyService.cpp
Expand Up @@ -65,7 +65,9 @@ enum {
LIST_AUDIO_PATCHES,
SET_AUDIO_PORT_CONFIG,
REGISTER_CLIENT,
GET_OUTPUT_FOR_ATTR
GET_OUTPUT_FOR_ATTR,
ACQUIRE_SOUNDTRIGGER_SESSION,
RELEASE_SOUNDTRIGGER_SESSION
};

class BpAudioPolicyService : public BpInterface<IAudioPolicyService>
Expand Down Expand Up @@ -563,13 +565,48 @@ class BpAudioPolicyService : public BpInterface<IAudioPolicyService>
}
return status;
}

virtual void registerClient(const sp<IAudioPolicyServiceClient>& client)
{
Parcel data, reply;
data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor());
data.writeStrongBinder(client->asBinder());
remote()->transact(REGISTER_CLIENT, data, &reply);
}

virtual status_t acquireSoundTriggerSession(audio_session_t *session,
audio_io_handle_t *ioHandle,
audio_devices_t *device)
{
if (session == NULL || ioHandle == NULL || device == NULL) {
return BAD_VALUE;
}
Parcel data, reply;
data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor());
status_t status = remote()->transact(ACQUIRE_SOUNDTRIGGER_SESSION, data, &reply);
if (status != NO_ERROR) {
return status;
}
status = (status_t)reply.readInt32();
if (status == NO_ERROR) {
*session = (audio_session_t)reply.readInt32();
*ioHandle = (audio_io_handle_t)reply.readInt32();
*device = (audio_devices_t)reply.readInt32();
}
return status;
}

virtual status_t releaseSoundTriggerSession(audio_session_t session)
{
Parcel data, reply;
data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor());
data.writeInt32(session);
status_t status = remote()->transact(RELEASE_SOUNDTRIGGER_SESSION, data, &reply);
if (status != NO_ERROR) {
return status;
}
return (status_t)reply.readInt32();
}
};

IMPLEMENT_META_INTERFACE(AudioPolicyService, "android.media.IAudioPolicyService");
Expand Down Expand Up @@ -984,6 +1021,7 @@ status_t BnAudioPolicyService::onTransact(
reply->writeInt32(status);
return NO_ERROR;
}

case REGISTER_CLIENT: {
CHECK_INTERFACE(IAudioPolicyService, data, reply);
sp<IAudioPolicyServiceClient> client = interface_cast<IAudioPolicyServiceClient>(
Expand All @@ -992,6 +1030,33 @@ status_t BnAudioPolicyService::onTransact(
return NO_ERROR;
} break;

case ACQUIRE_SOUNDTRIGGER_SESSION: {
CHECK_INTERFACE(IAudioPolicyService, data, reply);
sp<IAudioPolicyServiceClient> client = interface_cast<IAudioPolicyServiceClient>(
data.readStrongBinder());
audio_session_t session;
audio_io_handle_t ioHandle;
audio_devices_t device;
status_t status = acquireSoundTriggerSession(&session, &ioHandle, &device);
reply->writeInt32(status);
if (status == NO_ERROR) {
reply->writeInt32(session);
reply->writeInt32(ioHandle);
reply->writeInt32(device);
}
return NO_ERROR;
} break;

case RELEASE_SOUNDTRIGGER_SESSION: {
CHECK_INTERFACE(IAudioPolicyService, data, reply);
sp<IAudioPolicyServiceClient> client = interface_cast<IAudioPolicyServiceClient>(
data.readStrongBinder());
audio_session_t session = (audio_session_t)data.readInt32();
status_t status = releaseSoundTriggerSession(session);
reply->writeInt32(status);
return NO_ERROR;
} break;

default:
return BBinder::onTransact(code, data, reply, flags);
}
Expand Down
5 changes: 3 additions & 2 deletions services/audiopolicy/Android.mk
Expand Up @@ -30,7 +30,7 @@ LOCAL_SHARED_LIBRARIES := \
libbinder \
libmedia \
libhardware \
libhardware_legacy \
libhardware_legacy

ifneq ($(USE_LEGACY_AUDIO_POLICY), 1)
LOCAL_SHARED_LIBRARIES += \
Expand Down Expand Up @@ -58,7 +58,8 @@ LOCAL_SRC_FILES:= \
LOCAL_SHARED_LIBRARIES := \
libcutils \
libutils \
liblog
liblog \
libsoundtrigger

LOCAL_STATIC_LIBRARIES := \
libmedia_helper
Expand Down
1 change: 1 addition & 0 deletions services/audiopolicy/AudioPolicyClientImpl.cpp
Expand Up @@ -17,6 +17,7 @@
#define LOG_TAG "AudioPolicyClientImpl"
//#define LOG_NDEBUG 0

#include <soundtrigger/SoundTrigger.h>
#include <utils/Log.h>
#include "AudioPolicyService.h"

Expand Down
5 changes: 5 additions & 0 deletions services/audiopolicy/AudioPolicyInterface.h
Expand Up @@ -190,6 +190,11 @@ class AudioPolicyInterface
virtual status_t setAudioPortConfig(const struct audio_port_config *config) = 0;
virtual void clearAudioPatches(uid_t uid) = 0;

virtual status_t acquireSoundTriggerSession(audio_session_t *session,
audio_io_handle_t *ioHandle,
audio_devices_t *device) = 0;

virtual status_t releaseSoundTriggerSession(audio_session_t session) = 0;
};


Expand Down
20 changes: 20 additions & 0 deletions services/audiopolicy/AudioPolicyInterfaceImpl.cpp
Expand Up @@ -531,4 +531,24 @@ status_t AudioPolicyService::setAudioPortConfig(const struct audio_port_config *
return mAudioPolicyManager->setAudioPortConfig(config);
}

status_t AudioPolicyService::acquireSoundTriggerSession(audio_session_t *session,
audio_io_handle_t *ioHandle,
audio_devices_t *device)
{
if (mAudioPolicyManager == NULL) {
return NO_INIT;
}

return mAudioPolicyManager->acquireSoundTriggerSession(session, ioHandle, device);
}

status_t AudioPolicyService::releaseSoundTriggerSession(audio_session_t session)
{
if (mAudioPolicyManager == NULL) {
return NO_INIT;
}

return mAudioPolicyManager->releaseSoundTriggerSession(session);
}

}; // namespace android
15 changes: 13 additions & 2 deletions services/audiopolicy/AudioPolicyInterfaceImplLegacy.cpp
Expand Up @@ -496,10 +496,21 @@ audio_io_handle_t AudioPolicyService::getOutputForAttr(const audio_attributes_t
audio_output_flags_t flags,
const audio_offload_info_t *offloadInfo)
{
//FIXME: temporary to fix build with USE_LEGACY_AUDIO_POLICY
audio_stream_type_t stream = AUDIO_STREAM_MUSIC;
audio_stream_type_t stream = audio_attributes_to_stream_type(attr);

return getOutput(stream, samplingRate, format, channelMask, flags, offloadInfo);
}

status_t AudioPolicyService::acquireSoundTriggerSession(audio_session_t *session,
audio_io_handle_t *ioHandle,
audio_devices_t *device)
{
return INVALID_OPERATION;
}

status_t AudioPolicyService::releaseSoundTriggerSession(audio_session_t session)
{
return INVALID_OPERATION;
}

}; // namespace android

0 comments on commit df3dc7e

Please sign in to comment.