mirror of
https://github.com/f4exb/sdrangel.git
synced 2025-02-03 09:44:01 -05:00
Multiple audio support: RTP rate is device sample rate
This commit is contained in:
parent
2b3cc874c1
commit
5e776596b5
@ -573,6 +573,8 @@ void AudioDeviceManager::setOutputDeviceInfo(int outputDeviceIndex, const Output
|
||||
audioOutput->setUdpCopyToUDP(deviceInfo.copyToUDP);
|
||||
audioOutput->setUdpDestination(deviceInfo.udpAddress, deviceInfo.udpPort);
|
||||
audioOutput->setUdpUseRTP(deviceInfo.udpUseRTP);
|
||||
audioOutput->setUdpChannelMode(deviceInfo.udpChannelMode);
|
||||
audioOutput->setUdpChannelFormat(deviceInfo.udpChannelMode == AudioOutput::UDPChannelStereo, deviceInfo.sampleRate);
|
||||
}
|
||||
|
||||
void AudioDeviceManager::unsetOutputDeviceInfo(int outputDeviceIndex)
|
||||
|
@ -94,6 +94,11 @@ void AudioNetSink::setStereo(bool stereo)
|
||||
m_rtpBufferAudio->setPayloadType(stereo ? RTPSink::PayloadL16Stereo : RTPSink::PayloadL16Mono);
|
||||
}
|
||||
|
||||
void AudioNetSink::setParameters(bool stereo, int sampleRate)
|
||||
{
|
||||
m_rtpBufferAudio->setPayloadInformation(stereo ? RTPSink::PayloadL16Stereo : RTPSink::PayloadL16Mono, sampleRate);
|
||||
}
|
||||
|
||||
void AudioNetSink::write(qint16 sample)
|
||||
{
|
||||
if (m_type == SinkUDP)
|
||||
|
@ -44,6 +44,7 @@ public:
|
||||
void addDestination(const QString& address, uint16_t port);
|
||||
void deleteDestination(const QString& address, uint16_t port);
|
||||
void setStereo(bool stereo);
|
||||
void setParameters(bool stereo, int sampleRate);
|
||||
|
||||
void write(qint16 sample);
|
||||
void write(qint16 lSample, qint16 rSample);
|
||||
|
@ -197,13 +197,16 @@ void AudioOutput::setUdpUseRTP(bool useRTP)
|
||||
|
||||
void AudioOutput::setUdpChannelMode(UDPChannelMode udpChannelMode)
|
||||
{
|
||||
if (m_audioNetSink) {
|
||||
m_audioNetSink->setStereo(udpChannelMode == UDPChannelStereo);
|
||||
}
|
||||
|
||||
m_udpChannelMode = udpChannelMode;
|
||||
}
|
||||
|
||||
void AudioOutput::setUdpChannelFormat(bool stereo, int sampleRate)
|
||||
{
|
||||
if (m_audioNetSink) {
|
||||
m_audioNetSink->setParameters(stereo, sampleRate);
|
||||
}
|
||||
}
|
||||
|
||||
qint64 AudioOutput::readData(char* data, qint64 maxLen)
|
||||
{
|
||||
//qDebug("AudioOutput::readData: %lld", maxLen);
|
||||
|
@ -58,6 +58,7 @@ public:
|
||||
void setUdpCopyToUDP(bool copyToUDP);
|
||||
void setUdpUseRTP(bool useRTP);
|
||||
void setUdpChannelMode(UDPChannelMode udpChannelMode);
|
||||
void setUdpChannelFormat(bool stereo, int sampleRate);
|
||||
|
||||
private:
|
||||
QMutex m_mutex;
|
||||
|
@ -53,7 +53,7 @@ RTPSink::RTPSink(QUdpSocket *udpSocket, bool stereo) :
|
||||
qDebug("RTPSink::RTPSink: created session: %s", qrtplib::RTPGetErrorString(status).c_str());
|
||||
}
|
||||
|
||||
setPayloadType(m_payloadType);
|
||||
setPayloadInformation(m_payloadType, m_sampleRate);
|
||||
m_valid = true;
|
||||
|
||||
uint32_t endianTest32 = 1;
|
||||
@ -71,6 +71,74 @@ RTPSink::~RTPSink()
|
||||
}
|
||||
}
|
||||
|
||||
void RTPSink::setPayloadInformation(PayloadType payloadType, int sampleRate)
|
||||
{
|
||||
uint32_t timestampinc;
|
||||
QMutexLocker locker(&m_mutex);
|
||||
|
||||
qDebug("RTPSink::setPayloadType: %d sampleRate: %d", payloadType, sampleRate);
|
||||
|
||||
switch (payloadType)
|
||||
{
|
||||
case PayloadL16Stereo:
|
||||
m_sampleBytes = 4;
|
||||
m_rtpSession.SetDefaultPayloadType(96);
|
||||
timestampinc = m_sampleRate / 100;
|
||||
break;
|
||||
case PayloadL16Mono:
|
||||
default:
|
||||
m_sampleBytes = 2;
|
||||
m_rtpSession.SetDefaultPayloadType(96);
|
||||
timestampinc = m_sampleRate / 50;
|
||||
break;
|
||||
}
|
||||
|
||||
m_packetSamples = m_sampleRate/50; // 20ms packet samples
|
||||
m_bufferSize = m_packetSamples * m_sampleBytes;
|
||||
|
||||
if (m_byteBuffer) {
|
||||
delete[] m_byteBuffer;
|
||||
}
|
||||
|
||||
m_byteBuffer = new uint8_t[m_bufferSize];
|
||||
m_sampleBufferIndex = 0;
|
||||
m_payloadType = payloadType;
|
||||
|
||||
int status = m_rtpSession.SetTimestampUnit(1.0 / (double) m_sampleRate);
|
||||
|
||||
if (status < 0) {
|
||||
qCritical("RTPSink::setPayloadType: cannot set timestamp unit: %s", qrtplib::RTPGetErrorString(status).c_str());
|
||||
} else {
|
||||
qDebug("RTPSink::setPayloadType: timestamp unit set to %f: %s",
|
||||
1.0 / (double) m_sampleRate,
|
||||
qrtplib::RTPGetErrorString(status).c_str());
|
||||
}
|
||||
|
||||
status = m_rtpSession.SetDefaultMark(false);
|
||||
|
||||
if (status < 0) {
|
||||
qCritical("RTPSink::setPayloadType: cannot set default mark: %s", qrtplib::RTPGetErrorString(status).c_str());
|
||||
} else {
|
||||
qDebug("RTPSink::setPayloadType: set default mark to false: %s", qrtplib::RTPGetErrorString(status).c_str());
|
||||
}
|
||||
|
||||
status = m_rtpSession.SetDefaultTimestampIncrement(timestampinc);
|
||||
|
||||
if (status < 0) {
|
||||
qCritical("RTPSink::setPayloadType: cannot set default timestamp increment: %s", qrtplib::RTPGetErrorString(status).c_str());
|
||||
} else {
|
||||
qDebug("RTPSink::setPayloadType: set default timestamp increment to %d: %s", timestampinc, qrtplib::RTPGetErrorString(status).c_str());
|
||||
}
|
||||
|
||||
status = m_rtpSession.SetMaximumPacketSize(m_bufferSize+40);
|
||||
|
||||
if (status < 0) {
|
||||
qCritical("RTPSink::setPayloadType: cannot set maximum packet size: %s", qrtplib::RTPGetErrorString(status).c_str());
|
||||
} else {
|
||||
qDebug("RTPSink::setPayloadType: set maximum packet size to %d bytes: %s", m_bufferSize+40, qrtplib::RTPGetErrorString(status).c_str());
|
||||
}
|
||||
}
|
||||
|
||||
void RTPSink::setPayloadType(PayloadType payloadType)
|
||||
{
|
||||
uint32_t timestampinc;
|
||||
|
@ -49,6 +49,7 @@ public:
|
||||
|
||||
bool isValid() const { return m_valid; }
|
||||
void setPayloadType(PayloadType payloadType);
|
||||
void setPayloadInformation(PayloadType payloadType, int sampleRate);
|
||||
|
||||
void setDestination(const QString& address, uint16_t port);
|
||||
void deleteDestination(const QString& address, uint16_t port);
|
||||
|
Loading…
Reference in New Issue
Block a user