Introduce CaptureStateNotifier
This is a helper class for notifying a client of capture
state changes.
Bug: 146157104
Test: Compiles (further testing as part of the topic).
Change-Id: Ie27bc404805d319a6969290a6369d59fb68c1f38
Merged-In: Ie27bc404805d319a6969290a6369d59fb68c1f38
diff --git a/services/audiopolicy/service/CaptureStateNotifier.cpp b/services/audiopolicy/service/CaptureStateNotifier.cpp
new file mode 100644
index 0000000..8a18efa
--- /dev/null
+++ b/services/audiopolicy/service/CaptureStateNotifier.cpp
@@ -0,0 +1,58 @@
+#include "CaptureStateNotifier.h"
+
+#define LOG_TAG "CaptureStateNotifier"
+
+#include <android/media/ICaptureStateListener.h>
+#include <binder/IBinder.h>
+#include <utils/Log.h>
+
+namespace android {
+
+using media::ICaptureStateListener;
+
+class CaptureStateNotifier::DeathRecipient : public IBinder::DeathRecipient {
+public:
+ DeathRecipient(CaptureStateNotifier* notifier) : mNotifier(notifier) {}
+
+ void binderDied(const wp<IBinder>&) override {
+ mNotifier->binderDied();
+ }
+
+private:
+ CaptureStateNotifier* const mNotifier;
+};
+
+CaptureStateNotifier::CaptureStateNotifier(bool initialActive) {
+ mActive = initialActive;
+}
+
+CaptureStateNotifier::~CaptureStateNotifier() {
+ LOG_ALWAYS_FATAL_IF(mListener != nullptr);
+}
+
+bool CaptureStateNotifier::RegisterListener(const sp<ICaptureStateListener>& listener) {
+ std::lock_guard<std::mutex> _l(mMutex);
+ LOG_ALWAYS_FATAL_IF(mListener != nullptr);
+
+ ALOGI("Registering a listener");
+ mListener = listener;
+ sp<IBinder> binder = IInterface::asBinder(mListener);
+ binder->linkToDeath(new DeathRecipient(this));
+ return mActive;
+}
+
+void CaptureStateNotifier::setCaptureState(bool active) {
+ std::lock_guard<std::mutex> _l(mMutex);
+ mActive = active;
+ if (mListener) {
+ mListener->setCaptureState(active);
+ }
+}
+
+void CaptureStateNotifier::binderDied() {
+ std::lock_guard<std::mutex> _l(mMutex);
+ mListener.clear();
+ ALOGI("Listener binder died");
+}
+
+} // namespace android
\ No newline at end of file