aaudio: do not assert if deleting an unopened stream

Bug: 63440754
Test: write_sine.cpp, see bug for repro case
Change-Id: I1f7ed1bd97d4cfcd54d27d41d708c6c03d3d88ac
diff --git a/services/oboeservice/AAudioService.cpp b/services/oboeservice/AAudioService.cpp
index 4ccd2f6..669bb54 100644
--- a/services/oboeservice/AAudioService.cpp
+++ b/services/oboeservice/AAudioService.cpp
@@ -137,6 +137,7 @@
         aaudio_handle_t handle = mHandleTracker.put(AAUDIO_HANDLE_TYPE_STREAM, serviceStream.get());
         if (handle < 0) {
             ALOGE("AAudioService::openStream(): handle table full");
+            serviceStream->close();
             serviceStream.clear();
         } else {
             ALOGD("AAudioService::openStream(): handle = 0x%08X", handle);
diff --git a/services/oboeservice/AAudioServiceStreamBase.cpp b/services/oboeservice/AAudioServiceStreamBase.cpp
index 2e20287..52b1801 100644
--- a/services/oboeservice/AAudioServiceStreamBase.cpp
+++ b/services/oboeservice/AAudioServiceStreamBase.cpp
@@ -42,10 +42,11 @@
 
 AAudioServiceStreamBase::~AAudioServiceStreamBase() {
     ALOGD("AAudioServiceStreamBase::~AAudioServiceStreamBase() destroying %p", this);
-    // If the stream is deleted without closing then audio resources will leak.
-    // Not being closed here would indicate an internal error. So we want to find this ASAP.
-    LOG_ALWAYS_FATAL_IF(mState != AAUDIO_STREAM_STATE_CLOSED,
-                        "service stream not closed, state = %d", mState);
+    // If the stream is deleted when OPEN or in use then audio resources will leak.
+    // This would indicate an internal error. So we want to find this ASAP.
+    LOG_ALWAYS_FATAL_IF(!(mState == AAUDIO_STREAM_STATE_CLOSED
+                        || mState == AAUDIO_STREAM_STATE_UNINITIALIZED),
+                        "service stream still open, state = %d", mState);
 }
 
 std::string AAudioServiceStreamBase::dump() const {
diff --git a/services/oboeservice/AAudioServiceStreamBase.h b/services/oboeservice/AAudioServiceStreamBase.h
index eed1a03..c7df6f3 100644
--- a/services/oboeservice/AAudioServiceStreamBase.h
+++ b/services/oboeservice/AAudioServiceStreamBase.h
@@ -144,8 +144,16 @@
         mHandle = handle;
     }
 
+    aaudio_stream_state_t getState() const {
+        return mState;
+    }
+
 protected:
 
+    void setState(aaudio_stream_state_t state) {
+        mState = state;
+    }
+
     aaudio_result_t writeUpMessageQueue(AAudioServiceMessage *command);
 
     aaudio_result_t sendCurrentTimestamp();
diff --git a/services/oboeservice/AAudioServiceStreamMMAP.cpp b/services/oboeservice/AAudioServiceStreamMMAP.cpp
index da18f44..1b80486 100644
--- a/services/oboeservice/AAudioServiceStreamMMAP.cpp
+++ b/services/oboeservice/AAudioServiceStreamMMAP.cpp
@@ -215,6 +215,7 @@
     configurationOutput.setAudioFormat(mAudioFormat);
     configurationOutput.setDeviceId(deviceId);
 
+    setState(AAUDIO_STREAM_STATE_OPEN);
     return AAUDIO_OK;
 }
 
diff --git a/services/oboeservice/AAudioServiceStreamShared.cpp b/services/oboeservice/AAudioServiceStreamShared.cpp
index 9cc5cbc..8bb34d1 100644
--- a/services/oboeservice/AAudioServiceStreamShared.cpp
+++ b/services/oboeservice/AAudioServiceStreamShared.cpp
@@ -177,6 +177,7 @@
         goto error;
     }
 
+    setState(AAUDIO_STREAM_STATE_OPEN);
     return AAUDIO_OK;
 
 error: