Another TX audio fix

audioplugins
Phil Taylor 2021-02-12 23:56:02 +00:00
rodzic f83f40bee8
commit 7dc580ce9c
4 zmienionych plików z 45 dodań i 42 usunięć

Wyświetl plik

@ -80,7 +80,6 @@ audioHandler::audioHandler(QObject* parent) :
isInput(0),
volume(1.0f)
{
}
audioHandler::~audioHandler()
@ -308,14 +307,13 @@ qint64 audioHandler::writeData(const char* data, qint64 len)
{
QMutexLocker locker(&mutex);
if (buffer.length() > bufferSize)
if (buffer.length() > bufferSize * 4)
{
qWarning() << "writeData() Buffer overflow";
buffer.clear();
}
int chunkSize = 960; // Assume 8bit or uLaw.
//int chunkSize = 960; // Assume 8bit or uLaw.
if (isUlaw) {
for (int f = 0; f < len / 2; f++)
{
@ -330,20 +328,12 @@ qint64 audioHandler::writeData(const char* data, qint64 len)
}
else if (radioSampleBits == 16) {
buffer.append(QByteArray::fromRawData(data, len));
chunkSize = 1920;
//chunkSize = 1920;
}
else {
qWarning() << "Unsupported number of bits! :" << radioSampleBits;
}
if (buffer.length() >= chunkSize)
{
qDebug() << "Sending haveAudioData() with " << chunkSize << " bytes " << " rxlen: " << len;
emit haveAudioData(buffer.mid(0, chunkSize));
buffer.remove(0, chunkSize);
}
return (len); // Always return the same number as we received
}
@ -361,6 +351,9 @@ void audioHandler::notified()
{
}
void audioHandler::stateChanged(QAudio::State state)
{
if (state == QAudio::IdleState && audioOutput->error() == QAudio::UnderrunError) {
@ -412,16 +405,17 @@ void audioHandler::getBufferSize()
emit sendBufferSize(audioOutput->bufferSize());
}
void audioHandler::getNextAudioChunk()
QByteArray audioHandler::getNextAudioChunk()
{
QMutexLocker locker(&mutex);
quint16 numSamples = radioSampleBits * 120;
QByteArray ret;
if (buffer.size() >= numSamples) {
emit haveAudioData(buffer.mid(0, numSamples));
ret.append(buffer.mid(0, numSamples));
buffer.remove(0, numSamples);
}
return;
return ret;
}

Wyświetl plik

@ -40,6 +40,7 @@ public:
qint64 writeData(const char* data, qint64 len);
qint64 bytesAvailable() const;
bool isSequential() const;
QByteArray getNextAudioChunk(void);
public slots:
bool init(const quint8 bits, const quint8 channels, const quint16 samplerate, const quint16 bufferSize, const bool isulaw, const bool isinput);
@ -49,7 +50,6 @@ public slots:
private slots:
void notified();
void stateChanged(QAudio::State state);
void getNextAudioChunk(void);
signals:
void audioMessage(QString message);

Wyświetl plik

@ -584,7 +584,7 @@ udpAudio::udpAudio(QHostAddress local, QHostAddress ip, quint16 aport, quint16 b
rxaudio->moveToThread(rxAudioThread);
connect(this, SIGNAL(setupRxAudio(quint8, quint8, quint16, quint16, bool, bool)), rxaudio, SLOT(init(quint8, quint8, quint16, quint16, bool, bool)));
connect(this, SIGNAL(haveAudioData(QByteArray)), rxaudio, SLOT(incomingAudio(QByteArray)));
//connect(this, SIGNAL(haveAudioData(QByteArray)), rxaudio, SLOT(incomingAudio(QByteArray)));
connect(this, SIGNAL(haveChangeBufferSize(quint16)), rxaudio, SLOT(changeBufferSize(quint16)));
connect(rxAudioThread, SIGNAL(finished()), rxaudio, SLOT(deleteLater()));
@ -601,7 +601,7 @@ udpAudio::udpAudio(QHostAddress local, QHostAddress ip, quint16 aport, quint16 b
txaudio->moveToThread(txAudioThread);
connect(this, SIGNAL(setupTxAudio(quint8, quint8, quint16, quint16, bool, bool)), txaudio, SLOT(init(quint8, quint8, quint16, quint16, bool, bool)));
connect(txaudio, SIGNAL(haveAudioData(QByteArray)), this, SLOT(sendTxAudio(QByteArray)));
//connect(txaudio, SIGNAL(haveAudioData(QByteArray)), this, SLOT(sendTxAudio(QByteArray)));
connect(txAudioThread, SIGNAL(finished()), txaudio, SLOT(deleteLater()));
rxAudioThread->start();
@ -624,40 +624,44 @@ udpAudio::~udpAudio()
txAudioThread->quit();
txAudioThread->wait();
}
if (txAudioTimer != Q_NULLPTR)
{
txAudioTimer->stop();
delete txAudioTimer;
}
}
void udpAudio::sendTxAudio(QByteArray audio)
void udpAudio::sendTxAudio()
{
quint8 p[] = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
static_cast<quint8>(localSID >> 24 & 0xff), static_cast<quint8>(localSID >> 16 & 0xff), static_cast<quint8>(localSID >> 8 & 0xff), static_cast<quint8>(localSID & 0xff),
static_cast<quint8>(remoteSID >> 24 & 0xff), static_cast<quint8>(remoteSID >> 16 & 0xff), static_cast<quint8>(remoteSID >> 8 & 0xff), static_cast<quint8>(remoteSID & 0xff),
0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00
};
int counter = 0;
//if (((txCodec == 0x01 || txCodec == 0x02) && audio.length() != 960) || (txCodec == 0x04 && audio.length() != 1920)) {
// qDebug() << "Unsupported TX audio length :" << audio.length() << " With codec: " << txCodec;
//}
while (counter < audio.length())
{
QByteArray tx = QByteArray::fromRawData((const char*)p, sizeof(p));
QByteArray partial = audio.mid(counter, 1364);
tx.append(partial);
tx[0] = static_cast<quint8>(tx.length() & 0xff);
tx[1] = static_cast<quint8>(tx.length() >> 8 & 0xff);
tx[18] = static_cast<quint8>(sendAudioSeq >> 8 & 0xff);
tx[19] = static_cast<quint8>(sendAudioSeq & 0xff);
tx[22] = static_cast<quint8>(partial.length() >> 8 & 0xff);
tx[23] = static_cast<quint8>(partial.length() & 0xff);
counter = counter + partial.length();
//qDebug() << "Sending audio packet length: " << tx.length();
SendTrackedPacket(tx);
sendAudioSeq++;
}
QByteArray audio = txaudio->getNextAudioChunk();
int counter = 0;
while (counter < audio.length() ) {
QByteArray tx = QByteArray::fromRawData((const char*)p, sizeof(p));
QByteArray partial = audio.mid(counter, 1364);
tx.append(partial);
tx[0] = static_cast<quint8>(tx.length() & 0xff);
tx[1] = static_cast<quint8>(tx.length() >> 8 & 0xff);
tx[18] = static_cast<quint8>(sendAudioSeq >> 8 & 0xff);
tx[19] = static_cast<quint8>(sendAudioSeq & 0xff);
tx[22] = static_cast<quint8>(partial.length() >> 8 & 0xff);
tx[23] = static_cast<quint8>(partial.length() & 0xff);
counter = counter + partial.length();
//qDebug() << "Sending audio packet length: " << tx.length();
SendTrackedPacket(tx);
sendAudioSeq++;
QThread::msleep(5);
}
}
void udpAudio::changeBufferSize(quint16 value)
@ -688,6 +692,9 @@ void udpAudio::DataReceived()
connect(pkt7Timer, &QTimer::timeout, this, &udpBase::SendPkt7Idle);
pkt7Timer->start(3000); // send pkt7 idle packets every 3 seconds
txAudioTimer = new QTimer(this);
connect(txAudioTimer, &QTimer::timeout, this, &udpAudio::sendTxAudio);
txAudioTimer->start(10); // send pkt7 idle packets every 3 seconds
}
}
break;
@ -719,7 +726,7 @@ void udpAudio::DataReceived()
lastReceivedSeq = gotSeq;
emit haveAudioData(r.mid(24));
rxaudio->incomingAudio(r.mid(24));
}
break;
}

Wyświetl plik

@ -132,10 +132,10 @@ signals:
public slots:
void changeBufferSize(quint16 value);
void sendTxAudio(QByteArray d);
private:
void sendTxAudio();
void DataReceived();
QAudioFormat format;
quint16 bufferSize;
@ -159,6 +159,8 @@ private:
audioHandler* txaudio;
QThread* txAudioThread;
QTimer* txAudioTimer;
};