Send client / device format in recording callback
Bug 26798796
Change-Id: Ib4f64159c8371d87da49a8f0cad9317a87d843c4
diff --git a/include/media/AudioSystem.h b/include/media/AudioSystem.h
index 2f95b90..7011858 100644
--- a/include/media/AudioSystem.h
+++ b/include/media/AudioSystem.h
@@ -31,7 +31,9 @@
typedef void (*audio_error_callback)(status_t err);
typedef void (*dynamic_policy_callback)(int event, String8 regId, int val);
-typedef void (*record_config_callback)(int event, int session, int source);
+typedef void (*record_config_callback)(int event, int session, int source,
+ const audio_config_base_t *clientConfig,
+ const audio_config_base_t *deviceConfig);
class IAudioFlinger;
class IAudioPolicyService;
@@ -424,7 +426,8 @@
virtual void onAudioPatchListUpdate();
virtual void onDynamicPolicyMixStateUpdate(String8 regId, int32_t state);
virtual void onRecordingConfigurationUpdate(int event, audio_session_t session,
- audio_source_t source);
+ audio_source_t source, const audio_config_base_t *clientConfig,
+ const audio_config_base_t *deviceConfig);
private:
Mutex mLock;
diff --git a/include/media/IAudioPolicyServiceClient.h b/include/media/IAudioPolicyServiceClient.h
index e8fd39f..8c3459d 100644
--- a/include/media/IAudioPolicyServiceClient.h
+++ b/include/media/IAudioPolicyServiceClient.h
@@ -39,7 +39,9 @@
virtual void onDynamicPolicyMixStateUpdate(String8 regId, int32_t state) = 0;
// Notifies a change of audio recording configuration
virtual void onRecordingConfigurationUpdate(int event, audio_session_t session,
- audio_source_t source) = 0;
+ audio_source_t source,
+ const audio_config_base_t *clientConfig,
+ const audio_config_base_t *deviceConfig) = 0;
};
diff --git a/media/libmedia/AudioSystem.cpp b/media/libmedia/AudioSystem.cpp
index 1ea2003..1607af5 100644
--- a/media/libmedia/AudioSystem.cpp
+++ b/media/libmedia/AudioSystem.cpp
@@ -1245,7 +1245,8 @@
}
void AudioSystem::AudioPolicyServiceClient::onRecordingConfigurationUpdate(
- int event, audio_session_t session, audio_source_t source) {
+ int event, audio_session_t session, audio_source_t source,
+ const audio_config_base_t *clientConfig, const audio_config_base_t *deviceConfig) {
record_config_callback cb = NULL;
{
Mutex::Autolock _l(AudioSystem::gLock);
@@ -1253,7 +1254,7 @@
}
if (cb != NULL) {
- cb(event, session, source);
+ cb(event, session, source, clientConfig, deviceConfig);
}
}
diff --git a/media/libmedia/IAudioPolicyServiceClient.cpp b/media/libmedia/IAudioPolicyServiceClient.cpp
index fe5df28..0aeaf3c 100644
--- a/media/libmedia/IAudioPolicyServiceClient.cpp
+++ b/media/libmedia/IAudioPolicyServiceClient.cpp
@@ -34,6 +34,21 @@
RECORDING_CONFIGURATION_UPDATE
};
+// ----------------------------------------------------------------------
+inline void readAudioConfigBaseFromParcel(const Parcel& data, audio_config_base_t *config) {
+ config->sample_rate = data.readUint32();
+ config->channel_mask = (audio_channel_mask_t) data.readInt32();
+ config->format = (audio_format_t) data.readInt32();
+}
+
+inline void writeAudioConfigBaseToParcel(Parcel& data, const audio_config_base_t *config)
+{
+ data.writeUint32(config->sample_rate);
+ data.writeInt32((int32_t) config->channel_mask);
+ data.writeInt32((int32_t) config->format);
+}
+
+// ----------------------------------------------------------------------
class BpAudioPolicyServiceClient : public BpInterface<IAudioPolicyServiceClient>
{
public:
@@ -66,12 +81,15 @@
}
void onRecordingConfigurationUpdate(int event, audio_session_t session,
- audio_source_t source) {
+ audio_source_t source, const audio_config_base_t *clientConfig,
+ const audio_config_base_t *deviceConfig) {
Parcel data, reply;
data.writeInterfaceToken(IAudioPolicyServiceClient::getInterfaceDescriptor());
data.writeInt32(event);
data.writeInt32(session);
data.writeInt32(source);
+ writeAudioConfigBaseToParcel(data, clientConfig);
+ writeAudioConfigBaseToParcel(data, deviceConfig);
remote()->transact(RECORDING_CONFIGURATION_UPDATE, data, &reply, IBinder::FLAG_ONEWAY);
}
};
@@ -106,7 +124,11 @@
int event = (int) data.readInt32();
audio_session_t session = (audio_session_t) data.readInt32();
audio_source_t source = (audio_source_t) data.readInt32();
- onRecordingConfigurationUpdate(event, session, source);
+ audio_config_base_t clientConfig;
+ audio_config_base_t deviceConfig;
+ readAudioConfigBaseFromParcel(data, &clientConfig);
+ readAudioConfigBaseFromParcel(data, &deviceConfig);
+ onRecordingConfigurationUpdate(event, session, source, &clientConfig, &deviceConfig);
return NO_ERROR;
} break;
default:
diff --git a/services/audiopolicy/AudioPolicyInterface.h b/services/audiopolicy/AudioPolicyInterface.h
index dd3f144..40ca899 100644
--- a/services/audiopolicy/AudioPolicyInterface.h
+++ b/services/audiopolicy/AudioPolicyInterface.h
@@ -337,7 +337,9 @@
virtual void onDynamicPolicyMixStateUpdate(String8 regId, int32_t state) = 0;
virtual void onRecordingConfigurationUpdate(int event, audio_session_t session,
- audio_source_t source) = 0;
+ audio_source_t source,
+ const struct audio_config_base *clientConfig,
+ const struct audio_config_base *deviceConfig) = 0;
};
extern "C" AudioPolicyInterface* createAudioPolicyManager(AudioPolicyClientInterface *clientInterface);
diff --git a/services/audiopolicy/common/managerdefinitions/include/AudioSession.h b/services/audiopolicy/common/managerdefinitions/include/AudioSession.h
index 576822c..799410b 100644
--- a/services/audiopolicy/common/managerdefinitions/include/AudioSession.h
+++ b/services/audiopolicy/common/managerdefinitions/include/AudioSession.h
@@ -45,9 +45,9 @@
audio_session_t session() const { return mSession; }
audio_source_t inputSource()const { return mInputSource; }
- audio_format_t format() const { return mFormat; }
- uint32_t sampleRate() const { return mSampleRate; }
- audio_channel_mask_t channelMask() const { return mChannelMask; }
+ audio_format_t format() const { return mConfig.format; }
+ uint32_t sampleRate() const { return mConfig.sample_rate; }
+ audio_channel_mask_t channelMask() const { return mConfig.channel_mask; }
audio_input_flags_t flags() const { return mFlags; }
uid_t uid() const { return mUid; }
bool matches(const sp<AudioSession> &other) const;
@@ -58,12 +58,14 @@
uint32_t changeOpenCount(int delta);
uint32_t changeActiveCount(int delta);
+ void setDeviceConfig(audio_format_t format, uint32_t sampleRate,
+ audio_channel_mask_t channelMask);
+
private:
const audio_session_t mSession;
const audio_source_t mInputSource;
- const audio_format_t mFormat;
- const uint32_t mSampleRate;
- const audio_channel_mask_t mChannelMask;
+ const struct audio_config_base mConfig;
+ struct audio_config_base mDeviceConfig;
const audio_input_flags_t mFlags;
const uid_t mUid;
bool mIsSoundTrigger;
diff --git a/services/audiopolicy/common/managerdefinitions/src/AudioInputDescriptor.cpp b/services/audiopolicy/common/managerdefinitions/src/AudioInputDescriptor.cpp
index 9b6469c..5523aff 100644
--- a/services/audiopolicy/common/managerdefinitions/src/AudioInputDescriptor.cpp
+++ b/services/audiopolicy/common/managerdefinitions/src/AudioInputDescriptor.cpp
@@ -150,6 +150,7 @@
status_t AudioInputDescriptor::addAudioSession(audio_session_t session,
const sp<AudioSession>& audioSession) {
+ audioSession->setDeviceConfig(mFormat, mSamplingRate, mChannelMask);
return mSessions.addSession(session, audioSession);
}
diff --git a/services/audiopolicy/common/managerdefinitions/src/AudioSession.cpp b/services/audiopolicy/common/managerdefinitions/src/AudioSession.cpp
index 597c029..2a0b477 100644
--- a/services/audiopolicy/common/managerdefinitions/src/AudioSession.cpp
+++ b/services/audiopolicy/common/managerdefinitions/src/AudioSession.cpp
@@ -37,7 +37,8 @@
AudioMix* policyMix,
AudioPolicyClientInterface *clientInterface) :
mSession(session), mInputSource(inputSource),
- mFormat(format), mSampleRate(sampleRate), mChannelMask(channelMask),
+ mConfig({ .format = format, .sample_rate = sampleRate, .channel_mask = channelMask}),
+ mDeviceConfig(AUDIO_CONFIG_BASE_INITIALIZER),
mFlags(flags), mUid(uid), mIsSoundTrigger(isSoundTrigger),
mOpenCount(1), mActiveCount(0), mPolicyMix(policyMix), mClientInterface(clientInterface)
{
@@ -74,7 +75,7 @@
MIX_STATE_MIXING);
}
mClientInterface->onRecordingConfigurationUpdate(RECORD_CONFIG_EVENT_START,
- mSession, mInputSource);
+ mSession, mInputSource, &mConfig, &mDeviceConfig);
} else if ((oldActiveCount > 0) && (mActiveCount == 0)) {
// if input maps to a dynamic policy with an activity listener, notify of state change
if ((mPolicyMix != NULL) && ((mPolicyMix->mCbFlags & AudioMix::kCbFlagNotifyActivity) != 0))
@@ -83,7 +84,7 @@
MIX_STATE_IDLE);
}
mClientInterface->onRecordingConfigurationUpdate(RECORD_CONFIG_EVENT_STOP,
- mSession, mInputSource);
+ mSession, mInputSource, &mConfig, &mDeviceConfig);
}
return mActiveCount;
@@ -93,9 +94,9 @@
{
if (other->session() == mSession &&
other->inputSource() == mInputSource &&
- other->format() == mFormat &&
- other->sampleRate() == mSampleRate &&
- other->channelMask() == mChannelMask &&
+ other->format() == mConfig.format &&
+ other->sampleRate() == mConfig.sample_rate &&
+ other->channelMask() == mConfig.channel_mask &&
other->flags() == mFlags &&
other->uid() == mUid) {
return true;
@@ -103,6 +104,12 @@
return false;
}
+void AudioSession::setDeviceConfig(audio_format_t format, uint32_t sampleRate,
+ audio_channel_mask_t channelMask) {
+ mDeviceConfig.format = format;
+ mDeviceConfig.sample_rate = sampleRate;
+ mDeviceConfig.channel_mask = channelMask;
+}
status_t AudioSession::dump(int fd, int spaces, int index) const
{
@@ -118,12 +125,12 @@
result.append(buffer);
snprintf(buffer, SIZE, "%*s- input source: %d\n", spaces, "", mInputSource);
result.append(buffer);
- snprintf(buffer, SIZE, "%*s- format: %08x\n", spaces, "", mFormat);
+ snprintf(buffer, SIZE, "%*s- format: %08x\n", spaces, "", mConfig.format);
result.append(buffer);
- snprintf(buffer, SIZE, "%*s- sample: %d\n", spaces, "", mSampleRate);
+ snprintf(buffer, SIZE, "%*s- sample: %d\n", spaces, "", mConfig.sample_rate);
result.append(buffer);
snprintf(buffer, SIZE, "%*s- channel mask: %08x\n",
- spaces, "", mChannelMask);
+ spaces, "", mConfig.channel_mask);
result.append(buffer);
snprintf(buffer, SIZE, "%*s- is soundtrigger: %s\n",
spaces, "", mIsSoundTrigger ? "true" : "false");
diff --git a/services/audiopolicy/service/AudioPolicyClientImpl.cpp b/services/audiopolicy/service/AudioPolicyClientImpl.cpp
index 3d51f48..ce6b2dc 100644
--- a/services/audiopolicy/service/AudioPolicyClientImpl.cpp
+++ b/services/audiopolicy/service/AudioPolicyClientImpl.cpp
@@ -220,9 +220,11 @@
}
void AudioPolicyService::AudioPolicyClient::onRecordingConfigurationUpdate(
- int event, audio_session_t session, audio_source_t source)
+ int event, audio_session_t session, audio_source_t source,
+ const audio_config_base_t *clientConfig, const audio_config_base_t *deviceConfig)
{
- mAudioPolicyService->onRecordingConfigurationUpdate(event, session, source);
+ mAudioPolicyService->onRecordingConfigurationUpdate(event, session, source,
+ clientConfig, deviceConfig);
}
audio_unique_id_t AudioPolicyService::AudioPolicyClient::newAudioUniqueId()
diff --git a/services/audiopolicy/service/AudioPolicyService.cpp b/services/audiopolicy/service/AudioPolicyService.cpp
index 363968c..45f260a 100644
--- a/services/audiopolicy/service/AudioPolicyService.cpp
+++ b/services/audiopolicy/service/AudioPolicyService.cpp
@@ -239,17 +239,21 @@
}
void AudioPolicyService::onRecordingConfigurationUpdate(int event, audio_session_t session,
- audio_source_t source)
+ audio_source_t source, const audio_config_base_t *clientConfig,
+ const audio_config_base_t *deviceConfig)
{
- mOutputCommandThread->recordingConfigurationUpdateCommand(event, session, source);
+ mOutputCommandThread->recordingConfigurationUpdateCommand(event, session, source,
+ clientConfig, deviceConfig);
}
void AudioPolicyService::doOnRecordingConfigurationUpdate(int event, audio_session_t session,
- audio_source_t source)
+ audio_source_t source, const audio_config_base_t *clientConfig,
+ const audio_config_base_t *deviceConfig)
{
Mutex::Autolock _l(mNotificationClientsLock);
for (size_t i = 0; i < mNotificationClients.size(); i++) {
- mNotificationClients.valueAt(i)->onRecordingConfigurationUpdate(event, session, source);
+ mNotificationClients.valueAt(i)->onRecordingConfigurationUpdate(event, session, source,
+ clientConfig, deviceConfig);
}
}
@@ -316,10 +320,12 @@
}
void AudioPolicyService::NotificationClient::onRecordingConfigurationUpdate(
- int event, audio_session_t session, audio_source_t source)
+ int event, audio_session_t session, audio_source_t source,
+ const audio_config_base_t *clientConfig, const audio_config_base_t *deviceConfig)
{
if (mAudioPolicyServiceClient != 0) {
- mAudioPolicyServiceClient->onRecordingConfigurationUpdate(event, session, source);
+ mAudioPolicyServiceClient->onRecordingConfigurationUpdate(event, session, source,
+ clientConfig, deviceConfig);
}
}
@@ -601,7 +607,7 @@
}
mLock.unlock();
svc->doOnRecordingConfigurationUpdate(data->mEvent, data->mSession,
- data->mSource);
+ data->mSource, &data->mClientConfig, &data->mDeviceConfig);
mLock.lock();
} break;
default:
@@ -865,7 +871,8 @@
}
void AudioPolicyService::AudioCommandThread::recordingConfigurationUpdateCommand(
- int event, audio_session_t session, audio_source_t source)
+ int event, audio_session_t session, audio_source_t source,
+ const audio_config_base_t *clientConfig, const audio_config_base_t *deviceConfig)
{
sp<AudioCommand>command = new AudioCommand();
command->mCommand = RECORDING_CONFIGURATION_UPDATE;
@@ -873,6 +880,8 @@
data->mEvent = event;
data->mSession = session;
data->mSource = source;
+ data->mClientConfig = *clientConfig;
+ data->mDeviceConfig = *deviceConfig;
command->mParam = data;
ALOGV("AudioCommandThread() adding recording configuration update event %d, source %d",
event, source);
diff --git a/services/audiopolicy/service/AudioPolicyService.h b/services/audiopolicy/service/AudioPolicyService.h
index a91c560..7089014 100644
--- a/services/audiopolicy/service/AudioPolicyService.h
+++ b/services/audiopolicy/service/AudioPolicyService.h
@@ -229,9 +229,11 @@
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);
+ audio_source_t source, const audio_config_base_t *clientConfig,
+ const audio_config_base_t *deviceConfig);
void doOnRecordingConfigurationUpdate(int event, audio_session_t session,
- audio_source_t source);
+ audio_source_t source, const audio_config_base_t *clientConfig,
+ const audio_config_base_t *deviceConfig);
private:
AudioPolicyService() ANDROID_API;
@@ -305,7 +307,9 @@
void dynamicPolicyMixStateUpdateCommand(String8 regId, int32_t state);
void recordingConfigurationUpdateCommand(
int event, audio_session_t session,
- audio_source_t source);
+ audio_source_t source,
+ const audio_config_base_t *clientConfig,
+ const audio_config_base_t *deviceConfig);
void insertCommand_l(AudioCommand *command, int delayMs = 0);
private:
@@ -401,6 +405,8 @@
int mEvent;
audio_session_t mSession;
audio_source_t mSource;
+ struct audio_config_base mClientConfig;
+ struct audio_config_base mDeviceConfig;
};
Mutex mLock;
@@ -510,7 +516,9 @@
virtual void onAudioPatchListUpdate();
virtual void onDynamicPolicyMixStateUpdate(String8 regId, int32_t state);
virtual void onRecordingConfigurationUpdate(int event,
- audio_session_t session, audio_source_t source);
+ audio_session_t session, audio_source_t source,
+ const audio_config_base_t *clientConfig,
+ const audio_config_base_t *deviceConfig);
virtual audio_unique_id_t newAudioUniqueId();
@@ -531,7 +539,9 @@
void onDynamicPolicyMixStateUpdate(String8 regId, int32_t state);
void onRecordingConfigurationUpdate(
int event, audio_session_t session,
- audio_source_t source);
+ audio_source_t source,
+ const audio_config_base_t *clientConfig,
+ const audio_config_base_t *deviceConfig);
void setAudioPortCallbacksEnabled(bool enabled);
// IBinder::DeathRecipient