From bd48a2feb5d134833f080b1d093b5c833c59a9be Mon Sep 17 00:00:00 2001 From: f4exb Date: Tue, 19 Feb 2019 02:07:26 +0100 Subject: [PATCH] Copy audio to UDP/RTP: Opus implementation (5) --- sdrbase/audio/audionetsink.cpp | 2 ++ sdrbase/audio/audioopus.cpp | 7 ++++++- sdrbase/audio/audioopus.h | 2 ++ sdrgui/audio.md | 7 ++++--- sdrgui/gui/audiodialog.cpp | 2 ++ 5 files changed, 16 insertions(+), 4 deletions(-) diff --git a/sdrbase/audio/audionetsink.cpp b/sdrbase/audio/audionetsink.cpp index 275539c81..5b3315f59 100644 --- a/sdrbase/audio/audionetsink.cpp +++ b/sdrbase/audio/audionetsink.cpp @@ -175,6 +175,8 @@ void AudioNetSink::setNewCodecData() << " Fs: " << m_sampleRate/m_decimation << " stereo: " << m_stereo; m_opus.setEncoder(m_sampleRate/m_decimation, m_stereo ? 2 : 1); + m_codecInputIndex = 0; + m_bufferIndex = 0; } setDecimationFilters(); diff --git a/sdrbase/audio/audioopus.cpp b/sdrbase/audio/audioopus.cpp index cdf5b2057..1a964356f 100644 --- a/sdrbase/audio/audioopus.cpp +++ b/sdrbase/audio/audioopus.cpp @@ -20,12 +20,14 @@ #include "opus/opus.h" #include +#include #include "audioopus.h" AudioOpus::AudioOpus() : m_encoderState(0), - m_encoderOK(false) + m_encoderOK(false), + m_mutex(QMutex::Recursive) { qDebug("AudioOpus::AudioOpus: libopus version %s", opus_get_version_string()); } @@ -41,6 +43,7 @@ void AudioOpus::setEncoder(int32_t fs, int nChannels) { int error; bool newInstance = true; + QMutexLocker mutexLocker(&m_mutex); if (m_encoderState) { @@ -85,6 +88,8 @@ void AudioOpus::setEncoder(int32_t fs, int nChannels) int AudioOpus::encode(int frameSize, int16_t *in, uint8_t *out) { + QMutexLocker mutexLocker(&m_mutex); + int nbBytes = opus_encode(m_encoderState, in, frameSize, out, m_maxPacketSize); if (nbBytes < 0) diff --git a/sdrbase/audio/audioopus.h b/sdrbase/audio/audioopus.h index 14fdee121..b9aba5e06 100644 --- a/sdrbase/audio/audioopus.h +++ b/sdrbase/audio/audioopus.h @@ -19,6 +19,7 @@ #define SDRBASE_AUDIO_AUDIOOPUS_H_ #include +#include #include "export.h" class OpusEncoder; @@ -38,6 +39,7 @@ public: private: OpusEncoder *m_encoderState; bool m_encoderOK; + QMutex m_mutex; }; #endif /* SDRBASE_AUDIO_AUDIOOPUS_H_ */ diff --git a/sdrgui/audio.md b/sdrgui/audio.md index 9cb03a137..3c158acde 100644 --- a/sdrgui/audio.md +++ b/sdrgui/audio.md @@ -129,12 +129,13 @@ m=audio 9998 RTP/AVP 9 a=rtpmap:9 G722/8000/1 ``` -For Opus mono: +For Opus mono or stereo: ``` c=IN IP4 192.168.0.34 -m=audio 9998 RTP/AVP 101 -a=rtpmap:101 opus/48000/1 +m=audio 9998 RTP/AVP 96 +a=rtpmap:96 opus/48000/2 +a=fmtp:96 cbr=1 ``` ☞ Note that on Android clients VLC has trouble working with the RTP stream (choppy audio, hanging unexpectedly...) therefore [MX player](https://play.google.com/store/apps/details?id=com.mxtech.videoplayer.ad&hl=en) is recommended. diff --git a/sdrgui/gui/audiodialog.cpp b/sdrgui/gui/audiodialog.cpp index ca1f6514a..665cb5429 100644 --- a/sdrgui/gui/audiodialog.cpp +++ b/sdrgui/gui/audiodialog.cpp @@ -317,6 +317,8 @@ void AudioDialogX::updateOutputSDPString() break; case AudioOutput::UDPCodecOpus: format = "opus"; + nChannels = 2; // always 2 even for mono + effectiveSampleRate = 48000; // always 48000 regardless of input rate break; case AudioOutput::UDPCodecL16: default: