kopia lustrzana https://gitlab.com/eliggett/wfview
Add back support for portaudo and rtaudio APIs
rodzic
63c5e0257d
commit
44f6ec2740
|
@ -6,6 +6,7 @@
|
||||||
#include <QMap>
|
#include <QMap>
|
||||||
#include <QDebug>
|
#include <QDebug>
|
||||||
#include <QAudioFormat>
|
#include <QAudioFormat>
|
||||||
|
#include <QAudioDeviceInfo>
|
||||||
|
|
||||||
/* Opus and Eigen */
|
/* Opus and Eigen */
|
||||||
#ifdef Q_OS_WIN
|
#ifdef Q_OS_WIN
|
||||||
|
@ -16,6 +17,8 @@
|
||||||
#include <eigen3/Eigen/Eigen>
|
#include <eigen3/Eigen/Eigen>
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
enum audioType {qtAudio,portAudio,rtAudio};
|
||||||
|
|
||||||
#include "resampler/speex_resampler.h"
|
#include "resampler/speex_resampler.h"
|
||||||
|
|
||||||
#include "packettypes.h"
|
#include "packettypes.h"
|
||||||
|
@ -30,6 +33,22 @@ struct audioPacket {
|
||||||
qreal volume = 1.0;
|
qreal volume = 1.0;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
struct audioSetup {
|
||||||
|
audioType type;
|
||||||
|
QString name;
|
||||||
|
quint16 latency;
|
||||||
|
quint8 codec;
|
||||||
|
bool ulaw = false;
|
||||||
|
bool isinput;
|
||||||
|
quint32 sampleRate;
|
||||||
|
QAudioDeviceInfo port;
|
||||||
|
int portInt;
|
||||||
|
quint8 resampleQuality;
|
||||||
|
unsigned char localAFgain;
|
||||||
|
quint16 blockSize = 20; // Each 'block' of audio is 20ms long by default.
|
||||||
|
quint8 guid[GUIDLEN];
|
||||||
|
};
|
||||||
|
|
||||||
class audioConverter : public QObject
|
class audioConverter : public QObject
|
||||||
{
|
{
|
||||||
Q_OBJECT
|
Q_OBJECT
|
||||||
|
|
|
@ -330,7 +330,6 @@ void audioHandler::changeLatency(const quint16 newSize)
|
||||||
qDebug(logAudio()) << (setup.isinput ? "Input" : "Output") << "Configured latency: " << setup.latency << "Buffer Duration:" << outFormat.durationForBytes(audioOutput->bufferSize())/1000 << "ms";
|
qDebug(logAudio()) << (setup.isinput ? "Input" : "Output") << "Configured latency: " << setup.latency << "Buffer Duration:" << outFormat.durationForBytes(audioOutput->bufferSize())/1000 << "ms";
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
int audioHandler::getLatency()
|
int audioHandler::getLatency()
|
||||||
{
|
{
|
||||||
return currentLatency;
|
return currentLatency;
|
||||||
|
|
|
@ -20,27 +20,6 @@
|
||||||
#include <QAudioInput>
|
#include <QAudioInput>
|
||||||
#include <QIODevice>
|
#include <QIODevice>
|
||||||
|
|
||||||
/* Current resampler code */
|
|
||||||
#include "resampler/speex_resampler.h"
|
|
||||||
|
|
||||||
/* Potential new resampler */
|
|
||||||
//#include <r8bbase.h>
|
|
||||||
//#include <CDSPResampler.h>
|
|
||||||
|
|
||||||
|
|
||||||
/* Opus */
|
|
||||||
#ifdef Q_OS_WIN
|
|
||||||
#include "opus.h"
|
|
||||||
#else
|
|
||||||
#include "opus/opus.h"
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/* Eigen */
|
|
||||||
#ifndef Q_OS_WIN
|
|
||||||
#include <eigen3/Eigen/Eigen>
|
|
||||||
#else
|
|
||||||
#include <Eigen/Eigen>
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/* wfview Packet types */
|
/* wfview Packet types */
|
||||||
#include "packettypes.h"
|
#include "packettypes.h"
|
||||||
|
@ -57,20 +36,6 @@
|
||||||
#define MULAW_MAX 0x1fff
|
#define MULAW_MAX 0x1fff
|
||||||
|
|
||||||
|
|
||||||
struct audioSetup {
|
|
||||||
QString name;
|
|
||||||
quint16 latency;
|
|
||||||
quint8 codec;
|
|
||||||
bool ulaw = false;
|
|
||||||
bool isinput;
|
|
||||||
quint32 sampleRate;
|
|
||||||
QAudioDeviceInfo port;
|
|
||||||
quint8 resampleQuality;
|
|
||||||
unsigned char localAFgain;
|
|
||||||
quint16 blockSize=20; // Each 'block' of audio is 20ms long by default.
|
|
||||||
quint8 guid[GUIDLEN];
|
|
||||||
};
|
|
||||||
|
|
||||||
// For QtMultimedia, use a native QIODevice
|
// For QtMultimedia, use a native QIODevice
|
||||||
//class audioHandler : public QIODevice
|
//class audioHandler : public QIODevice
|
||||||
class audioHandler : public QObject
|
class audioHandler : public QObject
|
||||||
|
|
|
@ -0,0 +1,275 @@
|
||||||
|
#include "pahandler.h"
|
||||||
|
|
||||||
|
#include "logcategories.h"
|
||||||
|
|
||||||
|
#if defined(Q_OS_WIN)
|
||||||
|
#include <objbase.h>
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
paHandler::paHandler(QObject* parent)
|
||||||
|
{
|
||||||
|
Q_UNUSED(parent)
|
||||||
|
}
|
||||||
|
|
||||||
|
paHandler::~paHandler()
|
||||||
|
{
|
||||||
|
|
||||||
|
if (isInitialized) {
|
||||||
|
Pa_StopStream(audio);
|
||||||
|
Pa_CloseStream(audio);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (converterThread != Q_NULLPTR) {
|
||||||
|
converterThread->quit();
|
||||||
|
converterThread->wait();
|
||||||
|
}
|
||||||
|
|
||||||
|
//Pa_Terminate();
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
bool paHandler::init(audioSetup setup)
|
||||||
|
{
|
||||||
|
if (isInitialized) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
this->setup = setup;
|
||||||
|
qInfo(logAudio()) << (setup.isinput ? "Input" : "Output") << "PortAudio handler starting:" << setup.name;
|
||||||
|
|
||||||
|
if (setup.portInt==-1)
|
||||||
|
{
|
||||||
|
qInfo(logAudio()) << (setup.isinput ? "Input" : "Output") << "No audio device was found.";
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
inFormat = toQAudioFormat(setup.codec, setup.sampleRate);
|
||||||
|
|
||||||
|
qDebug(logAudio()) << "Creating" << (setup.isinput ? "Input" : "Output") << "audio device:" << setup.name <<
|
||||||
|
", bits" << inFormat.sampleSize() <<
|
||||||
|
", codec" << setup.codec <<
|
||||||
|
", latency" << setup.latency <<
|
||||||
|
", localAFGain" << setup.localAFgain <<
|
||||||
|
", radioChan" << inFormat.channelCount() <<
|
||||||
|
", resampleQuality" << setup.resampleQuality <<
|
||||||
|
", samplerate" << inFormat.sampleRate() <<
|
||||||
|
", uLaw" << setup.ulaw;
|
||||||
|
|
||||||
|
PaError err;
|
||||||
|
#ifdef Q_OS_WIN
|
||||||
|
CoInitialize(0);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
//err = Pa_Initialize();
|
||||||
|
//if (err != paNoError)
|
||||||
|
//{
|
||||||
|
// qDebug(logAudio()) << "Portaudio initialized";
|
||||||
|
//}
|
||||||
|
|
||||||
|
memset(&aParams, 0, sizeof(PaStreamParameters));
|
||||||
|
|
||||||
|
aParams.device = setup.portInt;
|
||||||
|
info = Pa_GetDeviceInfo(aParams.device);
|
||||||
|
|
||||||
|
qDebug(logAudio()) << "PortAudio" << (setup.isinput ? "Input" : "Output") << setup.portInt << "Input Channels" << info->maxInputChannels << "Output Channels" << info->maxOutputChannels;
|
||||||
|
|
||||||
|
|
||||||
|
if (setup.isinput) {
|
||||||
|
outFormat.setChannelCount(info->maxInputChannels);
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
outFormat.setChannelCount(info->maxOutputChannels);
|
||||||
|
}
|
||||||
|
|
||||||
|
aParams.suggestedLatency = (float)setup.latency/1000.0f;
|
||||||
|
outFormat.setSampleRate(info->defaultSampleRate);
|
||||||
|
aParams.sampleFormat = paFloat32;
|
||||||
|
outFormat.setSampleSize(32);
|
||||||
|
outFormat.setSampleType(QAudioFormat::Float);
|
||||||
|
outFormat.setByteOrder(QAudioFormat::LittleEndian);
|
||||||
|
outFormat.setCodec("audio/pcm");
|
||||||
|
|
||||||
|
|
||||||
|
if (!setup.isinput)
|
||||||
|
{
|
||||||
|
this->setVolume(setup.localAFgain);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (outFormat.channelCount() > 2) {
|
||||||
|
outFormat.setChannelCount(2);
|
||||||
|
}
|
||||||
|
else if (outFormat.channelCount() < 1)
|
||||||
|
{
|
||||||
|
qCritical(logAudio()) << (setup.isinput ? "Input" : "Output") << "No channels found, aborting setup.";
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (inFormat.channelCount() < outFormat.channelCount()) {
|
||||||
|
outFormat.setChannelCount(inFormat.channelCount());
|
||||||
|
}
|
||||||
|
|
||||||
|
aParams.channelCount = outFormat.channelCount();
|
||||||
|
|
||||||
|
if (outFormat.sampleRate() < 44100) {
|
||||||
|
outFormat.setSampleRate(48000);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
qDebug(logAudio()) << (setup.isinput ? "Input" : "Output") << "Selected format: SampleSize" << outFormat.sampleSize() << "Channel Count" << outFormat.channelCount() <<
|
||||||
|
"Sample Rate" << outFormat.sampleRate() << "Codec" << outFormat.codec() << "Sample Type" << outFormat.sampleType();
|
||||||
|
|
||||||
|
// We "hopefully" now have a valid format that is supported so try connecting
|
||||||
|
|
||||||
|
converter = new audioConverter();
|
||||||
|
converterThread = new QThread(this);
|
||||||
|
if (setup.isinput) {
|
||||||
|
converterThread->setObjectName("audioConvIn()");
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
converterThread->setObjectName("audioConvOut()");
|
||||||
|
}
|
||||||
|
converter->moveToThread(converterThread);
|
||||||
|
|
||||||
|
connect(this, SIGNAL(setupConverter(QAudioFormat, QAudioFormat, quint8, quint8)), converter, SLOT(init(QAudioFormat, QAudioFormat, quint8, quint8)));
|
||||||
|
connect(converterThread, SIGNAL(finished()), converter, SLOT(deleteLater()));
|
||||||
|
connect(this, SIGNAL(sendToConverter(audioPacket)), converter, SLOT(convert(audioPacket)));
|
||||||
|
converterThread->start(QThread::TimeCriticalPriority);
|
||||||
|
|
||||||
|
aParams.hostApiSpecificStreamInfo = NULL;
|
||||||
|
|
||||||
|
// Per channel chunk size.
|
||||||
|
this->chunkSize = (outFormat.bytesForDuration(setup.blockSize*1000)/sizeof(float))*outFormat.channelCount();
|
||||||
|
|
||||||
|
|
||||||
|
if (setup.isinput) {
|
||||||
|
err = Pa_OpenStream(&audio, &aParams, 0, outFormat.sampleRate(), this->chunkSize, paNoFlag, &paHandler::staticWrite, (void*)this);
|
||||||
|
emit setupConverter(outFormat, inFormat, 7, setup.resampleQuality);
|
||||||
|
connect(converter, SIGNAL(converted(audioPacket)), this, SLOT(convertedInput(audioPacket)));
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
err = Pa_OpenStream(&audio, 0, &aParams, outFormat.sampleRate(), this->chunkSize, paNoFlag, NULL, NULL);
|
||||||
|
emit setupConverter(inFormat, outFormat, 7, setup.resampleQuality);
|
||||||
|
connect(converter, SIGNAL(converted(audioPacket)), this, SLOT(convertedOutput(audioPacket)));
|
||||||
|
}
|
||||||
|
|
||||||
|
if (err == paNoError) {
|
||||||
|
err = Pa_StartStream(audio);
|
||||||
|
}
|
||||||
|
if (err == paNoError) {
|
||||||
|
isInitialized = true;
|
||||||
|
qInfo(logAudio()) << (setup.isinput ? "Input" : "Output") << "device successfully opened";
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
qInfo(logAudio()) << (setup.isinput ? "Input" : "Output") << "failed to open device" << Pa_GetErrorText(err);
|
||||||
|
}
|
||||||
|
|
||||||
|
return isInitialized;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void paHandler::setVolume(unsigned char volume)
|
||||||
|
{
|
||||||
|
|
||||||
|
this->volume = audiopot[volume];
|
||||||
|
|
||||||
|
qInfo(logAudio()) << (setup.isinput ? "Input" : "Output") << "setVolume: " << volume << "(" << this->volume << ")";
|
||||||
|
}
|
||||||
|
|
||||||
|
void paHandler::incomingAudio(audioPacket packet)
|
||||||
|
{
|
||||||
|
packet.volume = volume;
|
||||||
|
emit sendToConverter(packet);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
int paHandler::writeData(const void* inputBuffer, void* outputBuffer,
|
||||||
|
unsigned long nFrames, const PaStreamCallbackTimeInfo * streamTime,
|
||||||
|
PaStreamCallbackFlags status)
|
||||||
|
{
|
||||||
|
Q_UNUSED(outputBuffer);
|
||||||
|
Q_UNUSED(streamTime);
|
||||||
|
Q_UNUSED(status);
|
||||||
|
audioPacket packet;
|
||||||
|
packet.time = QTime::currentTime();
|
||||||
|
packet.sent = 0;
|
||||||
|
packet.volume = volume;
|
||||||
|
memcpy(&packet.guid, setup.guid, GUIDLEN);
|
||||||
|
packet.data.append((char*)inputBuffer, nFrames*inFormat.channelCount()*sizeof(float));
|
||||||
|
emit sendToConverter(packet);
|
||||||
|
|
||||||
|
return paContinue;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void paHandler::convertedOutput(audioPacket packet) {
|
||||||
|
|
||||||
|
if (packet.data.size() > 0) {
|
||||||
|
|
||||||
|
if (Pa_IsStreamActive(audio) == 1) {
|
||||||
|
PaError err = Pa_WriteStream(audio, (char*)packet.data.data(), packet.data.size() / sizeof(float) / outFormat.channelCount());
|
||||||
|
|
||||||
|
if (err != paNoError) {
|
||||||
|
qDebug(logAudio()) << (setup.isinput ? "Input" : "Output") << "Error writing audio!";
|
||||||
|
}
|
||||||
|
const PaStreamInfo* info = Pa_GetStreamInfo(audio);
|
||||||
|
|
||||||
|
//currentLatency = packet.time.msecsTo(QTime::currentTime()) + (info->outputLatency * 1000);
|
||||||
|
currentLatency = (info->outputLatency * 1000);
|
||||||
|
|
||||||
|
}
|
||||||
|
/*
|
||||||
|
currentLatency = packet.time.msecsTo(QTime::currentTime()) + (outFormat.durationForBytes(audioOutput->bufferSize() - audioOutput->bytesFree()) / 1000);
|
||||||
|
|
||||||
|
if (audioDevice != Q_NULLPTR) {
|
||||||
|
if (audioDevice->write(packet.data) < packet.data.size()) {
|
||||||
|
qDebug(logAudio()) << (setup.isinput ? "Input" : "Output") << "Buffer full!";
|
||||||
|
isOverrun = true;
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
isOverrun = false;
|
||||||
|
}
|
||||||
|
if (lastReceived.msecsTo(QTime::currentTime()) > 100) {
|
||||||
|
qDebug(logAudio()) << (setup.isinput ? "Input" : "Output") << "Time since last audio packet" << lastReceived.msecsTo(QTime::currentTime()) << "Expected around" << setup.blockSize;
|
||||||
|
}
|
||||||
|
lastReceived = QTime::currentTime();
|
||||||
|
}
|
||||||
|
|
||||||
|
lastSentSeq = packet.seq;
|
||||||
|
|
||||||
|
*/
|
||||||
|
amplitude = packet.amplitude;
|
||||||
|
emit haveLevels(getAmplitude(), setup.latency, currentLatency, false, false);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
void paHandler::convertedInput(audioPacket audio)
|
||||||
|
{
|
||||||
|
if (audio.data.size() > 0) {
|
||||||
|
emit haveAudioData(audio);
|
||||||
|
amplitude = audio.amplitude;
|
||||||
|
emit haveLevels(getAmplitude(), setup.latency, currentLatency, false,false);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
void paHandler::changeLatency(const quint16 newSize)
|
||||||
|
{
|
||||||
|
qInfo(logAudio()) << (setup.isinput ? "Input" : "Output") << "Changing latency to: " << newSize << " from " << setup.latency;
|
||||||
|
}
|
||||||
|
|
||||||
|
int paHandler::getLatency()
|
||||||
|
{
|
||||||
|
return currentLatency;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
quint16 paHandler::getAmplitude()
|
||||||
|
{
|
||||||
|
return amplitude;
|
||||||
|
}
|
|
@ -0,0 +1,93 @@
|
||||||
|
#ifndef PAHANDLER_H
|
||||||
|
#define PAHANDLER_H
|
||||||
|
|
||||||
|
#include <QObject>
|
||||||
|
#include <QByteArray>
|
||||||
|
#include <QThread>
|
||||||
|
|
||||||
|
#include "portaudio.h"
|
||||||
|
|
||||||
|
#include <QAudioFormat>
|
||||||
|
#include <QTime>
|
||||||
|
#include <QMap>
|
||||||
|
|
||||||
|
|
||||||
|
/* wfview Packet types */
|
||||||
|
#include "packettypes.h"
|
||||||
|
|
||||||
|
/* Logarithmic taper for volume control */
|
||||||
|
#include "audiotaper.h"
|
||||||
|
|
||||||
|
|
||||||
|
/* Audio converter class*/
|
||||||
|
#include "audioconverter.h"
|
||||||
|
|
||||||
|
#include <QDebug>
|
||||||
|
|
||||||
|
|
||||||
|
class paHandler : public QObject
|
||||||
|
{
|
||||||
|
Q_OBJECT
|
||||||
|
|
||||||
|
public:
|
||||||
|
paHandler(QObject* parent = 0);
|
||||||
|
~paHandler();
|
||||||
|
|
||||||
|
int getLatency();
|
||||||
|
|
||||||
|
|
||||||
|
void getNextAudioChunk(QByteArray& data);
|
||||||
|
quint16 getAmplitude();
|
||||||
|
|
||||||
|
public slots:
|
||||||
|
bool init(audioSetup setup);
|
||||||
|
void changeLatency(const quint16 newSize);
|
||||||
|
void setVolume(unsigned char volume);
|
||||||
|
void convertedInput(audioPacket audio);
|
||||||
|
void convertedOutput(audioPacket audio);
|
||||||
|
void incomingAudio(const audioPacket data);
|
||||||
|
|
||||||
|
|
||||||
|
private slots:
|
||||||
|
|
||||||
|
signals:
|
||||||
|
void audioMessage(QString message);
|
||||||
|
void sendLatency(quint16 newSize);
|
||||||
|
void haveAudioData(const audioPacket& data);
|
||||||
|
void haveLevels(quint16 amplitude, quint16 latency, quint16 current, bool under, bool over);
|
||||||
|
void setupConverter(QAudioFormat in, QAudioFormat out, quint8 opus, quint8 resamp);
|
||||||
|
void sendToConverter(audioPacket audio);
|
||||||
|
|
||||||
|
private:
|
||||||
|
|
||||||
|
int writeData(const void* inputBuffer, void* outputBuffer,
|
||||||
|
unsigned long nFrames,
|
||||||
|
const PaStreamCallbackTimeInfo* streamTime,
|
||||||
|
PaStreamCallbackFlags status);
|
||||||
|
static int staticWrite(const void* inputBuffer, void* outputBuffer, unsigned long nFrames, const PaStreamCallbackTimeInfo* streamTime, PaStreamCallbackFlags status, void* userData) {
|
||||||
|
return ((paHandler*)userData)->writeData(inputBuffer, outputBuffer, nFrames, streamTime, status);
|
||||||
|
}
|
||||||
|
|
||||||
|
bool isInitialized = false;
|
||||||
|
PaStream* audio = Q_NULLPTR;
|
||||||
|
PaStreamParameters aParams;
|
||||||
|
const PaDeviceInfo* info;
|
||||||
|
|
||||||
|
quint16 audioLatency;
|
||||||
|
unsigned int chunkSize;
|
||||||
|
|
||||||
|
quint32 lastSeq;
|
||||||
|
quint32 lastSentSeq = 0;
|
||||||
|
|
||||||
|
quint16 currentLatency;
|
||||||
|
quint16 amplitude = 0;
|
||||||
|
qreal volume = 1.0;
|
||||||
|
|
||||||
|
audioSetup setup;
|
||||||
|
QAudioFormat inFormat;
|
||||||
|
QAudioFormat outFormat;
|
||||||
|
audioConverter* converter = Q_NULLPTR;
|
||||||
|
QThread* converterThread = Q_NULLPTR;
|
||||||
|
};
|
||||||
|
|
||||||
|
#endif // PAHANDLER_H
|
|
@ -0,0 +1,334 @@
|
||||||
|
#include "rthandler.h"
|
||||||
|
|
||||||
|
#include "logcategories.h"
|
||||||
|
|
||||||
|
#if defined(Q_OS_WIN)
|
||||||
|
#include <objbase.h>
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
rtHandler::rtHandler(QObject* parent)
|
||||||
|
{
|
||||||
|
Q_UNUSED(parent)
|
||||||
|
}
|
||||||
|
|
||||||
|
rtHandler::~rtHandler()
|
||||||
|
{
|
||||||
|
|
||||||
|
if (isInitialized) {
|
||||||
|
try {
|
||||||
|
audio->abortStream();
|
||||||
|
audio->closeStream();
|
||||||
|
}
|
||||||
|
catch (RtAudioError& e) {
|
||||||
|
qInfo(logAudio()) << "Error closing stream:" << aParams.deviceId << ":" << QString::fromStdString(e.getMessage());
|
||||||
|
}
|
||||||
|
delete audio;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
if (converterThread != Q_NULLPTR) {
|
||||||
|
converterThread->quit();
|
||||||
|
converterThread->wait();
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
bool rtHandler::init(audioSetup setup)
|
||||||
|
{
|
||||||
|
if (isInitialized) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
this->setup = setup;
|
||||||
|
qInfo(logAudio()) << (setup.isinput ? "Input" : "Output") << "PortAudio handler starting:" << setup.name;
|
||||||
|
|
||||||
|
if (setup.portInt==-1)
|
||||||
|
{
|
||||||
|
qInfo(logAudio()) << (setup.isinput ? "Input" : "Output") << "No audio device was found.";
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
inFormat = toQAudioFormat(setup.codec, setup.sampleRate);
|
||||||
|
|
||||||
|
qDebug(logAudio()) << "Creating" << (setup.isinput ? "Input" : "Output") << "audio device:" << setup.name <<
|
||||||
|
", bits" << inFormat.sampleSize() <<
|
||||||
|
", codec" << setup.codec <<
|
||||||
|
", latency" << setup.latency <<
|
||||||
|
", localAFGain" << setup.localAFgain <<
|
||||||
|
", radioChan" << inFormat.channelCount() <<
|
||||||
|
", resampleQuality" << setup.resampleQuality <<
|
||||||
|
", samplerate" << inFormat.sampleRate() <<
|
||||||
|
", uLaw" << setup.ulaw;
|
||||||
|
|
||||||
|
#if !defined(Q_OS_MACX)
|
||||||
|
//options.flags = !RTAUDIO_HOG_DEVICE | RTAUDIO_MINIMIZE_LATENCY;
|
||||||
|
//options.flags = RTAUDIO_MINIMIZE_LATENCY;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if defined(Q_OS_LINUX)
|
||||||
|
audio = new RtAudio(RtAudio::Api::LINUX_ALSA);
|
||||||
|
#elif defined(Q_OS_WIN)
|
||||||
|
audio = new RtAudio(RtAudio::Api::WINDOWS_WASAPI);
|
||||||
|
#elif defined(Q_OS_MACX)
|
||||||
|
audio = new RtAudio(RtAudio::Api::MACOSX_CORE);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
options.numberOfBuffers = setup.latency/setup.blockSize;
|
||||||
|
|
||||||
|
if (setup.portInt > 0) {
|
||||||
|
aParams.deviceId = setup.portInt;
|
||||||
|
}
|
||||||
|
else if (setup.isinput) {
|
||||||
|
aParams.deviceId = audio->getDefaultInputDevice();
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
aParams.deviceId = audio->getDefaultOutputDevice();
|
||||||
|
}
|
||||||
|
aParams.firstChannel = 0;
|
||||||
|
|
||||||
|
try {
|
||||||
|
info = audio->getDeviceInfo(aParams.deviceId);
|
||||||
|
}
|
||||||
|
catch (RtAudioError& e) {
|
||||||
|
qInfo(logAudio()) << "Device error:" << aParams.deviceId << ":" << QString::fromStdString(e.getMessage());
|
||||||
|
return isInitialized;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (info.probed)
|
||||||
|
{
|
||||||
|
qInfo(logAudio()) << (setup.isinput ? "Input" : "Output") << QString::fromStdString(info.name) << "(" << aParams.deviceId << ") successfully probed";
|
||||||
|
|
||||||
|
RtAudioFormat sampleFormat;
|
||||||
|
outFormat.setByteOrder(QAudioFormat::LittleEndian);
|
||||||
|
outFormat.setCodec("audio/pcm");
|
||||||
|
|
||||||
|
if (info.nativeFormats == 0)
|
||||||
|
{
|
||||||
|
qCritical(logAudio()) << " No natively supported data formats!";
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
qDebug(logAudio()) << " Supported formats:" <<
|
||||||
|
(info.nativeFormats & RTAUDIO_SINT8 ? "8-bit int," : "") <<
|
||||||
|
(info.nativeFormats & RTAUDIO_SINT16 ? "16-bit int," : "") <<
|
||||||
|
(info.nativeFormats & RTAUDIO_SINT24 ? "24-bit int," : "") <<
|
||||||
|
(info.nativeFormats & RTAUDIO_SINT32 ? "32-bit int," : "") <<
|
||||||
|
(info.nativeFormats & RTAUDIO_FLOAT32 ? "32-bit float," : "") <<
|
||||||
|
(info.nativeFormats & RTAUDIO_FLOAT64 ? "64-bit float," : "");
|
||||||
|
|
||||||
|
qInfo(logAudio()) << " Preferred sample rate:" << info.preferredSampleRate;
|
||||||
|
if (setup.isinput) {
|
||||||
|
outFormat.setChannelCount(info.inputChannels);
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
outFormat.setChannelCount(info.outputChannels);
|
||||||
|
}
|
||||||
|
|
||||||
|
qInfo(logAudio()) << " Channels:" << outFormat.channelCount();
|
||||||
|
|
||||||
|
if (outFormat.channelCount() > 2) {
|
||||||
|
outFormat.setChannelCount(2);
|
||||||
|
}
|
||||||
|
else if (outFormat.channelCount() < 1)
|
||||||
|
{
|
||||||
|
qCritical(logAudio()) << (setup.isinput ? "Input" : "Output") << "No channels found, aborting setup.";
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
aParams.nChannels = outFormat.channelCount();
|
||||||
|
|
||||||
|
|
||||||
|
outFormat.setSampleRate(info.preferredSampleRate);
|
||||||
|
|
||||||
|
if (outFormat.sampleRate() < 44100) {
|
||||||
|
outFormat.setSampleRate(48000);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (info.nativeFormats & RTAUDIO_FLOAT32) {
|
||||||
|
outFormat.setSampleType(QAudioFormat::Float);
|
||||||
|
outFormat.setSampleSize(32);
|
||||||
|
sampleFormat = RTAUDIO_FLOAT32;
|
||||||
|
}
|
||||||
|
else if (info.nativeFormats & RTAUDIO_SINT32) {
|
||||||
|
outFormat.setSampleType(QAudioFormat::SignedInt);
|
||||||
|
outFormat.setSampleSize(32);
|
||||||
|
sampleFormat = RTAUDIO_SINT32;
|
||||||
|
}
|
||||||
|
else if (info.nativeFormats & RTAUDIO_SINT16) {
|
||||||
|
outFormat.setSampleType(QAudioFormat::SignedInt);
|
||||||
|
outFormat.setSampleSize(16);
|
||||||
|
sampleFormat = RTAUDIO_SINT16;
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
qCritical(logAudio()) << "Cannot find supported sample format!";
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
qDebug(logAudio()) << (setup.isinput ? "Input" : "Output") << "Selected format: SampleSize" << outFormat.sampleSize() << "Channel Count" << outFormat.channelCount() <<
|
||||||
|
"Sample Rate" << outFormat.sampleRate() << "Codec" << outFormat.codec() << "Sample Type" << outFormat.sampleType();
|
||||||
|
|
||||||
|
// We "hopefully" now have a valid format that is supported so try connecting
|
||||||
|
converter = new audioConverter();
|
||||||
|
converterThread = new QThread(this);
|
||||||
|
if (setup.isinput) {
|
||||||
|
converterThread->setObjectName("audioConvIn()");
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
converterThread->setObjectName("audioConvOut()");
|
||||||
|
}
|
||||||
|
converter->moveToThread(converterThread);
|
||||||
|
|
||||||
|
connect(this, SIGNAL(setupConverter(QAudioFormat, QAudioFormat, quint8, quint8)), converter, SLOT(init(QAudioFormat, QAudioFormat, quint8, quint8)));
|
||||||
|
connect(converterThread, SIGNAL(finished()), converter, SLOT(deleteLater()));
|
||||||
|
connect(this, SIGNAL(sendToConverter(audioPacket)), converter, SLOT(convert(audioPacket)));
|
||||||
|
converterThread->start(QThread::TimeCriticalPriority);
|
||||||
|
|
||||||
|
|
||||||
|
// Per channel chunk size.
|
||||||
|
this->chunkSize = (outFormat.bytesForDuration(setup.blockSize * 1000) / (outFormat.sampleSize()/8) / outFormat.channelCount());
|
||||||
|
|
||||||
|
try {
|
||||||
|
if (setup.isinput) {
|
||||||
|
audio->openStream(NULL, &aParams, sampleFormat, outFormat.sampleRate(), &this->chunkSize, &staticWrite, this, &options);
|
||||||
|
emit setupConverter(outFormat, inFormat, 7, setup.resampleQuality);
|
||||||
|
connect(converter, SIGNAL(converted(audioPacket)), this, SLOT(convertedInput(audioPacket)));
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
audio->openStream(&aParams, NULL, sampleFormat, outFormat.sampleRate(), &this->chunkSize, &staticRead, this , &options);
|
||||||
|
emit setupConverter(inFormat, outFormat, 7, setup.resampleQuality);
|
||||||
|
connect(converter, SIGNAL(converted(audioPacket)), this, SLOT(convertedOutput(audioPacket)));
|
||||||
|
}
|
||||||
|
audio->startStream();
|
||||||
|
isInitialized = true;
|
||||||
|
qInfo(logAudio()) << (setup.isinput ? "Input" : "Output") << "device successfully opened";
|
||||||
|
qInfo(logAudio()) << (setup.isinput ? "Input" : "Output") << "detected latency:" << audio->getStreamLatency();
|
||||||
|
}
|
||||||
|
catch (RtAudioError& e) {
|
||||||
|
qInfo(logAudio()) << "Error opening:" << QString::fromStdString(e.getMessage());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
qCritical(logAudio()) << (setup.isinput ? "Input" : "Output") << QString::fromStdString(info.name) << "(" << aParams.deviceId << ") could not be probed, check audio configuration!";
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!setup.isinput)
|
||||||
|
{
|
||||||
|
this->setVolume(setup.localAFgain);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
return isInitialized;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void rtHandler::setVolume(unsigned char volume)
|
||||||
|
{
|
||||||
|
|
||||||
|
this->volume = audiopot[volume];
|
||||||
|
|
||||||
|
qInfo(logAudio()) << (setup.isinput ? "Input" : "Output") << "setVolume: " << volume << "(" << this->volume << ")";
|
||||||
|
}
|
||||||
|
|
||||||
|
void rtHandler::incomingAudio(audioPacket packet)
|
||||||
|
{
|
||||||
|
packet.volume = volume;
|
||||||
|
emit sendToConverter(packet);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
int rtHandler::readData(void* outputBuffer, void* inputBuffer,
|
||||||
|
unsigned int nFrames, double streamTime, RtAudioStreamStatus status)
|
||||||
|
{
|
||||||
|
Q_UNUSED(inputBuffer);
|
||||||
|
Q_UNUSED(streamTime);
|
||||||
|
int nBytes = nFrames * outFormat.channelCount() * (outFormat.sampleSize()/8);
|
||||||
|
|
||||||
|
//lastSentSeq = packet.seq;
|
||||||
|
if (arrayBuffer.length() >= nBytes) {
|
||||||
|
std::memcpy(outputBuffer, arrayBuffer.constData(), nBytes);
|
||||||
|
arrayBuffer.remove(0, nBytes);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (status == RTAUDIO_INPUT_OVERFLOW) {
|
||||||
|
isUnderrun = true;
|
||||||
|
}
|
||||||
|
else if (status == RTAUDIO_OUTPUT_UNDERFLOW) {
|
||||||
|
isOverrun = true;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
isUnderrun = false;
|
||||||
|
isOverrun = false;
|
||||||
|
}
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
int rtHandler::writeData(void* outputBuffer, void* inputBuffer,
|
||||||
|
unsigned int nFrames, double streamTime, RtAudioStreamStatus status)
|
||||||
|
{
|
||||||
|
Q_UNUSED(outputBuffer);
|
||||||
|
Q_UNUSED(streamTime);
|
||||||
|
Q_UNUSED(status);
|
||||||
|
audioPacket packet;
|
||||||
|
packet.time = QTime::currentTime();
|
||||||
|
packet.sent = 0;
|
||||||
|
packet.volume = volume;
|
||||||
|
memcpy(&packet.guid, setup.guid, GUIDLEN);
|
||||||
|
packet.data.append((char*)inputBuffer, nFrames *outFormat.channelCount() * (outFormat.sampleSize()/8));
|
||||||
|
emit sendToConverter(packet);
|
||||||
|
if (status == RTAUDIO_INPUT_OVERFLOW) {
|
||||||
|
isUnderrun = true;
|
||||||
|
}
|
||||||
|
else if (status == RTAUDIO_OUTPUT_UNDERFLOW) {
|
||||||
|
isOverrun = true;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
isUnderrun = false;
|
||||||
|
isOverrun = false;
|
||||||
|
}
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void rtHandler::convertedOutput(audioPacket packet)
|
||||||
|
{
|
||||||
|
arrayBuffer.append(packet.data);
|
||||||
|
currentLatency = packet.time.msecsTo(QTime::currentTime()) + (outFormat.durationForBytes(audio->getStreamLatency() * (outFormat.sampleSize() / 8) * outFormat.channelCount()) * 1000);
|
||||||
|
emit haveLevels(getAmplitude(), setup.latency, currentLatency, isUnderrun, isOverrun);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
void rtHandler::convertedInput(audioPacket audio)
|
||||||
|
{
|
||||||
|
if (audio.data.size() > 0) {
|
||||||
|
emit haveAudioData(audio);
|
||||||
|
amplitude = audio.amplitude;
|
||||||
|
emit haveLevels(getAmplitude(), setup.latency, currentLatency, isUnderrun, isOverrun);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
void rtHandler::changeLatency(const quint16 newSize)
|
||||||
|
{
|
||||||
|
qInfo(logAudio()) << (setup.isinput ? "Input" : "Output") << "Changing latency to: " << newSize << " from " << setup.latency;
|
||||||
|
}
|
||||||
|
|
||||||
|
int rtHandler::getLatency()
|
||||||
|
{
|
||||||
|
return currentLatency;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
quint16 rtHandler::getAmplitude()
|
||||||
|
{
|
||||||
|
return amplitude;
|
||||||
|
}
|
|
@ -0,0 +1,111 @@
|
||||||
|
#ifndef rtHandler_H
|
||||||
|
#define rtHandler_H
|
||||||
|
|
||||||
|
#include <QObject>
|
||||||
|
#include <QByteArray>
|
||||||
|
#include <QThread>
|
||||||
|
|
||||||
|
#ifdef Q_OS_WIN
|
||||||
|
#include "RtAudio.h"
|
||||||
|
#else
|
||||||
|
#include "rtaudio/RtAudio.h"
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
#include <QAudioFormat>
|
||||||
|
#include <QTime>
|
||||||
|
#include <QMap>
|
||||||
|
|
||||||
|
|
||||||
|
/* wfview Packet types */
|
||||||
|
#include "packettypes.h"
|
||||||
|
|
||||||
|
/* Logarithmic taper for volume control */
|
||||||
|
#include "audiotaper.h"
|
||||||
|
|
||||||
|
|
||||||
|
/* Audio converter class*/
|
||||||
|
#include "audioconverter.h"
|
||||||
|
|
||||||
|
#include <QDebug>
|
||||||
|
|
||||||
|
|
||||||
|
class rtHandler : public QObject
|
||||||
|
{
|
||||||
|
Q_OBJECT
|
||||||
|
|
||||||
|
public:
|
||||||
|
rtHandler(QObject* parent = 0);
|
||||||
|
~rtHandler();
|
||||||
|
|
||||||
|
int getLatency();
|
||||||
|
|
||||||
|
|
||||||
|
void getNextAudioChunk(QByteArray& data);
|
||||||
|
quint16 getAmplitude();
|
||||||
|
|
||||||
|
public slots:
|
||||||
|
bool init(audioSetup setup);
|
||||||
|
void changeLatency(const quint16 newSize);
|
||||||
|
void setVolume(unsigned char volume);
|
||||||
|
void convertedInput(audioPacket audio);
|
||||||
|
void convertedOutput(audioPacket audio);
|
||||||
|
void incomingAudio(const audioPacket data);
|
||||||
|
|
||||||
|
|
||||||
|
private slots:
|
||||||
|
|
||||||
|
signals:
|
||||||
|
void audioMessage(QString message);
|
||||||
|
void sendLatency(quint16 newSize);
|
||||||
|
void haveAudioData(const audioPacket& data);
|
||||||
|
void haveLevels(quint16 amplitude, quint16 latency, quint16 current, bool under, bool over);
|
||||||
|
void setupConverter(QAudioFormat in, QAudioFormat out, quint8 opus, quint8 resamp);
|
||||||
|
void sendToConverter(audioPacket audio);
|
||||||
|
|
||||||
|
private:
|
||||||
|
|
||||||
|
|
||||||
|
int readData(void* outputBuffer, void* inputBuffer, unsigned int nFrames, double streamTime, RtAudioStreamStatus status);
|
||||||
|
|
||||||
|
static int staticRead(void* outputBuffer, void* inputBuffer, unsigned int nFrames, double streamTime, RtAudioStreamStatus status, void* userData) {
|
||||||
|
return static_cast<rtHandler*>(userData)->readData(outputBuffer, inputBuffer, nFrames, streamTime, status);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
int writeData(void* outputBuffer, void* inputBuffer, unsigned int nFrames, double streamTime, RtAudioStreamStatus status);
|
||||||
|
|
||||||
|
static int staticWrite(void* outputBuffer, void* inputBuffer, unsigned int nFrames, double streamTime, RtAudioStreamStatus status, void* userData) {
|
||||||
|
return static_cast<rtHandler*>(userData)->writeData(outputBuffer, inputBuffer, nFrames, streamTime, status);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
bool isInitialized = false;
|
||||||
|
|
||||||
|
RtAudio* audio = Q_NULLPTR;
|
||||||
|
int audioDevice = 0;
|
||||||
|
RtAudio::StreamParameters aParams;
|
||||||
|
RtAudio::StreamOptions options;
|
||||||
|
RtAudio::DeviceInfo info;
|
||||||
|
|
||||||
|
quint16 audioLatency;
|
||||||
|
unsigned int chunkSize;
|
||||||
|
|
||||||
|
quint32 lastSeq;
|
||||||
|
quint32 lastSentSeq = 0;
|
||||||
|
|
||||||
|
quint16 currentLatency;
|
||||||
|
quint16 amplitude = 0;
|
||||||
|
qreal volume = 1.0;
|
||||||
|
|
||||||
|
audioSetup setup;
|
||||||
|
QAudioFormat inFormat;
|
||||||
|
QAudioFormat outFormat;
|
||||||
|
audioConverter* converter = Q_NULLPTR;
|
||||||
|
QThread* converterThread = Q_NULLPTR;
|
||||||
|
QByteArray arrayBuffer;
|
||||||
|
bool isUnderrun = false;
|
||||||
|
bool isOverrun = true;
|
||||||
|
};
|
||||||
|
|
||||||
|
#endif // rtHandler_H
|
29
udpaudio.cpp
29
udpaudio.cpp
|
@ -16,8 +16,20 @@ udpAudio::udpAudio(QHostAddress local, QHostAddress ip, quint16 audioPort, quint
|
||||||
init(lport); // Perform connection
|
init(lport); // Perform connection
|
||||||
|
|
||||||
QUdpSocket::connect(udp, &QUdpSocket::readyRead, this, &udpAudio::dataReceived);
|
QUdpSocket::connect(udp, &QUdpSocket::readyRead, this, &udpAudio::dataReceived);
|
||||||
|
if (rxSetup.type == qtAudio) {
|
||||||
rxaudio = new audioHandler();
|
rxaudio = new audioHandler();
|
||||||
|
}
|
||||||
|
else if (rxSetup.type == portAudio) {
|
||||||
|
rxaudio = new paHandler();
|
||||||
|
}
|
||||||
|
else if (rxSetup.type == rtAudio) {
|
||||||
|
rxaudio = new rtHandler();
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
qCritical(logAudio()) << "Unsupported Receive Audio Handler selected!";
|
||||||
|
}
|
||||||
|
|
||||||
rxAudioThread = new QThread(this);
|
rxAudioThread = new QThread(this);
|
||||||
rxAudioThread->setObjectName("rxAudio()");
|
rxAudioThread->setObjectName("rxAudio()");
|
||||||
|
|
||||||
|
@ -42,7 +54,20 @@ udpAudio::udpAudio(QHostAddress local, QHostAddress ip, quint16 audioPort, quint
|
||||||
pingTimer->start(PING_PERIOD); // send ping packets every 100ms
|
pingTimer->start(PING_PERIOD); // send ping packets every 100ms
|
||||||
|
|
||||||
if (enableTx) {
|
if (enableTx) {
|
||||||
|
if (txSetup.type == qtAudio) {
|
||||||
txaudio = new audioHandler();
|
txaudio = new audioHandler();
|
||||||
|
}
|
||||||
|
else if (txSetup.type == portAudio) {
|
||||||
|
txaudio = new paHandler();
|
||||||
|
}
|
||||||
|
else if (txSetup.type == rtAudio) {
|
||||||
|
txaudio = new rtHandler();
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
qCritical(logAudio()) << "Unsupported Transmit Audio Handler selected!";
|
||||||
|
}
|
||||||
|
|
||||||
txAudioThread = new QThread(this);
|
txAudioThread = new QThread(this);
|
||||||
rxAudioThread->setObjectName("txAudio()");
|
rxAudioThread->setObjectName("txAudio()");
|
||||||
|
|
||||||
|
@ -52,7 +77,7 @@ udpAudio::udpAudio(QHostAddress local, QHostAddress ip, quint16 audioPort, quint
|
||||||
|
|
||||||
connect(this, SIGNAL(setupTxAudio(audioSetup)), txaudio, SLOT(init(audioSetup)));
|
connect(this, SIGNAL(setupTxAudio(audioSetup)), txaudio, SLOT(init(audioSetup)));
|
||||||
connect(txaudio, SIGNAL(haveAudioData(audioPacket)), this, SLOT(receiveAudioData(audioPacket)));
|
connect(txaudio, SIGNAL(haveAudioData(audioPacket)), this, SLOT(receiveAudioData(audioPacket)));
|
||||||
connect(txaudio, SIGNAL(haveLevels(quint16, quint16, quint16, bool)), this, SLOT(getTxLevels(quint16, quint16, quint16, bool)));
|
connect(txaudio, SIGNAL(haveLevels(quint16, quint16, quint16, bool, bool)), this, SLOT(getTxLevels(quint16, quint16, quint16, bool, bool)));
|
||||||
|
|
||||||
connect(txAudioThread, SIGNAL(finished()), txaudio, SLOT(deleteLater()));
|
connect(txAudioThread, SIGNAL(finished()), txaudio, SLOT(deleteLater()));
|
||||||
emit setupTxAudio(txSetup);
|
emit setupTxAudio(txSetup);
|
||||||
|
|
|
@ -28,6 +28,8 @@
|
||||||
#include "udpbase.h"
|
#include "udpbase.h"
|
||||||
|
|
||||||
#include "audiohandler.h"
|
#include "audiohandler.h"
|
||||||
|
#include "pahandler.h"
|
||||||
|
#include "rthandler.h"
|
||||||
|
|
||||||
|
|
||||||
// Class for all audio communications.
|
// Class for all audio communications.
|
||||||
|
@ -67,10 +69,10 @@ private:
|
||||||
|
|
||||||
uint16_t sendAudioSeq = 0;
|
uint16_t sendAudioSeq = 0;
|
||||||
|
|
||||||
audioHandler* rxaudio = Q_NULLPTR;
|
QObject* rxaudio = Q_NULLPTR;
|
||||||
QThread* rxAudioThread = Q_NULLPTR;
|
QThread* rxAudioThread = Q_NULLPTR;
|
||||||
|
|
||||||
audioHandler* txaudio = Q_NULLPTR;
|
QObject* txaudio = Q_NULLPTR;
|
||||||
QThread* txAudioThread = Q_NULLPTR;
|
QThread* txAudioThread = Q_NULLPTR;
|
||||||
|
|
||||||
QTimer* txAudioTimer = Q_NULLPTR;
|
QTimer* txAudioTimer = Q_NULLPTR;
|
||||||
|
|
356
wfmain.cpp
356
wfmain.cpp
|
@ -56,8 +56,6 @@ wfmain::wfmain(const QString serialPortCL, const QString hostCL, const QString s
|
||||||
|
|
||||||
setSerialDevicesUI();
|
setSerialDevicesUI();
|
||||||
|
|
||||||
setAudioDevicesUI();
|
|
||||||
|
|
||||||
setDefaultColors();
|
setDefaultColors();
|
||||||
setDefPrefs();
|
setDefPrefs();
|
||||||
|
|
||||||
|
@ -65,6 +63,9 @@ wfmain::wfmain(const QString serialPortCL, const QString hostCL, const QString s
|
||||||
|
|
||||||
setupPlots();
|
setupPlots();
|
||||||
loadSettings(); // Look for saved preferences
|
loadSettings(); // Look for saved preferences
|
||||||
|
|
||||||
|
setAudioDevicesUI();
|
||||||
|
|
||||||
setTuningSteps(); // TODO: Combine into preferences
|
setTuningSteps(); // TODO: Combine into preferences
|
||||||
|
|
||||||
qDebug(logSystem()) << "Running setUIToPrefs()";
|
qDebug(logSystem()) << "Running setUIToPrefs()";
|
||||||
|
@ -102,6 +103,10 @@ wfmain::~wfmain()
|
||||||
if (rigCtl != Q_NULLPTR) {
|
if (rigCtl != Q_NULLPTR) {
|
||||||
delete rigCtl;
|
delete rigCtl;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (prefs.audioSystem == portAudio) {
|
||||||
|
Pa_Terminate();
|
||||||
|
}
|
||||||
delete rpt;
|
delete rpt;
|
||||||
delete ui;
|
delete ui;
|
||||||
delete settings;
|
delete settings;
|
||||||
|
@ -1061,43 +1066,6 @@ void wfmain::setUIToPrefs()
|
||||||
ui->useCIVasRigIDChk->blockSignals(false);
|
ui->useCIVasRigIDChk->blockSignals(false);
|
||||||
}
|
}
|
||||||
|
|
||||||
void wfmain::setAudioDevicesUI()
|
|
||||||
{
|
|
||||||
|
|
||||||
// Enumerate audio devices, need to do before settings are loaded.
|
|
||||||
qDebug(logSystem()) << "Finding audio output devices";
|
|
||||||
const auto audioOutputs = QAudioDeviceInfo::availableDevices(QAudio::AudioOutput);
|
|
||||||
for (const QAudioDeviceInfo& deviceInfo : audioOutputs) {
|
|
||||||
#ifdef Q_OS_WIN
|
|
||||||
if (deviceInfo.realm() == "wasapi") {
|
|
||||||
#endif
|
|
||||||
ui->audioOutputCombo->addItem(deviceInfo.deviceName(), QVariant::fromValue(deviceInfo));
|
|
||||||
ui->serverTXAudioOutputCombo->addItem(deviceInfo.deviceName(), QVariant::fromValue(deviceInfo));
|
|
||||||
#ifdef Q_OS_WIN
|
|
||||||
}
|
|
||||||
|
|
||||||
#endif
|
|
||||||
}
|
|
||||||
|
|
||||||
qDebug(logSystem()) << "Finding audio input devices";
|
|
||||||
const auto audioInputs = QAudioDeviceInfo::availableDevices(QAudio::AudioInput);
|
|
||||||
for (const QAudioDeviceInfo& deviceInfo : audioInputs) {
|
|
||||||
#ifdef Q_OS_WIN
|
|
||||||
if (deviceInfo.realm() == "wasapi") {
|
|
||||||
#endif
|
|
||||||
ui->audioInputCombo->addItem(deviceInfo.deviceName(), QVariant::fromValue(deviceInfo));
|
|
||||||
ui->serverRXAudioInputCombo->addItem(deviceInfo.deviceName(), QVariant::fromValue(deviceInfo));
|
|
||||||
#ifdef Q_OS_WIN
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
}
|
|
||||||
// Set these to default audio devices initially.
|
|
||||||
qDebug(logSystem()) << "Audio devices done.";
|
|
||||||
rxSetup.port = QAudioDeviceInfo::defaultOutputDevice();
|
|
||||||
txSetup.port = QAudioDeviceInfo::defaultInputDevice();
|
|
||||||
qDebug(logSystem()) << "Audio set to default device initially";
|
|
||||||
}
|
|
||||||
|
|
||||||
void wfmain::setSerialDevicesUI()
|
void wfmain::setSerialDevicesUI()
|
||||||
{
|
{
|
||||||
ui->serialDeviceListCombo->blockSignals(true);
|
ui->serialDeviceListCombo->blockSignals(true);
|
||||||
|
@ -1302,6 +1270,7 @@ void wfmain::setDefPrefs()
|
||||||
defPrefs.meter2Type = meterNone;
|
defPrefs.meter2Type = meterNone;
|
||||||
defPrefs.tcpPort = 0;
|
defPrefs.tcpPort = 0;
|
||||||
defPrefs.waterfallFormat = 0;
|
defPrefs.waterfallFormat = 0;
|
||||||
|
defPrefs.audioSystem = qtAudio;
|
||||||
|
|
||||||
udpDefPrefs.ipAddress = QString("");
|
udpDefPrefs.ipAddress = QString("");
|
||||||
udpDefPrefs.controlLANPort = 50001;
|
udpDefPrefs.controlLANPort = 50001;
|
||||||
|
@ -1422,6 +1391,12 @@ void wfmain::loadSettings()
|
||||||
rxSetup.localAFgain = prefs.localAFgain;
|
rxSetup.localAFgain = prefs.localAFgain;
|
||||||
txSetup.localAFgain = 255;
|
txSetup.localAFgain = 255;
|
||||||
|
|
||||||
|
prefs.audioSystem = static_cast<audioType>(settings->value("AudioSystem", defPrefs.audioSystem).toInt());
|
||||||
|
ui->audioSystemCombo->blockSignals(true);
|
||||||
|
ui->audioSystemCombo->setCurrentIndex(prefs.audioSystem);
|
||||||
|
ui->audioSystemCombo->blockSignals(false);
|
||||||
|
|
||||||
|
|
||||||
settings->endGroup();
|
settings->endGroup();
|
||||||
|
|
||||||
// Misc. user settings (enable PTT, draw peaks, etc)
|
// Misc. user settings (enable PTT, draw peaks, etc)
|
||||||
|
@ -1429,6 +1404,7 @@ void wfmain::loadSettings()
|
||||||
prefs.enablePTT = settings->value("EnablePTT", defPrefs.enablePTT).toBool();
|
prefs.enablePTT = settings->value("EnablePTT", defPrefs.enablePTT).toBool();
|
||||||
ui->pttEnableChk->setChecked(prefs.enablePTT);
|
ui->pttEnableChk->setChecked(prefs.enablePTT);
|
||||||
prefs.niceTS = settings->value("NiceTS", defPrefs.niceTS).toBool();
|
prefs.niceTS = settings->value("NiceTS", defPrefs.niceTS).toBool();
|
||||||
|
|
||||||
settings->endGroup();
|
settings->endGroup();
|
||||||
|
|
||||||
settings->beginGroup("LAN");
|
settings->beginGroup("LAN");
|
||||||
|
@ -1531,31 +1507,12 @@ void wfmain::loadSettings()
|
||||||
ui->audioTXCodecCombo->setCurrentIndex(f);
|
ui->audioTXCodecCombo->setCurrentIndex(f);
|
||||||
ui->audioRXCodecCombo->blockSignals(false);
|
ui->audioRXCodecCombo->blockSignals(false);
|
||||||
|
|
||||||
ui->audioOutputCombo->blockSignals(true);
|
|
||||||
rxSetup.name = settings->value("AudioOutput", "").toString();
|
rxSetup.name = settings->value("AudioOutput", "").toString();
|
||||||
qInfo(logGui()) << "Got Audio Output: " << rxSetup.name;
|
qInfo(logGui()) << "Got Audio Output from Settings: " << rxSetup.name;
|
||||||
int audioOutputIndex = ui->audioOutputCombo->findText(rxSetup.name);
|
|
||||||
if (audioOutputIndex != -1) {
|
|
||||||
ui->audioOutputCombo->setCurrentIndex(audioOutputIndex);
|
|
||||||
|
|
||||||
QVariant v = ui->audioOutputCombo->currentData();
|
|
||||||
rxSetup.port = v.value<QAudioDeviceInfo>();
|
|
||||||
|
|
||||||
}
|
|
||||||
ui->audioOutputCombo->blockSignals(false);
|
|
||||||
|
|
||||||
ui->audioInputCombo->blockSignals(true);
|
|
||||||
txSetup.name = settings->value("AudioInput", "").toString();
|
txSetup.name = settings->value("AudioInput", "").toString();
|
||||||
qInfo(logGui()) << "Got Audio Input: " << txSetup.name;
|
qInfo(logGui()) << "Got Audio Input from Settings: " << txSetup.name;
|
||||||
int audioInputIndex = ui->audioInputCombo->findText(txSetup.name);
|
|
||||||
if (audioInputIndex != -1) {
|
|
||||||
ui->audioInputCombo->setCurrentIndex(audioInputIndex);
|
|
||||||
|
|
||||||
QVariant v = ui->audioInputCombo->currentData();
|
|
||||||
txSetup.port = v.value<QAudioDeviceInfo>();
|
|
||||||
|
|
||||||
}
|
|
||||||
ui->audioInputCombo->blockSignals(false);
|
|
||||||
|
|
||||||
rxSetup.resampleQuality = settings->value("ResampleQuality", "4").toInt();
|
rxSetup.resampleQuality = settings->value("ResampleQuality", "4").toInt();
|
||||||
txSetup.resampleQuality = rxSetup.resampleQuality;
|
txSetup.resampleQuality = rxSetup.resampleQuality;
|
||||||
|
@ -1614,6 +1571,8 @@ void wfmain::loadSettings()
|
||||||
rigTemp->txAudioSetup.localAFgain = 255;
|
rigTemp->txAudioSetup.localAFgain = 255;
|
||||||
rigTemp->rxAudioSetup.resampleQuality = 4;
|
rigTemp->rxAudioSetup.resampleQuality = 4;
|
||||||
rigTemp->txAudioSetup.resampleQuality = 4;
|
rigTemp->txAudioSetup.resampleQuality = 4;
|
||||||
|
rigTemp->rxAudioSetup.type = prefs.audioSystem;
|
||||||
|
rigTemp->txAudioSetup.type = prefs.audioSystem;
|
||||||
|
|
||||||
rigTemp->baudRate = prefs.serialPortBaud;
|
rigTemp->baudRate = prefs.serialPortBaud;
|
||||||
rigTemp->civAddr = prefs.radioCIVAddr;
|
rigTemp->civAddr = prefs.radioCIVAddr;
|
||||||
|
@ -1628,31 +1587,8 @@ void wfmain::loadSettings()
|
||||||
memcpy(rigTemp->guid, QUuid::fromString(guid).toRfc4122().constData(), GUIDLEN);
|
memcpy(rigTemp->guid, QUuid::fromString(guid).toRfc4122().constData(), GUIDLEN);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
ui->serverRXAudioInputCombo->blockSignals(true);
|
|
||||||
rigTemp->rxAudioSetup.name = settings->value("ServerAudioInput", "").toString();
|
rigTemp->rxAudioSetup.name = settings->value("ServerAudioInput", "").toString();
|
||||||
qInfo(logGui()) << "Got Server Audio Input: " << rigTemp->rxAudioSetup.name;
|
|
||||||
int serverAudioInputIndex = ui->serverRXAudioInputCombo->findText(rigTemp->rxAudioSetup.name);
|
|
||||||
if (serverAudioInputIndex != -1) {
|
|
||||||
ui->serverRXAudioInputCombo->setCurrentIndex(serverAudioInputIndex);
|
|
||||||
|
|
||||||
QVariant v = ui->serverRXAudioInputCombo->currentData();
|
|
||||||
rigTemp->rxAudioSetup.port = v.value<QAudioDeviceInfo>();
|
|
||||||
|
|
||||||
}
|
|
||||||
ui->serverRXAudioInputCombo->blockSignals(false);
|
|
||||||
|
|
||||||
ui->serverTXAudioOutputCombo->blockSignals(true);
|
|
||||||
rigTemp->txAudioSetup.name = settings->value("ServerAudioOutput", "").toString();
|
rigTemp->txAudioSetup.name = settings->value("ServerAudioOutput", "").toString();
|
||||||
qInfo(logGui()) << "Got Server Audio Output: " << rigTemp->txAudioSetup.name;
|
|
||||||
int serverAudioOutputIndex = ui->serverTXAudioOutputCombo->findText(rigTemp->txAudioSetup.name);
|
|
||||||
if (serverAudioOutputIndex != -1) {
|
|
||||||
ui->serverTXAudioOutputCombo->setCurrentIndex(serverAudioOutputIndex);
|
|
||||||
|
|
||||||
QVariant v = ui->serverTXAudioOutputCombo->currentData();
|
|
||||||
rigTemp->txAudioSetup.port = v.value<QAudioDeviceInfo>();
|
|
||||||
|
|
||||||
}
|
|
||||||
ui->serverTXAudioOutputCombo->blockSignals(false);
|
|
||||||
serverConfig.rigs.append(rigTemp);
|
serverConfig.rigs.append(rigTemp);
|
||||||
|
|
||||||
int row = 0;
|
int row = 0;
|
||||||
|
@ -1793,25 +1729,40 @@ void wfmain::on_serverAudioPortText_textChanged(QString text)
|
||||||
|
|
||||||
void wfmain::on_serverRXAudioInputCombo_currentIndexChanged(int value)
|
void wfmain::on_serverRXAudioInputCombo_currentIndexChanged(int value)
|
||||||
{
|
{
|
||||||
if (serverConfig.rigs.size() > 0)
|
|
||||||
|
if (!serverConfig.rigs.isEmpty())
|
||||||
{
|
{
|
||||||
|
if (prefs.audioSystem == qtAudio) {
|
||||||
QVariant v = ui->serverRXAudioInputCombo->itemData(value);
|
QVariant v = ui->serverRXAudioInputCombo->itemData(value);
|
||||||
serverConfig.rigs.first()->rxAudioSetup.port = v.value<QAudioDeviceInfo>();
|
serverConfig.rigs.first()->rxAudioSetup.port = v.value<QAudioDeviceInfo>();
|
||||||
|
|
||||||
serverConfig.rigs.first()->rxAudioSetup.name = ui->serverRXAudioInputCombo->itemText(value);
|
|
||||||
qDebug(logGui()) << "Changed default server audio input to:" << serverConfig.rigs.first()->rxAudioSetup.name;
|
|
||||||
}
|
}
|
||||||
|
else {
|
||||||
|
serverConfig.rigs.first()->rxAudioSetup.portInt = ui->serverRXAudioInputCombo->itemData(value).toInt();
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
serverConfig.rigs.first()->rxAudioSetup.name = ui->audioInputCombo->itemText(value);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void wfmain::on_serverTXAudioOutputCombo_currentIndexChanged(int value)
|
void wfmain::on_serverTXAudioOutputCombo_currentIndexChanged(int value)
|
||||||
{
|
{
|
||||||
if (serverConfig.rigs.size() > 0) {
|
|
||||||
|
if (!serverConfig.rigs.isEmpty())
|
||||||
|
{
|
||||||
|
if (prefs.audioSystem == qtAudio) {
|
||||||
QVariant v = ui->serverTXAudioOutputCombo->itemData(value);
|
QVariant v = ui->serverTXAudioOutputCombo->itemData(value);
|
||||||
serverConfig.rigs.first()->txAudioSetup.port = v.value<QAudioDeviceInfo>();
|
serverConfig.rigs.first()->txAudioSetup.port = v.value<QAudioDeviceInfo>();
|
||||||
|
|
||||||
serverConfig.rigs.first()->txAudioSetup.name = ui->serverTXAudioOutputCombo->itemText(value);
|
|
||||||
qDebug(logGui()) << "Changed default server audio output to:" << serverConfig.rigs.first()->txAudioSetup.name;
|
|
||||||
}
|
}
|
||||||
|
else {
|
||||||
|
serverConfig.rigs.first()->txAudioSetup.portInt = ui->serverTXAudioOutputCombo->itemData(value).toInt();
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
serverConfig.rigs.first()->txAudioSetup.name = ui->audioInputCombo->itemText(value);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void wfmain::on_serverUsersTable_cellChanged(int row, int column)
|
void wfmain::on_serverUsersTable_cellChanged(int row, int column)
|
||||||
|
@ -1871,6 +1822,8 @@ void wfmain::saveSettings()
|
||||||
settings->setValue("SerialPortBaud", prefs.serialPortBaud);
|
settings->setValue("SerialPortBaud", prefs.serialPortBaud);
|
||||||
settings->setValue("VirtualSerialPort", prefs.virtualSerialPort);
|
settings->setValue("VirtualSerialPort", prefs.virtualSerialPort);
|
||||||
settings->setValue("localAFgain", prefs.localAFgain);
|
settings->setValue("localAFgain", prefs.localAFgain);
|
||||||
|
settings->setValue("AudioSystem", prefs.audioSystem);
|
||||||
|
|
||||||
settings->endGroup();
|
settings->endGroup();
|
||||||
|
|
||||||
// Misc. user settings (enable PTT, draw peaks, etc)
|
// Misc. user settings (enable PTT, draw peaks, etc)
|
||||||
|
@ -3364,6 +3317,8 @@ void wfmain::receiveRigID(rigCapabilities rigCaps)
|
||||||
ui->useRTSforPTTchk->blockSignals(false);
|
ui->useRTSforPTTchk->blockSignals(false);
|
||||||
|
|
||||||
ui->connectBtn->setText("Disconnect"); // We must be connected now.
|
ui->connectBtn->setText("Disconnect"); // We must be connected now.
|
||||||
|
ui->audioSystemCombo->setEnabled(false);
|
||||||
|
|
||||||
prepareWf(ui->wfLengthSlider->value());
|
prepareWf(ui->wfLengthSlider->value());
|
||||||
if(usingLAN)
|
if(usingLAN)
|
||||||
{
|
{
|
||||||
|
@ -4622,20 +4577,33 @@ void wfmain::on_passwordTxt_textChanged(QString text)
|
||||||
|
|
||||||
void wfmain::on_audioOutputCombo_currentIndexChanged(int value)
|
void wfmain::on_audioOutputCombo_currentIndexChanged(int value)
|
||||||
{
|
{
|
||||||
|
|
||||||
|
if (prefs.audioSystem == qtAudio) {
|
||||||
QVariant v = ui->audioOutputCombo->itemData(value);
|
QVariant v = ui->audioOutputCombo->itemData(value);
|
||||||
rxSetup.port = v.value<QAudioDeviceInfo>();
|
rxSetup.port = v.value<QAudioDeviceInfo>();
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
rxSetup.portInt = ui->audioOutputCombo->itemData(value).toInt();
|
||||||
|
}
|
||||||
|
|
||||||
rxSetup.name = ui->audioOutputCombo->itemText(value);
|
rxSetup.name = ui->audioOutputCombo->itemText(value);
|
||||||
qDebug(logGui()) << "Changed default audio output to:" << rxSetup.name;
|
qDebug(logGui()) << "Changed audio output to:" << rxSetup.name;
|
||||||
}
|
}
|
||||||
|
|
||||||
void wfmain::on_audioInputCombo_currentIndexChanged(int value)
|
void wfmain::on_audioInputCombo_currentIndexChanged(int value)
|
||||||
{
|
{
|
||||||
|
|
||||||
|
if (prefs.audioSystem == qtAudio) {
|
||||||
QVariant v = ui->audioInputCombo->itemData(value);
|
QVariant v = ui->audioInputCombo->itemData(value);
|
||||||
txSetup.port = v.value<QAudioDeviceInfo>();
|
txSetup.port = v.value<QAudioDeviceInfo>();
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
txSetup.portInt = ui->audioInputCombo->itemData(value).toInt();
|
||||||
|
}
|
||||||
|
|
||||||
txSetup.name = ui->audioInputCombo->itemText(value);
|
txSetup.name = ui->audioInputCombo->itemText(value);
|
||||||
qDebug(logGui()) << "Changed default audio input to:" << txSetup.name;
|
|
||||||
|
qDebug(logGui()) << "Changed audio input to:" << txSetup.name;
|
||||||
}
|
}
|
||||||
|
|
||||||
void wfmain::on_audioSampleRateCombo_currentIndexChanged(QString text)
|
void wfmain::on_audioSampleRateCombo_currentIndexChanged(QString text)
|
||||||
|
@ -4690,6 +4658,7 @@ void wfmain::on_connectBtn_clicked()
|
||||||
if (haveRigCaps) {
|
if (haveRigCaps) {
|
||||||
emit sendCloseComm();
|
emit sendCloseComm();
|
||||||
ui->connectBtn->setText("Connect");
|
ui->connectBtn->setText("Connect");
|
||||||
|
ui->audioSystemCombo->setEnabled(true);
|
||||||
haveRigCaps = false;
|
haveRigCaps = false;
|
||||||
rigName->setText("NONE");
|
rigName->setText("NONE");
|
||||||
}
|
}
|
||||||
|
@ -5799,3 +5768,204 @@ void wfmain::on_debugBtn_clicked()
|
||||||
adjustSize();
|
adjustSize();
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void wfmain::setAudioDevicesUI()
|
||||||
|
{
|
||||||
|
|
||||||
|
// Enumerate audio devices, need to do before settings are loaded,
|
||||||
|
// First clear all existing entries
|
||||||
|
ui->audioInputCombo->blockSignals(true);
|
||||||
|
ui->audioOutputCombo->blockSignals(true);
|
||||||
|
ui->serverTXAudioOutputCombo->blockSignals(true);
|
||||||
|
ui->serverRXAudioInputCombo->blockSignals(true);
|
||||||
|
|
||||||
|
ui->audioInputCombo->clear();
|
||||||
|
ui->audioOutputCombo->clear();
|
||||||
|
ui->serverTXAudioOutputCombo->clear();
|
||||||
|
ui->serverRXAudioInputCombo->clear();
|
||||||
|
|
||||||
|
qDebug(logSystem()) << "Finding audio devices, output=" << rxSetup.name << "input="<<txSetup.name;
|
||||||
|
|
||||||
|
switch (prefs.audioSystem)
|
||||||
|
{
|
||||||
|
case qtAudio:
|
||||||
|
{
|
||||||
|
Pa_Terminate();
|
||||||
|
|
||||||
|
const auto audioOutputs = QAudioDeviceInfo::availableDevices(QAudio::AudioOutput);
|
||||||
|
for (const QAudioDeviceInfo& deviceInfo : audioOutputs) {
|
||||||
|
#ifdef Q_OS_WIN
|
||||||
|
if (deviceInfo.realm() == "wasapi") {
|
||||||
|
#endif
|
||||||
|
ui->audioOutputCombo->addItem(deviceInfo.deviceName(), QVariant::fromValue(deviceInfo));
|
||||||
|
ui->serverTXAudioOutputCombo->addItem(deviceInfo.deviceName(), QVariant::fromValue(deviceInfo));
|
||||||
|
#ifdef Q_OS_WIN
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
const auto audioInputs = QAudioDeviceInfo::availableDevices(QAudio::AudioInput);
|
||||||
|
for (const QAudioDeviceInfo& deviceInfo : audioInputs) {
|
||||||
|
#ifdef Q_OS_WIN
|
||||||
|
if (deviceInfo.realm() == "wasapi") {
|
||||||
|
#endif
|
||||||
|
ui->audioInputCombo->addItem(deviceInfo.deviceName(), QVariant::fromValue(deviceInfo));
|
||||||
|
ui->serverRXAudioInputCombo->addItem(deviceInfo.deviceName(), QVariant::fromValue(deviceInfo));
|
||||||
|
#ifdef Q_OS_WIN
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case portAudio:
|
||||||
|
{
|
||||||
|
PaError err;
|
||||||
|
|
||||||
|
err = Pa_Initialize();
|
||||||
|
|
||||||
|
if (err != paNoError)
|
||||||
|
{
|
||||||
|
qInfo(logAudio()) << "ERROR: Cannot initialize Portaudio";
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
qInfo(logAudio()) << "PortAudio version: " << Pa_GetVersionInfo()->versionText;
|
||||||
|
|
||||||
|
int numDevices;
|
||||||
|
numDevices = Pa_GetDeviceCount();
|
||||||
|
qInfo(logAudio()) << "Pa_CountDevices returned" << numDevices;
|
||||||
|
|
||||||
|
const PaDeviceInfo* info;
|
||||||
|
for (int i = 0; i < numDevices; i++)
|
||||||
|
{
|
||||||
|
info = Pa_GetDeviceInfo(i);
|
||||||
|
if (info->maxInputChannels > 0) {
|
||||||
|
qInfo(logAudio()) << (i == Pa_GetDefaultInputDevice() ? "*" : " ") << "(" << i << ") Output Device : " << info->name;
|
||||||
|
|
||||||
|
ui->audioInputCombo->addItem(info->name, i);
|
||||||
|
ui->serverRXAudioInputCombo->addItem(info->name, i);
|
||||||
|
}
|
||||||
|
if (info->maxOutputChannels > 0) {
|
||||||
|
qInfo(logAudio()) << (i == Pa_GetDefaultOutputDevice() ? "*" : " ") << "(" << i << ") Input Device : " << info->name;
|
||||||
|
ui->audioOutputCombo->addItem(info->name, i);
|
||||||
|
ui->serverTXAudioOutputCombo->addItem(info->name, i);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case rtAudio:
|
||||||
|
{
|
||||||
|
Pa_Terminate();
|
||||||
|
|
||||||
|
#if defined(Q_OS_LINUX)
|
||||||
|
RtAudio* audio = new RtAudio(RtAudio::Api::LINUX_ALSA);
|
||||||
|
#elif defined(Q_OS_WIN)
|
||||||
|
RtAudio* audio = new RtAudio(RtAudio::Api::WINDOWS_WASAPI);
|
||||||
|
#elif defined(Q_OS_MACX)
|
||||||
|
RtAudio* audio = new RtAudio(RtAudio::Api::MACOSX_CORE);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
// Enumerate audio devices, need to do before settings are loaded.
|
||||||
|
std::map<int, std::string> apiMap;
|
||||||
|
apiMap[RtAudio::MACOSX_CORE] = "OS-X Core Audio";
|
||||||
|
apiMap[RtAudio::WINDOWS_ASIO] = "Windows ASIO";
|
||||||
|
apiMap[RtAudio::WINDOWS_DS] = "Windows DirectSound";
|
||||||
|
apiMap[RtAudio::WINDOWS_WASAPI] = "Windows WASAPI";
|
||||||
|
apiMap[RtAudio::UNIX_JACK] = "Jack Client";
|
||||||
|
apiMap[RtAudio::LINUX_ALSA] = "Linux ALSA";
|
||||||
|
apiMap[RtAudio::LINUX_PULSE] = "Linux PulseAudio";
|
||||||
|
apiMap[RtAudio::LINUX_OSS] = "Linux OSS";
|
||||||
|
apiMap[RtAudio::RTAUDIO_DUMMY] = "RtAudio Dummy";
|
||||||
|
|
||||||
|
std::vector< RtAudio::Api > apis;
|
||||||
|
RtAudio::getCompiledApi(apis);
|
||||||
|
|
||||||
|
qInfo(logAudio()) << "RtAudio Version " << QString::fromStdString(RtAudio::getVersion());
|
||||||
|
|
||||||
|
qInfo(logAudio()) << "Compiled APIs:";
|
||||||
|
for (unsigned int i = 0; i < apis.size(); i++) {
|
||||||
|
qInfo(logAudio()) << " " << QString::fromStdString(apiMap[apis[i]]);
|
||||||
|
}
|
||||||
|
|
||||||
|
RtAudio::DeviceInfo info;
|
||||||
|
|
||||||
|
qInfo(logAudio()) << "Current API: " << QString::fromStdString(apiMap[audio->getCurrentApi()]);
|
||||||
|
|
||||||
|
unsigned int devices = audio->getDeviceCount();
|
||||||
|
qInfo(logAudio()) << "Found " << devices << " audio device(s) *=default";
|
||||||
|
|
||||||
|
for (unsigned int i = 1; i < devices; i++) {
|
||||||
|
info = audio->getDeviceInfo(i);
|
||||||
|
if (info.outputChannels > 0) {
|
||||||
|
qInfo(logAudio()) << (info.isDefaultOutput ? "*" : " ") << "(" << i << ") Output Device : " << QString::fromStdString(info.name);
|
||||||
|
ui->audioOutputCombo->addItem(QString::fromStdString(info.name), i);
|
||||||
|
ui->serverTXAudioOutputCombo->addItem(QString::fromStdString(info.name), i);
|
||||||
|
}
|
||||||
|
if (info.inputChannels > 0) {
|
||||||
|
qInfo(logAudio()) << (info.isDefaultInput ? "*" : " ") << "(" << i << ") Input Device : " << QString::fromStdString(info.name);
|
||||||
|
ui->audioInputCombo->addItem(QString::fromStdString(info.name), i);
|
||||||
|
ui->serverRXAudioInputCombo->addItem(QString::fromStdString(info.name), i);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
delete audio;
|
||||||
|
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// Stop blocking signals so we can set the current values
|
||||||
|
ui->audioInputCombo->blockSignals(false);
|
||||||
|
ui->audioOutputCombo->blockSignals(false);
|
||||||
|
ui->serverTXAudioOutputCombo->blockSignals(false);
|
||||||
|
ui->serverRXAudioInputCombo->blockSignals(false);
|
||||||
|
|
||||||
|
|
||||||
|
rxSetup.type = prefs.audioSystem;
|
||||||
|
txSetup.type = prefs.audioSystem;
|
||||||
|
|
||||||
|
int audioInputIndex = ui->audioInputCombo->findText(txSetup.name);
|
||||||
|
if (audioInputIndex != -1) {
|
||||||
|
ui->audioInputCombo->setCurrentIndex(audioInputIndex);
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
qDebug(logSystem()) << "Audio input not found";
|
||||||
|
}
|
||||||
|
|
||||||
|
int audioOutputIndex = ui->audioOutputCombo->findText(rxSetup.name);
|
||||||
|
if (audioOutputIndex != -1) {
|
||||||
|
ui->audioOutputCombo->setCurrentIndex(audioOutputIndex);
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
qDebug(logSystem()) << "Audio output not found";
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!serverConfig.rigs.isEmpty())
|
||||||
|
|
||||||
|
{
|
||||||
|
qInfo(logGui()) << "Got Server Audio Input: " << serverConfig.rigs.first()->rxAudioSetup.name;
|
||||||
|
int serverAudioInputIndex = ui->serverRXAudioInputCombo->findText(serverConfig.rigs.first()->rxAudioSetup.name);
|
||||||
|
if (serverAudioInputIndex != -1) {
|
||||||
|
ui->serverRXAudioInputCombo->setCurrentIndex(serverAudioInputIndex);
|
||||||
|
}
|
||||||
|
|
||||||
|
qInfo(logGui()) << "Got Server Audio Output: " << serverConfig.rigs.first()->txAudioSetup.name;
|
||||||
|
int serverAudioOutputIndex = ui->serverTXAudioOutputCombo->findText(serverConfig.rigs.first()->txAudioSetup.name);
|
||||||
|
if (serverAudioOutputIndex != -1) {
|
||||||
|
ui->serverTXAudioOutputCombo->setCurrentIndex(serverAudioOutputIndex);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// Set these to default audio devices initially.
|
||||||
|
qDebug(logSystem()) << "Audio devices done.";
|
||||||
|
}
|
||||||
|
|
||||||
|
void wfmain::on_audioSystemCombo_currentIndexChanged(int value)
|
||||||
|
{
|
||||||
|
prefs.audioSystem = static_cast<audioType>(value);
|
||||||
|
setAudioDevicesUI(); // Force all audio devices to update
|
||||||
|
}
|
11
wfmain.h
11
wfmain.h
|
@ -40,6 +40,14 @@
|
||||||
#include <deque>
|
#include <deque>
|
||||||
#include <memory>
|
#include <memory>
|
||||||
|
|
||||||
|
#include <portaudio.h>
|
||||||
|
#ifdef Q_OS_WIN
|
||||||
|
#include "RtAudio.h"
|
||||||
|
#else
|
||||||
|
#include "rtaudio/RtAudio.h"
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
namespace Ui {
|
namespace Ui {
|
||||||
class wfmain;
|
class wfmain;
|
||||||
}
|
}
|
||||||
|
@ -529,6 +537,8 @@ private slots:
|
||||||
|
|
||||||
void on_radioStatusBtn_clicked();
|
void on_radioStatusBtn_clicked();
|
||||||
|
|
||||||
|
void on_audioSystemCombo_currentIndexChanged(int value);
|
||||||
|
|
||||||
private:
|
private:
|
||||||
Ui::wfmain *ui;
|
Ui::wfmain *ui;
|
||||||
void closeEvent(QCloseEvent *event);
|
void closeEvent(QCloseEvent *event);
|
||||||
|
@ -769,6 +779,7 @@ private:
|
||||||
meterKind meter2Type;
|
meterKind meter2Type;
|
||||||
quint16 tcpPort;
|
quint16 tcpPort;
|
||||||
quint8 waterfallFormat;
|
quint8 waterfallFormat;
|
||||||
|
audioType audioSystem;
|
||||||
// plot scheme
|
// plot scheme
|
||||||
} prefs;
|
} prefs;
|
||||||
|
|
||||||
|
|
28
wfmain.ui
28
wfmain.ui
|
@ -2066,7 +2066,7 @@
|
||||||
<item>
|
<item>
|
||||||
<widget class="QStackedWidget" name="settingsStack">
|
<widget class="QStackedWidget" name="settingsStack">
|
||||||
<property name="currentIndex">
|
<property name="currentIndex">
|
||||||
<number>4</number>
|
<number>0</number>
|
||||||
</property>
|
</property>
|
||||||
<widget class="QWidget" name="radioAccess">
|
<widget class="QWidget" name="radioAccess">
|
||||||
<layout class="QVBoxLayout" name="verticalLayout_21">
|
<layout class="QVBoxLayout" name="verticalLayout_21">
|
||||||
|
@ -2633,6 +2633,32 @@
|
||||||
</property>
|
</property>
|
||||||
</spacer>
|
</spacer>
|
||||||
</item>
|
</item>
|
||||||
|
<item>
|
||||||
|
<widget class="QLabel" name="label_40">
|
||||||
|
<property name="text">
|
||||||
|
<string>Audio System</string>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item>
|
||||||
|
<widget class="QComboBox" name="audioSystemCombo">
|
||||||
|
<item>
|
||||||
|
<property name="text">
|
||||||
|
<string>QT Audio</string>
|
||||||
|
</property>
|
||||||
|
</item>
|
||||||
|
<item>
|
||||||
|
<property name="text">
|
||||||
|
<string>PortAudio</string>
|
||||||
|
</property>
|
||||||
|
</item>
|
||||||
|
<item>
|
||||||
|
<property name="text">
|
||||||
|
<string>RT Audio</string>
|
||||||
|
</property>
|
||||||
|
</item>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
</layout>
|
</layout>
|
||||||
</item>
|
</item>
|
||||||
</layout>
|
</layout>
|
||||||
|
|
27
wfserver.pro
27
wfserver.pro
|
@ -17,11 +17,12 @@ DEFINES += WFVIEW_VERSION=\\\"1.2e\\\"
|
||||||
|
|
||||||
DEFINES += BUILD_WFSERVER
|
DEFINES += BUILD_WFSERVER
|
||||||
|
|
||||||
|
|
||||||
CONFIG(debug, release|debug) {
|
CONFIG(debug, release|debug) {
|
||||||
# For Debug builds only:
|
# For Debug builds only:
|
||||||
QMAKE_CXXFLAGS += -faligned-new
|
QMAKE_CXXFLAGS += -faligned-new
|
||||||
WIN32:DESTDIR = wfview-debug
|
win32:DESTDIR = wfview-release
|
||||||
|
win32:LIBS += -L../portaudio/msvc/Win32/Debug/ -lportaudio_x86
|
||||||
} else {
|
} else {
|
||||||
# For Release builds only:
|
# For Release builds only:
|
||||||
linux:QMAKE_CXXFLAGS += -s
|
linux:QMAKE_CXXFLAGS += -s
|
||||||
|
@ -29,9 +30,25 @@ QMAKE_CXXFLAGS += -fvisibility=hidden
|
||||||
QMAKE_CXXFLAGS += -fvisibility-inlines-hidden
|
QMAKE_CXXFLAGS += -fvisibility-inlines-hidden
|
||||||
QMAKE_CXXFLAGS += -faligned-new
|
QMAKE_CXXFLAGS += -faligned-new
|
||||||
linux:QMAKE_LFLAGS += -O2 -s
|
linux:QMAKE_LFLAGS += -O2 -s
|
||||||
WIN32:DESTDIR = wfview-release
|
win32:DESTDIR = wfview-debug
|
||||||
|
win32:LIBS += -L../portaudio/msvc/Win32/Release/ -lportaudio_x86
|
||||||
}
|
}
|
||||||
|
|
||||||
|
# RTAudio defines
|
||||||
|
win32:DEFINES += __WINDOWS_WASAPI__
|
||||||
|
#win32:DEFINES += __WINDOWS_DS__ # Requires DirectSound libraries
|
||||||
|
#linux:DEFINES += __LINUX_ALSA__
|
||||||
|
#linux:DEFINES += __LINUX_OSS__
|
||||||
|
linux:DEFINES += __LINUX_PULSE__
|
||||||
|
macx:DEFINES += __MACOSX_CORE__
|
||||||
|
win32:SOURCES += ../rtaudio/RTAudio.cpp
|
||||||
|
win32:HEADERS += ../rtaudio/RTAUdio.h
|
||||||
|
!linux:INCLUDEPATH += ../rtaudio
|
||||||
|
linux:LIBS += -lpulse -lpulse-simple -lrtaudio -lpthread
|
||||||
|
|
||||||
|
win32:INCLUDEPATH += ../portaudio/include
|
||||||
|
!win32:LIBS += -lportaudio
|
||||||
|
|
||||||
# The following define makes your compiler emit warnings if you use
|
# The following define makes your compiler emit warnings if you use
|
||||||
# any feature of Qt which as been marked as deprecated (the exact warnings
|
# any feature of Qt which as been marked as deprecated (the exact warnings
|
||||||
# depend on your compiler). Please consult the documentation of the
|
# depend on your compiler). Please consult the documentation of the
|
||||||
|
@ -144,6 +161,8 @@ SOURCES += main.cpp\
|
||||||
udpcivdata.cpp \
|
udpcivdata.cpp \
|
||||||
udpaudio.cpp \
|
udpaudio.cpp \
|
||||||
logcategories.cpp \
|
logcategories.cpp \
|
||||||
|
pahandler.cpp \
|
||||||
|
rthandler.cpp \
|
||||||
audiohandler.cpp \
|
audiohandler.cpp \
|
||||||
audioconverter.cpp \
|
audioconverter.cpp \
|
||||||
udpserver.cpp \
|
udpserver.cpp \
|
||||||
|
@ -163,6 +182,8 @@ HEADERS += servermain.h \
|
||||||
udpcivdata.h \
|
udpcivdata.h \
|
||||||
udpaudio.h \
|
udpaudio.h \
|
||||||
logcategories.h \
|
logcategories.h \
|
||||||
|
pahandler.h \
|
||||||
|
rthandler.h \
|
||||||
audiohandler.h \
|
audiohandler.h \
|
||||||
audioconverter.h \
|
audioconverter.h \
|
||||||
udpserver.h \
|
udpserver.h \
|
||||||
|
|
29
wfview.pro
29
wfview.pro
|
@ -18,7 +18,8 @@ DEFINES += BUILD_WFVIEW
|
||||||
CONFIG(debug, release|debug) {
|
CONFIG(debug, release|debug) {
|
||||||
# For Debug builds only:
|
# For Debug builds only:
|
||||||
QMAKE_CXXFLAGS += -faligned-new
|
QMAKE_CXXFLAGS += -faligned-new
|
||||||
WIN32:DESTDIR = wfview-release
|
win32:DESTDIR = wfview-release
|
||||||
|
win32:LIBS += -L../portaudio/msvc/Win32/Debug/ -lportaudio_x86
|
||||||
} else {
|
} else {
|
||||||
# For Release builds only:
|
# For Release builds only:
|
||||||
linux:QMAKE_CXXFLAGS += -s
|
linux:QMAKE_CXXFLAGS += -s
|
||||||
|
@ -26,9 +27,25 @@ QMAKE_CXXFLAGS += -fvisibility=hidden
|
||||||
QMAKE_CXXFLAGS += -fvisibility-inlines-hidden
|
QMAKE_CXXFLAGS += -fvisibility-inlines-hidden
|
||||||
QMAKE_CXXFLAGS += -faligned-new
|
QMAKE_CXXFLAGS += -faligned-new
|
||||||
linux:QMAKE_LFLAGS += -O2 -s
|
linux:QMAKE_LFLAGS += -O2 -s
|
||||||
WIN32:DESTDIR = wfview-debug
|
win32:DESTDIR = wfview-debug
|
||||||
|
win32:LIBS += -L../portaudio/msvc/Win32/Release/ -lportaudio_x86
|
||||||
}
|
}
|
||||||
|
|
||||||
|
# RTAudio defines
|
||||||
|
win32:DEFINES += __WINDOWS_WASAPI__
|
||||||
|
#win32:DEFINES += __WINDOWS_DS__ # Requires DirectSound libraries
|
||||||
|
#linux:DEFINES += __LINUX_ALSA__
|
||||||
|
#linux:DEFINES += __LINUX_OSS__
|
||||||
|
linux:DEFINES += __LINUX_PULSE__
|
||||||
|
macx:DEFINES += __MACOSX_CORE__
|
||||||
|
win32:SOURCES += ../rtaudio/RTAudio.cpp
|
||||||
|
win32:HEADERS += ../rtaudio/RTAUdio.h
|
||||||
|
!linux:INCLUDEPATH += ../rtaudio
|
||||||
|
linux:LIBS += -lpulse -lpulse-simple -lrtaudio -lpthread
|
||||||
|
|
||||||
|
win32:INCLUDEPATH += ../portaudio/include
|
||||||
|
!win32:LIBS += -lportaudio
|
||||||
|
|
||||||
# The following define makes your compiler emit warnings if you use
|
# The following define makes your compiler emit warnings if you use
|
||||||
# any feature of Qt which as been marked as deprecated (the exact warnings
|
# any feature of Qt which as been marked as deprecated (the exact warnings
|
||||||
# depend on your compiler). Please consult the documentation of the
|
# depend on your compiler). Please consult the documentation of the
|
||||||
|
@ -59,10 +76,6 @@ isEmpty(PREFIX) {
|
||||||
|
|
||||||
DEFINES += PREFIX=\\\"$$PREFIX\\\"
|
DEFINES += PREFIX=\\\"$$PREFIX\\\"
|
||||||
|
|
||||||
# Choose audio system, uses QTMultimedia if both are commented out.
|
|
||||||
# DEFINES += RTAUDIO
|
|
||||||
# DEFINES += PORTAUDIO
|
|
||||||
|
|
||||||
contains(DEFINES, RTAUDIO) {
|
contains(DEFINES, RTAUDIO) {
|
||||||
# RTAudio defines
|
# RTAudio defines
|
||||||
win32:DEFINES += __WINDOWS_WASAPI__
|
win32:DEFINES += __WINDOWS_WASAPI__
|
||||||
|
@ -167,6 +180,8 @@ SOURCES += main.cpp\
|
||||||
udpcivdata.cpp \
|
udpcivdata.cpp \
|
||||||
udpaudio.cpp \
|
udpaudio.cpp \
|
||||||
logcategories.cpp \
|
logcategories.cpp \
|
||||||
|
pahandler.cpp \
|
||||||
|
rthandler.cpp \
|
||||||
audiohandler.cpp \
|
audiohandler.cpp \
|
||||||
audioconverter.cpp \
|
audioconverter.cpp \
|
||||||
calibrationwindow.cpp \
|
calibrationwindow.cpp \
|
||||||
|
@ -193,6 +208,8 @@ HEADERS += wfmain.h \
|
||||||
udpcivdata.h \
|
udpcivdata.h \
|
||||||
udpaudio.h \
|
udpaudio.h \
|
||||||
logcategories.h \
|
logcategories.h \
|
||||||
|
pahandler.h \
|
||||||
|
rthandler.h \
|
||||||
audiohandler.h \
|
audiohandler.h \
|
||||||
audioconverter.h \
|
audioconverter.h \
|
||||||
calibrationwindow.h \
|
calibrationwindow.h \
|
||||||
|
|
467
wfview.vcxproj
467
wfview.vcxproj
|
@ -16,12 +16,11 @@
|
||||||
<Keyword>QtVS_v304</Keyword>
|
<Keyword>QtVS_v304</Keyword>
|
||||||
<WindowsTargetPlatformVersion>10.0.19041.0</WindowsTargetPlatformVersion>
|
<WindowsTargetPlatformVersion>10.0.19041.0</WindowsTargetPlatformVersion>
|
||||||
<WindowsTargetPlatformMinVersion>10.0.19041.0</WindowsTargetPlatformMinVersion>
|
<WindowsTargetPlatformMinVersion>10.0.19041.0</WindowsTargetPlatformMinVersion>
|
||||||
<QtMsBuild Condition="'$(QtMsBuild)'=='' or !Exists('$(QtMsBuild)\qt.targets')">$(MSBuildProjectDirectory)\QtMsBuild</QtMsBuild>
|
<QtMsBuild Condition="'$(QtMsBuild)'=='' or !Exists('$(QtMsBuild)\qt.targets')">$(MSBuildProjectDirectory)\QtMsBuild</QtMsBuild></PropertyGroup>
|
||||||
</PropertyGroup>
|
|
||||||
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
|
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
|
||||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration">
|
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration">
|
||||||
<PlatformToolset>v142</PlatformToolset>
|
<PlatformToolset>v142</PlatformToolset>
|
||||||
<OutputDirectory>release\</OutputDirectory>
|
<OutputDirectory>wfview-release\</OutputDirectory>
|
||||||
<ATLMinimizesCRunTimeLibraryUsage>false</ATLMinimizesCRunTimeLibraryUsage>
|
<ATLMinimizesCRunTimeLibraryUsage>false</ATLMinimizesCRunTimeLibraryUsage>
|
||||||
<CharacterSet>NotSet</CharacterSet>
|
<CharacterSet>NotSet</CharacterSet>
|
||||||
<ConfigurationType>Application</ConfigurationType>
|
<ConfigurationType>Application</ConfigurationType>
|
||||||
|
@ -30,17 +29,14 @@
|
||||||
</PropertyGroup>
|
</PropertyGroup>
|
||||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration">
|
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration">
|
||||||
<PlatformToolset>v142</PlatformToolset>
|
<PlatformToolset>v142</PlatformToolset>
|
||||||
<OutputDirectory>debug\</OutputDirectory>
|
<OutputDirectory>wfview-debug\</OutputDirectory>
|
||||||
<ATLMinimizesCRunTimeLibraryUsage>false</ATLMinimizesCRunTimeLibraryUsage>
|
<ATLMinimizesCRunTimeLibraryUsage>false</ATLMinimizesCRunTimeLibraryUsage>
|
||||||
<CharacterSet>NotSet</CharacterSet>
|
<CharacterSet>NotSet</CharacterSet>
|
||||||
<ConfigurationType>Application</ConfigurationType>
|
<ConfigurationType>Application</ConfigurationType>
|
||||||
<IntermediateDirectory>debug\</IntermediateDirectory>
|
<IntermediateDirectory>debug\</IntermediateDirectory>
|
||||||
<PrimaryOutput>wfview</PrimaryOutput>
|
<PrimaryOutput>wfview</PrimaryOutput>
|
||||||
</PropertyGroup>
|
</PropertyGroup>
|
||||||
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
|
<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>
|
||||||
<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 Label="ExtensionSettings" />
|
||||||
<ImportGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="PropertySheets">
|
<ImportGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="PropertySheets">
|
||||||
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" />
|
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" />
|
||||||
|
@ -48,37 +44,11 @@
|
||||||
<ImportGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="PropertySheets">
|
<ImportGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="PropertySheets">
|
||||||
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" />
|
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" />
|
||||||
</ImportGroup>
|
</ImportGroup>
|
||||||
<PropertyGroup Label="UserMacros" />
|
<PropertyGroup Label="UserMacros" /><ImportGroup Condition="Exists('$(QtMsBuild)\qt_defaults.props')"><Import Project="$(QtMsBuild)\qt_defaults.props" /></ImportGroup><PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'"><OutDir>wfview-debug\</OutDir><IntDir>debug\</IntDir><TargetName>wfview</TargetName><IgnoreImportLibrary>true</IgnoreImportLibrary></PropertyGroup><PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'"><OutDir>wfview-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>
|
||||||
<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'">
|
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
|
||||||
<ClCompile>
|
<ClCompile>
|
||||||
<AdditionalIncludeDirectories>.;..\qcustomplot;..\opus\include;..\eigen;..\r8brain-free-src;resampler;release;/include;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
|
<AdditionalIncludeDirectories>.;..\rtaudio;..\portaudio\include;..\qcustomplot;..\opus\include;..\eigen;..\r8brain-free-src;resampler;release;/include;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
|
||||||
<AdditionalOptions>-Zc:rvalueCast -Zc:inline -Zc:strictStrings -Zc:throwingNew -Zc:referenceBinding -Zc:__cplusplus -w34100 -w34189 -w44996 -w44456 -w44457 -w44458 %(AdditionalOptions)</AdditionalOptions>
|
<AdditionalOptions>-Zc:rvalueCast -Zc:inline -Zc:strictStrings -Zc:throwingNew -Zc:referenceBinding -Zc:__cplusplus -w34100 -w34189 -w44996 -w44456 -w44457 -w44458 %(AdditionalOptions)</AdditionalOptions>
|
||||||
<AssemblerListingLocation>release\</AssemblerListingLocation>
|
<AssemblerListingLocation>release\</AssemblerListingLocation>
|
||||||
<BrowseInformation>false</BrowseInformation>
|
<BrowseInformation>false</BrowseInformation>
|
||||||
|
@ -87,19 +57,17 @@
|
||||||
<ExceptionHandling>Sync</ExceptionHandling>
|
<ExceptionHandling>Sync</ExceptionHandling>
|
||||||
<ObjectFileName>release\</ObjectFileName>
|
<ObjectFileName>release\</ObjectFileName>
|
||||||
<Optimization>MaxSpeed</Optimization>
|
<Optimization>MaxSpeed</Optimization>
|
||||||
<PreprocessorDefinitions>_WINDOWS;UNICODE;_UNICODE;WIN32;_ENABLE_EXTENDED_ALIGNED_STORAGE;WFVIEW_VERSION="1.2e";BUILD_WFVIEW;QT_DEPRECATED_WARNINGS;QCUSTOMPLOT_COMPILE_LIBRARY;USE_SSE;USE_SSE2;OUTSIDE_SPEEX;RANDOM_PREFIX=wf;EIGEN_MPL2_ONLY;EIGEN_DONT_VECTORIZE;EIGEN_VECTORIZE_SSE3;PREFIX="/usr/local";GITSHORT="b510b70";HOST="wfview.org";UNAME="build";NDEBUG;QT_NO_DEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
<PreprocessorDefinitions>_WINDOWS;UNICODE;_UNICODE;WIN32;_ENABLE_EXTENDED_ALIGNED_STORAGE;WFVIEW_VERSION="1.2e";BUILD_WFVIEW;__WINDOWS_WASAPI__;QT_DEPRECATED_WARNINGS;QCUSTOMPLOT_COMPILE_LIBRARY;USE_SSE;USE_SSE2;OUTSIDE_SPEEX;RANDOM_PREFIX=wf;EIGEN_MPL2_ONLY;EIGEN_DONT_VECTORIZE;EIGEN_VECTORIZE_SSE3;PREFIX="/usr/local";GITSHORT="63c5e02";HOST="wfview.org";UNAME="build";NDEBUG;QT_NO_DEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
||||||
<PreprocessToFile>false</PreprocessToFile>
|
<PreprocessToFile>false</PreprocessToFile>
|
||||||
<ProgramDataBaseFileName>
|
<ProgramDataBaseFileName></ProgramDataBaseFileName>
|
||||||
</ProgramDataBaseFileName>
|
|
||||||
<RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary>
|
<RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary>
|
||||||
<SuppressStartupBanner>true</SuppressStartupBanner>
|
<SuppressStartupBanner>true</SuppressStartupBanner>
|
||||||
<TreatWChar_tAsBuiltInType>true</TreatWChar_tAsBuiltInType>
|
<TreatWChar_tAsBuiltInType>true</TreatWChar_tAsBuiltInType>
|
||||||
<WarningLevel>Level3</WarningLevel>
|
<WarningLevel>Level3</WarningLevel>
|
||||||
<MultiProcessorCompilation>true</MultiProcessorCompilation>
|
<MultiProcessorCompilation>true</MultiProcessorCompilation></ClCompile>
|
||||||
</ClCompile>
|
|
||||||
<Link>
|
<Link>
|
||||||
<AdditionalDependencies>..\opus\win32\VS2015\Win32\Release\opus.lib;shell32.lib;%(AdditionalDependencies)</AdditionalDependencies>
|
<AdditionalDependencies>..\portaudio\msvc\Win32\Release\portaudio_x86.lib;..\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>
|
<AdditionalLibraryDirectories>..\portaudio\msvc\Win32\Release;..\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>
|
||||||
<AdditionalOptions>"/MANIFESTDEPENDENCY:type='win32' name='Microsoft.Windows.Common-Controls' version='6.0.0.0' publicKeyToken='6595b64144ccf1df' language='*' processorArchitecture='*'" %(AdditionalOptions)</AdditionalOptions>
|
<AdditionalOptions>"/MANIFESTDEPENDENCY:type='win32' name='Microsoft.Windows.Common-Controls' version='6.0.0.0' publicKeyToken='6595b64144ccf1df' language='*' processorArchitecture='*'" %(AdditionalOptions)</AdditionalOptions>
|
||||||
<DataExecutionPrevention>true</DataExecutionPrevention>
|
<DataExecutionPrevention>true</DataExecutionPrevention>
|
||||||
<GenerateDebugInformation>false</GenerateDebugInformation>
|
<GenerateDebugInformation>false</GenerateDebugInformation>
|
||||||
|
@ -117,31 +85,12 @@
|
||||||
<WarningLevel>0</WarningLevel>
|
<WarningLevel>0</WarningLevel>
|
||||||
</Midl>
|
</Midl>
|
||||||
<ResourceCompile>
|
<ResourceCompile>
|
||||||
<PreprocessorDefinitions>_WINDOWS;UNICODE;_UNICODE;WIN32;_ENABLE_EXTENDED_ALIGNED_STORAGE;WFVIEW_VERSION=\"1.2e\";BUILD_WFVIEW;QT_DEPRECATED_WARNINGS;QCUSTOMPLOT_COMPILE_LIBRARY;USE_SSE;USE_SSE2;OUTSIDE_SPEEX;RANDOM_PREFIX=wf;EIGEN_MPL2_ONLY;EIGEN_DONT_VECTORIZE;EIGEN_VECTORIZE_SSE3;PREFIX=\"/usr/local\";GITSHORT=\"b510b70\";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.2e\";BUILD_WFVIEW;__WINDOWS_WASAPI__;QT_DEPRECATED_WARNINGS;QCUSTOMPLOT_COMPILE_LIBRARY;USE_SSE;USE_SSE2;OUTSIDE_SPEEX;RANDOM_PREFIX=wf;EIGEN_MPL2_ONLY;EIGEN_DONT_VECTORIZE;EIGEN_VECTORIZE_SSE3;PREFIX=\"/usr/local\";GITSHORT=\"63c5e02\";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>
|
</ResourceCompile>
|
||||||
<QtMoc>
|
<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>
|
||||||
<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'">
|
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
|
||||||
<ClCompile>
|
<ClCompile>
|
||||||
<AdditionalIncludeDirectories>.;..\qcustomplot;..\opus\include;..\eigen;..\r8brain-free-src;resampler;debug;/include;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
|
<AdditionalIncludeDirectories>.;..\rtaudio;..\portaudio\include;..\qcustomplot;..\opus\include;..\eigen;..\r8brain-free-src;resampler;debug;/include;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
|
||||||
<AdditionalOptions>-Zc:rvalueCast -Zc:inline -Zc:strictStrings -Zc:throwingNew -Zc:referenceBinding -Zc:__cplusplus -w34100 -w34189 -w44996 -w44456 -w44457 -w44458 %(AdditionalOptions)</AdditionalOptions>
|
<AdditionalOptions>-Zc:rvalueCast -Zc:inline -Zc:strictStrings -Zc:throwingNew -Zc:referenceBinding -Zc:__cplusplus -w34100 -w34189 -w44996 -w44456 -w44457 -w44458 %(AdditionalOptions)</AdditionalOptions>
|
||||||
<AssemblerListingLocation>debug\</AssemblerListingLocation>
|
<AssemblerListingLocation>debug\</AssemblerListingLocation>
|
||||||
<BrowseInformation>false</BrowseInformation>
|
<BrowseInformation>false</BrowseInformation>
|
||||||
|
@ -150,17 +99,16 @@
|
||||||
<ExceptionHandling>Sync</ExceptionHandling>
|
<ExceptionHandling>Sync</ExceptionHandling>
|
||||||
<ObjectFileName>debug\</ObjectFileName>
|
<ObjectFileName>debug\</ObjectFileName>
|
||||||
<Optimization>Disabled</Optimization>
|
<Optimization>Disabled</Optimization>
|
||||||
<PreprocessorDefinitions>_WINDOWS;UNICODE;_UNICODE;WIN32;_ENABLE_EXTENDED_ALIGNED_STORAGE;WFVIEW_VERSION="1.2e";BUILD_WFVIEW;QT_DEPRECATED_WARNINGS;QCUSTOMPLOT_COMPILE_LIBRARY;USE_SSE;USE_SSE2;OUTSIDE_SPEEX;RANDOM_PREFIX=wf;EIGEN_MPL2_ONLY;EIGEN_DONT_VECTORIZE;EIGEN_VECTORIZE_SSE3;PREFIX="/usr/local";GITSHORT="b510b70";HOST="wfview.org";UNAME="build";%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
<PreprocessorDefinitions>_WINDOWS;UNICODE;_UNICODE;WIN32;_ENABLE_EXTENDED_ALIGNED_STORAGE;WFVIEW_VERSION="1.2e";BUILD_WFVIEW;__WINDOWS_WASAPI__;QT_DEPRECATED_WARNINGS;QCUSTOMPLOT_COMPILE_LIBRARY;USE_SSE;USE_SSE2;OUTSIDE_SPEEX;RANDOM_PREFIX=wf;EIGEN_MPL2_ONLY;EIGEN_DONT_VECTORIZE;EIGEN_VECTORIZE_SSE3;PREFIX="/usr/local";GITSHORT="63c5e02";HOST="wfview.org";UNAME="build";%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
||||||
<PreprocessToFile>false</PreprocessToFile>
|
<PreprocessToFile>false</PreprocessToFile>
|
||||||
<RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>
|
<RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>
|
||||||
<SuppressStartupBanner>true</SuppressStartupBanner>
|
<SuppressStartupBanner>true</SuppressStartupBanner>
|
||||||
<TreatWChar_tAsBuiltInType>true</TreatWChar_tAsBuiltInType>
|
<TreatWChar_tAsBuiltInType>true</TreatWChar_tAsBuiltInType>
|
||||||
<WarningLevel>Level3</WarningLevel>
|
<WarningLevel>Level3</WarningLevel>
|
||||||
<MultiProcessorCompilation>true</MultiProcessorCompilation>
|
<MultiProcessorCompilation>true</MultiProcessorCompilation></ClCompile>
|
||||||
</ClCompile>
|
|
||||||
<Link>
|
<Link>
|
||||||
<AdditionalDependencies>..\opus\win32\VS2015\Win32\Debug\opus.lib;shell32.lib;%(AdditionalDependencies)</AdditionalDependencies>
|
<AdditionalDependencies>..\portaudio\msvc\Win32\Debug\portaudio_x86.lib;..\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>
|
<AdditionalLibraryDirectories>..\portaudio\msvc\Win32\Debug;..\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>
|
||||||
<AdditionalOptions>"/MANIFESTDEPENDENCY:type='win32' name='Microsoft.Windows.Common-Controls' version='6.0.0.0' publicKeyToken='6595b64144ccf1df' language='*' processorArchitecture='*'" %(AdditionalOptions)</AdditionalOptions>
|
<AdditionalOptions>"/MANIFESTDEPENDENCY:type='win32' name='Microsoft.Windows.Common-Controls' version='6.0.0.0' publicKeyToken='6595b64144ccf1df' language='*' processorArchitecture='*'" %(AdditionalOptions)</AdditionalOptions>
|
||||||
<DataExecutionPrevention>true</DataExecutionPrevention>
|
<DataExecutionPrevention>true</DataExecutionPrevention>
|
||||||
<GenerateDebugInformation>true</GenerateDebugInformation>
|
<GenerateDebugInformation>true</GenerateDebugInformation>
|
||||||
|
@ -176,29 +124,11 @@
|
||||||
<WarningLevel>0</WarningLevel>
|
<WarningLevel>0</WarningLevel>
|
||||||
</Midl>
|
</Midl>
|
||||||
<ResourceCompile>
|
<ResourceCompile>
|
||||||
<PreprocessorDefinitions>_WINDOWS;UNICODE;_UNICODE;WIN32;_ENABLE_EXTENDED_ALIGNED_STORAGE;WFVIEW_VERSION=\"1.2e\";BUILD_WFVIEW;QT_DEPRECATED_WARNINGS;QCUSTOMPLOT_COMPILE_LIBRARY;USE_SSE;USE_SSE2;OUTSIDE_SPEEX;RANDOM_PREFIX=wf;EIGEN_MPL2_ONLY;EIGEN_DONT_VECTORIZE;EIGEN_VECTORIZE_SSE3;PREFIX=\"/usr/local\";GITSHORT=\"b510b70\";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.2e\";BUILD_WFVIEW;__WINDOWS_WASAPI__;QT_DEPRECATED_WARNINGS;QCUSTOMPLOT_COMPILE_LIBRARY;USE_SSE;USE_SSE2;OUTSIDE_SPEEX;RANDOM_PREFIX=wf;EIGEN_MPL2_ONLY;EIGEN_DONT_VECTORIZE;EIGEN_VECTORIZE_SSE3;PREFIX=\"/usr/local\";GITSHORT=\"63c5e02\";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>
|
</ResourceCompile>
|
||||||
<QtMoc>
|
<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>
|
||||||
<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>
|
<ItemGroup>
|
||||||
|
<ClCompile Include="..\rtaudio\RTAudio.cpp" />
|
||||||
<ClCompile Include="aboutbox.cpp" />
|
<ClCompile Include="aboutbox.cpp" />
|
||||||
<ClCompile Include="audioconverter.cpp" />
|
<ClCompile Include="audioconverter.cpp" />
|
||||||
<ClCompile Include="audiohandler.cpp" />
|
<ClCompile Include="audiohandler.cpp" />
|
||||||
|
@ -208,6 +138,7 @@
|
||||||
<ClCompile Include="logcategories.cpp" />
|
<ClCompile Include="logcategories.cpp" />
|
||||||
<ClCompile Include="main.cpp" />
|
<ClCompile Include="main.cpp" />
|
||||||
<ClCompile Include="meter.cpp" />
|
<ClCompile Include="meter.cpp" />
|
||||||
|
<ClCompile Include="pahandler.cpp" />
|
||||||
<ClCompile Include="pttyhandler.cpp" />
|
<ClCompile Include="pttyhandler.cpp" />
|
||||||
<ClCompile Include="..\qcustomplot\qcustomplot.cpp" />
|
<ClCompile Include="..\qcustomplot\qcustomplot.cpp" />
|
||||||
<ClCompile Include="qledlabel.cpp" />
|
<ClCompile Include="qledlabel.cpp" />
|
||||||
|
@ -216,6 +147,7 @@
|
||||||
<ClCompile Include="rigcommander.cpp" />
|
<ClCompile Include="rigcommander.cpp" />
|
||||||
<ClCompile Include="rigctld.cpp" />
|
<ClCompile Include="rigctld.cpp" />
|
||||||
<ClCompile Include="rigidentities.cpp" />
|
<ClCompile Include="rigidentities.cpp" />
|
||||||
|
<ClCompile Include="rthandler.cpp" />
|
||||||
<ClCompile Include="satellitesetup.cpp" />
|
<ClCompile Include="satellitesetup.cpp" />
|
||||||
<ClCompile Include="selectradio.cpp" />
|
<ClCompile Include="selectradio.cpp" />
|
||||||
<ClCompile Include="tcpserver.cpp" />
|
<ClCompile Include="tcpserver.cpp" />
|
||||||
|
@ -228,58 +160,264 @@
|
||||||
<ClCompile Include="wfmain.cpp" />
|
<ClCompile Include="wfmain.cpp" />
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
|
<ClInclude Include="..\rtaudio\RTAUdio.h" />
|
||||||
<QtMoc Include="aboutbox.h">
|
<QtMoc Include="aboutbox.h">
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
</QtMoc>
|
</QtMoc>
|
||||||
<QtMoc Include="audioconverter.h" />
|
|
||||||
<ClInclude Include="resampler\arch.h" />
|
<ClInclude Include="resampler\arch.h" />
|
||||||
|
<QtMoc Include="audioconverter.h">
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
</QtMoc>
|
||||||
<QtMoc Include="audiohandler.h">
|
<QtMoc Include="audiohandler.h">
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
</QtMoc>
|
</QtMoc>
|
||||||
<ClInclude Include="audiotaper.h" />
|
<ClInclude Include="audiotaper.h" />
|
||||||
<QtMoc Include="calibrationwindow.h">
|
<QtMoc Include="calibrationwindow.h">
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
</QtMoc>
|
</QtMoc>
|
||||||
<QtMoc Include="commhandler.h">
|
<QtMoc Include="commhandler.h">
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
</QtMoc>
|
</QtMoc>
|
||||||
<ClInclude Include="freqmemory.h" />
|
<ClInclude Include="freqmemory.h" />
|
||||||
<ClInclude Include="logcategories.h" />
|
<ClInclude Include="logcategories.h" />
|
||||||
<QtMoc Include="meter.h">
|
<QtMoc Include="meter.h">
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
</QtMoc>
|
</QtMoc>
|
||||||
<ClInclude Include="packettypes.h" />
|
<ClInclude Include="packettypes.h" />
|
||||||
|
<QtMoc Include="pahandler.h">
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
</QtMoc>
|
||||||
<QtMoc Include="pttyhandler.h">
|
<QtMoc Include="pttyhandler.h">
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
</QtMoc>
|
</QtMoc>
|
||||||
<QtMoc Include="..\qcustomplot\qcustomplot.h">
|
<QtMoc Include="..\qcustomplot\qcustomplot.h">
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
</QtMoc>
|
</QtMoc>
|
||||||
<QtMoc Include="qledlabel.h">
|
<QtMoc Include="qledlabel.h">
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
</QtMoc>
|
</QtMoc>
|
||||||
<ClInclude Include="repeaterattributes.h" />
|
<ClInclude Include="repeaterattributes.h" />
|
||||||
<QtMoc Include="repeatersetup.h">
|
<QtMoc Include="repeatersetup.h">
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
</QtMoc>
|
</QtMoc>
|
||||||
<ClInclude Include="resampler\resample_sse.h" />
|
<ClInclude Include="resampler\resample_sse.h" />
|
||||||
<QtMoc Include="rigcommander.h">
|
<QtMoc Include="rigcommander.h">
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
</QtMoc>
|
</QtMoc>
|
||||||
<QtMoc Include="rigctld.h">
|
<QtMoc Include="rigctld.h">
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
</QtMoc>
|
</QtMoc>
|
||||||
<ClInclude Include="rigidentities.h" />
|
<ClInclude Include="rigidentities.h" />
|
||||||
|
<QtMoc Include="rthandler.h">
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
</QtMoc>
|
||||||
<QtMoc Include="satellitesetup.h">
|
<QtMoc Include="satellitesetup.h">
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
</QtMoc>
|
</QtMoc>
|
||||||
<QtMoc Include="selectradio.h">
|
<QtMoc Include="selectradio.h">
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
</QtMoc>
|
</QtMoc>
|
||||||
<ClInclude Include="resampler\speex_resampler.h" />
|
<ClInclude Include="resampler\speex_resampler.h" />
|
||||||
<QtMoc Include="tcpserver.h">
|
<QtMoc Include="tcpserver.h">
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
</QtMoc>
|
</QtMoc>
|
||||||
<QtMoc Include="transceiveradjustments.h">
|
<QtMoc Include="transceiveradjustments.h">
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
</QtMoc>
|
||||||
|
<QtMoc Include="udpaudio.h">
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
</QtMoc>
|
||||||
|
<ClInclude Include="udpbase.h" />
|
||||||
|
<QtMoc Include="udpcivdata.h">
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
</QtMoc>
|
</QtMoc>
|
||||||
<QtMoc Include="udphandler.h">
|
<QtMoc Include="udphandler.h">
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
</QtMoc>
|
</QtMoc>
|
||||||
<QtMoc Include="udpserver.h">
|
<QtMoc Include="udpserver.h">
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
</QtMoc>
|
</QtMoc>
|
||||||
<QtMoc Include="udpaudio.h" />
|
|
||||||
<ClInclude Include="udpbase.h" />
|
|
||||||
<QtMoc Include="udpcivdata.h" />
|
|
||||||
<ClInclude Include="ulaw.h" />
|
<ClInclude Include="ulaw.h" />
|
||||||
<QtMoc Include="wfmain.h">
|
<QtMoc Include="wfmain.h">
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
</QtMoc>
|
</QtMoc>
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
<CustomBuild Include="debug\moc_predefs.h.cbt">
|
<CustomBuild Include="debug\moc_predefs.h.cbt">
|
||||||
<FileType>Document</FileType>
|
<FileType>Document</FileType>
|
||||||
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">true</ExcludedFromBuild>
|
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">true</ExcludedFromBuild>
|
||||||
|
@ -296,21 +434,127 @@
|
||||||
<Outputs Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">release\moc_predefs.h;%(Outputs)</Outputs>
|
<Outputs Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">release\moc_predefs.h;%(Outputs)</Outputs>
|
||||||
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">true</ExcludedFromBuild>
|
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">true</ExcludedFromBuild>
|
||||||
</CustomBuild>
|
</CustomBuild>
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
<QtUic Include="aboutbox.ui">
|
<QtUic Include="aboutbox.ui">
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
</QtUic>
|
</QtUic>
|
||||||
<QtUic Include="calibrationwindow.ui">
|
<QtUic Include="calibrationwindow.ui">
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
</QtUic>
|
</QtUic>
|
||||||
<QtUic Include="repeatersetup.ui">
|
<QtUic Include="repeatersetup.ui">
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
</QtUic>
|
</QtUic>
|
||||||
<QtUic Include="satellitesetup.ui">
|
<QtUic Include="satellitesetup.ui">
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
</QtUic>
|
</QtUic>
|
||||||
<QtUic Include="selectradio.ui">
|
<QtUic Include="selectradio.ui">
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
</QtUic>
|
</QtUic>
|
||||||
<QtUic Include="transceiveradjustments.ui">
|
<QtUic Include="transceiveradjustments.ui">
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
</QtUic>
|
</QtUic>
|
||||||
<QtUic Include="wfmain.ui">
|
<QtUic Include="wfmain.ui">
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
</QtUic>
|
</QtUic>
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
|
@ -344,16 +588,30 @@
|
||||||
<None Include="qdarkstyle\rc\radio_unchecked_disabled.png" />
|
<None Include="qdarkstyle\rc\radio_unchecked_disabled.png" />
|
||||||
<None Include="qdarkstyle\rc\radio_unchecked_focus.png" />
|
<None Include="qdarkstyle\rc\radio_unchecked_focus.png" />
|
||||||
<QtRcc Include="resources\resources.qrc">
|
<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.png" />
|
||||||
<None Include="qdarkstyle\rc\right_arrow_disabled.png" />
|
<None Include="qdarkstyle\rc\right_arrow_disabled.png" />
|
||||||
<None Include="qdarkstyle\rc\sizegrip.png" />
|
<None Include="qdarkstyle\rc\sizegrip.png" />
|
||||||
<QtRcc Include="qdarkstyle\style.qrc">
|
<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\style.qss" />
|
||||||
<None Include="qdarkstyle\rc\stylesheet-branch-end.png" />
|
<None Include="qdarkstyle\rc\stylesheet-branch-end.png" />
|
||||||
<None Include="qdarkstyle\rc\stylesheet-branch-more.png" />
|
<None Include="qdarkstyle\rc\stylesheet-branch-more.png" />
|
||||||
|
@ -367,9 +625,6 @@
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
<ResourceCompile Include=".\wfview_resource.rc" />
|
<ResourceCompile Include=".\wfview_resource.rc" />
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
|
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" /><ImportGroup Condition="Exists('$(QtMsBuild)\qt.targets')"><Import Project="$(QtMsBuild)\qt.targets" /></ImportGroup>
|
||||||
<ImportGroup Condition="Exists('$(QtMsBuild)\qt.targets')">
|
|
||||||
<Import Project="$(QtMsBuild)\qt.targets" />
|
|
||||||
</ImportGroup>
|
|
||||||
<ImportGroup Label="ExtensionTargets" />
|
<ImportGroup Label="ExtensionTargets" />
|
||||||
</Project>
|
</Project>
|
|
@ -47,9 +47,15 @@
|
||||||
</Filter>
|
</Filter>
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
|
<ClCompile Include="..\rtaudio\RTAudio.cpp">
|
||||||
|
<Filter>Source Files</Filter>
|
||||||
|
</ClCompile>
|
||||||
<ClCompile Include="aboutbox.cpp">
|
<ClCompile Include="aboutbox.cpp">
|
||||||
<Filter>Source Files</Filter>
|
<Filter>Source Files</Filter>
|
||||||
</ClCompile>
|
</ClCompile>
|
||||||
|
<ClCompile Include="audioconverter.cpp">
|
||||||
|
<Filter>Source Files</Filter>
|
||||||
|
</ClCompile>
|
||||||
<ClCompile Include="audiohandler.cpp">
|
<ClCompile Include="audiohandler.cpp">
|
||||||
<Filter>Source Files</Filter>
|
<Filter>Source Files</Filter>
|
||||||
</ClCompile>
|
</ClCompile>
|
||||||
|
@ -71,6 +77,9 @@
|
||||||
<ClCompile Include="meter.cpp">
|
<ClCompile Include="meter.cpp">
|
||||||
<Filter>Source Files</Filter>
|
<Filter>Source Files</Filter>
|
||||||
</ClCompile>
|
</ClCompile>
|
||||||
|
<ClCompile Include="pahandler.cpp">
|
||||||
|
<Filter>Source Files</Filter>
|
||||||
|
</ClCompile>
|
||||||
<ClCompile Include="pttyhandler.cpp">
|
<ClCompile Include="pttyhandler.cpp">
|
||||||
<Filter>Source Files</Filter>
|
<Filter>Source Files</Filter>
|
||||||
</ClCompile>
|
</ClCompile>
|
||||||
|
@ -95,6 +104,9 @@
|
||||||
<ClCompile Include="rigidentities.cpp">
|
<ClCompile Include="rigidentities.cpp">
|
||||||
<Filter>Source Files</Filter>
|
<Filter>Source Files</Filter>
|
||||||
</ClCompile>
|
</ClCompile>
|
||||||
|
<ClCompile Include="rthandler.cpp">
|
||||||
|
<Filter>Source Files</Filter>
|
||||||
|
</ClCompile>
|
||||||
<ClCompile Include="satellitesetup.cpp">
|
<ClCompile Include="satellitesetup.cpp">
|
||||||
<Filter>Source Files</Filter>
|
<Filter>Source Files</Filter>
|
||||||
</ClCompile>
|
</ClCompile>
|
||||||
|
@ -107,6 +119,15 @@
|
||||||
<ClCompile Include="transceiveradjustments.cpp">
|
<ClCompile Include="transceiveradjustments.cpp">
|
||||||
<Filter>Source Files</Filter>
|
<Filter>Source Files</Filter>
|
||||||
</ClCompile>
|
</ClCompile>
|
||||||
|
<ClCompile Include="udpaudio.cpp">
|
||||||
|
<Filter>Source Files</Filter>
|
||||||
|
</ClCompile>
|
||||||
|
<ClCompile Include="udpbase.cpp">
|
||||||
|
<Filter>Source Files</Filter>
|
||||||
|
</ClCompile>
|
||||||
|
<ClCompile Include="udpcivdata.cpp">
|
||||||
|
<Filter>Source Files</Filter>
|
||||||
|
</ClCompile>
|
||||||
<ClCompile Include="udphandler.cpp">
|
<ClCompile Include="udphandler.cpp">
|
||||||
<Filter>Source Files</Filter>
|
<Filter>Source Files</Filter>
|
||||||
</ClCompile>
|
</ClCompile>
|
||||||
|
@ -116,26 +137,20 @@
|
||||||
<ClCompile Include="wfmain.cpp">
|
<ClCompile Include="wfmain.cpp">
|
||||||
<Filter>Source Files</Filter>
|
<Filter>Source Files</Filter>
|
||||||
</ClCompile>
|
</ClCompile>
|
||||||
<ClCompile Include="audioconverter.cpp">
|
|
||||||
<Filter>Source Files</Filter>
|
|
||||||
</ClCompile>
|
|
||||||
<ClCompile Include="udpbase.cpp">
|
|
||||||
<Filter>Source Files</Filter>
|
|
||||||
</ClCompile>
|
|
||||||
<ClCompile Include="udpaudio.cpp">
|
|
||||||
<Filter>Source Files</Filter>
|
|
||||||
</ClCompile>
|
|
||||||
<ClCompile Include="udpcivdata.cpp">
|
|
||||||
<Filter>Source Files</Filter>
|
|
||||||
</ClCompile>
|
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
|
<ClInclude Include="..\rtaudio\RTAUdio.h">
|
||||||
|
<Filter>Header Files</Filter>
|
||||||
|
</ClInclude>
|
||||||
<QtMoc Include="aboutbox.h">
|
<QtMoc Include="aboutbox.h">
|
||||||
<Filter>Header Files</Filter>
|
<Filter>Header Files</Filter>
|
||||||
</QtMoc>
|
</QtMoc>
|
||||||
<ClInclude Include="resampler\arch.h">
|
<ClInclude Include="resampler\arch.h">
|
||||||
<Filter>Header Files</Filter>
|
<Filter>Header Files</Filter>
|
||||||
</ClInclude>
|
</ClInclude>
|
||||||
|
<QtMoc Include="audioconverter.h">
|
||||||
|
<Filter>Header Files</Filter>
|
||||||
|
</QtMoc>
|
||||||
<QtMoc Include="audiohandler.h">
|
<QtMoc Include="audiohandler.h">
|
||||||
<Filter>Header Files</Filter>
|
<Filter>Header Files</Filter>
|
||||||
</QtMoc>
|
</QtMoc>
|
||||||
|
@ -160,6 +175,9 @@
|
||||||
<ClInclude Include="packettypes.h">
|
<ClInclude Include="packettypes.h">
|
||||||
<Filter>Header Files</Filter>
|
<Filter>Header Files</Filter>
|
||||||
</ClInclude>
|
</ClInclude>
|
||||||
|
<QtMoc Include="pahandler.h">
|
||||||
|
<Filter>Header Files</Filter>
|
||||||
|
</QtMoc>
|
||||||
<QtMoc Include="pttyhandler.h">
|
<QtMoc Include="pttyhandler.h">
|
||||||
<Filter>Header Files</Filter>
|
<Filter>Header Files</Filter>
|
||||||
</QtMoc>
|
</QtMoc>
|
||||||
|
@ -187,6 +205,9 @@
|
||||||
<ClInclude Include="rigidentities.h">
|
<ClInclude Include="rigidentities.h">
|
||||||
<Filter>Header Files</Filter>
|
<Filter>Header Files</Filter>
|
||||||
</ClInclude>
|
</ClInclude>
|
||||||
|
<QtMoc Include="rthandler.h">
|
||||||
|
<Filter>Header Files</Filter>
|
||||||
|
</QtMoc>
|
||||||
<QtMoc Include="satellitesetup.h">
|
<QtMoc Include="satellitesetup.h">
|
||||||
<Filter>Header Files</Filter>
|
<Filter>Header Files</Filter>
|
||||||
</QtMoc>
|
</QtMoc>
|
||||||
|
@ -202,6 +223,15 @@
|
||||||
<QtMoc Include="transceiveradjustments.h">
|
<QtMoc Include="transceiveradjustments.h">
|
||||||
<Filter>Header Files</Filter>
|
<Filter>Header Files</Filter>
|
||||||
</QtMoc>
|
</QtMoc>
|
||||||
|
<QtMoc Include="udpaudio.h">
|
||||||
|
<Filter>Header Files</Filter>
|
||||||
|
</QtMoc>
|
||||||
|
<ClInclude Include="udpbase.h">
|
||||||
|
<Filter>Header Files</Filter>
|
||||||
|
</ClInclude>
|
||||||
|
<QtMoc Include="udpcivdata.h">
|
||||||
|
<Filter>Header Files</Filter>
|
||||||
|
</QtMoc>
|
||||||
<QtMoc Include="udphandler.h">
|
<QtMoc Include="udphandler.h">
|
||||||
<Filter>Header Files</Filter>
|
<Filter>Header Files</Filter>
|
||||||
</QtMoc>
|
</QtMoc>
|
||||||
|
@ -214,23 +244,71 @@
|
||||||
<QtMoc Include="wfmain.h">
|
<QtMoc Include="wfmain.h">
|
||||||
<Filter>Header Files</Filter>
|
<Filter>Header Files</Filter>
|
||||||
</QtMoc>
|
</QtMoc>
|
||||||
<QtMoc Include="audioconverter.h">
|
|
||||||
<Filter>Header Files</Filter>
|
|
||||||
</QtMoc>
|
|
||||||
<QtMoc Include="udpcivdata.h">
|
|
||||||
<Filter>Header Files</Filter>
|
|
||||||
</QtMoc>
|
|
||||||
<QtMoc Include="udpaudio.h">
|
|
||||||
<Filter>Header Files</Filter>
|
|
||||||
</QtMoc>
|
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
<CustomBuild Include="debug\moc_predefs.h.cbt">
|
<CustomBuild Include="debug\moc_predefs.h.cbt">
|
||||||
<Filter>Generated Files</Filter>
|
<Filter>Generated Files</Filter>
|
||||||
</CustomBuild>
|
</CustomBuild>
|
||||||
<CustomBuild Include="release\moc_predefs.h.cbt">
|
<CustomBuild Include="release\moc_predefs.h.cbt">
|
||||||
<Filter>Generated Files</Filter>
|
<Filter>Generated Files</Filter>
|
||||||
</CustomBuild>
|
</CustomBuild>
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
<QtUic Include="aboutbox.ui">
|
<QtUic Include="aboutbox.ui">
|
||||||
|
@ -387,11 +465,6 @@
|
||||||
</None>
|
</None>
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
<ResourceCompile Include=".\wfview_resource.rc" />
|
<ResourceCompile Include="C:\Users\Phil\source\repos\wfview\wfview_resource.rc" />
|
||||||
</ItemGroup>
|
|
||||||
<ItemGroup>
|
|
||||||
<ClInclude Include="udpbase.h">
|
|
||||||
<Filter>Header Files</Filter>
|
|
||||||
</ClInclude>
|
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
</Project>
|
</Project>
|
Ładowanie…
Reference in New Issue