AudioPolicy: callback for recording configuration change
Each AudioSession tracks start / end of recording, and sends
a callback to AudioSystem.
AudioSystem tracks a single recording callback tracking
input source and audio session number.
Change-Id: Ic065751d9ba013e03f2a6ad8dde02542e5465ec0
diff --git a/services/audiopolicy/service/AudioPolicyClientImpl.cpp b/services/audiopolicy/service/AudioPolicyClientImpl.cpp
index 489a9be..3d51f48 100644
--- a/services/audiopolicy/service/AudioPolicyClientImpl.cpp
+++ b/services/audiopolicy/service/AudioPolicyClientImpl.cpp
@@ -219,6 +219,12 @@
mAudioPolicyService->onDynamicPolicyMixStateUpdate(regId, state);
}
+void AudioPolicyService::AudioPolicyClient::onRecordingConfigurationUpdate(
+ int event, audio_session_t session, audio_source_t source)
+{
+ mAudioPolicyService->onRecordingConfigurationUpdate(event, session, source);
+}
+
audio_unique_id_t AudioPolicyService::AudioPolicyClient::newAudioUniqueId()
{
return AudioSystem::newAudioUniqueId();
diff --git a/services/audiopolicy/service/AudioPolicyService.cpp b/services/audiopolicy/service/AudioPolicyService.cpp
index cdde605..0c5d275 100644
--- a/services/audiopolicy/service/AudioPolicyService.cpp
+++ b/services/audiopolicy/service/AudioPolicyService.cpp
@@ -215,19 +215,6 @@
mOutputCommandThread->updateAudioPatchListCommand();
}
-status_t AudioPolicyService::clientCreateAudioPatch(const struct audio_patch *patch,
- audio_patch_handle_t *handle,
- int delayMs)
-{
- return mAudioCommandThread->createAudioPatchCommand(patch, handle, delayMs);
-}
-
-status_t AudioPolicyService::clientReleaseAudioPatch(audio_patch_handle_t handle,
- int delayMs)
-{
- return mAudioCommandThread->releaseAudioPatchCommand(handle, delayMs);
-}
-
void AudioPolicyService::doOnAudioPatchListUpdate()
{
Mutex::Autolock _l(mNotificationClientsLock);
@@ -251,6 +238,34 @@
}
}
+void AudioPolicyService::onRecordingConfigurationUpdate(int event, audio_session_t session,
+ audio_source_t source)
+{
+ mOutputCommandThread->recordingConfigurationUpdateCommand(event, session, source);
+}
+
+void AudioPolicyService::doOnRecordingConfigurationUpdate(int event, audio_session_t session,
+ audio_source_t source)
+{
+ Mutex::Autolock _l(mNotificationClientsLock);
+ for (size_t i = 0; i < mNotificationClients.size(); i++) {
+ mNotificationClients.valueAt(i)->onRecordingConfigurationUpdate(event, session, source);
+ }
+}
+
+status_t AudioPolicyService::clientCreateAudioPatch(const struct audio_patch *patch,
+ audio_patch_handle_t *handle,
+ int delayMs)
+{
+ return mAudioCommandThread->createAudioPatchCommand(patch, handle, delayMs);
+}
+
+status_t AudioPolicyService::clientReleaseAudioPatch(audio_patch_handle_t handle,
+ int delayMs)
+{
+ return mAudioCommandThread->releaseAudioPatchCommand(handle, delayMs);
+}
+
status_t AudioPolicyService::clientSetAudioPortConfig(const struct audio_port_config *config,
int delayMs)
{
@@ -296,7 +311,15 @@
String8 regId, int32_t state)
{
if (mAudioPolicyServiceClient != 0) {
- mAudioPolicyServiceClient->onDynamicPolicyMixStateUpdate(regId, state);
+ mAudioPolicyServiceClient->onDynamicPolicyMixStateUpdate(regId, state);
+ }
+}
+
+void AudioPolicyService::NotificationClient::onRecordingConfigurationUpdate(
+ int event, audio_session_t session, audio_source_t source)
+{
+ if (mAudioPolicyServiceClient != 0) {
+ mAudioPolicyServiceClient->onRecordingConfigurationUpdate(event, session, source);
}
}
@@ -558,7 +581,6 @@
case DYN_POLICY_MIX_STATE_UPDATE: {
DynPolicyMixStateUpdateData *data =
(DynPolicyMixStateUpdateData *)command->mParam.get();
- //###ALOGV("AudioCommandThread() processing dyn policy mix state update");
ALOGV("AudioCommandThread() processing dyn policy mix state update %s %d",
data->mRegId.string(), data->mState);
svc = mService.promote();
@@ -569,6 +591,19 @@
svc->doOnDynamicPolicyMixStateUpdate(data->mRegId, data->mState);
mLock.lock();
} break;
+ case RECORDING_CONFIGURATION_UPDATE: {
+ RecordingConfigurationUpdateData *data =
+ (RecordingConfigurationUpdateData *)command->mParam.get();
+ ALOGV("AudioCommandThread() processing recording configuration update");
+ svc = mService.promote();
+ if (svc == 0) {
+ break;
+ }
+ mLock.unlock();
+ svc->doOnRecordingConfigurationUpdate(data->mEvent, data->mSession,
+ data->mSource);
+ mLock.lock();
+ } break;
default:
ALOGW("AudioCommandThread() unknown command %d", command->mCommand);
}
@@ -825,6 +860,21 @@
sendCommand(command);
}
+void AudioPolicyService::AudioCommandThread::recordingConfigurationUpdateCommand(
+ int event, audio_session_t session, audio_source_t source)
+{
+ sp<AudioCommand>command = new AudioCommand();
+ command->mCommand = RECORDING_CONFIGURATION_UPDATE;
+ RecordingConfigurationUpdateData *data = new RecordingConfigurationUpdateData();
+ data->mEvent = event;
+ data->mSession = session;
+ data->mSource = source;
+ command->mParam = data;
+ ALOGV("AudioCommandThread() adding recording configuration update event %d, source %d",
+ event, source);
+ sendCommand(command);
+}
+
status_t AudioPolicyService::AudioCommandThread::sendCommand(sp<AudioCommand>& command, int delayMs)
{
{
@@ -971,6 +1021,10 @@
} break;
+ case RECORDING_CONFIGURATION_UPDATE: {
+
+ } break;
+
case START_TONE:
case STOP_TONE:
default:
diff --git a/services/audiopolicy/service/AudioPolicyService.h b/services/audiopolicy/service/AudioPolicyService.h
index a0d5aa2..4c11d93 100644
--- a/services/audiopolicy/service/AudioPolicyService.h
+++ b/services/audiopolicy/service/AudioPolicyService.h
@@ -225,6 +225,10 @@
void onDynamicPolicyMixStateUpdate(String8 regId, int32_t state);
void doOnDynamicPolicyMixStateUpdate(String8 regId, int32_t state);
+ void onRecordingConfigurationUpdate(int event, audio_session_t session,
+ audio_source_t source);
+ void doOnRecordingConfigurationUpdate(int event, audio_session_t session,
+ audio_source_t source);
private:
AudioPolicyService() ANDROID_API;
@@ -256,7 +260,8 @@
UPDATE_AUDIOPORT_LIST,
UPDATE_AUDIOPATCH_LIST,
SET_AUDIOPORT_CONFIG,
- DYN_POLICY_MIX_STATE_UPDATE
+ DYN_POLICY_MIX_STATE_UPDATE,
+ RECORDING_CONFIGURATION_UPDATE
};
AudioCommandThread (String8 name, const wp<AudioPolicyService>& service);
@@ -295,6 +300,9 @@
status_t setAudioPortConfigCommand(const struct audio_port_config *config,
int delayMs);
void dynamicPolicyMixStateUpdateCommand(String8 regId, int32_t state);
+ void recordingConfigurationUpdateCommand(
+ int event, audio_session_t session,
+ audio_source_t source);
void insertCommand_l(AudioCommand *command, int delayMs = 0);
private:
@@ -385,6 +393,13 @@
int32_t mState;
};
+ class RecordingConfigurationUpdateData : public AudioCommandData {
+ public:
+ int mEvent;
+ audio_session_t mSession;
+ audio_source_t mSource;
+ };
+
Mutex mLock;
Condition mWaitWorkCV;
Vector < sp<AudioCommand> > mAudioCommands; // list of pending commands
@@ -491,6 +506,8 @@
virtual void onAudioPortListUpdate();
virtual void onAudioPatchListUpdate();
virtual void onDynamicPolicyMixStateUpdate(String8 regId, int32_t state);
+ virtual void onRecordingConfigurationUpdate(int event,
+ audio_session_t session, audio_source_t source);
virtual audio_unique_id_t newAudioUniqueId();
@@ -509,6 +526,9 @@
void onAudioPortListUpdate();
void onAudioPatchListUpdate();
void onDynamicPolicyMixStateUpdate(String8 regId, int32_t state);
+ void onRecordingConfigurationUpdate(
+ int event, audio_session_t session,
+ audio_source_t source);
void setAudioPortCallbacksEnabled(bool enabled);
// IBinder::DeathRecipient