From a83c8a5518234d0744f7453222db3cf2d8b876c2 Mon Sep 17 00:00:00 2001 From: Mikhail Naganov Date: Tue, 5 Dec 2023 11:28:56 -0800 Subject: [PATCH] audio: Fix remote submix behavior with multiple inputs Align the behavior of the new implementation with the legacy implementation in the case when the client opens multiple input streams on the same remote submix device. Reduce the HAL buffer size to match legacy behavior. Bug: 264712385 Test: atest CtsVirtualDevicesTestCases --test-filter=".*VirtualAudioTest.*" Change-Id: Ia86a8480495693595dbb501ec58e5d1d238abab2 --- audio/aidl/default/Configuration.cpp | 4 ++-- audio/aidl/default/r_submix/ModuleRemoteSubmix.cpp | 2 +- audio/aidl/default/r_submix/StreamRemoteSubmix.cpp | 6 ++---- audio/aidl/default/r_submix/SubmixRoute.cpp | 6 ++++-- 4 files changed, 9 insertions(+), 9 deletions(-) diff --git a/audio/aidl/default/Configuration.cpp b/audio/aidl/default/Configuration.cpp index d63e353462..2a8e58f843 100644 --- a/audio/aidl/default/Configuration.cpp +++ b/audio/aidl/default/Configuration.cpp @@ -321,9 +321,9 @@ std::unique_ptr getPrimaryConfiguration() { // // Mix ports: // * "r_submix output", maximum 10 opened streams, maximum 10 active streams -// - profile PCM 16-bit; MONO, STEREO; 8000, 11025, 16000, 32000, 44100, 48000 +// - profile PCM 16-bit; STEREO; 8000, 11025, 16000, 32000, 44100, 48000 // * "r_submix input", maximum 10 opened streams, maximum 10 active streams -// - profile PCM 16-bit; MONO, STEREO; 8000, 11025, 16000, 32000, 44100, 48000 +// - profile PCM 16-bit; STEREO; 8000, 11025, 16000, 32000, 44100, 48000 // // Routes: // "r_submix output" -> "Remote Submix Out" diff --git a/audio/aidl/default/r_submix/ModuleRemoteSubmix.cpp b/audio/aidl/default/r_submix/ModuleRemoteSubmix.cpp index 3e8dd7cb39..2f4288976f 100644 --- a/audio/aidl/default/r_submix/ModuleRemoteSubmix.cpp +++ b/audio/aidl/default/r_submix/ModuleRemoteSubmix.cpp @@ -112,7 +112,7 @@ int32_t ModuleRemoteSubmix::getNominalLatencyMs(const AudioPortConfig&) { static constexpr int32_t kMaxLatencyMs = (r_submix::kDefaultPipeSizeInFrames * 1000) / r_submix::kDefaultSampleRateHz; static constexpr int32_t kMinLatencyMs = kMaxLatencyMs / r_submix::kDefaultPipePeriodCount; - return (kMaxLatencyMs + kMinLatencyMs) / 2; + return kMinLatencyMs; } } // namespace aidl::android::hardware::audio::core diff --git a/audio/aidl/default/r_submix/StreamRemoteSubmix.cpp b/audio/aidl/default/r_submix/StreamRemoteSubmix.cpp index 6258c938b0..d238aa42b3 100644 --- a/audio/aidl/default/r_submix/StreamRemoteSubmix.cpp +++ b/audio/aidl/default/r_submix/StreamRemoteSubmix.cpp @@ -73,10 +73,8 @@ std::map> StreamRemoteSubmix::s LOG(ERROR) << __func__ << ": nullptr sink when opening stream"; return ::android::NO_INIT; } - // If the sink has been shutdown or pipe recreation is forced, delete the pipe and - // recreate it. - if (sink->isShutdown()) { - LOG(DEBUG) << __func__ << ": Non-nullptr shut down sink when opening stream"; + if ((!mIsInput || mCurrentRoute->isStreamInOpen()) && sink->isShutdown()) { + LOG(DEBUG) << __func__ << ": Shut down sink when opening stream"; if (::android::OK != mCurrentRoute->resetPipe()) { LOG(ERROR) << __func__ << ": reset pipe failed"; return ::android::NO_INIT; diff --git a/audio/aidl/default/r_submix/SubmixRoute.cpp b/audio/aidl/default/r_submix/SubmixRoute.cpp index f04e607283..235c9a3f32 100644 --- a/audio/aidl/default/r_submix/SubmixRoute.cpp +++ b/audio/aidl/default/r_submix/SubmixRoute.cpp @@ -98,6 +98,9 @@ void SubmixRoute::openStream(bool isInput) { } mStreamInStandby = true; mReadCounterFrames = 0; + if (mSink != nullptr) { + mSink->shutdown(false); + } } else { mStreamOutOpen = true; } @@ -106,8 +109,7 @@ void SubmixRoute::openStream(bool isInput) { void SubmixRoute::closeStream(bool isInput) { std::lock_guard guard(mLock); if (isInput) { - mInputRefCount--; - if (mInputRefCount == 0) { + if (--mInputRefCount == 0) { mStreamInOpen = false; if (mSink != nullptr) { mSink->shutdown(true);