aaudio: prevent stop/close from a callback
Detect whether AAudioStream_requestStop() is being called
from a data or error callback and return error.
Also for start(), pause(), flush() and close().
Honor AAUDIO_CALLBACK_RESULT_STOP in Legacy callback.
Bug: 65560631
Bug: 62943389
Bug: 63096718
Test: test_various.cpp callback_blocker_none and callback_blocker_lowlat
Change-Id: I29a685cd42910f70d16e23db0f9ec00b72451cfc
diff --git a/media/libaaudio/src/legacy/AudioStreamTrack.cpp b/media/libaaudio/src/legacy/AudioStreamTrack.cpp
index c2ce9a2..9b691e0 100644
--- a/media/libaaudio/src/legacy/AudioStreamTrack.cpp
+++ b/media/libaaudio/src/legacy/AudioStreamTrack.cpp
@@ -224,8 +224,6 @@
}
aaudio_result_t AudioStreamTrack::requestStart() {
- std::lock_guard<std::mutex> lock(mStreamMutex);
-
if (mAudioTrack.get() == nullptr) {
ALOGE("requestStart() no AudioTrack");
return AAUDIO_ERROR_INVALID_STATE;
@@ -247,13 +245,12 @@
}
aaudio_result_t AudioStreamTrack::requestPause() {
- std::lock_guard<std::mutex> lock(mStreamMutex);
-
if (mAudioTrack.get() == nullptr) {
ALOGE("requestPause() no AudioTrack");
return AAUDIO_ERROR_INVALID_STATE;
} else if (getState() != AAUDIO_STREAM_STATE_STARTING
&& getState() != AAUDIO_STREAM_STATE_STARTED) {
+ // TODO What about DISCONNECTED?
ALOGE("requestPause(), called when state is %s",
AAudio_convertStreamStateToText(getState()));
return AAUDIO_ERROR_INVALID_STATE;
@@ -261,17 +258,14 @@
onStop();
setState(AAUDIO_STREAM_STATE_PAUSING);
mAudioTrack->pause();
- checkForDisconnectRequest();
status_t err = mAudioTrack->getPosition(&mPositionWhenPausing);
if (err != OK) {
return AAudioConvert_androidToAAudioResult(err);
}
- return AAUDIO_OK;
+ return checkForDisconnectRequest(false);
}
aaudio_result_t AudioStreamTrack::requestFlush() {
- std::lock_guard<std::mutex> lock(mStreamMutex);
-
if (mAudioTrack.get() == nullptr) {
ALOGE("requestFlush() no AudioTrack");
return AAUDIO_ERROR_INVALID_STATE;
@@ -288,8 +282,6 @@
}
aaudio_result_t AudioStreamTrack::requestStop() {
- std::lock_guard<std::mutex> lock(mStreamMutex);
-
if (mAudioTrack.get() == nullptr) {
ALOGE("requestStop() no AudioTrack");
return AAUDIO_ERROR_INVALID_STATE;
@@ -301,8 +293,7 @@
mFramesWritten.reset32();
mTimestampPosition.reset32();
mAudioTrack->stop();
- checkForDisconnectRequest();
- return AAUDIO_OK;
+ return checkForDisconnectRequest(false);;
}
aaudio_result_t AudioStreamTrack::updateStateMachine()