kopia lustrzana https://gitlab.com/eliggett/wfview
Various audio fixes (needs checking with Qt5)
rodzic
322cc54ad6
commit
7bb5e0f9c5
|
@ -252,11 +252,20 @@ void audioDevices::enumerate()
|
||||||
|
|
||||||
qInfo(logAudio()) << "Current API: " << QString::fromStdString(apiMap[audio->getCurrentApi()]);
|
qInfo(logAudio()) << "Current API: " << QString::fromStdString(apiMap[audio->getCurrentApi()]);
|
||||||
|
|
||||||
unsigned int devices = audio->getDeviceCount();
|
unsigned int devicecount = audio->getDeviceCount();
|
||||||
qInfo(logAudio()) << "Found:" << devices << " audio device(s) (*=default)";
|
|
||||||
|
|
||||||
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);
|
info = audio->getDeviceInfo(i);
|
||||||
|
#endif
|
||||||
if (info.inputChannels > 0) {
|
if (info.inputChannels > 0) {
|
||||||
bool isDefault = false;
|
bool isDefault = false;
|
||||||
qInfo(logAudio()) << (info.isDefaultInput ? "*" : " ") << "(" << i << ") Input Device : " << QString::fromStdString(info.name);
|
qInfo(logAudio()) << (info.isDefaultInput ? "*" : " ") << "(" << i << ") Input Device : " << QString::fromStdString(info.name);
|
||||||
|
@ -267,7 +276,12 @@ void audioDevices::enumerate()
|
||||||
isDefault = true;
|
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));
|
inputs.append(audioDevice(QString::fromStdString(info.name), i, isDefault));
|
||||||
|
#endif
|
||||||
|
|
||||||
#ifndef BUILD_WFSERVER
|
#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();
|
||||||
|
@ -284,7 +298,12 @@ void audioDevices::enumerate()
|
||||||
isDefault = true;
|
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));
|
outputs.append(audioDevice(QString::fromStdString(info.name), i, isDefault));
|
||||||
|
#endif
|
||||||
|
|
||||||
#ifndef BUILD_WFSERVER
|
#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();
|
||||||
|
@ -330,6 +349,7 @@ int audioDevices::findInput(QString type, QString name)
|
||||||
{
|
{
|
||||||
int ret = -1;
|
int ret = -1;
|
||||||
int def = -1;
|
int def = -1;
|
||||||
|
int usb = -1;
|
||||||
QString msg;
|
QString msg;
|
||||||
QTextStream s(&msg);
|
QTextStream s(&msg);
|
||||||
for (int f = 0; f < inputs.size(); f++)
|
for (int f = 0; f < inputs.size(); f++)
|
||||||
|
@ -343,6 +363,10 @@ int audioDevices::findInput(QString type, QString name)
|
||||||
{
|
{
|
||||||
def = f;
|
def = f;
|
||||||
}
|
}
|
||||||
|
if (inputs[f].name.toUpper().contains("USB")) {
|
||||||
|
// This is a USB device...
|
||||||
|
usb = f;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (ret == -1)
|
if (ret == -1)
|
||||||
|
@ -353,6 +377,11 @@ int audioDevices::findInput(QString type, QString name)
|
||||||
s << "Selecting first device " << inputs[0].name;
|
s << "Selecting first device " << inputs[0].name;
|
||||||
ret = 0;
|
ret = 0;
|
||||||
}
|
}
|
||||||
|
else if (usb > -1 && type != "Client")
|
||||||
|
{
|
||||||
|
s << " Selecting found USB device " << inputs[usb].name;
|
||||||
|
ret = usb;
|
||||||
|
}
|
||||||
else if (def > -1)
|
else if (def > -1)
|
||||||
{
|
{
|
||||||
s << " Selecting default device " << inputs[def].name;
|
s << " Selecting default device " << inputs[def].name;
|
||||||
|
@ -371,6 +400,7 @@ int audioDevices::findOutput(QString type, QString name)
|
||||||
{
|
{
|
||||||
int ret = -1;
|
int ret = -1;
|
||||||
int def = -1;
|
int def = -1;
|
||||||
|
int usb = -1;
|
||||||
QString msg;
|
QString msg;
|
||||||
QTextStream s(&msg);
|
QTextStream s(&msg);
|
||||||
for (int f = 0; f < outputs.size(); f++)
|
for (int f = 0; f < outputs.size(); f++)
|
||||||
|
@ -384,6 +414,11 @@ int audioDevices::findOutput(QString type, QString name)
|
||||||
{
|
{
|
||||||
def = f;
|
def = f;
|
||||||
}
|
}
|
||||||
|
if (outputs[f].name.toUpper().contains("USB")) {
|
||||||
|
// This is a USB device...
|
||||||
|
usb = f;
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if (ret == -1)
|
if (ret == -1)
|
||||||
|
@ -394,6 +429,11 @@ int audioDevices::findOutput(QString type, QString name)
|
||||||
s << " Selecting first device " << outputs[0].name;
|
s << " Selecting first device " << outputs[0].name;
|
||||||
ret = 0;
|
ret = 0;
|
||||||
}
|
}
|
||||||
|
else if (usb > -1 && type != "Client")
|
||||||
|
{
|
||||||
|
s << " Selecting found USB device " << outputs[usb].name;
|
||||||
|
ret = usb;
|
||||||
|
}
|
||||||
else if (def > -1)
|
else if (def > -1)
|
||||||
{
|
{
|
||||||
s << " Selecting default device " << outputs[def].name;
|
s << " Selecting default device " << outputs[def].name;
|
||||||
|
|
|
@ -303,7 +303,7 @@ void paHandler::convertedOutput(audioPacket packet) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else {
|
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);
|
Pa_StopStream(audio);
|
||||||
latencyAllowance++;
|
latencyAllowance++;
|
||||||
}
|
}
|
||||||
|
|
|
@ -160,6 +160,10 @@ bool rtHandler::init(audioSetup setup)
|
||||||
goto errorHandler;
|
goto errorHandler;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (outFormat.channelCount() == 1 && inFormat.channelCount() == 2) {
|
||||||
|
outFormat.setChannelCount(2);
|
||||||
|
}
|
||||||
|
|
||||||
aParams.nChannels = outFormat.channelCount();
|
aParams.nChannels = outFormat.channelCount();
|
||||||
|
|
||||||
|
|
||||||
|
@ -228,11 +232,7 @@ bool rtHandler::init(audioSetup setup)
|
||||||
|
|
||||||
|
|
||||||
// Per channel chunk size.
|
// Per channel chunk size.
|
||||||
#if (QT_VERSION < QT_VERSION_CHECK(6,0,0))
|
this->chunkSize = (outFormat.bytesForDuration(setup.blockSize * 1000) / outFormat.bytesPerFrame());
|
||||||
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
|
|
||||||
|
|
||||||
#ifdef RT_EXCEPTION
|
#ifdef RT_EXCEPTION
|
||||||
try {
|
try {
|
||||||
|
@ -305,11 +305,7 @@ int rtHandler::readData(void* outputBuffer, void* inputBuffer,
|
||||||
{
|
{
|
||||||
Q_UNUSED(inputBuffer);
|
Q_UNUSED(inputBuffer);
|
||||||
Q_UNUSED(streamTime);
|
Q_UNUSED(streamTime);
|
||||||
#if (QT_VERSION < QT_VERSION_CHECK(6,0,0))
|
int nBytes = nFrames * outFormat.bytesPerFrame();
|
||||||
int nBytes = nFrames * outFormat.channelCount() * (outFormat.sampleSize() / 8);
|
|
||||||
#else
|
|
||||||
int nBytes = nFrames * outFormat.channelCount() * sizeof(outFormat.sampleFormat());
|
|
||||||
#endif
|
|
||||||
//lastSentSeq = packet.seq;
|
//lastSentSeq = packet.seq;
|
||||||
if (arrayBuffer.length() >= nBytes) {
|
if (arrayBuffer.length() >= nBytes) {
|
||||||
if (audioMutex.tryLock(0)) {
|
if (audioMutex.tryLock(0)) {
|
||||||
|
@ -345,11 +341,8 @@ int rtHandler::writeData(void* outputBuffer, void* inputBuffer,
|
||||||
packet.sent = 0;
|
packet.sent = 0;
|
||||||
packet.volume = volume;
|
packet.volume = volume;
|
||||||
memcpy(&packet.guid, setup.guid, GUIDLEN);
|
memcpy(&packet.guid, setup.guid, GUIDLEN);
|
||||||
#if (QT_VERSION < QT_VERSION_CHECK(6,0,0))
|
packet.data.append((char*)inputBuffer, nFrames * outFormat.bytesPerFrame());
|
||||||
packet.data.append((char*)inputBuffer, nFrames * outFormat.channelCount() * (outFormat.sampleSize() / 8));
|
|
||||||
#else
|
|
||||||
packet.data.append((char*)inputBuffer, nFrames * outFormat.channelCount() * sizeof(outFormat.sampleFormat()));
|
|
||||||
#endif
|
|
||||||
emit sendToConverter(packet);
|
emit sendToConverter(packet);
|
||||||
if (status == RTAUDIO_INPUT_OVERFLOW) {
|
if (status == RTAUDIO_INPUT_OVERFLOW) {
|
||||||
isUnderrun = true;
|
isUnderrun = true;
|
||||||
|
@ -373,11 +366,7 @@ void rtHandler::convertedOutput(audioPacket packet)
|
||||||
arrayBuffer.append(packet.data);
|
arrayBuffer.append(packet.data);
|
||||||
audioMutex.unlock();
|
audioMutex.unlock();
|
||||||
amplitude = packet.amplitudePeak;
|
amplitude = packet.amplitudePeak;
|
||||||
#if (QT_VERSION < QT_VERSION_CHECK(6,0,0))
|
currentLatency = packet.time.msecsTo(QTime::currentTime()) + (outFormat.durationForBytes(audio->getStreamLatency() * outFormat.bytesPerFrame()) / 1000);
|
||||||
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
|
|
||||||
emit haveLevels(getAmplitude(), packet.amplitudeRMS, setup.latency, currentLatency, isUnderrun, isOverrun);
|
emit haveLevels(getAmplitude(), packet.amplitudeRMS, setup.latency, currentLatency, isUnderrun, isOverrun);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -388,11 +377,7 @@ void rtHandler::convertedInput(audioPacket packet)
|
||||||
if (packet.data.size() > 0) {
|
if (packet.data.size() > 0) {
|
||||||
emit haveAudioData(packet);
|
emit haveAudioData(packet);
|
||||||
amplitude = packet.amplitudePeak;
|
amplitude = packet.amplitudePeak;
|
||||||
#if (QT_VERSION < QT_VERSION_CHECK(6,0,0))
|
currentLatency = packet.time.msecsTo(QTime::currentTime()) + (outFormat.durationForBytes(audio->getStreamLatency() * outFormat.bytesPerFrame()) / 1000);
|
||||||
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
|
|
||||||
emit haveLevels(getAmplitude(), static_cast<quint16>(packet.amplitudeRMS * 255.0), setup.latency, currentLatency, isUnderrun, isOverrun);
|
emit haveLevels(getAmplitude(), static_cast<quint16>(packet.amplitudeRMS * 255.0), setup.latency, currentLatency, isUnderrun, isOverrun);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -105,6 +105,7 @@
|
||||||
<TargetName>wfserver</TargetName>
|
<TargetName>wfserver</TargetName>
|
||||||
<IgnoreImportLibrary>true</IgnoreImportLibrary>
|
<IgnoreImportLibrary>true</IgnoreImportLibrary>
|
||||||
<LinkIncremental>false</LinkIncremental>
|
<LinkIncremental>false</LinkIncremental>
|
||||||
|
<OutDir>wfview-release\</OutDir>
|
||||||
</PropertyGroup>
|
</PropertyGroup>
|
||||||
<PropertyGroup Label="QtSettings" Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
|
<PropertyGroup Label="QtSettings" Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
|
||||||
<QtInstall>msvc2019</QtInstall>
|
<QtInstall>msvc2019</QtInstall>
|
||||||
|
@ -119,7 +120,7 @@
|
||||||
<QtModules>core;network;gui;multimedia;widgets;serialport;printsupport</QtModules>
|
<QtModules>core;network;gui;multimedia;widgets;serialport;printsupport</QtModules>
|
||||||
</PropertyGroup>
|
</PropertyGroup>
|
||||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="QtSettings">
|
<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>
|
<QtModules>core;network;gui;multimedia;widgets;serialport;printsupport</QtModules>
|
||||||
</PropertyGroup>
|
</PropertyGroup>
|
||||||
<ImportGroup Condition="Exists('$(QtMsBuild)\qt.props')">
|
<ImportGroup Condition="Exists('$(QtMsBuild)\qt.props')">
|
||||||
|
@ -205,8 +206,8 @@
|
||||||
<MultiProcessorCompilation>true</MultiProcessorCompilation>
|
<MultiProcessorCompilation>true</MultiProcessorCompilation>
|
||||||
</ClCompile>
|
</ClCompile>
|
||||||
<Link>
|
<Link>
|
||||||
<AdditionalDependencies>..\portaudio\msvc\Win32\Release\portaudio_x86.lib;..\opus\win32\VS2015\Win32\Release\opus.lib;%(AdditionalDependencies)</AdditionalDependencies>
|
<AdditionalDependencies>..\portaudio\msvc\x64\Release\portaudio_x64.lib;..\opus\win32\VS2015\x64\Release\opus.lib;%(AdditionalDependencies)</AdditionalDependencies>
|
||||||
<AdditionalLibraryDirectories>..\portaudio\msvc\Win32\Release;..\opus\win32\VS2015\Win32\Release;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
|
<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>
|
<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>
|
||||||
|
|
|
@ -8,7 +8,7 @@
|
||||||
<QtLastBackgroundBuild>2022-08-21T18:45:22.2052009Z</QtLastBackgroundBuild>
|
<QtLastBackgroundBuild>2022-08-21T18:45:22.2052009Z</QtLastBackgroundBuild>
|
||||||
</PropertyGroup>
|
</PropertyGroup>
|
||||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="QtSettings">
|
<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>
|
||||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="QtSettings">
|
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="QtSettings">
|
||||||
<QtLastBackgroundBuild>2022-04-13T11:33:53.0745117Z</QtLastBackgroundBuild>
|
<QtLastBackgroundBuild>2022-04-13T11:33:53.0745117Z</QtLastBackgroundBuild>
|
||||||
|
|
|
@ -20,13 +20,13 @@ Global
|
||||||
{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|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
|
|
||||||
{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|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}.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|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
|
||||||
|
{00E054F8-A1D4-3ECA-A8D6-DFC8A68AFD56}.Release|x64.Build.0 = Release|x64
|
||||||
EndGlobalSection
|
EndGlobalSection
|
||||||
GlobalSection(SolutionProperties) = preSolution
|
GlobalSection(SolutionProperties) = preSolution
|
||||||
HideSolutionNode = FALSE
|
HideSolutionNode = FALSE
|
||||||
|
|
Ładowanie…
Reference in New Issue