mirror of
https://github.com/f4exb/sdrangel.git
synced 2024-09-28 15:56:33 -04: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->setUdpCopyToUDP(deviceInfo.copyToUDP);
|
||||||
audioOutput->setUdpDestination(deviceInfo.udpAddress, deviceInfo.udpPort);
|
audioOutput->setUdpDestination(deviceInfo.udpAddress, deviceInfo.udpPort);
|
||||||
audioOutput->setUdpUseRTP(deviceInfo.udpUseRTP);
|
audioOutput->setUdpUseRTP(deviceInfo.udpUseRTP);
|
||||||
|
audioOutput->setUdpChannelMode(deviceInfo.udpChannelMode);
|
||||||
|
audioOutput->setUdpChannelFormat(deviceInfo.udpChannelMode == AudioOutput::UDPChannelStereo, deviceInfo.sampleRate);
|
||||||
}
|
}
|
||||||
|
|
||||||
void AudioDeviceManager::unsetOutputDeviceInfo(int outputDeviceIndex)
|
void AudioDeviceManager::unsetOutputDeviceInfo(int outputDeviceIndex)
|
||||||
|
@ -94,6 +94,11 @@ void AudioNetSink::setStereo(bool stereo)
|
|||||||
m_rtpBufferAudio->setPayloadType(stereo ? RTPSink::PayloadL16Stereo : RTPSink::PayloadL16Mono);
|
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)
|
void AudioNetSink::write(qint16 sample)
|
||||||
{
|
{
|
||||||
if (m_type == SinkUDP)
|
if (m_type == SinkUDP)
|
||||||
|
@ -44,6 +44,7 @@ public:
|
|||||||
void addDestination(const QString& address, uint16_t port);
|
void addDestination(const QString& address, uint16_t port);
|
||||||
void deleteDestination(const QString& address, uint16_t port);
|
void deleteDestination(const QString& address, uint16_t port);
|
||||||
void setStereo(bool stereo);
|
void setStereo(bool stereo);
|
||||||
|
void setParameters(bool stereo, int sampleRate);
|
||||||
|
|
||||||
void write(qint16 sample);
|
void write(qint16 sample);
|
||||||
void write(qint16 lSample, qint16 rSample);
|
void write(qint16 lSample, qint16 rSample);
|
||||||
|
@ -197,13 +197,16 @@ void AudioOutput::setUdpUseRTP(bool useRTP)
|
|||||||
|
|
||||||
void AudioOutput::setUdpChannelMode(UDPChannelMode udpChannelMode)
|
void AudioOutput::setUdpChannelMode(UDPChannelMode udpChannelMode)
|
||||||
{
|
{
|
||||||
if (m_audioNetSink) {
|
|
||||||
m_audioNetSink->setStereo(udpChannelMode == UDPChannelStereo);
|
|
||||||
}
|
|
||||||
|
|
||||||
m_udpChannelMode = udpChannelMode;
|
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)
|
qint64 AudioOutput::readData(char* data, qint64 maxLen)
|
||||||
{
|
{
|
||||||
//qDebug("AudioOutput::readData: %lld", maxLen);
|
//qDebug("AudioOutput::readData: %lld", maxLen);
|
||||||
|
@ -58,6 +58,7 @@ public:
|
|||||||
void setUdpCopyToUDP(bool copyToUDP);
|
void setUdpCopyToUDP(bool copyToUDP);
|
||||||
void setUdpUseRTP(bool useRTP);
|
void setUdpUseRTP(bool useRTP);
|
||||||
void setUdpChannelMode(UDPChannelMode udpChannelMode);
|
void setUdpChannelMode(UDPChannelMode udpChannelMode);
|
||||||
|
void setUdpChannelFormat(bool stereo, int sampleRate);
|
||||||
|
|
||||||
private:
|
private:
|
||||||
QMutex m_mutex;
|
QMutex m_mutex;
|
||||||
|
@ -53,7 +53,7 @@ RTPSink::RTPSink(QUdpSocket *udpSocket, bool stereo) :
|
|||||||
qDebug("RTPSink::RTPSink: created session: %s", qrtplib::RTPGetErrorString(status).c_str());
|
qDebug("RTPSink::RTPSink: created session: %s", qrtplib::RTPGetErrorString(status).c_str());
|
||||||
}
|
}
|
||||||
|
|
||||||
setPayloadType(m_payloadType);
|
setPayloadInformation(m_payloadType, m_sampleRate);
|
||||||
m_valid = true;
|
m_valid = true;
|
||||||
|
|
||||||
uint32_t endianTest32 = 1;
|
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)
|
void RTPSink::setPayloadType(PayloadType payloadType)
|
||||||
{
|
{
|
||||||
uint32_t timestampinc;
|
uint32_t timestampinc;
|
||||||
|
@ -49,6 +49,7 @@ public:
|
|||||||
|
|
||||||
bool isValid() const { return m_valid; }
|
bool isValid() const { return m_valid; }
|
||||||
void setPayloadType(PayloadType payloadType);
|
void setPayloadType(PayloadType payloadType);
|
||||||
|
void setPayloadInformation(PayloadType payloadType, int sampleRate);
|
||||||
|
|
||||||
void setDestination(const QString& address, uint16_t port);
|
void setDestination(const QString& address, uint16_t port);
|
||||||
void deleteDestination(const QString& address, uint16_t port);
|
void deleteDestination(const QString& address, uint16_t port);
|
||||||
|
Loading…
Reference in New Issue
Block a user