From 58c1ed0e233f06373cefe4270e0dd12afbc1d992 Mon Sep 17 00:00:00 2001 From: Hajime Hoshi Date: Sun, 16 May 2021 17:56:57 +0900 Subject: [PATCH] audio/internal/oboe: Bug fix: Opening a stream might fail when too many streams are opened openStream might fail when too many streams are opened in a short time. In this case, sleep 1[ms] and retry to open the stream. Updates #1549 Closes #1645 --- audio/internal/oboe/binding_android.cpp | 12 ++++++++++++ audio/internal/readerdriver/driver_android.go | 3 +-- 2 files changed, 13 insertions(+), 2 deletions(-) diff --git a/audio/internal/oboe/binding_android.cpp b/audio/internal/oboe/binding_android.cpp index f4e674ad2..1e03ec1ce 100644 --- a/audio/internal/oboe/binding_android.cpp +++ b/audio/internal/oboe/binding_android.cpp @@ -84,6 +84,8 @@ public: return "bit_depth_in_bytes_ must be 2 but not"; } + int retry_count = 0; + retry: if (!stream_) { oboe::AudioStreamBuilder builder; oboe::Result result = @@ -96,6 +98,16 @@ public: ->setDataCallback(this) ->openStream(stream_); if (result != oboe::Result::OK) { + // openStream might fail with oboe::Result::ErrorInternal when too many + // streams are opened in a short time (#1645). + if (result == oboe::Result::ErrorInternal && retry_count < 100) { + retry_count++; + // Sleep 10[ms] + timespec ts = {}; + ts.tv_nsec = 10000000; + nanosleep(&ts, nullptr); + goto retry; + } return oboe::convertToText(result); } } diff --git a/audio/internal/readerdriver/driver_android.go b/audio/internal/readerdriver/driver_android.go index e81c8203f..459c22c1f 100644 --- a/audio/internal/readerdriver/driver_android.go +++ b/audio/internal/readerdriver/driver_android.go @@ -24,8 +24,7 @@ import ( ) func IsAvailable() bool { - // Disable the reader driver for Android temporarily (#1645). - return false + return true } type context struct {