From 805dd510ca219a1c4b165a4229ec059441e02335 Mon Sep 17 00:00:00 2001 From: Julien Wadel Date: Thu, 26 Mar 2020 22:46:17 +0100 Subject: [PATCH] Change destroy order Let audio initialization only when playbackCard and captureCard are found. --- linphone-app/src/utils/MediastreamerUtils.cpp | 48 ++++++++++++++----- 1 file changed, 35 insertions(+), 13 deletions(-) diff --git a/linphone-app/src/utils/MediastreamerUtils.cpp b/linphone-app/src/utils/MediastreamerUtils.cpp index 890803a3c..a5b208e12 100644 --- a/linphone-app/src/utils/MediastreamerUtils.cpp +++ b/linphone-app/src/utils/MediastreamerUtils.cpp @@ -34,9 +34,14 @@ SimpleCaptureGraph::SimpleCaptureGraph(const std::string &capture, const std::st msFactory = linphone_core_get_ms_factory(ccore); playbackCard = ms_snd_card_manager_get_card(ms_factory_get_snd_card_manager(msFactory), playbackCardId.c_str()); + if (!playbackCard) + qWarning("Cannot get playback card from MSFactory with : %s", QString::fromStdString(playbackCardId)); captureCard = ms_snd_card_manager_get_card(ms_factory_get_snd_card_manager(msFactory), captureCardId.c_str()); + if (!captureCard) + qWarning("Cannot get capture card from MSFactory with : %s", QString::fromStdString(captureCardId)); - init(); + if(playbackCard && captureCard)// Assure to initialize when playback and capture are available + init(); } SimpleCaptureGraph::~SimpleCaptureGraph() @@ -64,20 +69,22 @@ void SimpleCaptureGraph::init() { //Mute playback float muteGain = 0.0f; - ms_filter_call_method(playbackVolumeFilter, static_cast(MS_VOLUME_SET_GAIN), &muteGain); + ms_filter_call_method(playbackVolumeFilter, static_cast(MS_VOLUME_SET_GAIN), &muteGain); ticker = ms_ticker_new(); running = false; + } void SimpleCaptureGraph::start() { - if (!running) { - ms_ticker_attach(ticker, audioCapture); + if (!running && audioCapture) { running = true; + ms_ticker_attach(ticker, audioCapture); + } } void SimpleCaptureGraph::stop() { - if (running) { + if (running && audioCapture){ ms_ticker_detach(ticker, audioCapture); running = false; } @@ -87,14 +94,29 @@ void SimpleCaptureGraph::destroy() { if (running) { stop(); } - ms_ticker_destroy(ticker); - ms_filter_unlink(playbackVolumeFilter, 0, audioSink, 0); - ms_filter_unlink(captureVolumeFilter, 0, playbackVolumeFilter, 0); - ms_filter_unlink(audioCapture, 0, captureVolumeFilter, 0); - ms_filter_destroy(playbackVolumeFilter); - ms_filter_destroy(captureVolumeFilter); - ms_filter_destroy(audioSink); - ms_filter_destroy(audioCapture); + + if (audioSink) + ms_filter_unlink(playbackVolumeFilter, 0, audioSink, 0); + if (captureVolumeFilter && playbackVolumeFilter) + ms_filter_unlink(captureVolumeFilter, 0, playbackVolumeFilter, 0); + if (audioCapture) + ms_filter_unlink(audioCapture, 0, captureVolumeFilter, 0); + if (playbackVolumeFilter) + ms_filter_destroy(playbackVolumeFilter); + if (captureVolumeFilter) + ms_filter_destroy(captureVolumeFilter); + if (audioSink) + ms_filter_destroy(audioSink); + if (audioCapture) + ms_filter_destroy(audioCapture); + if (ticker) { + ms_ticker_destroy(ticker);// Destroy ticker at the end to avoid conflicts between attached filters + } + ticker = nullptr; + playbackVolumeFilter = nullptr; + captureVolumeFilter = nullptr; + audioSink = nullptr; + audioCapture = nullptr; } float SimpleCaptureGraph::getCaptureGain() {