diff --git a/audiodevices.cpp b/audiodevices.cpp index c364983..30370c1 100644 --- a/audiodevices.cpp +++ b/audiodevices.cpp @@ -82,6 +82,7 @@ void audioDevices::enumerate() "(" << numInputDevices << ") Input Device : " << deviceInfo.description(); #endif +#ifndef BUILD_WFSERVER #if (QT_VERSION < QT_VERSION_CHECK(6,0,0)) if (fm.boundingRect(deviceInfo.deviceName()).width() > numCharsIn) numCharsIn = fm.boundingRect(deviceInfo.deviceName()).width(); @@ -89,6 +90,7 @@ void audioDevices::enumerate() if (fm.boundingRect(deviceInfo.description()).width() > numCharsIn) numCharsIn = fm.boundingRect(deviceInfo.description()).width(); #endif +#endif #if (defined(Q_OS_WIN) && (QT_VERSION < QT_VERSION_CHECK(6,0,0))) } @@ -140,6 +142,7 @@ void audioDevices::enumerate() "(" << numOutputDevices << ") Output Device : " << deviceInfo.description(); #endif +#ifndef BUILD_WFSERVER #if (QT_VERSION < QT_VERSION_CHECK(6,0,0)) if (fm.boundingRect(deviceInfo.deviceName()).width() > numCharsOut) numCharsOut = fm.boundingRect(deviceInfo.deviceName()).width(); @@ -147,6 +150,7 @@ void audioDevices::enumerate() if (fm.boundingRect(deviceInfo.description()).width() > numCharsOut) numCharsOut = fm.boundingRect(deviceInfo.description()).width(); #endif +#endif #if (defined(Q_OS_WIN) && (QT_VERSION < QT_VERSION_CHECK(6,0,0))) } @@ -186,8 +190,10 @@ void audioDevices::enumerate() isDefault = true; } inputs.append(audioDevice(QString(info->name), i,isDefault)); +#ifndef BUILD_WFSERVER if (fm.boundingRect(QString(info->name)).width() > numCharsIn) numCharsIn = fm.boundingRect(QString(info->name)).width(); +#endif } if (info->maxOutputChannels > 0) { @@ -199,8 +205,10 @@ void audioDevices::enumerate() isDefault = true; } outputs.append(audioDevice(QString(info->name), i,isDefault)); +#ifndef BUILD_WFSERVER if (fm.boundingRect(QString(info->name)).width() > numCharsOut) numCharsOut = fm.boundingRect(QString(info->name)).width(); +#endif } } break; @@ -260,9 +268,10 @@ void audioDevices::enumerate() } inputs.append(audioDevice(QString::fromStdString(info.name), i, isDefault)); - +#ifndef BUILD_WFSERVER if (fm.boundingRect(QString::fromStdString(info.name)).width() > numCharsIn) numCharsIn = fm.boundingRect(QString::fromStdString(info.name)).width(); +#endif } if (info.outputChannels > 0) { @@ -276,9 +285,10 @@ void audioDevices::enumerate() } outputs.append(audioDevice(QString::fromStdString(info.name), i, isDefault)); - +#ifndef BUILD_WFSERVER if (fm.boundingRect(QString::fromStdString(info.name)).width() > numCharsOut) numCharsOut = fm.boundingRect(QString::fromStdString(info.name)).width(); +#endif } } diff --git a/servermain.cpp b/servermain.cpp index 2d39d5e..6312523 100644 --- a/servermain.cpp +++ b/servermain.cpp @@ -28,6 +28,7 @@ servermain::servermain(const QString settingsFile) qRegisterMetaType(); qRegisterMetaType>(); qRegisterMetaType(); + qRegisterMetaType(); setDefPrefs(); @@ -35,6 +36,10 @@ servermain::servermain(const QString settingsFile) loadSettings(); // Look for saved preferences + audioDev = new audioDevices(prefs.audioSystem, QFontMetrics(QFont())); + connect(audioDev, SIGNAL(updated()), this, SLOT(updateAudioDevices())); + audioDev->enumerate(); + setInitialTiming(); openRig(); @@ -62,6 +67,10 @@ servermain::~servermain() serverThread->wait(); } + if (audioDev != Q_NULLPTR) { + delete audioDev; + } + delete settings; #if defined(PORTAUDIO) @@ -527,6 +536,7 @@ void servermain::loadSettings() tempPrefs->rig = Q_NULLPTR; tempPrefs->rigThread = Q_NULLPTR; + serverConfig.rigs.append(tempPrefs); if (tempNum == 0) { settings->endGroup(); @@ -537,167 +547,6 @@ void servermain::loadSettings() } - /* - Now we have an array of rig objects, we need to match the configured audio devices with physical devices - */ - switch (prefs.audioSystem) - { - case rtAudio: - { -#if defined(Q_OS_LINUX) - RtAudio* audio = new RtAudio(RtAudio::Api::LINUX_ALSA); -// RtAudio* audio = new RtAudio(RtAudio::Api::LINUX_PULSE); -#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 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); - for (RIGCONFIG* rig : serverConfig.rigs) - { - qDebug(logAudio()) << "Rig" << rig->rigName << "rxAudio device:" << rig->rxAudioSetup.name; - qDebug(logAudio()) << "Rig" << rig->rigName << "txAudio device:" << rig->txAudioSetup.name; - if (info.outputChannels > 0) - { - qInfo(logAudio()) << (info.isDefaultOutput ? "*" : " ") << "(" << i << ") Output Device : " << QString::fromStdString(info.name); - if (rig->txAudioSetup.name.toStdString() == info.name) { - rig->txAudioSetup.portInt = i; - qDebug(logAudio()) << "Rig" << rig->rigName << "Selected txAudio device:" << QString(info.name.c_str()); - } - } - if (info.inputChannels > 0) - { - qInfo(logAudio()) << (info.isDefaultInput ? "*" : " ") << "(" << i << ") Input Device : " << QString::fromStdString(info.name); - if (rig->rxAudioSetup.name.toStdString() == info.name) { - rig->rxAudioSetup.portInt = i; - qDebug(logAudio()) << "Rig" << rig->rigName << "Selected rxAudio device:" << QString(info.name.c_str()); - } - } - } - } - break; - } - case portAudio: - { - // Use PortAudio device enumeration - - PaError err; - - err = Pa_Initialize(); - - if (err != paNoError) - { - qInfo(logAudio()) << "ERROR: Cannot initialize Portaudio"; - } - - 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); - for (RIGCONFIG* rig : serverConfig.rigs) - { - qDebug(logAudio()) << "Rig" << rig->rigName << "rxAudio device:" << rig->rxAudioSetup.name; - qDebug(logAudio()) << "Rig" << rig->rigName << "txAudio device:" << rig->txAudioSetup.name; - if (info->maxInputChannels > 0) { - qDebug(logAudio()) << (i == Pa_GetDefaultInputDevice() ? "*" : " ") << "(" << i << ") Input Device : " << info->name; - - if (rig->rxAudioSetup.name == info->name) { - qDebug(logAudio()) << "Rig" << rig->rigName << "Selected rxAudio device:" << QString(info->name); - rig->rxAudioSetup.portInt = i; - } - } - if (info->maxOutputChannels > 0) { - if (rig->txAudioSetup.name == info->name) { - qDebug(logAudio()) << "Rig" << rig->rigName << "Selected txAudio device:" << QString(info->name); - rig->txAudioSetup.portInt = i; - } - } - } - } - break; - } - case qtAudio: - { - const auto audioOutputs = QAudioDeviceInfo::availableDevices(QAudio::AudioOutput); - const auto audioInputs = QAudioDeviceInfo::availableDevices(QAudio::AudioInput); - //qInfo(logAudio()) << "Looking for audio input devices"; - for (const QAudioDeviceInfo& deviceInfo : audioInputs) { - qDebug(logSystem()) << "Found Audio input: " << deviceInfo.deviceName(); - for (RIGCONFIG* rig : serverConfig.rigs) - { - qDebug(logAudio()) << "Rig" << rig->rigName << "rxAudio device:" << rig->rxAudioSetup.name; - qDebug(logAudio()) << "Rig" << rig->rigName << "txAudio device:" << rig->txAudioSetup.name; - if (deviceInfo.deviceName() == rig->rxAudioSetup.name -#ifdef Q_OS_WIN - && deviceInfo.realm() == "wasapi" -#endif - ) - { - qDebug(logAudio()) << "Rig" << rig->rigName << "Selected rxAudio device:" << deviceInfo.deviceName(); - rig->rxAudioSetup.port = deviceInfo; - } - } - } - - //qInfo(logAudio()) << "Looking for audio output devices"; - for (const QAudioDeviceInfo& deviceInfo : audioOutputs) { - qDebug(logSystem()) << "Found Audio output: " << deviceInfo.deviceName(); - for (RIGCONFIG* rig : serverConfig.rigs) - { - if (deviceInfo.deviceName() == rig->txAudioSetup.name -#ifdef Q_OS_WIN - && deviceInfo.realm() == "wasapi" -#endif - ) - { - qDebug(logAudio()) << "Rig" << rig->rigName << "Selected txAudio device:" << deviceInfo.deviceName(); - rig->txAudioSetup.port = deviceInfo; - } - } - } - break; - } - } - - - settings->beginGroup("Server"); serverConfig.enabled = settings->value("ServerEnabled", false).toBool(); serverConfig.controlPort = settings->value("ServerControlPort", 50001).toInt(); @@ -731,6 +580,30 @@ void servermain::loadSettings() } +void servermain::updateAudioDevices() +{ + + for (RIGCONFIG* rig : serverConfig.rigs) + { + qDebug(logAudio()) << "Rig" << rig->rigName << "configured rxAudio device:" << rig->rxAudioSetup.name; + qDebug(logAudio()) << "Rig" << rig->rigName << "configured txAudio device:" << rig->txAudioSetup.name; + + int inputNum = audioDev->findInput(rig->rigName, rig->rxAudioSetup.name); + int outputNum = audioDev->findOutput(rig->rigName, rig->txAudioSetup.name); + + if (prefs.audioSystem == qtAudio) { + rig->rxAudioSetup.port = audioDev->getInputDeviceInfo(inputNum); + rig->txAudioSetup.port = audioDev->getOutputDeviceInfo(outputNum); + } + else { + rig->rxAudioSetup.portInt = audioDev->getInputDeviceInt(inputNum); + rig->txAudioSetup.portInt = audioDev->getOutputDeviceInt(outputNum); + } + rig->rxAudioSetup.name = audioDev->getInputName(inputNum); + rig->txAudioSetup.name = audioDev->getOutputName(outputNum); + } + +} void servermain::receivePTTstatus(bool pttOn) { diff --git a/servermain.h b/servermain.h index b04da11..18cbf10 100644 --- a/servermain.h +++ b/servermain.h @@ -20,6 +20,7 @@ #include "freqmemory.h" #include "rigidentities.h" #include "repeaterattributes.h" +#include "audiodevices.h" #include "udpserver.h" #include "rigctld.h" @@ -181,6 +182,7 @@ private slots: void receiveStatusUpdate(networkStatus status); void receiveStateInfo(rigstate* state); void connectToRig(RIGCONFIG* rig); + void updateAudioDevices(); private: QSettings *settings=Q_NULLPTR; @@ -282,6 +284,8 @@ private: rigstate* rigState = Q_NULLPTR; + audioDevices* audioDev = Q_NULLPTR; + SERVERCONFIG serverConfig; }; @@ -300,6 +304,7 @@ Q_DECLARE_METATYPE(QList) Q_DECLARE_METATYPE(enum meterKind) Q_DECLARE_METATYPE(enum spectrumMode) Q_DECLARE_METATYPE(rigstate*) +Q_DECLARE_METATYPE(codecType) #endif // WFMAIN_H diff --git a/wfmain.cpp b/wfmain.cpp index 552aab4..423c5e1 100644 --- a/wfmain.cpp +++ b/wfmain.cpp @@ -242,7 +242,7 @@ void wfmain::openRig() //TODO: if(hasRunPreviously) //TODO: if(useNetwork){... - + // } else { // if (prefs.fileWasNotFound) { diff --git a/wfserver.pro b/wfserver.pro index d50ffa2..54cc187 100644 --- a/wfserver.pro +++ b/wfserver.pro @@ -142,7 +142,8 @@ SOURCES += main.cpp\ resampler/resample.c \ rigctld.cpp \ tcpserver.cpp \ - keyboard.cpp + keyboard.cpp \ + audiodevices.cpp HEADERS += servermain.h \ commhandler.h \ @@ -170,4 +171,5 @@ HEADERS += servermain.h \ tcpserver.h \ audiotaper.h \ keyboard.h \ - wfviewtypes.h + wfviewtypes.h \ + audiodevices.h diff --git a/wfserver.vcxproj b/wfserver.vcxproj index 911e16a..38ffcd5 100644 --- a/wfserver.vcxproj +++ b/wfserver.vcxproj @@ -352,6 +352,7 @@ + @@ -375,6 +376,7 @@ + diff --git a/wfserver.vcxproj.filters b/wfserver.vcxproj.filters index dc19d3b..df3b01d 100644 --- a/wfserver.vcxproj.filters +++ b/wfserver.vcxproj.filters @@ -103,6 +103,9 @@ Source Files + + Source Files + @@ -329,4 +332,9 @@ + + + Header Files + + \ No newline at end of file diff --git a/wfview.sln b/wfview.sln index 40bfb15..b656dd2 100644 --- a/wfview.sln +++ b/wfview.sln @@ -16,17 +16,17 @@ Global EndGlobalSection GlobalSection(ProjectConfigurationPlatforms) = postSolution {326108AD-FA9D-3AAF-8D3E-062C4DDC34E2}.Debug|Win32.ActiveCfg = Debug|Win32 - {326108AD-FA9D-3AAF-8D3E-062C4DDC34E2}.Debug|Win32.Build.0 = Debug|Win32 {326108AD-FA9D-3AAF-8D3E-062C4DDC34E2}.Debug|x64.ActiveCfg = Debug|x64 {326108AD-FA9D-3AAF-8D3E-062C4DDC34E2}.Debug|x64.Build.0 = Debug|x64 {326108AD-FA9D-3AAF-8D3E-062C4DDC34E2}.Release|Win32.ActiveCfg = Release|Win32 - {326108AD-FA9D-3AAF-8D3E-062C4DDC34E2}.Release|Win32.Build.0 = Release|Win32 {326108AD-FA9D-3AAF-8D3E-062C4DDC34E2}.Release|x64.ActiveCfg = Release|x64 {326108AD-FA9D-3AAF-8D3E-062C4DDC34E2}.Release|x64.Build.0 = Release|x64 {00E054F8-A1D4-3ECA-A8D6-DFC8A68AFD56}.Debug|Win32.ActiveCfg = Debug|Win32 + {00E054F8-A1D4-3ECA-A8D6-DFC8A68AFD56}.Debug|Win32.Build.0 = Debug|Win32 {00E054F8-A1D4-3ECA-A8D6-DFC8A68AFD56}.Debug|x64.ActiveCfg = Debug|x64 {00E054F8-A1D4-3ECA-A8D6-DFC8A68AFD56}.Debug|x64.Build.0 = Debug|x64 {00E054F8-A1D4-3ECA-A8D6-DFC8A68AFD56}.Release|Win32.ActiveCfg = Release|Win32 + {00E054F8-A1D4-3ECA-A8D6-DFC8A68AFD56}.Release|Win32.Build.0 = Release|Win32 {00E054F8-A1D4-3ECA-A8D6-DFC8A68AFD56}.Release|x64.ActiveCfg = Release|x64 EndGlobalSection GlobalSection(SolutionProperties) = preSolution