diff --git a/audiodevices.cpp b/audiodevices.cpp index 30370c1..cd28265 100644 --- a/audiodevices.cpp +++ b/audiodevices.cpp @@ -252,11 +252,20 @@ void audioDevices::enumerate() qInfo(logAudio()) << "Current API: " << QString::fromStdString(apiMap[audio->getCurrentApi()]); - unsigned int devices = audio->getDeviceCount(); - qInfo(logAudio()) << "Found:" << devices << " audio device(s) (*=default)"; + unsigned int devicecount = audio->getDeviceCount(); - for (unsigned int i = 1; i < devices; i++) { +#if (RTAUDIO_VERSION_MAJOR > 5) + std::vector devices = audio->getDeviceIds(); +#endif + qInfo(logAudio()) << "Found:" << devicecount << " audio device(s) (*=default)"; + + for (unsigned int i = 1; i < devicecount; i++) { + +#if (RTAUDIO_VERSION_MAJOR > 5) + info = audio->getDeviceInfo(devices[i]); +#else info = audio->getDeviceInfo(i); +#endif if (info.inputChannels > 0) { bool isDefault = false; qInfo(logAudio()) << (info.isDefaultInput ? "*" : " ") << "(" << i << ") Input Device : " << QString::fromStdString(info.name); @@ -267,7 +276,12 @@ void audioDevices::enumerate() isDefault = true; } +#if (RTAUDIO_VERSION_MAJOR > 5) + inputs.append(audioDevice(QString::fromStdString(info.name), devices[i], isDefault)); +#else inputs.append(audioDevice(QString::fromStdString(info.name), i, isDefault)); +#endif + #ifndef BUILD_WFSERVER if (fm.boundingRect(QString::fromStdString(info.name)).width() > numCharsIn) numCharsIn = fm.boundingRect(QString::fromStdString(info.name)).width(); @@ -284,7 +298,12 @@ void audioDevices::enumerate() isDefault = true; } +#if (RTAUDIO_VERSION_MAJOR > 5) + outputs.append(audioDevice(QString::fromStdString(info.name), devices[i], isDefault)); +#else outputs.append(audioDevice(QString::fromStdString(info.name), i, isDefault)); +#endif + #ifndef BUILD_WFSERVER if (fm.boundingRect(QString::fromStdString(info.name)).width() > numCharsOut) numCharsOut = fm.boundingRect(QString::fromStdString(info.name)).width(); @@ -330,6 +349,7 @@ int audioDevices::findInput(QString type, QString name) { int ret = -1; int def = -1; + int usb = -1; QString msg; QTextStream s(&msg); for (int f = 0; f < inputs.size(); f++) @@ -343,6 +363,10 @@ int audioDevices::findInput(QString type, QString name) { def = f; } + if (inputs[f].name.toUpper().contains("USB")) { + // This is a USB device... + usb = f; + } } if (ret == -1) @@ -353,6 +377,11 @@ int audioDevices::findInput(QString type, QString name) s << "Selecting first device " << inputs[0].name; ret = 0; } + else if (usb > -1 && type != "Client") + { + s << " Selecting found USB device " << inputs[usb].name; + ret = usb; + } else if (def > -1) { s << " Selecting default device " << inputs[def].name; @@ -371,6 +400,7 @@ int audioDevices::findOutput(QString type, QString name) { int ret = -1; int def = -1; + int usb = -1; QString msg; QTextStream s(&msg); for (int f = 0; f < outputs.size(); f++) @@ -384,6 +414,11 @@ int audioDevices::findOutput(QString type, QString name) { def = f; } + if (outputs[f].name.toUpper().contains("USB")) { + // This is a USB device... + usb = f; + } + } if (ret == -1) @@ -394,6 +429,11 @@ int audioDevices::findOutput(QString type, QString name) s << " Selecting first device " << outputs[0].name; ret = 0; } + else if (usb > -1 && type != "Client") + { + s << " Selecting found USB device " << outputs[usb].name; + ret = usb; + } else if (def > -1) { s << " Selecting default device " << outputs[def].name; diff --git a/pahandler.cpp b/pahandler.cpp index 4b06d06..2a85fa4 100644 --- a/pahandler.cpp +++ b/pahandler.cpp @@ -303,7 +303,7 @@ void paHandler::convertedOutput(audioPacket packet) { } } else { - qDebug(logAudio()) << (setup.isinput ? "Input" : "Output") << "Disgarding audio data as current latency" << currentLatency << "exceeds setup latency" << setup.latency; + qDebug(logAudio()) << (setup.isinput ? "Input" : "Output") << "Discarding audio data as current latency" << currentLatency << "exceeds setup latency" << setup.latency; Pa_StopStream(audio); latencyAllowance++; } diff --git a/rthandler.cpp b/rthandler.cpp index 24d9d98..e75e7ed 100644 --- a/rthandler.cpp +++ b/rthandler.cpp @@ -160,6 +160,10 @@ bool rtHandler::init(audioSetup setup) goto errorHandler; } + if (outFormat.channelCount() == 1 && inFormat.channelCount() == 2) { + outFormat.setChannelCount(2); + } + aParams.nChannels = outFormat.channelCount(); @@ -228,11 +232,7 @@ bool rtHandler::init(audioSetup setup) // Per channel chunk size. -#if (QT_VERSION < QT_VERSION_CHECK(6,0,0)) - this->chunkSize = (outFormat.bytesForDuration(setup.blockSize * 1000) / (outFormat.sampleSize() / 8) / outFormat.channelCount()); -#else - this->chunkSize = (outFormat.bytesForDuration(setup.blockSize * 1000) / sizeof(outFormat.sampleFormat()) / outFormat.channelCount()); -#endif + this->chunkSize = (outFormat.bytesForDuration(setup.blockSize * 1000) / outFormat.bytesPerFrame()); #ifdef RT_EXCEPTION try { @@ -305,11 +305,7 @@ int rtHandler::readData(void* outputBuffer, void* inputBuffer, { Q_UNUSED(inputBuffer); Q_UNUSED(streamTime); -#if (QT_VERSION < QT_VERSION_CHECK(6,0,0)) - int nBytes = nFrames * outFormat.channelCount() * (outFormat.sampleSize() / 8); -#else - int nBytes = nFrames * outFormat.channelCount() * sizeof(outFormat.sampleFormat()); -#endif + int nBytes = nFrames * outFormat.bytesPerFrame(); //lastSentSeq = packet.seq; if (arrayBuffer.length() >= nBytes) { if (audioMutex.tryLock(0)) { @@ -345,11 +341,8 @@ int rtHandler::writeData(void* outputBuffer, void* inputBuffer, packet.sent = 0; packet.volume = volume; memcpy(&packet.guid, setup.guid, GUIDLEN); -#if (QT_VERSION < QT_VERSION_CHECK(6,0,0)) - packet.data.append((char*)inputBuffer, nFrames * outFormat.channelCount() * (outFormat.sampleSize() / 8)); -#else - packet.data.append((char*)inputBuffer, nFrames * outFormat.channelCount() * sizeof(outFormat.sampleFormat())); -#endif + packet.data.append((char*)inputBuffer, nFrames * outFormat.bytesPerFrame()); + emit sendToConverter(packet); if (status == RTAUDIO_INPUT_OVERFLOW) { isUnderrun = true; @@ -373,11 +366,7 @@ void rtHandler::convertedOutput(audioPacket packet) arrayBuffer.append(packet.data); audioMutex.unlock(); amplitude = packet.amplitudePeak; -#if (QT_VERSION < QT_VERSION_CHECK(6,0,0)) - currentLatency = packet.time.msecsTo(QTime::currentTime()) + (outFormat.durationForBytes(audio->getStreamLatency() * (outFormat.sampleSize() / 8) * outFormat.channelCount()) / 1000); -#else - currentLatency = packet.time.msecsTo(QTime::currentTime()) + (outFormat.durationForBytes(audio->getStreamLatency() * sizeof(outFormat.sampleFormat()) * outFormat.channelCount()) / 1000); -#endif + currentLatency = packet.time.msecsTo(QTime::currentTime()) + (outFormat.durationForBytes(audio->getStreamLatency() * outFormat.bytesPerFrame()) / 1000); emit haveLevels(getAmplitude(), packet.amplitudeRMS, setup.latency, currentLatency, isUnderrun, isOverrun); } @@ -388,11 +377,7 @@ void rtHandler::convertedInput(audioPacket packet) if (packet.data.size() > 0) { emit haveAudioData(packet); amplitude = packet.amplitudePeak; -#if (QT_VERSION < QT_VERSION_CHECK(6,0,0)) - currentLatency = packet.time.msecsTo(QTime::currentTime()) + (outFormat.durationForBytes(audio->getStreamLatency() * (outFormat.sampleSize() / 8) * outFormat.channelCount()) / 1000); -#else - currentLatency = packet.time.msecsTo(QTime::currentTime()) + (outFormat.durationForBytes(audio->getStreamLatency() * sizeof(outFormat.sampleFormat()) * outFormat.channelCount()) / 1000); -#endif + currentLatency = packet.time.msecsTo(QTime::currentTime()) + (outFormat.durationForBytes(audio->getStreamLatency() * outFormat.bytesPerFrame()) / 1000); emit haveLevels(getAmplitude(), static_cast(packet.amplitudeRMS * 255.0), setup.latency, currentLatency, isUnderrun, isOverrun); } } diff --git a/wfserver.vcxproj b/wfserver.vcxproj index 79d991f..60b5d5f 100644 --- a/wfserver.vcxproj +++ b/wfserver.vcxproj @@ -105,6 +105,7 @@ wfserver true false + wfview-release\ msvc2019 @@ -119,7 +120,7 @@ core;network;gui;multimedia;widgets;serialport;printsupport - msvc2019 + msvc2019_64_v62 core;network;gui;multimedia;widgets;serialport;printsupport @@ -205,8 +206,8 @@ true - ..\portaudio\msvc\Win32\Release\portaudio_x86.lib;..\opus\win32\VS2015\Win32\Release\opus.lib;%(AdditionalDependencies) - ..\portaudio\msvc\Win32\Release;..\opus\win32\VS2015\Win32\Release;%(AdditionalLibraryDirectories) + ..\portaudio\msvc\x64\Release\portaudio_x64.lib;..\opus\win32\VS2015\x64\Release\opus.lib;%(AdditionalDependencies) + ..\portaudio\msvc\x64\Release;..\opus\win32\VS2015\x64\Release;%(AdditionalLibraryDirectories) "/MANIFESTDEPENDENCY:type='win32' name='Microsoft.Windows.Common-Controls' version='6.0.0.0' publicKeyToken='6595b64144ccf1df' language='*' processorArchitecture='*'" %(AdditionalOptions) true false diff --git a/wfserver.vcxproj.user b/wfserver.vcxproj.user index 4912332..6491d95 100644 --- a/wfserver.vcxproj.user +++ b/wfserver.vcxproj.user @@ -8,7 +8,7 @@ 2022-08-21T18:45:22.2052009Z - 2022-04-13T11:33:53.0745117Z + 2023-01-02T19:56:38.8798452Z 2022-04-13T11:33:53.0745117Z diff --git a/wfview.sln b/wfview.sln index dc35573..3f1c01e 100644 --- a/wfview.sln +++ b/wfview.sln @@ -20,13 +20,13 @@ Global {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|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}.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.Build.0 = Release|x64 EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE