summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--include/media/AudioSystem.h4
-rw-r--r--include/media/IAudioPolicyService.h2
-rw-r--r--media/libmedia/AudioSystem.cpp24
-rw-r--r--media/libmedia/IAudioPolicyService.cpp17
-rw-r--r--services/audioflinger/Threads.cpp15
-rw-r--r--services/audioflinger/Threads.h1
-rw-r--r--services/audiopolicy/service/AudioPolicyService.cpp24
-rw-r--r--services/audiopolicy/service/AudioPolicyService.h4
8 files changed, 74 insertions, 17 deletions
diff --git a/include/media/AudioSystem.h b/include/media/AudioSystem.h
index 26cffa6..06116a5 100644
--- a/include/media/AudioSystem.h
+++ b/include/media/AudioSystem.h
@@ -408,8 +408,8 @@ private:
AudioPolicyServiceClient() {
}
- status_t addAudioPortCallback(const sp<AudioPortCallback>& callback);
- status_t removeAudioPortCallback(const sp<AudioPortCallback>& callback);
+ int addAudioPortCallback(const sp<AudioPortCallback>& callback);
+ int removeAudioPortCallback(const sp<AudioPortCallback>& callback);
// DeathRecipient
virtual void binderDied(const wp<IBinder>& who);
diff --git a/include/media/IAudioPolicyService.h b/include/media/IAudioPolicyService.h
index ee462a0..6b93f6f 100644
--- a/include/media/IAudioPolicyService.h
+++ b/include/media/IAudioPolicyService.h
@@ -149,6 +149,8 @@ public:
virtual void registerClient(const sp<IAudioPolicyServiceClient>& client) = 0;
+ virtual void setAudioPortCallbacksEnabled(bool enabled) = 0;
+
virtual status_t acquireSoundTriggerSession(audio_session_t *session,
audio_io_handle_t *ioHandle,
audio_devices_t *device) = 0;
diff --git a/media/libmedia/AudioSystem.cpp b/media/libmedia/AudioSystem.cpp
index 6c2c226..f13bcf3 100644
--- a/media/libmedia/AudioSystem.cpp
+++ b/media/libmedia/AudioSystem.cpp
@@ -1043,7 +1043,11 @@ status_t AudioSystem::addAudioPortCallback(const sp<AudioPortCallback>& callback
if (gAudioPolicyServiceClient == 0) {
return NO_INIT;
}
- return gAudioPolicyServiceClient->addAudioPortCallback(callback);
+ int ret = gAudioPolicyServiceClient->addAudioPortCallback(callback);
+ if (ret == 1) {
+ aps->setAudioPortCallbacksEnabled(true);
+ }
+ return (ret < 0) ? INVALID_OPERATION : NO_ERROR;
}
/*static*/
@@ -1056,7 +1060,11 @@ status_t AudioSystem::removeAudioPortCallback(const sp<AudioPortCallback>& callb
if (gAudioPolicyServiceClient == 0) {
return NO_INIT;
}
- return gAudioPolicyServiceClient->removeAudioPortCallback(callback);
+ int ret = gAudioPolicyServiceClient->removeAudioPortCallback(callback);
+ if (ret == 0) {
+ aps->setAudioPortCallbacksEnabled(false);
+ }
+ return (ret < 0) ? INVALID_OPERATION : NO_ERROR;
}
status_t AudioSystem::addAudioDeviceCallback(
@@ -1138,20 +1146,20 @@ status_t AudioSystem::stopAudioSource(audio_io_handle_t handle)
// ---------------------------------------------------------------------------
-status_t AudioSystem::AudioPolicyServiceClient::addAudioPortCallback(
+int AudioSystem::AudioPolicyServiceClient::addAudioPortCallback(
const sp<AudioPortCallback>& callback)
{
Mutex::Autolock _l(mLock);
for (size_t i = 0; i < mAudioPortCallbacks.size(); i++) {
if (mAudioPortCallbacks[i] == callback) {
- return INVALID_OPERATION;
+ return -1;
}
}
mAudioPortCallbacks.add(callback);
- return NO_ERROR;
+ return mAudioPortCallbacks.size();
}
-status_t AudioSystem::AudioPolicyServiceClient::removeAudioPortCallback(
+int AudioSystem::AudioPolicyServiceClient::removeAudioPortCallback(
const sp<AudioPortCallback>& callback)
{
Mutex::Autolock _l(mLock);
@@ -1162,10 +1170,10 @@ status_t AudioSystem::AudioPolicyServiceClient::removeAudioPortCallback(
}
}
if (i == mAudioPortCallbacks.size()) {
- return INVALID_OPERATION;
+ return -1;
}
mAudioPortCallbacks.removeAt(i);
- return NO_ERROR;
+ return mAudioPortCallbacks.size();
}
diff --git a/media/libmedia/IAudioPolicyService.cpp b/media/libmedia/IAudioPolicyService.cpp
index fd18f17..3348441 100644
--- a/media/libmedia/IAudioPolicyService.cpp
+++ b/media/libmedia/IAudioPolicyService.cpp
@@ -72,7 +72,8 @@ enum {
GET_PHONE_STATE,
REGISTER_POLICY_MIXES,
START_AUDIO_SOURCE,
- STOP_AUDIO_SOURCE
+ STOP_AUDIO_SOURCE,
+ SET_AUDIO_PORT_CALLBACK_ENABLED,
};
#define MAX_ITEMS_PER_LIST 1024
@@ -646,6 +647,14 @@ public:
remote()->transact(REGISTER_CLIENT, data, &reply);
}
+ virtual void setAudioPortCallbacksEnabled(bool enabled)
+ {
+ Parcel data, reply;
+ data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor());
+ data.writeInt32(enabled ? 1 : 0);
+ remote()->transact(SET_AUDIO_PORT_CALLBACK_ENABLED, data, &reply);
+ }
+
virtual status_t acquireSoundTriggerSession(audio_session_t *session,
audio_io_handle_t *ioHandle,
audio_devices_t *device)
@@ -1219,6 +1228,12 @@ status_t BnAudioPolicyService::onTransact(
return NO_ERROR;
} break;
+ case SET_AUDIO_PORT_CALLBACK_ENABLED: {
+ CHECK_INTERFACE(IAudioPolicyService, data, reply);
+ setAudioPortCallbacksEnabled(data.readInt32() == 1);
+ return NO_ERROR;
+ } break;
+
case ACQUIRE_SOUNDTRIGGER_SESSION: {
CHECK_INTERFACE(IAudioPolicyService, data, reply);
sp<IAudioPolicyServiceClient> client = interface_cast<IAudioPolicyServiceClient>(
diff --git a/services/audioflinger/Threads.cpp b/services/audioflinger/Threads.cpp
index 410fff5..c8f9be0 100644
--- a/services/audioflinger/Threads.cpp
+++ b/services/audioflinger/Threads.cpp
@@ -530,7 +530,7 @@ AudioFlinger::ThreadBase::ThreadBase(const sp<AudioFlinger>& audioFlinger, audio
// RecordThread::readInputParameters_l()
//FIXME: mStandby should be true here. Is this some kind of hack?
mStandby(false), mOutDevice(outDevice), mInDevice(inDevice),
- mAudioSource(AUDIO_SOURCE_DEFAULT), mId(id),
+ mPrevInDevice(AUDIO_DEVICE_NONE), mAudioSource(AUDIO_SOURCE_DEFAULT), mId(id),
// mName will be set by concrete (non-virtual) subclass
mDeathRecipient(new PMDeathRecipient(this)),
mSystemReady(systemReady)
@@ -3131,6 +3131,7 @@ status_t AudioFlinger::PlaybackThread::createAudioPatch_l(const struct audio_pat
for (size_t i = 0; i < mEffectChains.size(); i++) {
mEffectChains[i]->setDevice_l(type);
}
+ bool configChanged = mOutDevice != type;
mOutDevice = type;
mPatch = *patch;
@@ -3159,7 +3160,9 @@ status_t AudioFlinger::PlaybackThread::createAudioPatch_l(const struct audio_pat
param.toString().string());
*handle = AUDIO_PATCH_HANDLE_NONE;
}
- sendIoConfigEvent_l(AUDIO_OUTPUT_CONFIG_CHANGED);
+ if (configChanged) {
+ sendIoConfigEvent_l(AUDIO_OUTPUT_CONFIG_CHANGED);
+ }
return status;
}
@@ -6796,6 +6799,9 @@ bool AudioFlinger::RecordThread::checkForNewParameter_l(const String8& keyValueP
status = BAD_VALUE;
} else {
mInDevice = value;
+ if (value != AUDIO_DEVICE_NONE) {
+ mPrevInDevice = value;
+ }
// disable AEC and NS if the device is a BT SCO headset supporting those
// pre processings
if (mTracks.size() > 0) {
@@ -7079,7 +7085,10 @@ status_t AudioFlinger::RecordThread::createAudioPatch_l(const struct audio_patch
*handle = AUDIO_PATCH_HANDLE_NONE;
}
- sendIoConfigEvent_l(AUDIO_INPUT_CONFIG_CHANGED);
+ if (mInDevice != mPrevInDevice) {
+ sendIoConfigEvent_l(AUDIO_INPUT_CONFIG_CHANGED);
+ mPrevInDevice = mInDevice;
+ }
return status;
}
diff --git a/services/audioflinger/Threads.h b/services/audioflinger/Threads.h
index b12b091..0783371 100644
--- a/services/audioflinger/Threads.h
+++ b/services/audioflinger/Threads.h
@@ -436,6 +436,7 @@ protected:
bool mStandby; // Whether thread is currently in standby.
audio_devices_t mOutDevice; // output device
audio_devices_t mInDevice; // input device
+ audio_devices_t mPrevInDevice; // previous input device
struct audio_patch mPatch;
audio_source_t mAudioSource;
diff --git a/services/audiopolicy/service/AudioPolicyService.cpp b/services/audiopolicy/service/AudioPolicyService.cpp
index c5f4fb7..fbe4f18 100644
--- a/services/audiopolicy/service/AudioPolicyService.cpp
+++ b/services/audiopolicy/service/AudioPolicyService.cpp
@@ -166,6 +166,17 @@ void AudioPolicyService::registerClient(const sp<IAudioPolicyServiceClient>& cli
}
}
+void AudioPolicyService::setAudioPortCallbacksEnabled(bool enabled)
+{
+ Mutex::Autolock _l(mNotificationClientsLock);
+
+ uid_t uid = IPCThreadState::self()->getCallingUid();
+ if (mNotificationClients.indexOfKey(uid) < 0) {
+ return;
+ }
+ mNotificationClients.valueFor(uid)->setAudioPortCallbacksEnabled(enabled);
+}
+
// removeNotificationClient() is called when the client process dies.
void AudioPolicyService::removeNotificationClient(uid_t uid)
{
@@ -246,7 +257,8 @@ status_t AudioPolicyService::clientSetAudioPortConfig(const struct audio_port_co
AudioPolicyService::NotificationClient::NotificationClient(const sp<AudioPolicyService>& service,
const sp<IAudioPolicyServiceClient>& client,
uid_t uid)
- : mService(service), mUid(uid), mAudioPolicyServiceClient(client)
+ : mService(service), mUid(uid), mAudioPolicyServiceClient(client),
+ mAudioPortCallbacksEnabled(false)
{
}
@@ -265,14 +277,14 @@ void AudioPolicyService::NotificationClient::binderDied(const wp<IBinder>& who _
void AudioPolicyService::NotificationClient::onAudioPortListUpdate()
{
- if (mAudioPolicyServiceClient != 0) {
+ if (mAudioPolicyServiceClient != 0 && mAudioPortCallbacksEnabled) {
mAudioPolicyServiceClient->onAudioPortListUpdate();
}
}
void AudioPolicyService::NotificationClient::onAudioPatchListUpdate()
{
- if (mAudioPolicyServiceClient != 0) {
+ if (mAudioPolicyServiceClient != 0 && mAudioPortCallbacksEnabled) {
mAudioPolicyServiceClient->onAudioPatchListUpdate();
}
}
@@ -285,6 +297,12 @@ void AudioPolicyService::NotificationClient::onDynamicPolicyMixStateUpdate(
}
}
+void AudioPolicyService::NotificationClient::setAudioPortCallbacksEnabled(bool enabled)
+{
+ mAudioPortCallbacksEnabled = enabled;
+}
+
+
void AudioPolicyService::binderDied(const wp<IBinder>& who) {
ALOGW("binderDied() %p, calling pid %d", who.unsafe_get(),
IPCThreadState::self()->getCallingPid());
diff --git a/services/audiopolicy/service/AudioPolicyService.h b/services/audiopolicy/service/AudioPolicyService.h
index eb50cdd..a0d5aa2 100644
--- a/services/audiopolicy/service/AudioPolicyService.h
+++ b/services/audiopolicy/service/AudioPolicyService.h
@@ -185,6 +185,8 @@ public:
virtual void registerClient(const sp<IAudioPolicyServiceClient>& client);
+ virtual void setAudioPortCallbacksEnabled(bool enabled);
+
virtual status_t acquireSoundTriggerSession(audio_session_t *session,
audio_io_handle_t *ioHandle,
audio_devices_t *device);
@@ -507,6 +509,7 @@ private:
void onAudioPortListUpdate();
void onAudioPatchListUpdate();
void onDynamicPolicyMixStateUpdate(String8 regId, int32_t state);
+ void setAudioPortCallbacksEnabled(bool enabled);
// IBinder::DeathRecipient
virtual void binderDied(const wp<IBinder>& who);
@@ -518,6 +521,7 @@ private:
const wp<AudioPolicyService> mService;
const uid_t mUid;
const sp<IAudioPolicyServiceClient> mAudioPolicyServiceClient;
+ bool mAudioPortCallbacksEnabled;
};
// Internal dump utilities.