Invert how sound trigger capture is notified
Previously, audio policy client would call an method on the sound
trigger middleware service. This has been replaced by the sound
trigger service registering a callback, in order to avoid a cyclic
dependency between the services.
Bug: 146157104
Change-Id: I876461a7650d337d6dd05fbe80efaf08f8ef20dd
Merged-In: I876461a7650d337d6dd05fbe80efaf08f8ef20dd
diff --git a/media/libaudioclient/Android.bp b/media/libaudioclient/Android.bp
index 0ec63b9..4762b63 100644
--- a/media/libaudioclient/Android.bp
+++ b/media/libaudioclient/Android.bp
@@ -77,6 +77,7 @@
"TrackPlayerBase.cpp",
],
shared_libs: [
+ "capture_state_listener-aidl-cpp",
"libaudiofoundation",
"libaudioutils",
"libaudiopolicy",
diff --git a/media/libaudioclient/IAudioPolicyService.cpp b/media/libaudioclient/IAudioPolicyService.cpp
index 1fd17fd..60af84b 100644
--- a/media/libaudioclient/IAudioPolicyService.cpp
+++ b/media/libaudioclient/IAudioPolicyService.cpp
@@ -22,6 +22,7 @@
#include <math.h>
#include <sys/types.h>
+#include <android/media/ICaptureStateListener.h>
#include <binder/IPCThreadState.h>
#include <binder/Parcel.h>
#include <media/AudioEffect.h>
@@ -32,6 +33,8 @@
namespace android {
+using media::ICaptureStateListener;
+
enum {
SET_DEVICE_CONNECTION_STATE = IBinder::FIRST_CALL_TRANSACTION,
GET_DEVICE_CONNECTION_STATE,
@@ -115,6 +118,7 @@
GET_DEVICES_FOR_ATTRIBUTES,
AUDIO_MODULES_UPDATED, // oneway
SET_CURRENT_IME_UID,
+ REGISTER_SOUNDTRIGGER_CAPTURE_STATE_LISTENER,
};
#define MAX_ITEMS_PER_LIST 1024
@@ -1470,6 +1474,27 @@
data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor());
remote()->transact(AUDIO_MODULES_UPDATED, data, &reply, IBinder::FLAG_ONEWAY);
}
+
+ status_t registerSoundTriggerCaptureStateListener(
+ const sp<media::ICaptureStateListener>& listener,
+ bool* result) override {
+ Parcel data, reply;
+ status_t status;
+ status =
+ data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor());
+ if (status != NO_ERROR) return status;
+ status = data.writeStrongBinder(IInterface::asBinder(listener));
+ if (status != NO_ERROR) return status;
+ status =
+ remote()->transact(REGISTER_SOUNDTRIGGER_CAPTURE_STATE_LISTENER,
+ data,
+ &reply,
+ 0);
+ if (status != NO_ERROR) return status;
+ status = reply.readBool(result);
+ if (status != NO_ERROR) return status;
+ return NO_ERROR;
+ }
};
IMPLEMENT_META_INTERFACE(AudioPolicyService, "android.media.IAudioPolicyService");
@@ -1543,7 +1568,8 @@
case GET_DEVICES_FOR_ATTRIBUTES:
case SET_ALLOWED_CAPTURE_POLICY:
case AUDIO_MODULES_UPDATED:
- case SET_CURRENT_IME_UID: {
+ case SET_CURRENT_IME_UID:
+ case REGISTER_SOUNDTRIGGER_CAPTURE_STATE_LISTENER: {
if (!isServiceUid(IPCThreadState::self()->getCallingUid())) {
ALOGW("%s: transaction %d received from PID %d unauthorized UID %d",
__func__, code, IPCThreadState::self()->getCallingPid(),
@@ -2706,6 +2732,31 @@
return NO_ERROR;
}
+ case REGISTER_SOUNDTRIGGER_CAPTURE_STATE_LISTENER: {
+ CHECK_INTERFACE(IAudioPolicyService, data, reply);
+ sp<IBinder> binder = data.readStrongBinder();
+ if (binder == nullptr) {
+ return BAD_VALUE;
+ }
+ sp<ICaptureStateListener>
+ listener = interface_cast<ICaptureStateListener>(
+ binder);
+ if (listener == nullptr) {
+ return BAD_VALUE;
+ }
+ bool ret;
+ status_t status =
+ registerSoundTriggerCaptureStateListener(listener, &ret);
+ LOG_ALWAYS_FATAL_IF(status != NO_ERROR,
+ "Server returned unexpected status code: %d",
+ status);
+ status = reply->writeBool(ret);
+ if (status != NO_ERROR) {
+ return status;
+ }
+ return NO_ERROR;
+ } break;
+
default:
return BBinder::onTransact(code, data, reply, flags);
}
diff --git a/media/libaudioclient/include/media/IAudioPolicyService.h b/media/libaudioclient/include/media/IAudioPolicyService.h
index 62066bf..bb1c07f 100644
--- a/media/libaudioclient/include/media/IAudioPolicyService.h
+++ b/media/libaudioclient/include/media/IAudioPolicyService.h
@@ -31,6 +31,11 @@
#include <vector>
namespace android {
+namespace media {
+// Must be pre-declared, or else there isn't a good way to generate a header
+// library.
+class ICaptureStateListener;
+}
// ----------------------------------------------------------------------------
@@ -243,6 +248,12 @@
virtual status_t getPreferredDeviceForStrategy(product_strategy_t strategy,
AudioDeviceTypeAddr &device) = 0;
+
+ // The return code here is only intended to represent transport errors. The
+ // actual server implementation should always return NO_ERROR.
+ virtual status_t registerSoundTriggerCaptureStateListener(
+ const sp<media::ICaptureStateListener>& listener,
+ bool* result) = 0;
};
diff --git a/services/audiopolicy/service/Android.bp b/services/audiopolicy/service/Android.bp
index 35a4599..6ee573f 100644
--- a/services/audiopolicy/service/Android.bp
+++ b/services/audiopolicy/service/Android.bp
@@ -28,7 +28,7 @@
"libmediautils",
"libsensorprivacy",
"libutils",
- "soundtrigger_middleware-aidl-cpp",
+ "capture_state_listener-aidl-cpp",
],
static_libs: [
diff --git a/services/audiopolicy/service/AudioPolicyClientImpl.cpp b/services/audiopolicy/service/AudioPolicyClientImpl.cpp
index 5b81b9d..9fa7a53 100644
--- a/services/audiopolicy/service/AudioPolicyClientImpl.cpp
+++ b/services/audiopolicy/service/AudioPolicyClientImpl.cpp
@@ -19,7 +19,6 @@
#include "AudioPolicyService.h"
-#include <android/media/soundtrigger_middleware/ISoundTriggerMiddlewareService.h>
#include <utils/Log.h>
#include "BinderProxy.h"
@@ -242,12 +241,9 @@
return AudioSystem::newAudioUniqueId(use);
}
-void AudioPolicyService::AudioPolicyClient::setSoundTriggerCaptureState(bool active) {
- using media::soundtrigger_middleware::ISoundTriggerMiddlewareService;
-
- static BinderProxy<ISoundTriggerMiddlewareService>
- proxy("soundtrigger_middleware");
- proxy.waitServiceOrDie()->setExternalCaptureState(active);
+void AudioPolicyService::AudioPolicyClient::setSoundTriggerCaptureState(bool active)
+{
+ mAudioPolicyService->mCaptureStateNotifier.setCaptureState(active);
}
} // namespace android
diff --git a/services/audiopolicy/service/AudioPolicyInterfaceImpl.cpp b/services/audiopolicy/service/AudioPolicyInterfaceImpl.cpp
index 6d79c94..9577160 100644
--- a/services/audiopolicy/service/AudioPolicyInterfaceImpl.cpp
+++ b/services/audiopolicy/service/AudioPolicyInterfaceImpl.cpp
@@ -1523,4 +1523,12 @@
return mAudioPolicyManager->getPreferredDeviceForStrategy(strategy, device);
}
+status_t AudioPolicyService::registerSoundTriggerCaptureStateListener(
+ const sp<media::ICaptureStateListener>& listener,
+ bool* result)
+{
+ *result = mCaptureStateNotifier.RegisterListener(listener);
+ return NO_ERROR;
+}
+
} // namespace android
diff --git a/services/audiopolicy/service/AudioPolicyService.cpp b/services/audiopolicy/service/AudioPolicyService.cpp
index cbe6eb9..d743be9 100644
--- a/services/audiopolicy/service/AudioPolicyService.cpp
+++ b/services/audiopolicy/service/AudioPolicyService.cpp
@@ -57,9 +57,13 @@
// ----------------------------------------------------------------------------
AudioPolicyService::AudioPolicyService()
- : BnAudioPolicyService(), mpAudioPolicyDev(NULL), mpAudioPolicy(NULL),
- mAudioPolicyManager(NULL), mAudioPolicyClient(NULL), mPhoneState(AUDIO_MODE_INVALID)
-{
+ : BnAudioPolicyService(),
+ mpAudioPolicyDev(NULL),
+ mpAudioPolicy(NULL),
+ mAudioPolicyManager(NULL),
+ mAudioPolicyClient(NULL),
+ mPhoneState(AUDIO_MODE_INVALID),
+ mCaptureStateNotifier(false) {
}
void AudioPolicyService::onFirstRef()
diff --git a/services/audiopolicy/service/AudioPolicyService.h b/services/audiopolicy/service/AudioPolicyService.h
index 3f24276..f77a481 100644
--- a/services/audiopolicy/service/AudioPolicyService.h
+++ b/services/audiopolicy/service/AudioPolicyService.h
@@ -34,6 +34,7 @@
#include <media/AudioPolicy.h>
#include <mediautils/ServiceUtilities.h>
#include "AudioPolicyEffects.h"
+#include "CaptureStateNotifier.h"
#include <AudioPolicyInterface.h>
#include <android/hardware/BnSensorPrivacyListener.h>
@@ -274,6 +275,10 @@
virtual status_t getVolumeGroupFromAudioAttributes(const AudioAttributes &aa,
volume_group_t &volumeGroup);
+ status_t registerSoundTriggerCaptureStateListener(
+ const sp<media::ICaptureStateListener>& listener,
+ bool* result) override;
+
virtual status_t setRttEnabled(bool enabled);
bool isCallScreenModeSupported() override;
@@ -897,6 +902,8 @@
DefaultKeyedVector< audio_port_handle_t, sp<AudioPlaybackClient> > mAudioPlaybackClients;
MediaPackageManager mPackageManager; // To check allowPlaybackCapture
+
+ CaptureStateNotifier mCaptureStateNotifier;
};
} // namespace android