Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 7b234d48 authored by Mikhail Naganov's avatar Mikhail Naganov
Browse files

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.*"
(cherry picked from commit a83c8a55)
Change-Id: I6f5e6a2c133059c66269b1bdd8a30392db282c4d
parent 829179e2
Loading
Loading
Loading
Loading
+2 −2
Original line number Diff line number Diff line
@@ -321,9 +321,9 @@ std::unique_ptr<Configuration> 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"
+1 −1
Original line number Diff line number Diff line
@@ -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
+2 −4
Original line number Diff line number Diff line
@@ -73,10 +73,8 @@ std::map<AudioDeviceAddress, std::shared_ptr<SubmixRoute>> 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;
+4 −2
Original line number Diff line number Diff line
@@ -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);