From 6d1378cb2018e7bef230abe74ad8ca4bc0ada9f1 Mon Sep 17 00:00:00 2001
From: Andreas Traczyk <andreas.traczyk@savoirfairelinux.com>
Date: Mon, 31 Dec 2018 11:58:25 -0500
Subject: [PATCH] portaudiolayer: calculate frames to copy with number of
 channels

- also honor isCaptureMuted

Change-Id: Ic0c17ea2acecf8d773fc34f3487b0c12c0706247
---
 src/media/audio/portaudio/portaudiolayer.cpp | 18 +++++++++++-------
 1 file changed, 11 insertions(+), 7 deletions(-)

diff --git a/src/media/audio/portaudio/portaudiolayer.cpp b/src/media/audio/portaudio/portaudiolayer.cpp
index 52c350f536..3703fe1b85 100644
--- a/src/media/audio/portaudio/portaudiolayer.cpp
+++ b/src/media/audio/portaudio/portaudiolayer.cpp
@@ -268,13 +268,14 @@ PortAudioLayer::PortAudioLayerImpl::paOutputCallback(PortAudioLayer& parent,
     (void) timeInfo;
     (void) statusFlags;
 
-    const auto& ringBuff = parent.getToRing(parent.audioFormat_, framesPerBuffer);
-    const auto& playBuff = parent.getToPlay(parent.audioFormat_, framesPerBuffer);
-    auto toPlay = ringBuff ? ringBuff : playBuff;
-    if (!toPlay)
+    auto toPlay = parent.getPlayback(parent.audioFormat_, framesPerBuffer);
+    if (!toPlay) {
+        std::fill_n(outputBuffer, framesPerBuffer * parent.audioFormat_.nb_channels, 0);
         return paContinue;
+    }
 
-    std::copy_n((AudioSample*)toPlay->pointer()->extended_data[0], toPlay->pointer()->nb_samples, outputBuffer);
+    auto nFrames = toPlay->pointer()->nb_samples * toPlay->pointer()->channels;
+    std::copy_n((AudioSample*)toPlay->pointer()->extended_data[0], nFrames, outputBuffer);
 
     return paContinue;
 }
@@ -298,8 +299,11 @@ PortAudioLayer::PortAudioLayerImpl::paInputCallback(PortAudioLayer& parent,
     }
 
     auto inBuff = std::make_unique<AudioFrame>(parent.audioInputFormat_, framesPerBuffer);
-    std::copy_n(inputBuffer, framesPerBuffer, (AudioSample*)inBuff->pointer()->extended_data[0]);
-    //inBuff.applyGain(parent.isCaptureMuted_ ? 0.0 : parent.captureGain_);
+    auto nFrames = framesPerBuffer * parent.audioInputFormat_.nb_channels;
+    if (parent.isCaptureMuted_)
+        libav_utils::fillWithSilence(inBuff->pointer());
+    else
+        std::copy_n(inputBuffer, nFrames, (AudioSample*)inBuff->pointer()->extended_data[0]);
     mainRingBuffer_->put(std::move(inBuff));
     return paContinue;
 }
-- 
GitLab