Multiple audio support: RTP rate is device sample rate

This commit is contained in:
f4exb 2018-03-27 00:09:52 +02:00
parent 2b3cc874c1
commit 5e776596b5
7 changed files with 86 additions and 5 deletions

View File

@ -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)

View File

@ -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)

View File

@ -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);

View File

@ -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);

View File

@ -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;

View File

@ -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;

View File

@ -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);