libaaudio: fix error passing for errorCallback
Bug: 36489240
Test: CTS test_aaudio.cpp
Change-Id: I67ece88c5a17392d102b20c3899e7fec15e3d6b4
Signed-off-by: Phil Burk <philburk@google.com>
(cherry picked from commit 65658fa931455a52847bec80e76c9799c3790604)
diff --git a/media/libaaudio/src/client/AudioStreamInternal.cpp b/media/libaaudio/src/client/AudioStreamInternal.cpp
index 1f9ce4f..2f12ada 100644
--- a/media/libaaudio/src/client/AudioStreamInternal.cpp
+++ b/media/libaaudio/src/client/AudioStreamInternal.cpp
@@ -199,11 +199,11 @@
void *AudioStreamInternal::callbackLoop() {
aaudio_result_t result = AAUDIO_OK;
aaudio_data_callback_result_t callbackResult = AAUDIO_CALLBACK_RESULT_CONTINUE;
- int32_t framesWritten = 0;
AAudioStream_dataCallback appCallback = getDataCallbackProc();
if (appCallback == nullptr) return NULL;
- while (mCallbackEnabled.load() && isPlaying() && (result >= 0)) { // result might be a frame count
+ // result might be a frame count
+ while (mCallbackEnabled.load() && isPlaying() && (result >= 0)) {
// Call application using the AAudio callback interface.
callbackResult = (*appCallback)(
(AAudioStream *) this,
@@ -212,30 +212,32 @@
mCallbackFrames);
if (callbackResult == AAUDIO_CALLBACK_RESULT_CONTINUE) {
- // Write audio data to stream
+ // Write audio data to stream.
int64_t timeoutNanos = calculateReasonableTimeout(mCallbackFrames);
+
+ // This is a BLOCKING WRITE!
result = write(mCallbackBuffer, mCallbackFrames, timeoutNanos);
- if (result == AAUDIO_ERROR_DISCONNECTED) {
+ if ((result != mCallbackFrames)) {
+ ALOGE("AudioStreamInternal(): callbackLoop: write() returned %d", result);
+ if (result >= 0) {
+ // Only wrote some of the frames requested. Must have timed out.
+ result = AAUDIO_ERROR_TIMEOUT;
+ }
if (getErrorCallbackProc() != nullptr) {
- ALOGD("AudioStreamAAudio(): callbackLoop() stream disconnected");
(*getErrorCallbackProc())(
(AAudioStream *) this,
getErrorCallbackUserData(),
- AAUDIO_OK);
+ result);
}
break;
- } else if (result != mCallbackFrames) {
- ALOGE("AudioStreamAAudio(): callbackLoop() wrote %d / %d",
- framesWritten, mCallbackFrames);
- break;
}
} else if (callbackResult == AAUDIO_CALLBACK_RESULT_STOP) {
- ALOGD("AudioStreamAAudio(): callback returned AAUDIO_CALLBACK_RESULT_STOP");
+ ALOGD("AudioStreamInternal(): callback returned AAUDIO_CALLBACK_RESULT_STOP");
break;
}
}
- ALOGD("AudioStreamAAudio(): callbackLoop() exiting, result = %d, isPlaying() = %d",
+ ALOGD("AudioStreamInternal(): callbackLoop() exiting, result = %d, isPlaying() = %d",
result, (int) isPlaying());
return NULL; // TODO review
}
@@ -243,7 +245,7 @@
static void *aaudio_callback_thread_proc(void *context)
{
AudioStreamInternal *stream = (AudioStreamInternal *)context;
- //LOGD("AudioStreamAAudio(): oboe_callback_thread, stream = %p", stream);
+ //LOGD("AudioStreamInternal(): oboe_callback_thread, stream = %p", stream);
if (stream != NULL) {
return stream->callbackLoop();
} else {