Various audio fixes (needs checking with Qt5)

half-duplex
Phil Taylor 2023-01-02 20:07:34 +00:00
rodzic 322cc54ad6
commit 7bb5e0f9c5
6 zmienionych plików z 60 dodań i 34 usunięć

Wyświetl plik

@ -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<unsigned int> 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;

Wyświetl plik

@ -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++;
}

Wyświetl plik

@ -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<quint16>(packet.amplitudeRMS * 255.0), setup.latency, currentLatency, isUnderrun, isOverrun);
}
}

Wyświetl plik

@ -105,6 +105,7 @@
<TargetName>wfserver</TargetName>
<IgnoreImportLibrary>true</IgnoreImportLibrary>
<LinkIncremental>false</LinkIncremental>
<OutDir>wfview-release\</OutDir>
</PropertyGroup>
<PropertyGroup Label="QtSettings" Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
<QtInstall>msvc2019</QtInstall>
@ -119,7 +120,7 @@
<QtModules>core;network;gui;multimedia;widgets;serialport;printsupport</QtModules>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="QtSettings">
<QtInstall>msvc2019</QtInstall>
<QtInstall>msvc2019_64_v62</QtInstall>
<QtModules>core;network;gui;multimedia;widgets;serialport;printsupport</QtModules>
</PropertyGroup>
<ImportGroup Condition="Exists('$(QtMsBuild)\qt.props')">
@ -205,8 +206,8 @@
<MultiProcessorCompilation>true</MultiProcessorCompilation>
</ClCompile>
<Link>
<AdditionalDependencies>..\portaudio\msvc\Win32\Release\portaudio_x86.lib;..\opus\win32\VS2015\Win32\Release\opus.lib;%(AdditionalDependencies)</AdditionalDependencies>
<AdditionalLibraryDirectories>..\portaudio\msvc\Win32\Release;..\opus\win32\VS2015\Win32\Release;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
<AdditionalDependencies>..\portaudio\msvc\x64\Release\portaudio_x64.lib;..\opus\win32\VS2015\x64\Release\opus.lib;%(AdditionalDependencies)</AdditionalDependencies>
<AdditionalLibraryDirectories>..\portaudio\msvc\x64\Release;..\opus\win32\VS2015\x64\Release;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
<AdditionalOptions>"/MANIFESTDEPENDENCY:type='win32' name='Microsoft.Windows.Common-Controls' version='6.0.0.0' publicKeyToken='6595b64144ccf1df' language='*' processorArchitecture='*'" %(AdditionalOptions)</AdditionalOptions>
<DataExecutionPrevention>true</DataExecutionPrevention>
<GenerateDebugInformation>false</GenerateDebugInformation>

Wyświetl plik

@ -8,7 +8,7 @@
<QtLastBackgroundBuild>2022-08-21T18:45:22.2052009Z</QtLastBackgroundBuild>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="QtSettings">
<QtLastBackgroundBuild>2022-04-13T11:33:53.0745117Z</QtLastBackgroundBuild>
<QtLastBackgroundBuild>2023-01-02T19:56:38.8798452Z</QtLastBackgroundBuild>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="QtSettings">
<QtLastBackgroundBuild>2022-04-13T11:33:53.0745117Z</QtLastBackgroundBuild>

Wyświetl plik

@ -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