kopia lustrzana https://gitlab.com/eliggett/wfview
Merge branch 'master' into audio-enhance
commit
ada263efed
135
audiohandler.cpp
135
audiohandler.cpp
|
@ -63,7 +63,6 @@ bool audioHandler::init(audioSetup setupIn)
|
|||
if (isInitialized) {
|
||||
return false;
|
||||
}
|
||||
|
||||
/*
|
||||
0x01 uLaw 1ch 8bit
|
||||
0x02 PCM 1ch 8bit
|
||||
|
@ -88,6 +87,17 @@ bool audioHandler::init(audioSetup setupIn)
|
|||
setup.bits = 16;
|
||||
}
|
||||
|
||||
qDebug(logAudio()) << "Creating" << (setup.isinput ? "Input" : "Output") << "audio device:" << setup.name <<
|
||||
", bits" << setup.bits <<
|
||||
", codec" << setup.codec <<
|
||||
", latency" << setup.latency <<
|
||||
", localAFGain" << setup.localAFgain <<
|
||||
", radioChan" << setup.radioChan <<
|
||||
", resampleQuality" << setup.resampleQuality <<
|
||||
", samplerate" << setup.samplerate <<
|
||||
", uLaw" << setup.ulaw;
|
||||
|
||||
|
||||
ringBuf = new wilt::Ring<audioPacket>(setupIn.latency / 8 + 1); // Should be customizable.
|
||||
|
||||
tempBuf.sent = 0;
|
||||
|
@ -440,16 +450,26 @@ qint64 audioHandler::readData(char* buffer, qint64 nBytes)
|
|||
if (!isReady) {
|
||||
isReady = true;
|
||||
}
|
||||
if (!audioBuffered) {
|
||||
memset(buffer, 0, nBytes);
|
||||
#if defined(RTAUDIO)
|
||||
return 0;
|
||||
#elif defined(PORTAUDIO)
|
||||
return 0;
|
||||
#else
|
||||
return nBytes;
|
||||
#endif
|
||||
}
|
||||
audioPacket packet;
|
||||
if (ringBuf->size()>0)
|
||||
{
|
||||
// Output buffer is ALWAYS 16 bit.
|
||||
//qDebug(logAudio()) << "Read: nFrames" << nFrames << "nBytes" << nBytes;
|
||||
while (sentlen < nBytes)
|
||||
{
|
||||
audioPacket packet;
|
||||
if (!ringBuf->try_read(packet))
|
||||
{
|
||||
qDebug(logAudio()) << "No more data available but buffer is not full! sentlen:" << sentlen << " nBytes:" << nBytes ;
|
||||
qDebug(logAudio()) << (setup.isinput ? "Input" : "Output") << "buffer is empty, sentlen:" << sentlen << " nBytes:" << nBytes ;
|
||||
break;
|
||||
}
|
||||
currentLatency = packet.time.msecsTo(QTime::currentTime());
|
||||
|
@ -480,6 +500,7 @@ qint64 audioHandler::readData(char* buffer, qint64 nBytes)
|
|||
}
|
||||
currentLatency = packet.time.msecsTo(QTime::currentTime());
|
||||
}
|
||||
delayedPackets++;
|
||||
}
|
||||
|
||||
int send = qMin((int)nBytes - sentlen, packet.data.length());
|
||||
|
@ -509,8 +530,14 @@ qint64 audioHandler::readData(char* buffer, qint64 nBytes)
|
|||
|
||||
// fill the rest of the buffer with silence
|
||||
if (nBytes > sentlen) {
|
||||
memset(buffer+sentlen,0,nBytes-sentlen);
|
||||
}
|
||||
memset(buffer + sentlen, 0, nBytes - sentlen);
|
||||
}
|
||||
|
||||
if (delayedPackets > 10) {
|
||||
while (ringBuf->try_read(packet)); // Empty buffer
|
||||
delayedPackets = 0;
|
||||
}
|
||||
|
||||
#if defined(RTAUDIO)
|
||||
return 0;
|
||||
#elif defined(PORTAUDIO)
|
||||
|
@ -555,20 +582,19 @@ qint64 audioHandler::writeData(const char* data, qint64 nBytes)
|
|||
int send = qMin((int)(nBytes - sentlen), chunkBytes - tempBuf.sent);
|
||||
tempBuf.data.append(QByteArray::fromRawData(data + sentlen, send));
|
||||
sentlen = sentlen + send;
|
||||
tempBuf.seq = 0; // Not used in TX
|
||||
tempBuf.seq = lastSentSeq;
|
||||
tempBuf.time = QTime::currentTime();
|
||||
tempBuf.sent = tempBuf.sent + send;
|
||||
}
|
||||
else {
|
||||
//ringBuf->write(tempBuf);
|
||||
|
||||
if (!ringBuf->try_write(tempBuf))
|
||||
{
|
||||
qDebug(logAudio()) << "outgoing audio buffer full!";
|
||||
qDebug(logAudio()) << (setup.isinput ? "Input" : "Output") << " audio buffer full!";
|
||||
break;
|
||||
}
|
||||
tempBuf.data.clear();
|
||||
tempBuf.sent = 0;
|
||||
lastSentSeq++;
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -593,6 +619,13 @@ void audioHandler::incomingAudio(audioPacket inPacket)
|
|||
qDebug(logAudio()) << "Packet received when stream was not ready";
|
||||
return;
|
||||
}
|
||||
if (!audioBuffered && ringBuf->size() > ringBuf->capacity() / 2)
|
||||
{
|
||||
qDebug(logAudio()) << (setup.isinput ? "Input" : "Output") << "Audio buffering complete, capacity:" << ringBuf->capacity() << ", used:" << ringBuf->size();
|
||||
audioBuffered = true;
|
||||
}
|
||||
|
||||
audioPacket livePacket = inPacket;
|
||||
|
||||
if (setup.codec == 0x40 || setup.codec == 0x80) {
|
||||
unsigned char* in = (unsigned char*)inPacket.data.data();
|
||||
|
@ -600,17 +633,25 @@ void audioHandler::incomingAudio(audioPacket inPacket)
|
|||
/* Decode the frame. */
|
||||
QByteArray outPacket((setup.samplerate / 50) * sizeof(qint16) * setup.radioChan, (char)0xff); // Preset the output buffer size.
|
||||
qint16* out = (qint16*)outPacket.data();
|
||||
int nSamples = opus_packet_get_nb_samples(in, inPacket.data.size(),setup.samplerate);
|
||||
if (nSamples != setup.samplerate / 50)
|
||||
int nSamples = opus_packet_get_nb_samples(in, livePacket.data.size(),setup.samplerate);
|
||||
if (nSamples == -1) {
|
||||
// No opus data yet?
|
||||
return;
|
||||
}
|
||||
else if (nSamples != setup.samplerate / 50)
|
||||
{
|
||||
qInfo(logAudio()) << "Opus nSamples=" << nSamples << " expected:" << (setup.samplerate / 50);
|
||||
return;
|
||||
}
|
||||
nSamples = opus_decode(decoder, in, inPacket.data.size(), out, (setup.samplerate / 50), 0);
|
||||
|
||||
if (livePacket.seq > lastSentSeq + 1) {
|
||||
nSamples = opus_decode(decoder, in, livePacket.data.size(), out, (setup.samplerate / 50), 1);
|
||||
}
|
||||
else {
|
||||
nSamples = opus_decode(decoder, in, livePacket.data.size(), out, (setup.samplerate / 50), 0);
|
||||
}
|
||||
if (nSamples < 0)
|
||||
{
|
||||
qInfo(logAudio()) << (setup.isinput ? "Input" : "Output") << "Opus decode failed:" << opus_strerror(nSamples) << "packet size" << inPacket.data.length();
|
||||
qInfo(logAudio()) << (setup.isinput ? "Input" : "Output") << "Opus decode failed:" << opus_strerror(nSamples) << "packet size" << livePacket.data.length();
|
||||
return;
|
||||
}
|
||||
else {
|
||||
|
@ -619,22 +660,22 @@ void audioHandler::incomingAudio(audioPacket inPacket)
|
|||
qInfo(logAudio()) << (setup.isinput ? "Input" : "Output") << "Opus decoder mismatch: nBytes:" << nSamples * sizeof(qint16) * setup.radioChan << "outPacket:" << outPacket.size();
|
||||
outPacket.resize(nSamples * sizeof(qint16) * setup.radioChan);
|
||||
}
|
||||
//qInfo(logAudio()) << (setup.isinput ? "Input" : "Output") << "Opus decoded" << inPacket.data.size() << "bytes, into" << outPacket.length() << "bytes";
|
||||
inPacket.data.clear();
|
||||
inPacket.data = outPacket; // Replace incoming data with converted.
|
||||
//qInfo(logAudio()) << (setup.isinput ? "Input" : "Output") << "Opus decoded" << livePacket.data.size() << "bytes, into" << outPacket.length() << "bytes";
|
||||
livePacket.data.clear();
|
||||
livePacket.data = outPacket; // Replace incoming data with converted.
|
||||
}
|
||||
}
|
||||
|
||||
//qDebug(logAudio()) << "Got" << setup.bits << "bits, length" << inPacket.data.length();
|
||||
//qDebug(logAudio()) << "Got" << setup.bits << "bits, length" << livePacket.data.length();
|
||||
// Incoming data is 8bits?
|
||||
if (setup.bits == 8)
|
||||
{
|
||||
// Current packet is 8bit so need to create a new buffer that is 16bit
|
||||
QByteArray outPacket((int)inPacket.data.length() * 2 * (devChannels / setup.radioChan), (char)0xff);
|
||||
QByteArray outPacket((int)livePacket.data.length() * 2 * (devChannels / setup.radioChan), (char)0xff);
|
||||
qint16* out = (qint16*)outPacket.data();
|
||||
for (int f = 0; f < inPacket.data.length(); f++)
|
||||
for (int f = 0; f < livePacket.data.length(); f++)
|
||||
{
|
||||
int samp = (quint8)inPacket.data[f];
|
||||
int samp = (quint8)livePacket.data[f];
|
||||
for (int g = setup.radioChan; g <= devChannels; g++)
|
||||
{
|
||||
if (setup.ulaw)
|
||||
|
@ -643,30 +684,30 @@ void audioHandler::incomingAudio(audioPacket inPacket)
|
|||
*out++ = (qint16)((samp - 128) << 8) * this->volume;
|
||||
}
|
||||
}
|
||||
inPacket.data.clear();
|
||||
inPacket.data = outPacket; // Replace incoming data with converted.
|
||||
livePacket.data.clear();
|
||||
livePacket.data = outPacket; // Replace incoming data with converted.
|
||||
}
|
||||
else
|
||||
{
|
||||
// This is already a 16bit stream, do we need to convert to stereo?
|
||||
if (setup.radioChan == 1 && devChannels > 1) {
|
||||
// Yes
|
||||
QByteArray outPacket(inPacket.data.length() * 2, (char)0xff); // Preset the output buffer size.
|
||||
qint16* in = (qint16*)inPacket.data.data();
|
||||
QByteArray outPacket(livePacket.data.length() * 2, (char)0xff); // Preset the output buffer size.
|
||||
qint16* in = (qint16*)livePacket.data.data();
|
||||
qint16* out = (qint16*)outPacket.data();
|
||||
for (int f = 0; f < inPacket.data.length() / 2; f++)
|
||||
for (int f = 0; f < livePacket.data.length() / 2; f++)
|
||||
{
|
||||
*out++ = (qint16)*in * this->volume;
|
||||
*out++ = (qint16)*in++ * this->volume;
|
||||
}
|
||||
inPacket.data.clear();
|
||||
inPacket.data = outPacket; // Replace incoming data with converted.
|
||||
livePacket.data.clear();
|
||||
livePacket.data = outPacket; // Replace incoming data with converted.
|
||||
}
|
||||
else
|
||||
{
|
||||
// We already have the same number of channels so just update volume.
|
||||
qint16* in = (qint16*)inPacket.data.data();
|
||||
for (int f = 0; f < inPacket.data.length() / 2; f++)
|
||||
qint16* in = (qint16*)livePacket.data.data();
|
||||
for (int f = 0; f < livePacket.data.length() / 2; f++)
|
||||
{
|
||||
*in = *in * this->volume;
|
||||
in++;
|
||||
|
@ -678,17 +719,17 @@ void audioHandler::incomingAudio(audioPacket inPacket)
|
|||
/* We now have an array of 16bit samples in the NATIVE samplerate of the radio
|
||||
If the radio sample rate is below 48000, we need to resample.
|
||||
*/
|
||||
//qDebug(logAudio()) << "Now 16 bit stereo, length" << inPacket.data.length();
|
||||
//qDebug(logAudio()) << "Now 16 bit stereo, length" << livePacket.data.length();
|
||||
|
||||
if (resampleRatio != 1.0) {
|
||||
|
||||
// We need to resample
|
||||
// We have a stereo 16bit stream.
|
||||
quint32 outFrames = ((inPacket.data.length() / 2 / devChannels) * resampleRatio);
|
||||
quint32 inFrames = (inPacket.data.length() / 2 / devChannels);
|
||||
quint32 outFrames = ((livePacket.data.length() / 2 / devChannels) * resampleRatio);
|
||||
quint32 inFrames = (livePacket.data.length() / 2 / devChannels);
|
||||
QByteArray outPacket(outFrames * 4, (char)0xff); // Preset the output buffer size.
|
||||
|
||||
const qint16* in = (qint16*)inPacket.data.constData();
|
||||
const qint16* in = (qint16*)livePacket.data.constData();
|
||||
qint16* out = (qint16*)outPacket.data();
|
||||
|
||||
int err = 0;
|
||||
|
@ -696,17 +737,24 @@ void audioHandler::incomingAudio(audioPacket inPacket)
|
|||
if (err) {
|
||||
qInfo(logAudio()) << (setup.isinput ? "Input" : "Output") << "Resampler error " << err << " inFrames:" << inFrames << " outFrames:" << outFrames;
|
||||
}
|
||||
inPacket.data.clear();
|
||||
inPacket.data = outPacket; // Replace incoming data with converted.
|
||||
livePacket.data.clear();
|
||||
livePacket.data = outPacket; // Replace incoming data with converted.
|
||||
}
|
||||
|
||||
//qDebug(logAudio()) << "Adding packet to buffer:" << inPacket.seq << ": " << inPacket.data.length();
|
||||
lastSentSeq = inPacket.seq;
|
||||
//qDebug(logAudio()) << "Adding packet to buffer:" << livePacket.seq << ": " << livePacket.data.length();
|
||||
|
||||
if (!ringBuf->try_write(inPacket))
|
||||
if (!ringBuf->try_write(livePacket))
|
||||
{
|
||||
qDebug(logAudio()) << (setup.isinput ? "Input" : "Output") << "Buffer full! capacity:" << ringBuf->capacity() << "length" << ringBuf->size();
|
||||
while (ringBuf->try_read(inPacket)); // Empty buffer
|
||||
return;
|
||||
}
|
||||
if ((inPacket.seq > lastSentSeq + 1) && (setup.codec == 0x40 || setup.codec == 0x80)) {
|
||||
qDebug(logAudio()) << (setup.isinput ? "Input" : "Output") << "Attempting FEC on packet" << inPacket.seq << "as last is" << lastSentSeq;
|
||||
lastSentSeq = inPacket.seq;
|
||||
incomingAudio(inPacket); // Call myself again to run the packet a second time (FEC)
|
||||
}
|
||||
lastSentSeq = inPacket.seq;
|
||||
return;
|
||||
}
|
||||
|
||||
|
@ -715,6 +763,7 @@ void audioHandler::changeLatency(const quint16 newSize)
|
|||
qInfo(logAudio()) << (setup.isinput ? "Input" : "Output") << "Changing latency to: " << newSize << " from " << setup.latency;
|
||||
setup.latency = newSize;
|
||||
delete ringBuf;
|
||||
audioBuffered = false;
|
||||
ringBuf = new wilt::Ring<audioPacket>(setup.latency / 8 + 1); // Should be customizable.
|
||||
}
|
||||
|
||||
|
@ -736,8 +785,9 @@ void audioHandler::getNextAudioChunk(QByteArray& ret)
|
|||
|
||||
if (currentLatency > setup.latency) {
|
||||
qInfo(logAudio()) << (setup.isinput ? "Input" : "Output") << "Packet " << hex << packet.seq <<
|
||||
" arrived too late (increase output latency!) " <<
|
||||
" arrived too late (increase latency!) " <<
|
||||
dec << packet.time.msecsTo(QTime::currentTime()) << "ms";
|
||||
delayedPackets++;
|
||||
// if (!ringBuf->try_read(packet))
|
||||
// break;
|
||||
// currentLatency = packet.time.msecsTo(QTime::currentTime());
|
||||
|
@ -838,6 +888,11 @@ void audioHandler::getNextAudioChunk(QByteArray& ret)
|
|||
|
||||
ret = packet.data;
|
||||
//qDebug(logAudio()) << "Now radio format, length" << packet.data.length();
|
||||
if (delayedPackets > 10) {
|
||||
while (ringBuf->try_read(packet)); // Empty buffer
|
||||
delayedPackets = 0;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
|
|
@ -165,7 +165,7 @@ private:
|
|||
void reinit();
|
||||
bool isInitialized=false;
|
||||
bool isReady = false;
|
||||
|
||||
bool audioBuffered = false;
|
||||
#if defined(RTAUDIO)
|
||||
RtAudio* audio = Q_NULLPTR;
|
||||
int audioDevice = 0;
|
||||
|
@ -195,6 +195,8 @@ private:
|
|||
quint8 radioSampleBits;
|
||||
quint8 radioChannels;
|
||||
|
||||
int delayedPackets=0;
|
||||
|
||||
QMap<quint32, audioPacket>audioBuffer;
|
||||
|
||||
double resampleRatio;
|
||||
|
|
|
@ -35,6 +35,9 @@
|
|||
#define AUDIO_SIZE 0x18
|
||||
#define DATA_SIZE 0x15
|
||||
|
||||
#define BUFSIZE 50 // Number of packets to buffer
|
||||
#define TXAUDIO_PERIOD 20
|
||||
|
||||
// 0x10 length control packet (connect/disconnect/idle.)
|
||||
typedef union control_packet {
|
||||
struct {
|
||||
|
@ -354,7 +357,7 @@ typedef union capabilities_packet {
|
|||
quint32 baudrate; // 0x9c
|
||||
quint16 capf; // 0xa0
|
||||
char unusedi; // 0xa2
|
||||
quint16 capg; // 0xa3
|
||||
quint16 capg; // 0xa3
|
||||
char unusedj[3]; // 0xa5
|
||||
};
|
||||
char packet[CAPABILITIES_SIZE];
|
||||
|
|
|
@ -199,7 +199,7 @@ void rigCtlClient::socketReadyRead()
|
|||
response.append("1"); // rigctld protocol version
|
||||
response.append(QString("%1").arg(rigCaps.rigctlModel));
|
||||
response.append("0"); // Print something
|
||||
bandType lastBand;
|
||||
bandType lastBand=(bandType)-1;
|
||||
for (bandType band : rigCaps.bands)
|
||||
{
|
||||
if (band != lastBand)
|
||||
|
|
|
@ -1099,10 +1099,6 @@ void udpBase::dataReceived(QByteArray r)
|
|||
// This is response to OUR request so increment counter
|
||||
pingSendSeq++;
|
||||
}
|
||||
else {
|
||||
// Not sure what to do here, need to spend more time with the protocol but will try sending ping with same seq next time.
|
||||
//qInfo(logUdp()) << this->metaObject()->className() << "Received out-of-sequence ping response. Sent:" << pingSendSeq << " received " << in->seq;
|
||||
}
|
||||
}
|
||||
else {
|
||||
qInfo(logUdp()) << this->metaObject()->className() << "Unhandled response to ping. I have never seen this! 0x10=" << r[16];
|
||||
|
@ -1158,7 +1154,7 @@ void udpBase::dataReceived(QByteArray r)
|
|||
{
|
||||
rxBufferMutex.lock();
|
||||
if (rxSeqBuf.isEmpty()) {
|
||||
if (rxSeqBuf.size() > 400)
|
||||
if (rxSeqBuf.size() > BUFSIZE)
|
||||
{
|
||||
rxSeqBuf.erase(rxSeqBuf.begin());
|
||||
}
|
||||
|
@ -1182,7 +1178,7 @@ void udpBase::dataReceived(QByteArray r)
|
|||
{
|
||||
// Add incoming packet to the received buffer and if it is in the missing buffer, remove it.
|
||||
rxSeqBuf.insert(in->seq, QTime::currentTime());
|
||||
if (rxSeqBuf.size() > 400)
|
||||
if (rxSeqBuf.size() > BUFSIZE)
|
||||
{
|
||||
rxSeqBuf.erase(rxSeqBuf.begin());
|
||||
}
|
||||
|
@ -1233,37 +1229,57 @@ void udpBase::sendRetransmitRequest()
|
|||
// We have at least 1 missing packet!
|
||||
qDebug(logUdp()) << "Missing Seq: size=" << rxSeqBuf.size() << "firstKey=" << rxSeqBuf.firstKey() << "lastKey=" << rxSeqBuf.lastKey() << "missing=" << rxSeqBuf.lastKey() - rxSeqBuf.firstKey() - rxSeqBuf.size() + 1;
|
||||
// We are missing packets so iterate through the buffer and add the missing ones to missing packet list
|
||||
for (int i = 0; i < rxSeqBuf.keys().length() - 1; i++) {
|
||||
missingMutex.lock();
|
||||
for (quint16 j = rxSeqBuf.keys()[i] + 1; j < rxSeqBuf.keys()[i + 1]; j++) {
|
||||
auto s = rxMissing.find(j);
|
||||
if (s == rxMissing.end())
|
||||
{
|
||||
// We haven't seen this missing packet before
|
||||
qDebug(logUdp()) << this->metaObject()->className() << ": Adding to missing buffer (len=" << rxMissing.size() << "): " << j;
|
||||
if (rxMissing.size() > 25)
|
||||
{
|
||||
rxMissing.erase(rxMissing.begin());
|
||||
}
|
||||
rxMissing.insert(j, 0);
|
||||
if (rxSeqBuf.size() > 400)
|
||||
{
|
||||
rxSeqBuf.erase(rxSeqBuf.begin());
|
||||
}
|
||||
rxSeqBuf.insert(j, QTime::currentTime()); // Add this missing packet to the rxbuffer as we now long about it.
|
||||
packetsLost++;
|
||||
}
|
||||
else {
|
||||
if (s.value() == 4)
|
||||
{
|
||||
// We have tried 4 times to request this packet, time to give up!
|
||||
s = rxMissing.erase(s);
|
||||
}
|
||||
missingMutex.lock();
|
||||
auto i = std::adjacent_find(rxSeqBuf.keys().begin(), rxSeqBuf.keys().end(), [](int l, int r) {return l + 1 < r; });
|
||||
|
||||
int missCounter = 0;
|
||||
while (i != rxSeqBuf.keys().end())
|
||||
{
|
||||
quint16 j = 1 + *i;
|
||||
++i;
|
||||
if (i == rxSeqBuf.keys().end())
|
||||
{
|
||||
continue;
|
||||
}
|
||||
|
||||
missCounter++;
|
||||
|
||||
if (missCounter > 20) {
|
||||
// More than 20 packets missing, something horrific has happened!
|
||||
qDebug(logUdp()) << this->metaObject()->className() << ": Too many missing packets, clearing buffer";
|
||||
rxSeqBuf.clear();
|
||||
rxMissing.clear();
|
||||
missingMutex.unlock();
|
||||
rxBufferMutex.unlock();
|
||||
return;
|
||||
}
|
||||
|
||||
auto s = rxMissing.find(j);
|
||||
if (s == rxMissing.end())
|
||||
{
|
||||
// We haven't seen this missing packet before
|
||||
qDebug(logUdp()) << this->metaObject()->className() << ": Adding to missing buffer (len=" << rxMissing.size() << "): " << j;
|
||||
if (rxMissing.size() > 25)
|
||||
{
|
||||
rxMissing.erase(rxMissing.begin());
|
||||
}
|
||||
rxMissing.insert(j, 0);
|
||||
if (rxSeqBuf.size() > BUFSIZE)
|
||||
{
|
||||
rxSeqBuf.erase(rxSeqBuf.begin());
|
||||
}
|
||||
rxSeqBuf.insert(j, QTime::currentTime()); // Add this missing packet to the rxbuffer as we now long about it.
|
||||
packetsLost++;
|
||||
}
|
||||
else {
|
||||
if (s.value() == 4)
|
||||
{
|
||||
// We have tried 4 times to request this packet, time to give up!
|
||||
s = rxMissing.erase(s);
|
||||
}
|
||||
}
|
||||
missingMutex.unlock();
|
||||
}
|
||||
missingMutex.unlock();
|
||||
}
|
||||
}
|
||||
rxBufferMutex.unlock();
|
||||
|
@ -1392,7 +1408,7 @@ void udpBase::sendTrackedPacket(QByteArray d)
|
|||
congestion = 0;
|
||||
}
|
||||
txSeqBuf.insert(sendSeq,s);
|
||||
if (txSeqBuf.size() > 400)
|
||||
if (txSeqBuf.size() > BUFSIZE)
|
||||
{
|
||||
txSeqBuf.erase(txSeqBuf.begin());
|
||||
}
|
||||
|
|
|
@ -24,6 +24,14 @@
|
|||
#include "audiohandler.h"
|
||||
#include "packettypes.h"
|
||||
|
||||
#define PURGE_SECONDS 10
|
||||
#define TOKEN_RENEWAL 60000
|
||||
#define PING_PERIOD 100
|
||||
#define IDLE_PERIOD 100
|
||||
#define AREYOUTHERE_PERIOD 500
|
||||
#define WATCHDOG_PERIOD 500
|
||||
#define RETRANSMIT_PERIOD 100
|
||||
#define LOCK_PERIOD 100
|
||||
|
||||
struct udpPreferences {
|
||||
QString ipAddress;
|
||||
|
|
169
udpserver.cpp
169
udpserver.cpp
|
@ -1,7 +1,13 @@
|
|||
#include "udpserver.h"
|
||||
#include "logcategories.h"
|
||||
|
||||
udpServer::udpServer()
|
||||
#define STALE_CONNECTION 15
|
||||
#define LOCK_PERIOD 10 // time to attempt to lock Mutex in ms
|
||||
#define AUDIO_SEND_PERIOD 20 //
|
||||
udpServer::udpServer(SERVERCONFIG config, audioSetup outAudio, audioSetup inAudio) :
|
||||
config(config),
|
||||
outAudio(outAudio),
|
||||
inAudio(inAudio)
|
||||
{
|
||||
qInfo(logUdpServer()) << "Starting udp server";
|
||||
}
|
||||
|
@ -37,7 +43,7 @@ void udpServer::init(SERVERCONFIG conf, audioSetup out, audioSetup in)
|
|||
|
||||
uint32_t addr = localIP.toIPv4Address();
|
||||
|
||||
qInfo(logUdpServer()) << " My IP Address: " << QHostAddress(addr).toString() << " My MAC Address: " << macAddress;
|
||||
qInfo(logUdpServer()) << "My IP Address:" << QHostAddress(addr).toString() << "My MAC Address:" << macAddress;
|
||||
|
||||
|
||||
controlId = (addr >> 8 & 0xff) << 24 | (addr & 0xff) << 16 | (config.controlPort & 0xffff);
|
||||
|
@ -59,6 +65,13 @@ void udpServer::init(SERVERCONFIG conf, audioSetup out, audioSetup in)
|
|||
udpAudio->bind(config.audioPort);
|
||||
QUdpSocket::connect(udpAudio, &QUdpSocket::readyRead, this, &udpServer::audioReceived);
|
||||
|
||||
#if !defined(PORTAUDIO) && !defined(RTAUDIO)
|
||||
qInfo(logUdpServer()) << "Server audio input (RX):" << inAudio.port.deviceName();
|
||||
qInfo(logUdpServer()) << "Server audio output (TX):" << outAudio.port.deviceName();
|
||||
#else
|
||||
qInfo(logUdpServer()) << "Server audio input (RX):" << inAudio.name;
|
||||
qInfo(logUdpServer()) << "Server audio output (TX):" << outAudio.name;
|
||||
#endif
|
||||
wdTimer = new QTimer();
|
||||
connect(wdTimer, &QTimer::timeout, this, &udpServer::watchdog);
|
||||
wdTimer->start(500);
|
||||
|
@ -207,15 +220,9 @@ void udpServer::controlReceived()
|
|||
sendPing(&controlClients, current, in->seq, true);
|
||||
}
|
||||
else if (in->reply == 0x01) {
|
||||
if (in->seq == current->pingSeq || in->seq == current->pingSeq - 1)
|
||||
{
|
||||
// A Reply to our ping!
|
||||
if (in->seq == current->pingSeq) {
|
||||
current->pingSeq++;
|
||||
}
|
||||
else {
|
||||
qInfo(logUdpServer()) << current->ipAddress.toString() << ": got out of sequence ping reply. Got: " << in->seq << " expecting: " << current->pingSeq;
|
||||
}
|
||||
// A Reply to our ping!
|
||||
if (in->seq == current->pingSeq) {
|
||||
current->pingSeq++;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -320,6 +327,7 @@ void udpServer::controlReceived()
|
|||
{
|
||||
outAudio.codec = current->txCodec;
|
||||
outAudio.samplerate = current->txSampleRate;
|
||||
outAudio.isinput = false;
|
||||
outAudio.latency = current->txBufferLen;
|
||||
outAudio.isinput = false;
|
||||
|
||||
|
@ -343,6 +351,7 @@ void udpServer::controlReceived()
|
|||
{
|
||||
inAudio.codec = current->rxCodec;
|
||||
inAudio.samplerate = current->rxSampleRate;
|
||||
inAudio.latency = current->txBufferLen;
|
||||
inAudio.isinput = true;
|
||||
|
||||
rxaudio = new audioHandler();
|
||||
|
@ -361,7 +370,7 @@ void udpServer::controlReceived()
|
|||
rxAudioTimer = new QTimer();
|
||||
rxAudioTimer->setTimerType(Qt::PreciseTimer);
|
||||
connect(rxAudioTimer, &QTimer::timeout, this, std::bind(&udpServer::sendRxAudio, this));
|
||||
rxAudioTimer->start(20);
|
||||
rxAudioTimer->start(TXAUDIO_PERIOD);
|
||||
}
|
||||
|
||||
}
|
||||
|
@ -484,15 +493,9 @@ void udpServer::civReceived()
|
|||
sendPing(&civClients, current, in->seq, true);
|
||||
}
|
||||
else if (in->reply == 0x01) {
|
||||
if (in->seq == current->pingSeq || in->seq == current->pingSeq - 1)
|
||||
{
|
||||
// A Reply to our ping!
|
||||
if (in->seq == current->pingSeq) {
|
||||
current->pingSeq++;
|
||||
}
|
||||
else {
|
||||
qInfo(logUdpServer()) << current->ipAddress.toString() << ": got out of sequence ping reply. Got: " << in->seq << " expecting: " << current->pingSeq;
|
||||
}
|
||||
// A Reply to our ping!
|
||||
if (in->seq == current->pingSeq) {
|
||||
current->pingSeq++;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -631,8 +634,8 @@ void udpServer::audioReceived()
|
|||
sendPing(&audioClients, current, in->seq, true);
|
||||
}
|
||||
else if (in->reply == 0x01) {
|
||||
if (in->seq == current->pingSeq)
|
||||
{
|
||||
// A Reply to our ping!
|
||||
if (in->seq == current->pingSeq) {
|
||||
current->pingSeq++;
|
||||
}
|
||||
}
|
||||
|
@ -834,9 +837,9 @@ void udpServer::commonReceived(QList<CLIENT*>* l, CLIENT* current, QByteArray r)
|
|||
// Add incoming packet to the received buffer and if it is in the missing buffer, remove it.
|
||||
if (current->rxMutex.try_lock_for(std::chrono::milliseconds(LOCK_PERIOD)))
|
||||
{
|
||||
if (current->rxSeqBuf.size() > 400)
|
||||
if (current->rxSeqBuf.size() > BUFSIZE)
|
||||
{
|
||||
current->rxSeqBuf.remove(0);
|
||||
current->rxSeqBuf.remove(current->rxSeqBuf.firstKey());
|
||||
}
|
||||
current->rxSeqBuf.insert(in->seq, QTime::currentTime());
|
||||
current->rxMutex.unlock();
|
||||
|
@ -1129,9 +1132,9 @@ void udpServer::sendCapabilities(CLIENT* c)
|
|||
s.data = QByteArray::fromRawData((const char*)p.packet, sizeof(p));
|
||||
if (c->txMutex.try_lock_for(std::chrono::milliseconds(LOCK_PERIOD)))
|
||||
{
|
||||
if (c->txSeqBuf.size() > 400)
|
||||
if (c->txSeqBuf.size() > BUFSIZE)
|
||||
{
|
||||
c->txSeqBuf.remove(0);
|
||||
c->txSeqBuf.remove(c->txSeqBuf.firstKey());
|
||||
}
|
||||
c->txSeqBuf.insert(p.seq, s);
|
||||
c->txSeq++;
|
||||
|
@ -1200,9 +1203,9 @@ void udpServer::sendConnectionInfo(CLIENT* c)
|
|||
|
||||
if (c->txMutex.try_lock_for(std::chrono::milliseconds(LOCK_PERIOD)))
|
||||
{
|
||||
if (c->txSeqBuf.size() > 400)
|
||||
if (c->txSeqBuf.size() > BUFSIZE)
|
||||
{
|
||||
c->txSeqBuf.remove(0);
|
||||
c->txSeqBuf.remove(c->txSeqBuf.firstKey());
|
||||
}
|
||||
c->txSeqBuf.insert(p.seq, s);
|
||||
c->txSeq++;
|
||||
|
@ -1258,9 +1261,9 @@ void udpServer::sendTokenResponse(CLIENT* c, quint8 type)
|
|||
|
||||
if (c->txMutex.try_lock_for(std::chrono::milliseconds(LOCK_PERIOD)))
|
||||
{
|
||||
if (c->txSeqBuf.size() > 400)
|
||||
if (c->txSeqBuf.size() > BUFSIZE)
|
||||
{
|
||||
c->txSeqBuf.remove(0);
|
||||
c->txSeqBuf.remove(c->txSeqBuf.firstKey());
|
||||
}
|
||||
c->txSeqBuf.insert(p.seq, s);
|
||||
c->txSeq++;
|
||||
|
@ -1374,9 +1377,9 @@ void udpServer::sendStatus(CLIENT* c)
|
|||
s.data = QByteArray::fromRawData((const char*)p.packet, sizeof(p));
|
||||
if (c->txMutex.try_lock_for(std::chrono::milliseconds(LOCK_PERIOD)))
|
||||
{
|
||||
if (c->txSeqBuf.size() > 400)
|
||||
if (c->txSeqBuf.size() > BUFSIZE)
|
||||
{
|
||||
c->txSeqBuf.remove(0);
|
||||
c->txSeqBuf.remove(c->txSeqBuf.firstKey());
|
||||
}
|
||||
c->txSeq++;
|
||||
c->txSeqBuf.insert(p.seq, s);
|
||||
|
@ -1429,9 +1432,9 @@ void udpServer::dataForServer(QByteArray d)
|
|||
|
||||
if (client->txMutex.try_lock_for(std::chrono::milliseconds(LOCK_PERIOD)))
|
||||
{
|
||||
if (client->txSeqBuf.size() > 400)
|
||||
if (client->txSeqBuf.size() > BUFSIZE)
|
||||
{
|
||||
client->txSeqBuf.remove(0);
|
||||
client->txSeqBuf.remove(client->txSeqBuf.firstKey());
|
||||
}
|
||||
client->txSeqBuf.insert(p.seq, s);
|
||||
client->txSeq++;
|
||||
|
@ -1468,8 +1471,6 @@ void udpServer::sendRxAudio()
|
|||
{
|
||||
audio.clear();
|
||||
rxaudio->getNextAudioChunk(audio);
|
||||
// Now we have the next audio chunk, we can release the mutex.
|
||||
audioMutex.unlock();
|
||||
int len = 0;
|
||||
while (len < audio.length()) {
|
||||
audioPacket partial;
|
||||
|
@ -1477,6 +1478,8 @@ void udpServer::sendRxAudio()
|
|||
receiveAudioData(partial);
|
||||
len = len + partial.data.length();
|
||||
}
|
||||
// Now we have the next audio chunk, we can release the mutex.
|
||||
audioMutex.unlock();
|
||||
}
|
||||
else {
|
||||
qInfo(logUdpServer()) << "Unable to lock mutex for rxaudio";
|
||||
|
@ -1511,9 +1514,9 @@ void udpServer::receiveAudioData(const audioPacket& d)
|
|||
s.data = t;
|
||||
if (client->txMutex.try_lock_for(std::chrono::milliseconds(LOCK_PERIOD)))
|
||||
{
|
||||
if (client->txSeqBuf.size() > 400)
|
||||
if (client->txSeqBuf.size() > BUFSIZE)
|
||||
{
|
||||
client->txSeqBuf.remove(0);
|
||||
client->txSeqBuf.remove(client->txSeqBuf.firstKey());
|
||||
}
|
||||
client->txSeqBuf.insert(p.seq, s);
|
||||
client->txSeq++;
|
||||
|
@ -1551,7 +1554,7 @@ void udpServer::sendRetransmitRequest(CLIENT* c)
|
|||
// This will run every 100ms so out-of-sequence packets will not trigger a retransmit request.
|
||||
|
||||
QByteArray missingSeqs;
|
||||
|
||||
QTime missingTime = QTime::currentTime();
|
||||
|
||||
if (!c->rxSeqBuf.empty() && c->rxSeqBuf.size() <= c->rxSeqBuf.lastKey() - c->rxSeqBuf.firstKey())
|
||||
{
|
||||
|
@ -1582,59 +1585,81 @@ void udpServer::sendRetransmitRequest(CLIENT* c)
|
|||
// We have at least 1 missing packet!
|
||||
qDebug(logUdp()) << "Missing Seq: size=" << c->rxSeqBuf.size() << "firstKey=" << c->rxSeqBuf.firstKey() << "lastKey=" << c->rxSeqBuf.lastKey() << "missing=" << c->rxSeqBuf.lastKey() - c->rxSeqBuf.firstKey() - c->rxSeqBuf.size() + 1;
|
||||
// We are missing packets so iterate through the buffer and add the missing ones to missing packet list
|
||||
for (int i = 0; i < c->rxSeqBuf.keys().length() - 1; i++) {
|
||||
for (quint16 j = c->rxSeqBuf.keys()[i] + 1; j < c->rxSeqBuf.keys()[i + 1]; j++) {
|
||||
auto s = c->rxMissing.find(j);
|
||||
if (s == c->rxMissing.end())
|
||||
if (c->rxMutex.try_lock_for(std::chrono::milliseconds(LOCK_PERIOD)))
|
||||
{
|
||||
if (c->missMutex.try_lock_for(std::chrono::milliseconds(LOCK_PERIOD)))
|
||||
{
|
||||
int missCounter = 0;
|
||||
auto i = std::adjacent_find(c->rxSeqBuf.keys().begin(), c->rxSeqBuf.keys().end(), [](int l, int r) {return l + 1 < r; });
|
||||
while (i != c->rxSeqBuf.keys().end())
|
||||
{
|
||||
// We haven't seen this missing packet before
|
||||
qDebug(logUdp()) << this->metaObject()->className() << ": Adding to missing buffer (len=" << c->rxMissing.size() << "): " << j;
|
||||
|
||||
if (c->missMutex.try_lock_for(std::chrono::milliseconds(LOCK_PERIOD)))
|
||||
quint16 j = 1 + *i;
|
||||
++i;
|
||||
if (i == c->rxSeqBuf.keys().end())
|
||||
{
|
||||
c->rxMissing.insert(j, 0);
|
||||
continue;
|
||||
}
|
||||
if (c->rxSeqBuf.lastKey() - c->rxSeqBuf.firstKey() - c->rxSeqBuf.size() == 0 && c->type == "AUDIO" &&
|
||||
(c->txCodec == 0x40 || c->txCodec == 0x80))
|
||||
{
|
||||
// Single missing audio packet ignore it!
|
||||
qDebug(logUdpServer()) << "Single missing audio packet will be handled by FEC (" << hex << j << ")";
|
||||
c->rxSeqBuf.insert(j, QTime::currentTime()); // Add this missing packet to the rxbuffer so it doesn't try to retransmit
|
||||
c->missMutex.unlock();
|
||||
}
|
||||
else {
|
||||
qInfo(logUdpServer()) << "Unable to lock missMutex()";
|
||||
c->rxMutex.unlock();
|
||||
return;
|
||||
}
|
||||
|
||||
missCounter++;
|
||||
|
||||
if (c->rxMutex.try_lock_for(std::chrono::milliseconds(LOCK_PERIOD)))
|
||||
if (missCounter > 20) {
|
||||
// More than 20 packets missing, something horrific has happened!
|
||||
qDebug(logUdpServer()) << ": Too many missing packets, clearing buffer";
|
||||
c->rxSeqBuf.clear();
|
||||
c->rxMissing.clear();
|
||||
c->missMutex.unlock();
|
||||
c->rxMutex.unlock();
|
||||
return;
|
||||
}
|
||||
auto s = c->rxMissing.find(j);
|
||||
if (s == c->rxMissing.end())
|
||||
{
|
||||
if (c->rxSeqBuf.size() > 400)
|
||||
// We haven't seen this missing packet before
|
||||
qDebug(logUdp()) << this->metaObject()->className() << ": Adding to missing buffer (len=" << c->rxMissing.size() << "): " << j << dec << missingTime.msecsTo(QTime::currentTime()) << "ms";
|
||||
c->rxMissing.insert(j, 0);
|
||||
|
||||
if (c->rxSeqBuf.size() > BUFSIZE)
|
||||
{
|
||||
c->rxSeqBuf.remove(0);
|
||||
c->rxSeqBuf.remove(c->rxSeqBuf.firstKey());
|
||||
}
|
||||
c->rxSeqBuf.insert(j, QTime::currentTime()); // Add this missing packet to the rxbuffer as we now long about it.
|
||||
c->rxMutex.unlock();
|
||||
}
|
||||
else {
|
||||
qInfo(logUdpServer()) << "Unable to lock rxMutex()";
|
||||
}
|
||||
|
||||
}
|
||||
else {
|
||||
if (s.value() == 4)
|
||||
{
|
||||
// We have tried 4 times to request this packet, time to give up!
|
||||
if (c->missMutex.try_lock_for(std::chrono::milliseconds(LOCK_PERIOD)))
|
||||
if (s.value() == 4)
|
||||
{
|
||||
// We have tried 4 times to request this packet, time to give up!
|
||||
s = c->rxMissing.erase(s);
|
||||
c->missMutex.unlock();
|
||||
}
|
||||
else {
|
||||
qInfo(logUdpServer()) << "Unable to lock missMutex()";
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
else {
|
||||
qInfo(logUdpServer()) << "Unable to lock missMutex()";
|
||||
}
|
||||
c->rxMutex.unlock();
|
||||
}
|
||||
else {
|
||||
qInfo(logUdpServer()) << "Unable to lock rxMutex()";
|
||||
}
|
||||
c->missMutex.unlock();
|
||||
}
|
||||
}
|
||||
|
||||
if (missingTime.msecsTo(QTime::currentTime()) > 10) {
|
||||
qInfo(logUdpServer()) << "Initial missing processing has been running for" << missingTime.msecsTo(QTime::currentTime()) << "(ms)";
|
||||
}
|
||||
|
||||
if (c->missMutex.try_lock_for(std::chrono::milliseconds(LOCK_PERIOD)))
|
||||
{
|
||||
for (auto it = c->rxMissing.begin(); it != c->rxMissing.end(); ++it)
|
||||
|
@ -1676,9 +1701,10 @@ void udpServer::sendRetransmitRequest(CLIENT* c)
|
|||
{
|
||||
qDebug(logUdp()) << this->metaObject()->className() << ": sending request for multiple missing packets : " << missingSeqs.toHex();
|
||||
|
||||
missingSeqs.insert(0, p.packet, sizeof(p.packet));
|
||||
|
||||
if (udpMutex.try_lock_for(std::chrono::milliseconds(LOCK_PERIOD)))
|
||||
{
|
||||
missingSeqs.insert(0, p.packet, sizeof(p.packet));
|
||||
c->socket->writeDatagram(missingSeqs, c->ipAddress, c->port);
|
||||
udpMutex.unlock();
|
||||
}
|
||||
|
@ -1693,7 +1719,6 @@ void udpServer::sendRetransmitRequest(CLIENT* c)
|
|||
else {
|
||||
qInfo(logUdpServer()) << "Unable to lock missMutex()";
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
|
42
wfmain.cpp
42
wfmain.cpp
|
@ -67,20 +67,20 @@ wfmain::wfmain(const QString serialPortCL, const QString hostCL, const QString s
|
|||
|
||||
setUIToPrefs();
|
||||
|
||||
setServerToPrefs();
|
||||
|
||||
setInitialTiming();
|
||||
|
||||
openRig();
|
||||
|
||||
rigConnections();
|
||||
|
||||
if (serverConfig.enabled && udp != Q_NULLPTR) {
|
||||
/* if (serverConfig.enabled && udp != Q_NULLPTR) {
|
||||
// Server
|
||||
connect(rig, SIGNAL(haveAudioData(audioPacket)), udp, SLOT(receiveAudioData(audioPacket)));
|
||||
connect(rig, SIGNAL(haveDataForServer(QByteArray)), udp, SLOT(dataForServer(QByteArray)));
|
||||
connect(udp, SIGNAL(haveDataFromServer(QByteArray)), rig, SLOT(dataFromServer(QByteArray)));
|
||||
}
|
||||
} */
|
||||
|
||||
setServerToPrefs();
|
||||
|
||||
amTransmitting = false;
|
||||
|
||||
|
@ -976,7 +976,13 @@ void wfmain::setServerToPrefs()
|
|||
connect(this, SIGNAL(initServer(SERVERCONFIG, audioSetup, audioSetup)), udp, SLOT(init(SERVERCONFIG, audioSetup, audioSetup)));
|
||||
connect(serverThread, SIGNAL(finished()), udp, SLOT(deleteLater()));
|
||||
|
||||
if (!prefs.enableLAN && udp != Q_NULLPTR) {
|
||||
if (rig != Q_NULLPTR) {
|
||||
connect(rig, SIGNAL(haveAudioData(audioPacket)), udp, SLOT(receiveAudioData(audioPacket)));
|
||||
connect(rig, SIGNAL(haveDataForServer(QByteArray)), udp, SLOT(dataForServer(QByteArray)));
|
||||
connect(udp, SIGNAL(haveDataFromServer(QByteArray)), rig, SLOT(dataFromServer(QByteArray)));
|
||||
}
|
||||
|
||||
if (!prefs.enableLAN) {
|
||||
connect(udp, SIGNAL(haveNetworkStatus(QString)), this, SLOT(receiveStatusUpdate(QString)));
|
||||
}
|
||||
|
||||
|
@ -1133,8 +1139,8 @@ void wfmain::setAudioDevicesUI()
|
|||
// Set these to default audio devices initially.
|
||||
rxSetup.port = QAudioDeviceInfo::defaultOutputDevice();
|
||||
txSetup.port = QAudioDeviceInfo::defaultInputDevice();
|
||||
serverRxSetup.port = QAudioDeviceInfo::defaultOutputDevice();
|
||||
serverTxSetup.port = QAudioDeviceInfo::defaultInputDevice();
|
||||
serverRxSetup.port = QAudioDeviceInfo::defaultInputDevice();
|
||||
serverTxSetup.port = QAudioDeviceInfo::defaultOutputDevice();
|
||||
#endif
|
||||
}
|
||||
|
||||
|
@ -1458,6 +1464,8 @@ void wfmain::loadSettings()
|
|||
|
||||
prefs.localAFgain = (unsigned char)settings->value("localAFgain", defPrefs.localAFgain).toUInt();
|
||||
rxSetup.localAFgain = prefs.localAFgain;
|
||||
txSetup.localAFgain = 255;
|
||||
|
||||
settings->endGroup();
|
||||
|
||||
// Misc. user settings (enable PTT, draw peaks, etc)
|
||||
|
@ -1623,8 +1631,13 @@ void wfmain::loadSettings()
|
|||
ui->serverAudioPortText->setText(QString::number(serverConfig.audioPort));
|
||||
|
||||
serverRxSetup.isinput = true;
|
||||
|
||||
serverTxSetup.isinput = false;
|
||||
|
||||
serverRxSetup.localAFgain = 255;
|
||||
|
||||
serverTxSetup.localAFgain = 255;
|
||||
|
||||
ui->serverRXAudioInputCombo->blockSignals(true);
|
||||
serverRxSetup.name = settings->value("ServerAudioInput", "").toString();
|
||||
qInfo(logGui()) << "Got Server Audio Input: " << serverRxSetup.name;
|
||||
|
@ -1634,7 +1647,7 @@ void wfmain::loadSettings()
|
|||
#if defined(RTAUDIO)
|
||||
serverRxSetup.port = ui->serverRXAudioInputCombo->itemData(serverAudioInputIndex).toInt();
|
||||
#elif defined(PORTAUDIO)
|
||||
serverRxSetup.port = ui->audioOutputCombo->itemData(serverAudioInputIndex).toInt();
|
||||
serverRxSetup.port = ui->serverRXAudioInputCombo->itemData(serverAudioInputIndex).toInt();
|
||||
#else
|
||||
QVariant v = ui->serverRXAudioInputCombo->currentData();
|
||||
serverRxSetup.port = v.value<QAudioDeviceInfo>();
|
||||
|
@ -1642,7 +1655,8 @@ void wfmain::loadSettings()
|
|||
}
|
||||
ui->serverRXAudioInputCombo->blockSignals(false);
|
||||
|
||||
serverTxSetup.resampleQuality = settings->value("ResampleQuality", "4").toInt();
|
||||
serverRxSetup.resampleQuality = rxSetup.resampleQuality;
|
||||
serverTxSetup.resampleQuality = serverRxSetup.resampleQuality;
|
||||
|
||||
ui->serverTXAudioOutputCombo->blockSignals(true);
|
||||
serverTxSetup.name = settings->value("ServerAudioOutput", "").toString();
|
||||
|
@ -1656,13 +1670,11 @@ void wfmain::loadSettings()
|
|||
serverTxSetup.port = ui->serverTXAudioOutputCombo->itemData(serverAudioOutputIndex).toInt();
|
||||
#else
|
||||
QVariant v = ui->serverTXAudioOutputCombo->currentData();
|
||||
serverRxSetup.port = v.value<QAudioDeviceInfo>();
|
||||
serverTxSetup.port = v.value<QAudioDeviceInfo>();
|
||||
#endif
|
||||
}
|
||||
ui->serverTXAudioOutputCombo->blockSignals(false);
|
||||
|
||||
serverTxSetup.resampleQuality = settings->value("ResampleQuality", "4").toInt();
|
||||
|
||||
int row = 0;
|
||||
ui->serverUsersTable->setRowCount(0);
|
||||
|
||||
|
@ -1786,17 +1798,17 @@ void wfmain::on_serverEnableCheckbox_clicked(bool checked)
|
|||
|
||||
void wfmain::on_serverControlPortText_textChanged(QString text)
|
||||
{
|
||||
serverConfig.controlPort = ui->serverControlPortText->text().toInt();
|
||||
serverConfig.controlPort = text.toInt();
|
||||
}
|
||||
|
||||
void wfmain::on_serverCivPortText_textChanged(QString text)
|
||||
{
|
||||
serverConfig.civPort = ui->serverCivPortText->text().toInt();
|
||||
serverConfig.civPort = text.toInt();
|
||||
}
|
||||
|
||||
void wfmain::on_serverAudioPortText_textChanged(QString text)
|
||||
{
|
||||
serverConfig.audioPort = ui->serverAudioPortText->text().toInt();
|
||||
serverConfig.audioPort = text.toInt();
|
||||
}
|
||||
|
||||
void wfmain::on_serverRXAudioInputCombo_currentIndexChanged(int value)
|
||||
|
|
366
wfview.vcxproj
366
wfview.vcxproj
|
@ -16,8 +16,7 @@
|
|||
<Keyword>QtVS_v304</Keyword>
|
||||
<WindowsTargetPlatformVersion>10.0.19041.0</WindowsTargetPlatformVersion>
|
||||
<WindowsTargetPlatformMinVersion>10.0.19041.0</WindowsTargetPlatformMinVersion>
|
||||
<QtMsBuild Condition="'$(QtMsBuild)'=='' or !Exists('$(QtMsBuild)\qt.targets')">$(MSBuildProjectDirectory)\QtMsBuild</QtMsBuild>
|
||||
</PropertyGroup>
|
||||
<QtMsBuild Condition="'$(QtMsBuild)'=='' or !Exists('$(QtMsBuild)\qt.targets')">$(MSBuildProjectDirectory)\QtMsBuild</QtMsBuild></PropertyGroup>
|
||||
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
|
||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration">
|
||||
<PlatformToolset>v142</PlatformToolset>
|
||||
|
@ -37,10 +36,7 @@
|
|||
<IntermediateDirectory>debug\</IntermediateDirectory>
|
||||
<PrimaryOutput>wfview</PrimaryOutput>
|
||||
</PropertyGroup>
|
||||
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
|
||||
<Target Name="QtMsBuildNotFound" BeforeTargets="CustomBuild;ClCompile" Condition="!Exists('$(QtMsBuild)\qt.targets') or !Exists('$(QtMsBuild)\qt.props')">
|
||||
<Message Importance="High" Text="QtMsBuild: could not locate qt.targets, qt.props; project may not build correctly." />
|
||||
</Target>
|
||||
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" /><Target Name="QtMsBuildNotFound" BeforeTargets="CustomBuild;ClCompile" Condition="!Exists('$(QtMsBuild)\qt.targets') or !Exists('$(QtMsBuild)\qt.props')"><Message Importance="High" Text="QtMsBuild: could not locate qt.targets, qt.props; project may not build correctly." /></Target>
|
||||
<ImportGroup Label="ExtensionSettings" />
|
||||
<ImportGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="PropertySheets">
|
||||
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" />
|
||||
|
@ -48,34 +44,8 @@
|
|||
<ImportGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="PropertySheets">
|
||||
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" />
|
||||
</ImportGroup>
|
||||
<PropertyGroup Label="UserMacros" />
|
||||
<ImportGroup Condition="Exists('$(QtMsBuild)\qt_defaults.props')">
|
||||
<Import Project="$(QtMsBuild)\qt_defaults.props" />
|
||||
</ImportGroup>
|
||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
|
||||
<OutDir>debug\</OutDir>
|
||||
<IntDir>debug\</IntDir>
|
||||
<TargetName>wfview</TargetName>
|
||||
<IgnoreImportLibrary>true</IgnoreImportLibrary>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
|
||||
<OutDir>release\</OutDir>
|
||||
<IntDir>release\</IntDir>
|
||||
<TargetName>wfview</TargetName>
|
||||
<IgnoreImportLibrary>true</IgnoreImportLibrary>
|
||||
<LinkIncremental>false</LinkIncremental>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup Label="QtSettings" Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
|
||||
<QtInstall>msvc2019</QtInstall>
|
||||
<QtModules>core;network;gui;multimedia;widgets;serialport;printsupport</QtModules>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup Label="QtSettings" Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
|
||||
<QtInstall>msvc2019</QtInstall>
|
||||
<QtModules>core;network;gui;multimedia;widgets;serialport;printsupport</QtModules>
|
||||
</PropertyGroup>
|
||||
<ImportGroup Condition="Exists('$(QtMsBuild)\qt.props')">
|
||||
<Import Project="$(QtMsBuild)\qt.props" />
|
||||
</ImportGroup>
|
||||
<PropertyGroup Label="UserMacros" /><ImportGroup Condition="Exists('$(QtMsBuild)\qt_defaults.props')"><Import Project="$(QtMsBuild)\qt_defaults.props" /></ImportGroup><PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'"><OutDir>debug\</OutDir><IntDir>debug\</IntDir><TargetName>wfview</TargetName><IgnoreImportLibrary>true</IgnoreImportLibrary></PropertyGroup><PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'"><OutDir>release\</OutDir><IntDir>release\</IntDir><TargetName>wfview</TargetName><IgnoreImportLibrary>true</IgnoreImportLibrary><LinkIncremental>false</LinkIncremental></PropertyGroup><PropertyGroup Label="QtSettings" Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'"><QtInstall>msvc2019</QtInstall><QtModules>core;network;gui;multimedia;widgets;serialport;printsupport</QtModules></PropertyGroup><PropertyGroup Label="QtSettings" Condition="'$(Configuration)|$(Platform)'=='Release|Win32'"><QtInstall>msvc2019</QtInstall><QtModules>core;network;gui;multimedia;widgets;serialport;printsupport</QtModules></PropertyGroup><ImportGroup Condition="Exists('$(QtMsBuild)\qt.props')"><Import Project="$(QtMsBuild)\qt.props" /></ImportGroup>
|
||||
|
||||
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
|
||||
<ClCompile>
|
||||
<AdditionalIncludeDirectories>.;..\qcustomplot;..\opus\include;resampler;release;/include;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
|
||||
|
@ -87,16 +57,14 @@
|
|||
<ExceptionHandling>Sync</ExceptionHandling>
|
||||
<ObjectFileName>release\</ObjectFileName>
|
||||
<Optimization>MaxSpeed</Optimization>
|
||||
<PreprocessorDefinitions>_WINDOWS;UNICODE;_UNICODE;WIN32;_ENABLE_EXTENDED_ALIGNED_STORAGE;WFVIEW_VERSION="1.2d";QT_DEPRECATED_WARNINGS;QCUSTOMPLOT_COMPILE_LIBRARY;USE_SSE;USE_SSE2;OUTSIDE_SPEEX;RANDOM_PREFIX=wf;PREFIX="/usr/local";GITSHORT="62771f6";HOST="wfview.org";UNAME="build";NDEBUG;QT_NO_DEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
||||
<PreprocessorDefinitions>_WINDOWS;UNICODE;_UNICODE;WIN32;_ENABLE_EXTENDED_ALIGNED_STORAGE;WFVIEW_VERSION="1.2d";QT_DEPRECATED_WARNINGS;QCUSTOMPLOT_COMPILE_LIBRARY;USE_SSE;USE_SSE2;OUTSIDE_SPEEX;RANDOM_PREFIX=wf;PREFIX="/usr/local";GITSHORT="01ea44d";HOST="wfview.org";UNAME="build";NDEBUG;QT_NO_DEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
||||
<PreprocessToFile>false</PreprocessToFile>
|
||||
<ProgramDataBaseFileName>
|
||||
</ProgramDataBaseFileName>
|
||||
<ProgramDataBaseFileName></ProgramDataBaseFileName>
|
||||
<RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary>
|
||||
<SuppressStartupBanner>true</SuppressStartupBanner>
|
||||
<TreatWChar_tAsBuiltInType>true</TreatWChar_tAsBuiltInType>
|
||||
<WarningLevel>Level3</WarningLevel>
|
||||
<MultiProcessorCompilation>true</MultiProcessorCompilation>
|
||||
</ClCompile>
|
||||
<MultiProcessorCompilation>true</MultiProcessorCompilation></ClCompile>
|
||||
<Link>
|
||||
<AdditionalDependencies>..\opus\win32\VS2015\Win32\Release\opus.lib;shell32.lib;%(AdditionalDependencies)</AdditionalDependencies>
|
||||
<AdditionalLibraryDirectories>..\opus\win32\VS2015\Win32\Release;C:\opensslx86\lib;C:\Utils\my_sql\mysql-5.7.25-win32\lib;C:\Utils\postgresqlx86\pgsql\lib;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
|
||||
|
@ -117,28 +85,9 @@
|
|||
<WarningLevel>0</WarningLevel>
|
||||
</Midl>
|
||||
<ResourceCompile>
|
||||
<PreprocessorDefinitions>_WINDOWS;UNICODE;_UNICODE;WIN32;_ENABLE_EXTENDED_ALIGNED_STORAGE;WFVIEW_VERSION="1.2d";QT_DEPRECATED_WARNINGS;QCUSTOMPLOT_COMPILE_LIBRARY;USE_SSE;USE_SSE2;OUTSIDE_SPEEX;RANDOM_PREFIX=wf;PREFIX=\"/usr/local\";GITSHORT=\"62771f6\";HOST=\"wfview.org\";UNAME=\"build\";NDEBUG;QT_NO_DEBUG;QT_MULTIMEDIA_LIB;QT_PRINTSUPPORT_LIB;QT_WIDGETS_LIB;QT_GUI_LIB;QT_SERIALPORT_LIB;QT_NETWORK_LIB;QT_CORE_LIB;%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
||||
<PreprocessorDefinitions>_WINDOWS;UNICODE;_UNICODE;WIN32;_ENABLE_EXTENDED_ALIGNED_STORAGE;WFVIEW_VERSION=\"1.2d\";QT_DEPRECATED_WARNINGS;QCUSTOMPLOT_COMPILE_LIBRARY;USE_SSE;USE_SSE2;OUTSIDE_SPEEX;RANDOM_PREFIX=wf;PREFIX=\"/usr/local\";GITSHORT=\"01ea44d\";HOST=\"wfview.org\";UNAME=\"build\";NDEBUG;QT_NO_DEBUG;QT_MULTIMEDIA_LIB;QT_PRINTSUPPORT_LIB;QT_WIDGETS_LIB;QT_GUI_LIB;QT_SERIALPORT_LIB;QT_NETWORK_LIB;QT_CORE_LIB;%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
||||
</ResourceCompile>
|
||||
<QtMoc>
|
||||
<CompilerFlavor>msvc</CompilerFlavor>
|
||||
<Include>./$(Configuration)/moc_predefs.h</Include>
|
||||
<ExecutionDescription>Moc'ing %(Identity)...</ExecutionDescription>
|
||||
<DynamicSource>output</DynamicSource>
|
||||
<QtMocDir>$(Configuration)</QtMocDir>
|
||||
<QtMocFileName>moc_%(Filename).cpp</QtMocFileName>
|
||||
</QtMoc>
|
||||
<QtRcc>
|
||||
<Compression>default</Compression>
|
||||
<ExecutionDescription>Rcc'ing %(Identity)...</ExecutionDescription>
|
||||
<QtRccDir>$(Configuration)</QtRccDir>
|
||||
<QtRccFileName>qrc_%(Filename).cpp</QtRccFileName>
|
||||
</QtRcc>
|
||||
<QtUic>
|
||||
<ExecutionDescription>Uic'ing %(Identity)...</ExecutionDescription>
|
||||
<QtUicDir>$(ProjectDir)</QtUicDir>
|
||||
<QtUicFileName>ui_%(Filename).h</QtUicFileName>
|
||||
</QtUic>
|
||||
</ItemDefinitionGroup>
|
||||
<QtMoc><CompilerFlavor>msvc</CompilerFlavor><Include>./$(Configuration)/moc_predefs.h</Include><ExecutionDescription>Moc'ing %(Identity)...</ExecutionDescription><DynamicSource>output</DynamicSource><QtMocDir>$(Configuration)</QtMocDir><QtMocFileName>moc_%(Filename).cpp</QtMocFileName></QtMoc><QtRcc><Compression>default</Compression><ExecutionDescription>Rcc'ing %(Identity)...</ExecutionDescription><QtRccDir>$(Configuration)</QtRccDir><QtRccFileName>qrc_%(Filename).cpp</QtRccFileName></QtRcc><QtUic><ExecutionDescription>Uic'ing %(Identity)...</ExecutionDescription><QtUicDir>$(ProjectDir)</QtUicDir><QtUicFileName>ui_%(Filename).h</QtUicFileName></QtUic></ItemDefinitionGroup>
|
||||
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
|
||||
<ClCompile>
|
||||
<AdditionalIncludeDirectories>.;..\qcustomplot;..\opus\include;resampler;debug;/include;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
|
||||
|
@ -150,14 +99,13 @@
|
|||
<ExceptionHandling>Sync</ExceptionHandling>
|
||||
<ObjectFileName>debug\</ObjectFileName>
|
||||
<Optimization>Disabled</Optimization>
|
||||
<PreprocessorDefinitions>_WINDOWS;UNICODE;_UNICODE;WIN32;_ENABLE_EXTENDED_ALIGNED_STORAGE;WFVIEW_VERSION="1.2d";QT_DEPRECATED_WARNINGS;QCUSTOMPLOT_COMPILE_LIBRARY;USE_SSE;USE_SSE2;OUTSIDE_SPEEX;RANDOM_PREFIX=wf;PREFIX="/usr/local";GITSHORT="62771f6";HOST="wfview.org";UNAME="build";%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
||||
<PreprocessorDefinitions>_WINDOWS;UNICODE;_UNICODE;WIN32;_ENABLE_EXTENDED_ALIGNED_STORAGE;WFVIEW_VERSION="1.2d";QT_DEPRECATED_WARNINGS;QCUSTOMPLOT_COMPILE_LIBRARY;USE_SSE;USE_SSE2;OUTSIDE_SPEEX;RANDOM_PREFIX=wf;PREFIX="/usr/local";GITSHORT="01ea44d";HOST="wfview.org";UNAME="build";%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
||||
<PreprocessToFile>false</PreprocessToFile>
|
||||
<RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>
|
||||
<SuppressStartupBanner>true</SuppressStartupBanner>
|
||||
<TreatWChar_tAsBuiltInType>true</TreatWChar_tAsBuiltInType>
|
||||
<WarningLevel>Level3</WarningLevel>
|
||||
<MultiProcessorCompilation>true</MultiProcessorCompilation>
|
||||
</ClCompile>
|
||||
<MultiProcessorCompilation>true</MultiProcessorCompilation></ClCompile>
|
||||
<Link>
|
||||
<AdditionalDependencies>..\opus\win32\VS2015\Win32\Debug\opus.lib;shell32.lib;%(AdditionalDependencies)</AdditionalDependencies>
|
||||
<AdditionalLibraryDirectories>..\opus\win32\VS2015\Win32\Debug;C:\opensslx86\lib;C:\Utils\my_sql\mysql-5.7.25-win32\lib;C:\Utils\postgresqlx86\pgsql\lib;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
|
||||
|
@ -176,28 +124,9 @@
|
|||
<WarningLevel>0</WarningLevel>
|
||||
</Midl>
|
||||
<ResourceCompile>
|
||||
<PreprocessorDefinitions>_WINDOWS;UNICODE;_UNICODE;WIN32;_ENABLE_EXTENDED_ALIGNED_STORAGE;WFVIEW_VERSION="1.2d";QT_DEPRECATED_WARNINGS;QCUSTOMPLOT_COMPILE_LIBRARY;USE_SSE;USE_SSE2;OUTSIDE_SPEEX;RANDOM_PREFIX=wf;PREFIX=\"/usr/local\";GITSHORT=\"62771f6\";HOST=\"wfview.org\";UNAME=\"build\";QT_MULTIMEDIA_LIB;QT_PRINTSUPPORT_LIB;QT_WIDGETS_LIB;QT_GUI_LIB;QT_SERIALPORT_LIB;QT_NETWORK_LIB;QT_CORE_LIB;_DEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
||||
<PreprocessorDefinitions>_WINDOWS;UNICODE;_UNICODE;WIN32;_ENABLE_EXTENDED_ALIGNED_STORAGE;WFVIEW_VERSION=\"1.2d\";QT_DEPRECATED_WARNINGS;QCUSTOMPLOT_COMPILE_LIBRARY;USE_SSE;USE_SSE2;OUTSIDE_SPEEX;RANDOM_PREFIX=wf;PREFIX=\"/usr/local\";GITSHORT=\"01ea44d\";HOST=\"wfview.org\";UNAME=\"build\";QT_MULTIMEDIA_LIB;QT_PRINTSUPPORT_LIB;QT_WIDGETS_LIB;QT_GUI_LIB;QT_SERIALPORT_LIB;QT_NETWORK_LIB;QT_CORE_LIB;_DEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
||||
</ResourceCompile>
|
||||
<QtMoc>
|
||||
<CompilerFlavor>msvc</CompilerFlavor>
|
||||
<Include>./$(Configuration)/moc_predefs.h</Include>
|
||||
<ExecutionDescription>Moc'ing %(Identity)...</ExecutionDescription>
|
||||
<DynamicSource>output</DynamicSource>
|
||||
<QtMocDir>$(Configuration)</QtMocDir>
|
||||
<QtMocFileName>moc_%(Filename).cpp</QtMocFileName>
|
||||
</QtMoc>
|
||||
<QtRcc>
|
||||
<Compression>default</Compression>
|
||||
<ExecutionDescription>Rcc'ing %(Identity)...</ExecutionDescription>
|
||||
<QtRccDir>$(Configuration)</QtRccDir>
|
||||
<QtRccFileName>qrc_%(Filename).cpp</QtRccFileName>
|
||||
</QtRcc>
|
||||
<QtUic>
|
||||
<ExecutionDescription>Uic'ing %(Identity)...</ExecutionDescription>
|
||||
<QtUicDir>$(ProjectDir)</QtUicDir>
|
||||
<QtUicFileName>ui_%(Filename).h</QtUicFileName>
|
||||
</QtUic>
|
||||
</ItemDefinitionGroup>
|
||||
<QtMoc><CompilerFlavor>msvc</CompilerFlavor><Include>./$(Configuration)/moc_predefs.h</Include><ExecutionDescription>Moc'ing %(Identity)...</ExecutionDescription><DynamicSource>output</DynamicSource><QtMocDir>$(Configuration)</QtMocDir><QtMocFileName>moc_%(Filename).cpp</QtMocFileName></QtMoc><QtRcc><Compression>default</Compression><ExecutionDescription>Rcc'ing %(Identity)...</ExecutionDescription><QtRccDir>$(Configuration)</QtRccDir><QtRccFileName>qrc_%(Filename).cpp</QtRccFileName></QtRcc><QtUic><ExecutionDescription>Uic'ing %(Identity)...</ExecutionDescription><QtUicDir>$(ProjectDir)</QtUicDir><QtUicFileName>ui_%(Filename).h</QtUicFileName></QtUic></ItemDefinitionGroup>
|
||||
<ItemGroup>
|
||||
<ClCompile Include="aboutbox.cpp" />
|
||||
<ClCompile Include="audiohandler.cpp" />
|
||||
|
@ -220,58 +149,192 @@
|
|||
<ClCompile Include="transceiveradjustments.cpp" />
|
||||
<ClCompile Include="udphandler.cpp" />
|
||||
<ClCompile Include="udpserver.cpp" />
|
||||
<ClCompile Include="udpserversetup.cpp" />
|
||||
<ClCompile Include="wfmain.cpp" />
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<QtMoc Include="aboutbox.h">
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
</QtMoc>
|
||||
<ClInclude Include="resampler\arch.h" />
|
||||
<QtMoc Include="audiohandler.h">
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
</QtMoc>
|
||||
<ClInclude Include="audiotaper.h" />
|
||||
<QtMoc Include="calibrationwindow.h">
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
</QtMoc>
|
||||
<QtMoc Include="commhandler.h">
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
</QtMoc>
|
||||
<ClInclude Include="freqmemory.h" />
|
||||
<ClInclude Include="logcategories.h" />
|
||||
<QtMoc Include="meter.h">
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
</QtMoc>
|
||||
<ClInclude Include="packettypes.h" />
|
||||
<QtMoc Include="pttyhandler.h">
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
</QtMoc>
|
||||
<QtMoc Include="..\qcustomplot\qcustomplot.h">
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
</QtMoc>
|
||||
<QtMoc Include="qledlabel.h">
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
</QtMoc>
|
||||
<ClInclude Include="repeaterattributes.h" />
|
||||
<QtMoc Include="repeatersetup.h">
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
</QtMoc>
|
||||
<ClInclude Include="resampler\resample_sse.h" />
|
||||
<QtMoc Include="rigcommander.h">
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
</QtMoc>
|
||||
<QtMoc Include="rigctld.h">
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
</QtMoc>
|
||||
<ClInclude Include="rigidentities.h" />
|
||||
<ClInclude Include="rigstate.h" />
|
||||
<ClInclude Include="ring\ring.h" />
|
||||
<QtMoc Include="satellitesetup.h">
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
</QtMoc>
|
||||
<ClInclude Include="resampler\speex_resampler.h" />
|
||||
<QtMoc Include="transceiveradjustments.h">
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
</QtMoc>
|
||||
<QtMoc Include="udphandler.h">
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
</QtMoc>
|
||||
<QtMoc Include="udpserver.h">
|
||||
</QtMoc>
|
||||
<QtMoc Include="udpserversetup.h">
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
</QtMoc>
|
||||
<ClInclude Include="ulaw.h" />
|
||||
<QtMoc Include="wfmain.h">
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
</QtMoc>
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
<CustomBuild Include="debug\moc_predefs.h.cbt">
|
||||
<FileType>Document</FileType>
|
||||
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">true</ExcludedFromBuild>
|
||||
|
@ -288,21 +351,117 @@
|
|||
<Outputs Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">release\moc_predefs.h;%(Outputs)</Outputs>
|
||||
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">true</ExcludedFromBuild>
|
||||
</CustomBuild>
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<QtUic Include="aboutbox.ui">
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
</QtUic>
|
||||
<QtUic Include="calibrationwindow.ui">
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
</QtUic>
|
||||
<QtUic Include="repeatersetup.ui">
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
</QtUic>
|
||||
<QtUic Include="satellitesetup.ui">
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
</QtUic>
|
||||
<QtUic Include="transceiveradjustments.ui">
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
</QtUic>
|
||||
<QtUic Include="udpserversetup.ui">
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
</QtUic>
|
||||
<QtUic Include="wfmain.ui">
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
</QtUic>
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
|
@ -336,16 +495,30 @@
|
|||
<None Include="qdarkstyle\rc\radio_unchecked_disabled.png" />
|
||||
<None Include="qdarkstyle\rc\radio_unchecked_focus.png" />
|
||||
<QtRcc Include="resources\resources.qrc">
|
||||
<InitFuncName Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">resources</InitFuncName>
|
||||
<InitFuncName Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">resources</InitFuncName>
|
||||
</QtRcc>
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
<InitFuncName Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">resources</InitFuncName><InitFuncName Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">resources</InitFuncName></QtRcc>
|
||||
<None Include="qdarkstyle\rc\right_arrow.png" />
|
||||
<None Include="qdarkstyle\rc\right_arrow_disabled.png" />
|
||||
<None Include="qdarkstyle\rc\sizegrip.png" />
|
||||
<QtRcc Include="qdarkstyle\style.qrc">
|
||||
<InitFuncName Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">style</InitFuncName>
|
||||
<InitFuncName Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">style</InitFuncName>
|
||||
</QtRcc>
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
<InitFuncName Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">style</InitFuncName><InitFuncName Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">style</InitFuncName></QtRcc>
|
||||
<None Include="qdarkstyle\style.qss" />
|
||||
<None Include="qdarkstyle\rc\stylesheet-branch-end.png" />
|
||||
<None Include="qdarkstyle\rc\stylesheet-branch-more.png" />
|
||||
|
@ -364,9 +537,6 @@
|
|||
<ItemGroup>
|
||||
<ResourceCompile Include=".\wfview_resource.rc" />
|
||||
</ItemGroup>
|
||||
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
|
||||
<ImportGroup Condition="Exists('$(QtMsBuild)\qt.targets')">
|
||||
<Import Project="$(QtMsBuild)\qt.targets" />
|
||||
</ImportGroup>
|
||||
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" /><ImportGroup Condition="Exists('$(QtMsBuild)\qt.targets')"><Import Project="$(QtMsBuild)\qt.targets" /></ImportGroup>
|
||||
<ImportGroup Label="ExtensionTargets" />
|
||||
</Project>
|
Ładowanie…
Reference in New Issue