From cbf74f49702c9945ed5e039f38a63da06f3a9345 Mon Sep 17 00:00:00 2001
From: philippegorley <philippe.gorley@savoirfairelinux.com>
Date: Tue, 11 Dec 2018 16:37:46 -0500
Subject: [PATCH] audio: add function to fill frames with silence

When mixing audio frames, the mix buffer needs to be initialized with
silence.

Change-Id: I15d0573d8036a2755cbc33bdf91619cfedcf8f2d
---
 src/client/videomanager.cpp | 2 ++
 src/media/libav_deps.h      | 1 +
 src/media/libav_utils.cpp   | 8 ++++++++
 src/media/libav_utils.h     | 2 ++
 4 files changed, 13 insertions(+)

diff --git a/src/client/videomanager.cpp b/src/client/videomanager.cpp
index cbf2f1dab1..a0a93751e7 100644
--- a/src/client/videomanager.cpp
+++ b/src/client/videomanager.cpp
@@ -35,6 +35,7 @@
 #include "client/ring_signal.h"
 #include "audio/ringbufferpool.h"
 #include "dring/media_const.h"
+#include "libav_utils.h"
 
 #include <functional>
 #include <memory>
@@ -108,6 +109,7 @@ AudioFrame::mix(const AudioFrame& frame)
     }
     if (f.nb_samples == 0) {
         reserve(fIn.nb_samples);
+        ring::libav_utils::fillWithSilence(&f);
     } else if (f.nb_samples != fIn.nb_samples) {
         throw std::invalid_argument("Can't mix frames with different length");
     }
diff --git a/src/media/libav_deps.h b/src/media/libav_deps.h
index a835996d01..add322d167 100644
--- a/src/media/libav_deps.h
+++ b/src/media/libav_deps.h
@@ -38,6 +38,7 @@ extern "C" {
 #include <libavutil/imgutils.h>
 #include <libavutil/intreadwrite.h>
 #include <libavutil/log.h>
+#include <libavutil/samplefmt.h>
 }
 
 #include "libav_utils.h"
diff --git a/src/media/libav_utils.cpp b/src/media/libav_utils.cpp
index e963921f75..cdb82a7420 100644
--- a/src/media/libav_utils.cpp
+++ b/src/media/libav_utils.cpp
@@ -222,4 +222,12 @@ fillWithBlack(AVFrame* frame)
     }
 }
 
+void
+fillWithSilence(AVFrame* frame)
+{
+    int ret = av_samples_set_silence(frame->extended_data, 0, frame->nb_samples, frame->channels, (AVSampleFormat)frame->format);
+    if (ret < 0)
+        RING_ERR() << "Failed to fill frame with silence";
+}
+
 }} // namespace ring::libav_utils
diff --git a/src/media/libav_utils.h b/src/media/libav_utils.h
index d61c7b08d7..79bb356a77 100644
--- a/src/media/libav_utils.h
+++ b/src/media/libav_utils.h
@@ -47,4 +47,6 @@ namespace ring { namespace libav_utils {
 
     void fillWithBlack(AVFrame* frame);
 
+    void fillWithSilence(AVFrame* frame);
+
 }} // namespace ring::libav_utils
-- 
GitLab