mirror of
https://github.com/f4exb/sdrangel.git
synced 2024-11-17 13:51:47 -05:00
RTP fixes
This commit is contained in:
parent
e64ed09308
commit
ebf3b1fc4b
@ -65,7 +65,7 @@ AMDemod::AMDemod(DeviceSourceAPI *deviceAPI) :
|
|||||||
|
|
||||||
DSPEngine::instance()->getAudioDeviceManager()->addAudioSink(&m_audioFifo, getInputMessageQueue());
|
DSPEngine::instance()->getAudioDeviceManager()->addAudioSink(&m_audioFifo, getInputMessageQueue());
|
||||||
m_audioSampleRate = DSPEngine::instance()->getAudioDeviceManager()->getOutputSampleRate();
|
m_audioSampleRate = DSPEngine::instance()->getAudioDeviceManager()->getOutputSampleRate();
|
||||||
m_audioNetSink = new AudioNetSink(0, false, false); // parent thread allocated dynamically
|
m_audioNetSink = new AudioNetSink(0); // parent thread allocated dynamically - no RTP
|
||||||
m_audioNetSink->setDestination(m_settings.m_udpAddress, m_settings.m_udpPort);
|
m_audioNetSink->setDestination(m_settings.m_udpAddress, m_settings.m_udpPort);
|
||||||
|
|
||||||
applyChannelSettings(m_inputSampleRate, m_inputFrequencyOffset, true);
|
applyChannelSettings(m_inputSampleRate, m_inputFrequencyOffset, true);
|
||||||
|
@ -42,7 +42,6 @@
|
|||||||
class DeviceSourceAPI;
|
class DeviceSourceAPI;
|
||||||
class ThreadedBasebandSampleSink;
|
class ThreadedBasebandSampleSink;
|
||||||
class DownChannelizer;
|
class DownChannelizer;
|
||||||
class AudioNetSink;
|
|
||||||
|
|
||||||
class BFMDemod : public BasebandSampleSink, public ChannelSinkAPI {
|
class BFMDemod : public BasebandSampleSink, public ChannelSinkAPI {
|
||||||
public:
|
public:
|
||||||
|
@ -81,7 +81,7 @@ NFMDemod::NFMDemod(DeviceSourceAPI *devieAPI) :
|
|||||||
m_afSquelch.setCoefficients(24, 600, 48000.0, 200, 0); // 0.5ms test period, 300ms average span, 48kS/s SR, 100ms attack, no decay
|
m_afSquelch.setCoefficients(24, 600, 48000.0, 200, 0); // 0.5ms test period, 300ms average span, 48kS/s SR, 100ms attack, no decay
|
||||||
|
|
||||||
DSPEngine::instance()->getAudioDeviceManager()->addAudioSink(&m_audioFifo, getInputMessageQueue());
|
DSPEngine::instance()->getAudioDeviceManager()->addAudioSink(&m_audioFifo, getInputMessageQueue());
|
||||||
m_audioNetSink = new AudioNetSink(0); // parent thread allocated dynamically
|
m_audioNetSink = new AudioNetSink(0); // parent thread allocated dynamically - no RTP
|
||||||
m_audioNetSink->setDestination(m_settings.m_udpAddress, m_settings.m_udpPort);
|
m_audioNetSink->setDestination(m_settings.m_udpAddress, m_settings.m_udpPort);
|
||||||
|
|
||||||
applyChannelSettings(m_inputSampleRate, m_inputFrequencyOffset, true);
|
applyChannelSettings(m_inputSampleRate, m_inputFrequencyOffset, true);
|
||||||
|
@ -66,7 +66,9 @@ SSBDemod::SSBDemod(DeviceSourceAPI *deviceAPI) :
|
|||||||
m_spanLog2 = 3;
|
m_spanLog2 = 3;
|
||||||
m_inputSampleRate = 48000;
|
m_inputSampleRate = 48000;
|
||||||
m_inputFrequencyOffset = 0;
|
m_inputFrequencyOffset = 0;
|
||||||
m_audioSampleRate = DSPEngine::instance()->getDefaultAudioSampleRate();
|
|
||||||
|
DSPEngine::instance()->getAudioDeviceManager()->addAudioSink(&m_audioFifo, getInputMessageQueue());
|
||||||
|
m_audioSampleRate = DSPEngine::instance()->getAudioDeviceManager()->getOutputSampleRate();
|
||||||
|
|
||||||
m_audioBuffer.resize(1<<14);
|
m_audioBuffer.resize(1<<14);
|
||||||
m_audioBufferFill = 0;
|
m_audioBufferFill = 0;
|
||||||
@ -86,7 +88,7 @@ SSBDemod::SSBDemod(DeviceSourceAPI *deviceAPI) :
|
|||||||
DSBFilter = new fftfilt((2.0f * m_Bandwidth) / m_audioSampleRate, 2 * ssbFftLen);
|
DSBFilter = new fftfilt((2.0f * m_Bandwidth) / m_audioSampleRate, 2 * ssbFftLen);
|
||||||
|
|
||||||
DSPEngine::instance()->getAudioDeviceManager()->addAudioSink(&m_audioFifo, getInputMessageQueue());
|
DSPEngine::instance()->getAudioDeviceManager()->addAudioSink(&m_audioFifo, getInputMessageQueue());
|
||||||
m_audioNetSink = new AudioNetSink(0); // parent thread allocated dynamically
|
m_audioNetSink = new AudioNetSink(0); // parent thread allocated dynamically - no RTP
|
||||||
m_audioNetSink->setDestination(m_settings.m_udpAddress, m_settings.m_udpPort);
|
m_audioNetSink->setDestination(m_settings.m_udpAddress, m_settings.m_udpPort);
|
||||||
|
|
||||||
applyChannelSettings(m_inputSampleRate, m_inputFrequencyOffset, true);
|
applyChannelSettings(m_inputSampleRate, m_inputFrequencyOffset, true);
|
||||||
|
@ -60,7 +60,7 @@ WFMDemod::WFMDemod(DeviceSourceAPI* deviceAPI) :
|
|||||||
m_audioBufferFill = 0;
|
m_audioBufferFill = 0;
|
||||||
|
|
||||||
DSPEngine::instance()->getAudioDeviceManager()->addAudioSink(&m_audioFifo, getInputMessageQueue());
|
DSPEngine::instance()->getAudioDeviceManager()->addAudioSink(&m_audioFifo, getInputMessageQueue());
|
||||||
m_audioNetSink = new AudioNetSink(0); // parent thread allocated dynamically
|
m_audioNetSink = new AudioNetSink(0); // parent thread allocated dynamically - no RTP
|
||||||
m_audioNetSink->setDestination(m_settings.m_udpAddress, m_settings.m_udpPort);
|
m_audioNetSink->setDestination(m_settings.m_udpAddress, m_settings.m_udpPort);
|
||||||
|
|
||||||
applyChannelSettings(m_inputSampleRate, m_inputFrequencyOffset, true);
|
applyChannelSettings(m_inputSampleRate, m_inputFrequencyOffset, true);
|
||||||
|
@ -23,17 +23,23 @@
|
|||||||
|
|
||||||
const int AudioNetSink::m_udpBlockSize = 512;
|
const int AudioNetSink::m_udpBlockSize = 512;
|
||||||
|
|
||||||
AudioNetSink::AudioNetSink(QObject *parent, bool stereo, bool useRTP) :
|
AudioNetSink::AudioNetSink(QObject *parent) :
|
||||||
m_type(SinkUDP),
|
m_type(SinkUDP),
|
||||||
m_rtpBufferAudio(0),
|
m_rtpBufferAudio(0),
|
||||||
m_bufferIndex(0),
|
m_bufferIndex(0),
|
||||||
m_port(9998)
|
m_port(9998)
|
||||||
{
|
{
|
||||||
m_udpSocket = new QUdpSocket(parent);
|
m_udpSocket = new QUdpSocket(parent);
|
||||||
|
}
|
||||||
|
|
||||||
if (useRTP) {
|
AudioNetSink::AudioNetSink(QObject *parent, int sampleRate, bool stereo) :
|
||||||
m_rtpBufferAudio = new RTPSink(m_udpSocket, stereo);
|
m_type(SinkUDP),
|
||||||
}
|
m_rtpBufferAudio(0),
|
||||||
|
m_bufferIndex(0),
|
||||||
|
m_port(9998)
|
||||||
|
{
|
||||||
|
m_udpSocket = new QUdpSocket(parent);
|
||||||
|
m_rtpBufferAudio = new RTPSink(m_udpSocket, sampleRate, stereo);
|
||||||
}
|
}
|
||||||
|
|
||||||
AudioNetSink::~AudioNetSink()
|
AudioNetSink::~AudioNetSink()
|
||||||
|
@ -37,7 +37,8 @@ public:
|
|||||||
SinkRTP
|
SinkRTP
|
||||||
} SinkType;
|
} SinkType;
|
||||||
|
|
||||||
AudioNetSink(QObject *parent, bool stereo = false, bool useRTP = true);
|
AudioNetSink(QObject *parent); //!< without RTP
|
||||||
|
AudioNetSink(QObject *parent, int sampleRate, bool stereo); //!< with RTP
|
||||||
~AudioNetSink();
|
~AudioNetSink();
|
||||||
|
|
||||||
void setDestination(const QString& address, uint16_t port);
|
void setDestination(const QString& address, uint16_t port);
|
||||||
|
@ -111,7 +111,7 @@ bool AudioOutput::start(int device, int rate)
|
|||||||
}
|
}
|
||||||
|
|
||||||
m_audioOutput = new QAudioOutput(devInfo, m_audioFormat);
|
m_audioOutput = new QAudioOutput(devInfo, m_audioFormat);
|
||||||
m_audioNetSink = new AudioNetSink(0);
|
m_audioNetSink = new AudioNetSink(0, m_audioFormat.sampleRate(), false);
|
||||||
|
|
||||||
QIODevice::open(QIODevice::ReadOnly);
|
QIODevice::open(QIODevice::ReadOnly);
|
||||||
|
|
||||||
|
@ -19,9 +19,9 @@
|
|||||||
#include "dsp/dsptypes.h"
|
#include "dsp/dsptypes.h"
|
||||||
#include <algorithm>
|
#include <algorithm>
|
||||||
|
|
||||||
RTPSink::RTPSink(QUdpSocket *udpSocket, bool stereo) :
|
RTPSink::RTPSink(QUdpSocket *udpSocket, int sampleRate, bool stereo) :
|
||||||
m_payloadType(stereo ? RTPSink::PayloadL16Stereo : RTPSink::PayloadL16Mono),
|
m_payloadType(stereo ? RTPSink::PayloadL16Stereo : RTPSink::PayloadL16Mono),
|
||||||
m_sampleRate(48000),
|
m_sampleRate(sampleRate),
|
||||||
m_sampleBytes(0),
|
m_sampleBytes(0),
|
||||||
m_packetSamples(0),
|
m_packetSamples(0),
|
||||||
m_bufferSize(0),
|
m_bufferSize(0),
|
||||||
@ -76,7 +76,7 @@ void RTPSink::setPayloadInformation(PayloadType payloadType, int sampleRate)
|
|||||||
uint32_t timestampinc;
|
uint32_t timestampinc;
|
||||||
QMutexLocker locker(&m_mutex);
|
QMutexLocker locker(&m_mutex);
|
||||||
|
|
||||||
qDebug("RTPSink::setPayloadType: %d sampleRate: %d", payloadType, sampleRate);
|
qDebug("RTPSink::setPayloadInformation: %d sampleRate: %d", payloadType, sampleRate);
|
||||||
|
|
||||||
switch (payloadType)
|
switch (payloadType)
|
||||||
{
|
{
|
||||||
@ -107,9 +107,9 @@ void RTPSink::setPayloadInformation(PayloadType payloadType, int sampleRate)
|
|||||||
int status = m_rtpSession.SetTimestampUnit(1.0 / (double) m_sampleRate);
|
int status = m_rtpSession.SetTimestampUnit(1.0 / (double) m_sampleRate);
|
||||||
|
|
||||||
if (status < 0) {
|
if (status < 0) {
|
||||||
qCritical("RTPSink::setPayloadType: cannot set timestamp unit: %s", qrtplib::RTPGetErrorString(status).c_str());
|
qCritical("RTPSink::setPayloadInformation: cannot set timestamp unit: %s", qrtplib::RTPGetErrorString(status).c_str());
|
||||||
} else {
|
} else {
|
||||||
qDebug("RTPSink::setPayloadType: timestamp unit set to %f: %s",
|
qDebug("RTPSink::setPayloadInformation: timestamp unit set to %f: %s",
|
||||||
1.0 / (double) m_sampleRate,
|
1.0 / (double) m_sampleRate,
|
||||||
qrtplib::RTPGetErrorString(status).c_str());
|
qrtplib::RTPGetErrorString(status).c_str());
|
||||||
}
|
}
|
||||||
@ -117,25 +117,26 @@ void RTPSink::setPayloadInformation(PayloadType payloadType, int sampleRate)
|
|||||||
status = m_rtpSession.SetDefaultMark(false);
|
status = m_rtpSession.SetDefaultMark(false);
|
||||||
|
|
||||||
if (status < 0) {
|
if (status < 0) {
|
||||||
qCritical("RTPSink::setPayloadType: cannot set default mark: %s", qrtplib::RTPGetErrorString(status).c_str());
|
qCritical("RTPSink::setPayloadInformation: cannot set default mark: %s", qrtplib::RTPGetErrorString(status).c_str());
|
||||||
} else {
|
} else {
|
||||||
qDebug("RTPSink::setPayloadType: set default mark to false: %s", qrtplib::RTPGetErrorString(status).c_str());
|
qDebug("RTPSink::setPayloadInformation: set default mark to false: %s", qrtplib::RTPGetErrorString(status).c_str());
|
||||||
}
|
}
|
||||||
|
|
||||||
status = m_rtpSession.SetDefaultTimestampIncrement(timestampinc);
|
status = m_rtpSession.SetDefaultTimestampIncrement(timestampinc);
|
||||||
|
|
||||||
if (status < 0) {
|
if (status < 0) {
|
||||||
qCritical("RTPSink::setPayloadType: cannot set default timestamp increment: %s", qrtplib::RTPGetErrorString(status).c_str());
|
qCritical("RTPSink::setPayloadInformation: cannot set default timestamp increment: %s", qrtplib::RTPGetErrorString(status).c_str());
|
||||||
} else {
|
} else {
|
||||||
qDebug("RTPSink::setPayloadType: set default timestamp increment to %d: %s", timestampinc, qrtplib::RTPGetErrorString(status).c_str());
|
qDebug("RTPSink::setPayloadInformation: set default timestamp increment to %d: %s", timestampinc, qrtplib::RTPGetErrorString(status).c_str());
|
||||||
}
|
}
|
||||||
|
|
||||||
status = m_rtpSession.SetMaximumPacketSize(m_bufferSize+40);
|
int maximumPacketSize = std::max(m_bufferSize+40, RTP_MINPACKETSIZE);
|
||||||
|
status = m_rtpSession.SetMaximumPacketSize(maximumPacketSize);
|
||||||
|
|
||||||
if (status < 0) {
|
if (status < 0) {
|
||||||
qCritical("RTPSink::setPayloadType: cannot set maximum packet size: %s", qrtplib::RTPGetErrorString(status).c_str());
|
qCritical("RTPSink::setPayloadInformation: cannot set maximum packet size: %s", qrtplib::RTPGetErrorString(status).c_str());
|
||||||
} else {
|
} else {
|
||||||
qDebug("RTPSink::setPayloadType: set maximum packet size to %d bytes: %s", m_bufferSize+40, qrtplib::RTPGetErrorString(status).c_str());
|
qDebug("RTPSink::setPayloadInformation: set maximum packet size to %d bytes: %s", maximumPacketSize, qrtplib::RTPGetErrorString(status).c_str());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -44,7 +44,7 @@ public:
|
|||||||
PayloadL16Stereo,
|
PayloadL16Stereo,
|
||||||
} PayloadType;
|
} PayloadType;
|
||||||
|
|
||||||
RTPSink(QUdpSocket *udpSocket, bool stereo);
|
RTPSink(QUdpSocket *udpSocket, int sampleRate, bool stereo);
|
||||||
~RTPSink();
|
~RTPSink();
|
||||||
|
|
||||||
bool isValid() const { return m_valid; }
|
bool isValid() const { return m_valid; }
|
||||||
|
Loading…
Reference in New Issue
Block a user