kopia lustrzana https://gitlab.com/eliggett/wfview
Merge branch 'lan-alpha'
commit
7ea69b88e4
|
@ -747,18 +747,21 @@ audioHandler::~audioHandler()
|
|||
if (audioOutput != Q_NULLPTR) {
|
||||
audioOutput->stop();
|
||||
delete audioOutput;
|
||||
qDebug(logAudio()) << "Audio output stopped";
|
||||
}
|
||||
if (audioInput != Q_NULLPTR) {
|
||||
audioInput->stop();
|
||||
delete audioInput;
|
||||
qDebug(logAudio()) << "Audio input stopped";
|
||||
}
|
||||
|
||||
if (resampler != NULL) {
|
||||
speex_resampler_destroy(resampler);
|
||||
qDebug(logAudio()) << "Resampler closed";
|
||||
}
|
||||
}
|
||||
|
||||
bool audioHandler::init(const quint8 bits, const quint8 channels, const quint16 samplerate, const quint16 latency, const bool ulaw, const bool isinput, QString port, quint8 resampleQuality)
|
||||
bool audioHandler::init(const quint8 bits, const quint8 channels, const quint16 samplerate, const quint16 latency, const bool ulaw, const bool isinput, QAudioDeviceInfo port, quint8 resampleQuality)
|
||||
{
|
||||
if (isInitialized) {
|
||||
return false;
|
||||
|
@ -789,16 +792,10 @@ bool audioHandler::init(const quint8 bits, const quint8 channels, const quint16
|
|||
if (isInput) {
|
||||
resampler = wf_resampler_init(radioChannels, INTERNAL_SAMPLE_RATE, samplerate, resampleQuality, &resample_error);
|
||||
|
||||
const auto deviceInfos = QAudioDeviceInfo::availableDevices(QAudio::AudioInput);
|
||||
for (const QAudioDeviceInfo& deviceInfo : deviceInfos) {
|
||||
if (deviceInfo.deviceName() == port) {
|
||||
qInfo(logAudio()) << "Input Audio Device name: " << deviceInfo.deviceName();
|
||||
isInitialized = setDevice(deviceInfo);
|
||||
break;
|
||||
}
|
||||
}
|
||||
isInitialized = setDevice(port);
|
||||
|
||||
if (!isInitialized) {
|
||||
qInfo(logAudio()) << "Input device " << deviceInfo.deviceName() << " not found, using default";
|
||||
qInfo(logAudio()) << "Input device " << port.deviceName() << " not found, using default";
|
||||
isInitialized = setDevice(QAudioDeviceInfo::defaultInputDevice());
|
||||
}
|
||||
}
|
||||
|
@ -806,16 +803,10 @@ bool audioHandler::init(const quint8 bits, const quint8 channels, const quint16
|
|||
{
|
||||
resampler = wf_resampler_init(radioChannels, samplerate, INTERNAL_SAMPLE_RATE, resampleQuality, &resample_error);
|
||||
|
||||
const auto deviceInfos = QAudioDeviceInfo::availableDevices(QAudio::AudioOutput);
|
||||
for (const QAudioDeviceInfo& deviceInfo : deviceInfos) {
|
||||
if (deviceInfo.deviceName() == port) {
|
||||
qInfo(logAudio()) << "Output Audio Device name: " << deviceInfo.deviceName();
|
||||
isInitialized = setDevice(deviceInfo);
|
||||
break;
|
||||
}
|
||||
}
|
||||
isInitialized = setDevice(port);
|
||||
|
||||
if (!isInitialized) {
|
||||
qInfo(logAudio()) << "Output device " << deviceInfo.deviceName() << " not found, using default";
|
||||
qInfo(logAudio()) << "Output device " << deviceInfo.deviceName() << " not found, using default";
|
||||
isInitialized = setDevice(QAudioDeviceInfo::defaultOutputDevice());
|
||||
}
|
||||
}
|
||||
|
@ -823,7 +814,7 @@ bool audioHandler::init(const quint8 bits, const quint8 channels, const quint16
|
|||
wf_resampler_get_ratio(resampler, &ratioNum, &ratioDen);
|
||||
qInfo(logAudio()) << (isInput ? "Input" : "Output") << "wf_resampler_init() returned: " << resample_error << " ratioNum" << ratioNum << " ratioDen" << ratioDen;
|
||||
|
||||
qInfo(logAudio()) << (isInput ? "Input" : "Output") << "audio port name: " << port;
|
||||
qInfo(logAudio()) << (isInput ? "Input" : "Output") << "audio port name: " << deviceInfo.deviceName();
|
||||
return isInitialized;
|
||||
}
|
||||
|
||||
|
@ -902,11 +893,11 @@ void audioHandler::reinit()
|
|||
audioOutput = new QAudioOutput(deviceInfo, format, this);
|
||||
|
||||
// This seems to only be needed on Linux but is critical in aligning buffer sizes.
|
||||
#ifdef Q_OS_MAC
|
||||
//#ifdef Q_OS_MAC
|
||||
audioOutput->setBufferSize(chunkSize*8);
|
||||
#else
|
||||
audioOutput->setBufferSize(chunkSize*4);
|
||||
#endif
|
||||
//#else
|
||||
// audioOutput->setBufferSize(chunkSize*4);
|
||||
//#endif
|
||||
|
||||
connect(audioOutput, SIGNAL(notify()), SLOT(notified()));
|
||||
connect(audioOutput, SIGNAL(stateChanged(QAudio::State)), SLOT(stateChanged(QAudio::State)));
|
||||
|
@ -926,11 +917,13 @@ void audioHandler::start()
|
|||
}
|
||||
|
||||
if (isInput) {
|
||||
this->open(QIODevice::WriteOnly | QIODevice::Unbuffered);
|
||||
audioInput->start(this);
|
||||
//this->open(QIODevice::WriteOnly | QIODevice::Unbuffered);
|
||||
this->open(QIODevice::WriteOnly);
|
||||
audioInput->start(this);
|
||||
}
|
||||
else {
|
||||
this->open(QIODevice::ReadOnly | QIODevice::Unbuffered);
|
||||
//this->open(QIODevice::ReadOnly | QIODevice::Unbuffered);
|
||||
this->open(QIODevice::ReadOnly);
|
||||
audioOutput->start(this);
|
||||
}
|
||||
}
|
||||
|
|
|
@ -57,7 +57,7 @@ public:
|
|||
void getNextAudioChunk(QByteArray &data);
|
||||
bool isChunkAvailable();
|
||||
public slots:
|
||||
bool init(const quint8 bits, const quint8 channels, const quint16 samplerate, const quint16 latency, const bool isulaw, const bool isinput, QString port, quint8 resampleQuality);
|
||||
bool init(const quint8 bits, const quint8 channels, const quint16 samplerate, const quint16 latency, const bool isulaw, const bool isinput, QAudioDeviceInfo port, quint8 resampleQuality);
|
||||
void incomingAudio(const audioPacket data);
|
||||
void changeLatency(const quint16 newSize);
|
||||
|
||||
|
|
|
@ -147,6 +147,7 @@ void rigCommander::commSetup(unsigned char rigCivAddr, udpPreferences prefs, QSt
|
|||
|
||||
void rigCommander::closeComm()
|
||||
{
|
||||
qDebug(logRig()) << "Closing rig comms";
|
||||
if (comm != Q_NULLPTR) {
|
||||
delete comm;
|
||||
}
|
||||
|
@ -2573,9 +2574,12 @@ void rigCommander::determineRigCaps()
|
|||
rigCaps.spectSeqMax = 0;
|
||||
rigCaps.spectAmpMax = 0;
|
||||
rigCaps.spectLenMax = 0;
|
||||
|
||||
|
||||
// Clear inputs list in case we have re-connected.
|
||||
rigCaps.inputs.clear();
|
||||
// Clear inputs/preamps/attenuators lists in case we have re-connected.
|
||||
rigCaps.preamps.clear();
|
||||
rigCaps.attenuators.clear();
|
||||
rigCaps.inputs.clear();
|
||||
rigCaps.inputs.append(inputMic);
|
||||
|
||||
rigCaps.hasAttenuator = true; // Verify that all recent rigs have attenuators
|
||||
|
|
113
udphandler.cpp
113
udphandler.cpp
|
@ -14,8 +14,8 @@ udpHandler::udpHandler(udpPreferences prefs) :
|
|||
txLatency(prefs.audioTXLatency),
|
||||
rxCodec(prefs.audioRXCodec),
|
||||
txCodec(prefs.audioTXCodec),
|
||||
audioInputPort(prefs.audioInput),
|
||||
audioOutputPort(prefs.audioOutput),
|
||||
audioInputPort(prefs.inputDevice),
|
||||
audioOutputPort(prefs.outputDevice),
|
||||
resampleQuality(prefs.resampleQuality)
|
||||
{
|
||||
|
||||
|
@ -687,7 +687,7 @@ void udpCivData::dataReceived()
|
|||
|
||||
|
||||
// Audio stream
|
||||
udpAudio::udpAudio(QHostAddress local, QHostAddress ip, quint16 audioPort, quint16 rxlatency, quint16 txlatency, quint16 rxsample, quint8 rxcodec, quint16 txsample, quint8 txcodec, QString outputPort, QString inputPort,quint8 resampleQuality)
|
||||
udpAudio::udpAudio(QHostAddress local, QHostAddress ip, quint16 audioPort, quint16 rxlatency, quint16 txlatency, quint16 rxsample, quint8 rxcodec, quint16 txsample, quint8 txcodec, QAudioDeviceInfo outputPort, QAudioDeviceInfo inputPort,quint8 resampleQuality)
|
||||
{
|
||||
qInfo(logUdp()) << "Starting udpAudio";
|
||||
this->localIP = local;
|
||||
|
@ -736,7 +736,7 @@ udpAudio::udpAudio(QHostAddress local, QHostAddress ip, quint16 audioPort, quint
|
|||
|
||||
rxAudioThread->start();
|
||||
|
||||
connect(this, SIGNAL(setupRxAudio(quint8, quint8, quint16, quint16, bool, bool, QString, quint8)), rxaudio, SLOT(init(quint8, quint8, quint16, quint16, bool, bool,QString, quint8)));
|
||||
connect(this, SIGNAL(setupRxAudio(quint8, quint8, quint16, quint16, bool, bool, QAudioDeviceInfo, quint8)), rxaudio, SLOT(init(quint8, quint8, quint16, quint16, bool, bool,QAudioDeviceInfo, quint8)));
|
||||
|
||||
connect(this, SIGNAL(haveAudioData(audioPacket)), rxaudio, SLOT(incomingAudio(audioPacket)));
|
||||
connect(this, SIGNAL(haveChangeLatency(quint16)), rxaudio, SLOT(changeLatency(quint16)));
|
||||
|
@ -758,7 +758,7 @@ udpAudio::udpAudio(QHostAddress local, QHostAddress ip, quint16 audioPort, quint
|
|||
|
||||
txAudioThread->start();
|
||||
|
||||
connect(this, SIGNAL(setupTxAudio(quint8, quint8, quint16, quint16, bool, bool,QString,quint8)), txaudio, SLOT(init(quint8, quint8, quint16, quint16, bool, bool,QString,quint8)));
|
||||
connect(this, SIGNAL(setupTxAudio(quint8, quint8, quint16, quint16, bool, bool,QAudioDeviceInfo,quint8)), txaudio, SLOT(init(quint8, quint8, quint16, quint16, bool, bool,QAudioDeviceInfo,quint8)));
|
||||
connect(txAudioThread, SIGNAL(finished()), txaudio, SLOT(deleteLater()));
|
||||
|
||||
sendControl(false, 0x03, 0x00); // First connect packet
|
||||
|
@ -790,6 +790,7 @@ udpAudio::~udpAudio()
|
|||
{
|
||||
if (pingTimer != Q_NULLPTR)
|
||||
{
|
||||
qDebug(logUdp()) << "Stopping pingTimer";
|
||||
pingTimer->stop();
|
||||
delete pingTimer;
|
||||
pingTimer = Q_NULLPTR;
|
||||
|
@ -797,6 +798,7 @@ udpAudio::~udpAudio()
|
|||
|
||||
if (idleTimer != Q_NULLPTR)
|
||||
{
|
||||
qDebug(logUdp()) << "Stopping idleTimer";
|
||||
idleTimer->stop();
|
||||
delete idleTimer;
|
||||
idleTimer = Q_NULLPTR;
|
||||
|
@ -804,6 +806,7 @@ udpAudio::~udpAudio()
|
|||
|
||||
if (watchdogTimer != Q_NULLPTR)
|
||||
{
|
||||
qDebug(logUdp()) << "Stopping watchdogTimer";
|
||||
watchdogTimer->stop();
|
||||
delete watchdogTimer;
|
||||
watchdogTimer = Q_NULLPTR;
|
||||
|
@ -811,19 +814,23 @@ udpAudio::~udpAudio()
|
|||
|
||||
if (txAudioTimer != Q_NULLPTR)
|
||||
{
|
||||
qDebug(logUdp()) << "Stopping txaudio timer";
|
||||
txAudioTimer->stop();
|
||||
delete txAudioTimer;
|
||||
}
|
||||
|
||||
if (rxAudioThread != Q_NULLPTR) {
|
||||
qDebug(logUdp()) << "Stopping rxaudio thread";
|
||||
rxAudioThread->quit();
|
||||
rxAudioThread->wait();
|
||||
}
|
||||
|
||||
if (txAudioThread != Q_NULLPTR) {
|
||||
qDebug(logUdp()) << "Stopping txaudio thread";
|
||||
txAudioThread->quit();
|
||||
txAudioThread->wait();
|
||||
}
|
||||
qDebug(logUdp()) << "udpHandler successfully closed";
|
||||
}
|
||||
|
||||
void udpAudio::watchdog()
|
||||
|
@ -895,7 +902,7 @@ void udpAudio::dataReceived()
|
|||
{
|
||||
while (udp->hasPendingDatagrams()) {
|
||||
QNetworkDatagram datagram = udp->receiveDatagram();
|
||||
//qInfo(logUdp()) << "Received: " << datagram.data();
|
||||
//qInfo(logUdp()) << "Received: " << datagram.data().mid(0,10);
|
||||
QByteArray r = datagram.data();
|
||||
|
||||
switch (r.length())
|
||||
|
@ -1118,7 +1125,6 @@ void udpBase::dataReceived(QByteArray r)
|
|||
for (quint16 i = 0x10; i < r.length(); i = i + 2)
|
||||
{
|
||||
quint16 seq = (quint8)r[i] | (quint8)r[i + 1] << 8;
|
||||
txBufferMutex.lock();
|
||||
QMap<quint16, SEQBUFENTRY>::iterator match = txSeqBuf.find(seq);
|
||||
if (match == txSeqBuf.end()) {
|
||||
qDebug(logUdp()) << this->metaObject()->className() << ": Requested packet " << hex << seq << " not found";
|
||||
|
@ -1137,7 +1143,6 @@ void udpBase::dataReceived(QByteArray r)
|
|||
packetsLost++;
|
||||
congestion++;
|
||||
}
|
||||
txBufferMutex.unlock();
|
||||
}
|
||||
}
|
||||
else if (in->len != PING_SIZE && in->type == 0x00 && in->seq != 0x00)
|
||||
|
@ -1353,15 +1358,19 @@ void udpBase::sendTrackedPacket(QByteArray d)
|
|||
s.timeSent = QTime::currentTime();
|
||||
s.retransmitCount = 0;
|
||||
s.data = d;
|
||||
txBufferMutex.lock();
|
||||
if (txBufferMutex.tryLock(100))
|
||||
{
|
||||
|
||||
if (sendSeq == 0) {
|
||||
// We are either the first ever sent packet or have rolled-over so clear the buffer.
|
||||
txSeqBuf.clear();
|
||||
congestion = 0;
|
||||
if (sendSeq == 0) {
|
||||
// We are either the first ever sent packet or have rolled-over so clear the buffer.
|
||||
txSeqBuf.clear();
|
||||
congestion = 0;
|
||||
}
|
||||
txSeqBuf.insert(sendSeq,s);
|
||||
txBufferMutex.unlock();
|
||||
} else {
|
||||
qInfo(logUdp()) << this->metaObject()->className() << ": txBuffer mutex is locked";
|
||||
}
|
||||
txSeqBuf.insert(sendSeq,s);
|
||||
txBufferMutex.unlock();
|
||||
purgeOldEntries(); // Delete entries older than PURGE_SECONDS seconds (currently 5)
|
||||
sendSeq++;
|
||||
|
||||
|
@ -1387,46 +1396,58 @@ void udpBase::sendTrackedPacket(QByteArray d)
|
|||
void udpBase::purgeOldEntries()
|
||||
{
|
||||
// Erase old entries from the tx packet buffer
|
||||
txBufferMutex.lock();
|
||||
|
||||
if (!txSeqBuf.isEmpty())
|
||||
if (txBufferMutex.tryLock(100))
|
||||
{
|
||||
// Loop through the earliest items in the buffer and delete if older than PURGE_SECONDS
|
||||
for (auto it = txSeqBuf.begin(); it != txSeqBuf.end();) {
|
||||
if (it.value().timeSent.secsTo(QTime::currentTime()) > PURGE_SECONDS) {
|
||||
txSeqBuf.erase(it++);
|
||||
}
|
||||
else {
|
||||
break;
|
||||
if (!txSeqBuf.isEmpty())
|
||||
{
|
||||
// Loop through the earliest items in the buffer and delete if older than PURGE_SECONDS
|
||||
for (auto it = txSeqBuf.begin(); it != txSeqBuf.end();) {
|
||||
if (it.value().timeSent.secsTo(QTime::currentTime()) > PURGE_SECONDS) {
|
||||
txSeqBuf.erase(it++);
|
||||
}
|
||||
else {
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
txBufferMutex.unlock();
|
||||
|
||||
} else {
|
||||
qInfo(logUdp()) << this->metaObject()->className() << ": txBuffer mutex is locked";
|
||||
}
|
||||
|
||||
txBufferMutex.unlock();
|
||||
|
||||
rxBufferMutex.lock();
|
||||
if (!rxSeqBuf.isEmpty()) {
|
||||
// Loop through the earliest items in the buffer and delete if older than PURGE_SECONDS
|
||||
for (auto it = rxSeqBuf.begin(); it != rxSeqBuf.end();) {
|
||||
if (it.value().secsTo(QTime::currentTime()) > PURGE_SECONDS) {
|
||||
rxSeqBuf.erase(it++);
|
||||
}
|
||||
else {
|
||||
break;
|
||||
|
||||
if (rxBufferMutex.tryLock(100))
|
||||
{
|
||||
if (!rxSeqBuf.isEmpty()) {
|
||||
// Loop through the earliest items in the buffer and delete if older than PURGE_SECONDS
|
||||
for (auto it = rxSeqBuf.begin(); it != rxSeqBuf.end();) {
|
||||
if (it.value().secsTo(QTime::currentTime()) > PURGE_SECONDS) {
|
||||
rxSeqBuf.erase(it++);
|
||||
}
|
||||
else {
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
rxBufferMutex.unlock();
|
||||
} else {
|
||||
qInfo(logUdp()) << this->metaObject()->className() << ": rxBuffer mutex is locked";
|
||||
}
|
||||
|
||||
if (missingMutex.tryLock(100))
|
||||
{
|
||||
// Erase old entries from the missing packets buffer
|
||||
if (!rxMissing.isEmpty() && rxMissing.size() > 50) {
|
||||
for (size_t i = 0; i < 25; ++i) {
|
||||
rxMissing.erase(rxMissing.begin());
|
||||
}
|
||||
}
|
||||
missingMutex.unlock();
|
||||
} else {
|
||||
qInfo(logUdp()) << this->metaObject()->className() << ": missingBuffer mutex is locked";
|
||||
}
|
||||
rxBufferMutex.unlock();
|
||||
|
||||
missingMutex.lock();
|
||||
// Erase old entries from the missing packets buffer
|
||||
if (!rxMissing.isEmpty() && rxMissing.size() > 50) {
|
||||
for (size_t i = 0; i < 25; ++i) {
|
||||
rxMissing.erase(rxMissing.begin());
|
||||
}
|
||||
}
|
||||
missingMutex.unlock();
|
||||
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
|
|
12
udphandler.h
12
udphandler.h
|
@ -43,6 +43,8 @@ struct udpPreferences {
|
|||
QString password;
|
||||
QString audioOutput;
|
||||
QString audioInput;
|
||||
QAudioDeviceInfo inputDevice;
|
||||
QAudioDeviceInfo outputDevice;
|
||||
quint16 audioRXLatency;
|
||||
quint16 audioTXLatency;
|
||||
quint16 audioRXSampleRate;
|
||||
|
@ -172,14 +174,14 @@ class udpAudio : public udpBase
|
|||
Q_OBJECT
|
||||
|
||||
public:
|
||||
udpAudio(QHostAddress local, QHostAddress ip, quint16 aport, quint16 rxlatency, quint16 txlatency, quint16 rxsample, quint8 rxcodec, quint16 txsample, quint8 txcodec, QString outputPort, QString inputPort,quint8 resampleQuality);
|
||||
udpAudio(QHostAddress local, QHostAddress ip, quint16 aport, quint16 rxlatency, quint16 txlatency, quint16 rxsample, quint8 rxcodec, quint16 txsample, quint8 txcodec, QAudioDeviceInfo outputPort, QAudioDeviceInfo inputPort,quint8 resampleQuality);
|
||||
~udpAudio();
|
||||
|
||||
signals:
|
||||
void haveAudioData(audioPacket data);
|
||||
|
||||
void setupTxAudio(const quint8 samples, const quint8 channels, const quint16 samplerate, const quint16 latency, const bool isUlaw, const bool isInput, QString port, quint8 resampleQuality);
|
||||
void setupRxAudio(const quint8 samples, const quint8 channels, const quint16 samplerate, const quint16 latency, const bool isUlaw, const bool isInput, QString port, quint8 resampleQuality);
|
||||
void setupTxAudio(const quint8 samples, const quint8 channels, const quint16 samplerate, const quint16 latency, const bool isUlaw, const bool isInput, QAudioDeviceInfo port, quint8 resampleQuality);
|
||||
void setupRxAudio(const quint8 samples, const quint8 channels, const quint16 samplerate, const quint16 latency, const bool isUlaw, const bool isInput, QAudioDeviceInfo port, quint8 resampleQuality);
|
||||
|
||||
void haveChangeLatency(quint16 value);
|
||||
void haveSetVolume(unsigned char value);
|
||||
|
@ -286,8 +288,8 @@ private:
|
|||
quint8 rxCodec;
|
||||
quint8 txCodec;
|
||||
|
||||
QString audioInputPort;
|
||||
QString audioOutputPort;
|
||||
QAudioDeviceInfo audioInputPort;
|
||||
QAudioDeviceInfo audioOutputPort;
|
||||
|
||||
quint8 resampleQuality;
|
||||
|
||||
|
|
|
@ -392,11 +392,11 @@ void udpServer::controlReceived()
|
|||
|
||||
txAudioThread->start();
|
||||
|
||||
connect(this, SIGNAL(setupTxAudio(quint8, quint8, quint16, quint16, bool, bool, QString, quint8)), txaudio, SLOT(init(quint8, quint8, quint16, quint16, bool, bool, QString, quint8)));
|
||||
connect(this, SIGNAL(setupTxAudio(quint8, quint8, quint16, quint16, bool, bool, QAudioDeviceInfo, quint8)), txaudio, SLOT(init(quint8, quint8, quint16, quint16, bool, bool, QAudioDeviceInfo, quint8)));
|
||||
connect(txAudioThread, SIGNAL(finished()), txaudio, SLOT(deleteLater()));
|
||||
|
||||
emit setupTxAudio(samples, channels, current->txSampleRate, current->txBufferLen, uLaw, false, config.audioOutput, config.resampleQuality);
|
||||
hasTxAudio=datagram.senderAddress();
|
||||
emit setupTxAudio(samples, channels, current->txSampleRate, current->txBufferLen, uLaw, false, config.outputDevice, config.resampleQuality);
|
||||
hasTxAudio = datagram.senderAddress();
|
||||
|
||||
connect(this, SIGNAL(haveAudioData(audioPacket)), txaudio, SLOT(incomingAudio(audioPacket)));
|
||||
|
||||
|
@ -425,10 +425,10 @@ void udpServer::controlReceived()
|
|||
rxaudio->moveToThread(rxAudioThread);
|
||||
rxAudioThread->start();
|
||||
|
||||
connect(this, SIGNAL(setupRxAudio(quint8, quint8, quint16, quint16, bool, bool, QString, quint8)), rxaudio, SLOT(init(quint8, quint8, quint16, quint16, bool, bool, QString, quint8)));
|
||||
connect(this, SIGNAL(setupRxAudio(quint8, quint8, quint16, quint16, bool, bool, QAudioDeviceInfo, quint8)), rxaudio, SLOT(init(quint8, quint8, quint16, quint16, bool, bool, QAudioDeviceInfo, quint8)));
|
||||
connect(rxAudioThread, SIGNAL(finished()), rxaudio, SLOT(deleteLater()));
|
||||
|
||||
emit setupRxAudio(samples, channels, current->rxSampleRate, 150, uLaw, true, config.audioInput, config.resampleQuality);
|
||||
emit setupRxAudio(samples, channels, current->rxSampleRate, 150, uLaw, true, config.inputDevice, config.resampleQuality);
|
||||
|
||||
rxAudioTimer = new QTimer();
|
||||
rxAudioTimer->setTimerType(Qt::PreciseTimer);
|
||||
|
@ -688,7 +688,7 @@ void udpServer::audioReceived()
|
|||
current->seqPrefix++;
|
||||
}
|
||||
|
||||
if (hasTxAudio == datagram.senderAddress())
|
||||
if (hasTxAudio == current->ipAddress)
|
||||
{
|
||||
// 0xac is the smallest possible audio packet.
|
||||
audioPacket tempAudio;
|
||||
|
@ -1053,25 +1053,11 @@ void udpServer::sendCapabilities(CLIENT* c)
|
|||
if (txaudio == Q_NULLPTR) {
|
||||
p.txsample = 0x8b01; // all tx sample frequencies supported
|
||||
p.enablea = 0x01; // 0x01 enables TX 24K mode?
|
||||
qInfo(logUdpServer()) << c->ipAddress.toString() << "(" << c->type << "): Client will have TX audio";
|
||||
}
|
||||
else {
|
||||
p.enablea = 0x00; // 0x01 enables TX 24K mode?
|
||||
if (txSampleRate == 48000) {
|
||||
p.txsample = 0x0800; // fixed tx sample frequency
|
||||
}
|
||||
else if (txSampleRate == 32000) {
|
||||
p.txsample = 0x0400;
|
||||
}
|
||||
else if (txSampleRate == 24000) {
|
||||
p.txsample = 0x0000;
|
||||
p.enablea = 0x01;
|
||||
}
|
||||
else if (txSampleRate == 16000) {
|
||||
p.txsample = 0x0200;
|
||||
}
|
||||
else if (txSampleRate == 12000) {
|
||||
p.txsample = 0x8000;
|
||||
}
|
||||
qInfo(logUdpServer()) << c->ipAddress.toString() << "(" << c->type << "): Disable tx audio for client";
|
||||
p.txsample = 0;
|
||||
}
|
||||
|
||||
// I still don't know what these are?
|
||||
|
|
|
@ -50,8 +50,8 @@ public slots:
|
|||
signals:
|
||||
void haveDataFromServer(QByteArray);
|
||||
void haveAudioData(audioPacket data);
|
||||
void setupTxAudio(const quint8 samples, const quint8 channels, const quint16 samplerate, const quint16 latency, const bool isUlaw, const bool isInput, QString port, quint8 resampleQuality);
|
||||
void setupRxAudio(const quint8 samples, const quint8 channels, const quint16 samplerate, const quint16 latency, const bool isUlaw, const bool isInput, QString port, quint8 resampleQuality);
|
||||
void setupTxAudio(const quint8 samples, const quint8 channels, const quint16 samplerate, const quint16 latency, const bool isUlaw, const bool isInput, QAudioDeviceInfo port, quint8 resampleQuality);
|
||||
void setupRxAudio(const quint8 samples, const quint8 channels, const quint16 samplerate, const quint16 latency, const bool isUlaw, const bool isInput, QAudioDeviceInfo port, quint8 resampleQuality);
|
||||
|
||||
|
||||
private:
|
||||
|
|
|
@ -4,6 +4,7 @@
|
|||
#include <QDialog>
|
||||
#include <QComboBox>
|
||||
#include <QList>
|
||||
#include <QAudioDeviceInfo>
|
||||
|
||||
#include <QDebug>
|
||||
|
||||
|
@ -22,6 +23,8 @@ struct SERVERCONFIG {
|
|||
quint16 audioPort;
|
||||
QString audioOutput;
|
||||
QString audioInput;
|
||||
QAudioDeviceInfo inputDevice;
|
||||
QAudioDeviceInfo outputDevice;
|
||||
quint8 resampleQuality;
|
||||
quint32 baudRate;
|
||||
|
||||
|
|
16
wfmain.cpp
16
wfmain.cpp
|
@ -171,11 +171,11 @@ wfmain::wfmain(const QString serialPortCL, const QString hostCL, const QString s
|
|||
// Enumerate audio devices, need to do before settings are loaded.
|
||||
const auto audioOutputs = QAudioDeviceInfo::availableDevices(QAudio::AudioOutput);
|
||||
for (const QAudioDeviceInfo& deviceInfo : audioOutputs) {
|
||||
ui->audioOutputCombo->addItem(deviceInfo.deviceName());
|
||||
ui->audioOutputCombo->addItem(deviceInfo.deviceName(),QVariant::fromValue(deviceInfo));
|
||||
}
|
||||
const auto audioInputs = QAudioDeviceInfo::availableDevices(QAudio::AudioInput);
|
||||
for (const QAudioDeviceInfo& deviceInfo : audioInputs) {
|
||||
ui->audioInputCombo->addItem(deviceInfo.deviceName());
|
||||
ui->audioInputCombo->addItem(deviceInfo.deviceName(),QVariant::fromValue(deviceInfo));
|
||||
}
|
||||
|
||||
ui->serialDeviceListCombo->blockSignals(true);
|
||||
|
@ -266,6 +266,8 @@ wfmain::wfmain(const QString serialPortCL, const QString hostCL, const QString s
|
|||
serverConfig.audioInput = udpPrefs.audioInput;
|
||||
serverConfig.audioOutput = udpPrefs.audioOutput;
|
||||
serverConfig.baudRate = prefs.serialPortBaud;
|
||||
serverConfig.inputDevice = udpPrefs.inputDevice;
|
||||
serverConfig.outputDevice = udpPrefs.outputDevice;
|
||||
}
|
||||
udp = new udpServer(serverConfig);
|
||||
|
||||
|
@ -1086,7 +1088,7 @@ void wfmain::loadSettings()
|
|||
ui->audioSampleRateCombo->setEnabled(ui->lanEnableBtn->isChecked());
|
||||
int audioSampleRateIndex = ui->audioSampleRateCombo->findText(QString::number(udpDefPrefs.audioRXSampleRate));
|
||||
if (audioSampleRateIndex != -1) {
|
||||
ui->audioOutputCombo->setCurrentIndex(audioSampleRateIndex);
|
||||
ui->audioSampleRateCombo->setCurrentIndex(audioSampleRateIndex);
|
||||
}
|
||||
|
||||
// Add codec combobox items here so that we can add userdata!
|
||||
|
@ -1119,6 +1121,8 @@ void wfmain::loadSettings()
|
|||
int audioOutputIndex = ui->audioOutputCombo->findText(udpPrefs.audioOutput);
|
||||
if (audioOutputIndex != -1) {
|
||||
ui->audioOutputCombo->setCurrentIndex(audioOutputIndex);
|
||||
QVariant v = ui->audioOutputCombo->currentData();
|
||||
udpPrefs.outputDevice = v.value<QAudioDeviceInfo>();
|
||||
}
|
||||
|
||||
udpPrefs.audioInput = settings->value("AudioInput", udpDefPrefs.audioInput).toString();
|
||||
|
@ -1127,6 +1131,8 @@ void wfmain::loadSettings()
|
|||
int audioInputIndex = ui->audioInputCombo->findText(udpPrefs.audioInput);
|
||||
if (audioInputIndex != -1) {
|
||||
ui->audioInputCombo->setCurrentIndex(audioInputIndex);
|
||||
QVariant v = ui->audioInputCombo->currentData();
|
||||
udpPrefs.inputDevice = v.value<QAudioDeviceInfo>();
|
||||
}
|
||||
|
||||
udpPrefs.resampleQuality = settings->value("ResampleQuality", udpDefPrefs.resampleQuality).toInt();
|
||||
|
@ -3518,11 +3524,15 @@ void wfmain::on_passwordTxt_textChanged(QString text)
|
|||
void wfmain::on_audioOutputCombo_currentIndexChanged(QString text)
|
||||
{
|
||||
udpPrefs.audioOutput = text;
|
||||
QVariant v = ui->audioOutputCombo->currentData();
|
||||
udpPrefs.outputDevice = v.value<QAudioDeviceInfo>();
|
||||
}
|
||||
|
||||
void wfmain::on_audioInputCombo_currentIndexChanged(QString text)
|
||||
{
|
||||
udpPrefs.audioInput = text;
|
||||
QVariant v = ui->audioInputCombo->currentData();
|
||||
udpPrefs.inputDevice = v.value<QAudioDeviceInfo>();
|
||||
}
|
||||
|
||||
void wfmain::on_audioSampleRateCombo_currentIndexChanged(QString text)
|
||||
|
|
Ładowanie…
Reference in New Issue