Fix wfserver device detection

half-duplex
Phil Taylor 2023-01-02 13:39:59 +00:00
rodzic e6a5152734
commit 39dacf54f2
8 zmienionych plików z 68 dodań i 168 usunięć

Wyświetl plik

@ -82,6 +82,7 @@ void audioDevices::enumerate()
"(" << numInputDevices << ") Input Device : " << deviceInfo.description(); "(" << numInputDevices << ") Input Device : " << deviceInfo.description();
#endif #endif
#ifndef BUILD_WFSERVER
#if (QT_VERSION < QT_VERSION_CHECK(6,0,0)) #if (QT_VERSION < QT_VERSION_CHECK(6,0,0))
if (fm.boundingRect(deviceInfo.deviceName()).width() > numCharsIn) if (fm.boundingRect(deviceInfo.deviceName()).width() > numCharsIn)
numCharsIn = fm.boundingRect(deviceInfo.deviceName()).width(); numCharsIn = fm.boundingRect(deviceInfo.deviceName()).width();
@ -89,6 +90,7 @@ void audioDevices::enumerate()
if (fm.boundingRect(deviceInfo.description()).width() > numCharsIn) if (fm.boundingRect(deviceInfo.description()).width() > numCharsIn)
numCharsIn = fm.boundingRect(deviceInfo.description()).width(); numCharsIn = fm.boundingRect(deviceInfo.description()).width();
#endif #endif
#endif
#if (defined(Q_OS_WIN) && (QT_VERSION < QT_VERSION_CHECK(6,0,0))) #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(); "(" << numOutputDevices << ") Output Device : " << deviceInfo.description();
#endif #endif
#ifndef BUILD_WFSERVER
#if (QT_VERSION < QT_VERSION_CHECK(6,0,0)) #if (QT_VERSION < QT_VERSION_CHECK(6,0,0))
if (fm.boundingRect(deviceInfo.deviceName()).width() > numCharsOut) if (fm.boundingRect(deviceInfo.deviceName()).width() > numCharsOut)
numCharsOut = fm.boundingRect(deviceInfo.deviceName()).width(); numCharsOut = fm.boundingRect(deviceInfo.deviceName()).width();
@ -147,6 +150,7 @@ void audioDevices::enumerate()
if (fm.boundingRect(deviceInfo.description()).width() > numCharsOut) if (fm.boundingRect(deviceInfo.description()).width() > numCharsOut)
numCharsOut = fm.boundingRect(deviceInfo.description()).width(); numCharsOut = fm.boundingRect(deviceInfo.description()).width();
#endif #endif
#endif
#if (defined(Q_OS_WIN) && (QT_VERSION < QT_VERSION_CHECK(6,0,0))) #if (defined(Q_OS_WIN) && (QT_VERSION < QT_VERSION_CHECK(6,0,0)))
} }
@ -186,8 +190,10 @@ void audioDevices::enumerate()
isDefault = true; isDefault = true;
} }
inputs.append(audioDevice(QString(info->name), i,isDefault)); inputs.append(audioDevice(QString(info->name), i,isDefault));
#ifndef BUILD_WFSERVER
if (fm.boundingRect(QString(info->name)).width() > numCharsIn) if (fm.boundingRect(QString(info->name)).width() > numCharsIn)
numCharsIn = fm.boundingRect(QString(info->name)).width(); numCharsIn = fm.boundingRect(QString(info->name)).width();
#endif
} }
if (info->maxOutputChannels > 0) { if (info->maxOutputChannels > 0) {
@ -199,8 +205,10 @@ void audioDevices::enumerate()
isDefault = true; isDefault = true;
} }
outputs.append(audioDevice(QString(info->name), i,isDefault)); outputs.append(audioDevice(QString(info->name), i,isDefault));
#ifndef BUILD_WFSERVER
if (fm.boundingRect(QString(info->name)).width() > numCharsOut) if (fm.boundingRect(QString(info->name)).width() > numCharsOut)
numCharsOut = fm.boundingRect(QString(info->name)).width(); numCharsOut = fm.boundingRect(QString(info->name)).width();
#endif
} }
} }
break; break;
@ -260,9 +268,10 @@ void audioDevices::enumerate()
} }
inputs.append(audioDevice(QString::fromStdString(info.name), i, isDefault)); inputs.append(audioDevice(QString::fromStdString(info.name), i, isDefault));
#ifndef BUILD_WFSERVER
if (fm.boundingRect(QString::fromStdString(info.name)).width() > numCharsIn) if (fm.boundingRect(QString::fromStdString(info.name)).width() > numCharsIn)
numCharsIn = fm.boundingRect(QString::fromStdString(info.name)).width(); numCharsIn = fm.boundingRect(QString::fromStdString(info.name)).width();
#endif
} }
if (info.outputChannels > 0) { if (info.outputChannels > 0) {
@ -276,9 +285,10 @@ void audioDevices::enumerate()
} }
outputs.append(audioDevice(QString::fromStdString(info.name), i, isDefault)); outputs.append(audioDevice(QString::fromStdString(info.name), i, isDefault));
#ifndef BUILD_WFSERVER
if (fm.boundingRect(QString::fromStdString(info.name)).width() > numCharsOut) if (fm.boundingRect(QString::fromStdString(info.name)).width() > numCharsOut)
numCharsOut = fm.boundingRect(QString::fromStdString(info.name)).width(); numCharsOut = fm.boundingRect(QString::fromStdString(info.name)).width();
#endif
} }
} }

Wyświetl plik

@ -28,6 +28,7 @@ servermain::servermain(const QString settingsFile)
qRegisterMetaType<rigstate*>(); qRegisterMetaType<rigstate*>();
qRegisterMetaType<QList<radio_cap_packet>>(); qRegisterMetaType<QList<radio_cap_packet>>();
qRegisterMetaType<networkStatus>(); qRegisterMetaType<networkStatus>();
qRegisterMetaType<codecType>();
setDefPrefs(); setDefPrefs();
@ -35,6 +36,10 @@ servermain::servermain(const QString settingsFile)
loadSettings(); // Look for saved preferences loadSettings(); // Look for saved preferences
audioDev = new audioDevices(prefs.audioSystem, QFontMetrics(QFont()));
connect(audioDev, SIGNAL(updated()), this, SLOT(updateAudioDevices()));
audioDev->enumerate();
setInitialTiming(); setInitialTiming();
openRig(); openRig();
@ -62,6 +67,10 @@ servermain::~servermain()
serverThread->wait(); serverThread->wait();
} }
if (audioDev != Q_NULLPTR) {
delete audioDev;
}
delete settings; delete settings;
#if defined(PORTAUDIO) #if defined(PORTAUDIO)
@ -527,6 +536,7 @@ void servermain::loadSettings()
tempPrefs->rig = Q_NULLPTR; tempPrefs->rig = Q_NULLPTR;
tempPrefs->rigThread = Q_NULLPTR; tempPrefs->rigThread = Q_NULLPTR;
serverConfig.rigs.append(tempPrefs); serverConfig.rigs.append(tempPrefs);
if (tempNum == 0) { if (tempNum == 0) {
settings->endGroup(); 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<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);
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"); settings->beginGroup("Server");
serverConfig.enabled = settings->value("ServerEnabled", false).toBool(); serverConfig.enabled = settings->value("ServerEnabled", false).toBool();
serverConfig.controlPort = settings->value("ServerControlPort", 50001).toInt(); 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) void servermain::receivePTTstatus(bool pttOn)
{ {

Wyświetl plik

@ -20,6 +20,7 @@
#include "freqmemory.h" #include "freqmemory.h"
#include "rigidentities.h" #include "rigidentities.h"
#include "repeaterattributes.h" #include "repeaterattributes.h"
#include "audiodevices.h"
#include "udpserver.h" #include "udpserver.h"
#include "rigctld.h" #include "rigctld.h"
@ -181,6 +182,7 @@ private slots:
void receiveStatusUpdate(networkStatus status); void receiveStatusUpdate(networkStatus status);
void receiveStateInfo(rigstate* state); void receiveStateInfo(rigstate* state);
void connectToRig(RIGCONFIG* rig); void connectToRig(RIGCONFIG* rig);
void updateAudioDevices();
private: private:
QSettings *settings=Q_NULLPTR; QSettings *settings=Q_NULLPTR;
@ -282,6 +284,8 @@ private:
rigstate* rigState = Q_NULLPTR; rigstate* rigState = Q_NULLPTR;
audioDevices* audioDev = Q_NULLPTR;
SERVERCONFIG serverConfig; SERVERCONFIG serverConfig;
}; };
@ -300,6 +304,7 @@ Q_DECLARE_METATYPE(QList<radio_cap_packet>)
Q_DECLARE_METATYPE(enum meterKind) Q_DECLARE_METATYPE(enum meterKind)
Q_DECLARE_METATYPE(enum spectrumMode) Q_DECLARE_METATYPE(enum spectrumMode)
Q_DECLARE_METATYPE(rigstate*) Q_DECLARE_METATYPE(rigstate*)
Q_DECLARE_METATYPE(codecType)
#endif // WFMAIN_H #endif // WFMAIN_H

Wyświetl plik

@ -242,7 +242,7 @@ void wfmain::openRig()
//TODO: if(hasRunPreviously) //TODO: if(hasRunPreviously)
//TODO: if(useNetwork){... //TODO: if(useNetwork){...
// } else { // } else {
// if (prefs.fileWasNotFound) { // if (prefs.fileWasNotFound) {

Wyświetl plik

@ -142,7 +142,8 @@ SOURCES += main.cpp\
resampler/resample.c \ resampler/resample.c \
rigctld.cpp \ rigctld.cpp \
tcpserver.cpp \ tcpserver.cpp \
keyboard.cpp keyboard.cpp \
audiodevices.cpp
HEADERS += servermain.h \ HEADERS += servermain.h \
commhandler.h \ commhandler.h \
@ -170,4 +171,5 @@ HEADERS += servermain.h \
tcpserver.h \ tcpserver.h \
audiotaper.h \ audiotaper.h \
keyboard.h \ keyboard.h \
wfviewtypes.h wfviewtypes.h \
audiodevices.h

Wyświetl plik

@ -352,6 +352,7 @@
<ItemGroup> <ItemGroup>
<ClCompile Include="..\rtaudio\RTAudio.cpp" /> <ClCompile Include="..\rtaudio\RTAudio.cpp" />
<ClCompile Include="audioconverter.cpp" /> <ClCompile Include="audioconverter.cpp" />
<ClCompile Include="audiodevices.cpp" />
<ClCompile Include="audiohandler.cpp" /> <ClCompile Include="audiohandler.cpp" />
<ClCompile Include="commhandler.cpp" /> <ClCompile Include="commhandler.cpp" />
<ClCompile Include="freqmemory.cpp" /> <ClCompile Include="freqmemory.cpp" />
@ -375,6 +376,7 @@
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>
<ClInclude Include="..\rtaudio\RTAUdio.h" /> <ClInclude Include="..\rtaudio\RTAUdio.h" />
<QtMoc Include="audiodevices.h" />
<ClInclude Include="resampler\arch.h" /> <ClInclude Include="resampler\arch.h" />
<QtMoc Include="audioconverter.h"> <QtMoc Include="audioconverter.h">
</QtMoc> </QtMoc>

Wyświetl plik

@ -103,6 +103,9 @@
<ClCompile Include="udpserver.cpp"> <ClCompile Include="udpserver.cpp">
<Filter>Source Files</Filter> <Filter>Source Files</Filter>
</ClCompile> </ClCompile>
<ClCompile Include="audiodevices.cpp">
<Filter>Source Files</Filter>
</ClCompile>
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>
<ClInclude Include="..\rtaudio\RTAUdio.h"> <ClInclude Include="..\rtaudio\RTAUdio.h">
@ -329,4 +332,9 @@
<ItemGroup> <ItemGroup>
<ResourceCompile Include=".\wfserver_resource.rc" /> <ResourceCompile Include=".\wfserver_resource.rc" />
</ItemGroup> </ItemGroup>
<ItemGroup>
<QtMoc Include="audiodevices.h">
<Filter>Header Files</Filter>
</QtMoc>
</ItemGroup>
</Project> </Project>

Wyświetl plik

@ -16,17 +16,17 @@ Global
EndGlobalSection EndGlobalSection
GlobalSection(ProjectConfigurationPlatforms) = postSolution GlobalSection(ProjectConfigurationPlatforms) = postSolution
{326108AD-FA9D-3AAF-8D3E-062C4DDC34E2}.Debug|Win32.ActiveCfg = Debug|Win32 {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.ActiveCfg = Debug|x64
{326108AD-FA9D-3AAF-8D3E-062C4DDC34E2}.Debug|x64.Build.0 = 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.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.ActiveCfg = Release|x64
{326108AD-FA9D-3AAF-8D3E-062C4DDC34E2}.Release|x64.Build.0 = 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.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.ActiveCfg = Debug|x64
{00E054F8-A1D4-3ECA-A8D6-DFC8A68AFD56}.Debug|x64.Build.0 = 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.ActiveCfg = Release|Win32
{00E054F8-A1D4-3ECA-A8D6-DFC8A68AFD56}.Release|Win32.Build.0 = Release|Win32
{00E054F8-A1D4-3ECA-A8D6-DFC8A68AFD56}.Release|x64.ActiveCfg = Release|x64 {00E054F8-A1D4-3ECA-A8D6-DFC8A68AFD56}.Release|x64.ActiveCfg = Release|x64
EndGlobalSection EndGlobalSection
GlobalSection(SolutionProperties) = preSolution GlobalSection(SolutionProperties) = preSolution