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: