Merge "Add an API to query audio server death count."
diff --git a/media/libaaudio/include/aaudio/AAudioTesting.h b/media/libaaudio/include/aaudio/AAudioTesting.h
index 0f2d7a2..edda6d0 100644
--- a/media/libaaudio/include/aaudio/AAudioTesting.h
+++ b/media/libaaudio/include/aaudio/AAudioTesting.h
@@ -91,6 +91,13 @@
  */
 AAUDIO_API bool AAudioStream_isMMapUsed(AAudioStream* stream);
 
+/**
+ * Returns the count of audio server death.
+ *
+ * @return audio server death count.
+ */
+AAUDIO_API int AAudio_getAudioServerDeathCount();
+
 #ifdef __cplusplus
 }
 #endif
diff --git a/media/libaaudio/src/core/AAudioAudio.cpp b/media/libaaudio/src/core/AAudioAudio.cpp
index 90ff4a5..b0504c9 100644
--- a/media/libaaudio/src/core/AAudioAudio.cpp
+++ b/media/libaaudio/src/core/AAudioAudio.cpp
@@ -25,6 +25,7 @@
 
 #include <aaudio/AAudio.h>
 #include <aaudio/AAudioTesting.h>
+#include <media/AudioSystem.h>
 #include "AudioClock.h"
 #include "AudioGlobal.h"
 #include "AudioStreamBuilder.h"
@@ -604,3 +605,7 @@
     // Do not return channel index masks as they are not public.
     return AAudio_isChannelIndexMask(channelMask) ? AAUDIO_UNSPECIFIED : channelMask;
 }
+
+AAUDIO_API int AAudio_getAudioServerDeathCount() {
+    return android::AudioSystem::getAudioFlingerDeathCount();
+}
diff --git a/media/libaaudio/src/libaaudio.map.txt b/media/libaaudio/src/libaaudio.map.txt
index f45b816..f0cb595 100644
--- a/media/libaaudio/src/libaaudio.map.txt
+++ b/media/libaaudio/src/libaaudio.map.txt
@@ -3,6 +3,7 @@
     AAudio_convertResultToText;
     AAudio_convertStreamStateToText;
     AAudio_createStreamBuilder;
+    AAudio_getAudioServerDeathCount;    # introduced=33
     AAudio_getMMapPolicy;
     AAudio_setMMapPolicy;
     AAudioStreamBuilder_setPerformanceMode;
diff --git a/media/libaudioclient/AudioSystem.cpp b/media/libaudioclient/AudioSystem.cpp
index a7b10b2..fe6a24a 100644
--- a/media/libaudioclient/AudioSystem.cpp
+++ b/media/libaudioclient/AudioSystem.cpp
@@ -17,6 +17,8 @@
 #define LOG_TAG "AudioSystem"
 //#define LOG_NDEBUG 0
 
+#include <atomic>
+
 #include <utils/Log.h>
 
 #include <android/media/IAudioPolicyService.h>
@@ -82,6 +84,8 @@
 // HotwordDetectionService.
 sp<IBinder> gAudioFlingerBinder = nullptr;
 
+std::atomic<int> gAudioFlingerDeathCount{0};
+
 void AudioSystem::setAudioFlingerBinder(const sp<IBinder>& audioFlinger) {
     if (audioFlinger->getInterfaceDescriptor() != media::IAudioFlingerService::descriptor) {
         ALOGE("setAudioFlingerBinder: received a binder of type %s",
@@ -535,6 +539,8 @@
 
     reportError(DEAD_OBJECT);
 
+    gAudioFlingerDeathCount += 1;
+
     ALOGW("AudioFlinger server died!");
 }
 
@@ -2410,6 +2416,10 @@
     return af->getAAudioHardwareBurstMinUsec();
 }
 
+int32_t AudioSystem::getAudioFlingerDeathCount() {
+    return gAudioFlingerDeathCount.load();
+}
+
 // ---------------------------------------------------------------------------
 
 int AudioSystem::AudioPolicyServiceClient::addAudioPortCallback(
diff --git a/media/libaudioclient/include/media/AudioSystem.h b/media/libaudioclient/include/media/AudioSystem.h
index e89ce15..01f22a8 100644
--- a/media/libaudioclient/include/media/AudioSystem.h
+++ b/media/libaudioclient/include/media/AudioSystem.h
@@ -565,6 +565,11 @@
     static status_t getDirectProfilesForAttributes(const audio_attributes_t* attr,
                                             std::vector<audio_profile>* audioProfiles);
 
+    /**
+     * @return count of AudioFlinger death.
+     */
+    static int32_t getAudioFlingerDeathCount();
+
     // A listener for capture state changes.
     class CaptureStateListener : public virtual RefBase {
     public: