Make compatible with rtaudio API 5 and 6.

Recent rtaudio changed the API to not throw exceptions anymore and
also have DeviceIDs not queried by index but IDs that are provided
separately ( https://github.com/thestk/rtaudio/releases ).

Adapt the code-base to be compatible with the old and the new API
as we have to exepect that in a transition period both APIs are
common on various build platforms.
This commit is contained in:
Henner Zeller 2024-01-21 10:32:43 -08:00
parent 052167962d
commit 23ae66151b
2 changed files with 59 additions and 10 deletions

View File

@ -31,6 +31,10 @@ public:
monoPacker.init(&s2m.out, 512);
stereoPacker.init(_stream->sinkOut, 512);
#if RTAUDIO_VERSION_MAJOR >= 6
audio.setErrorCallback(&reportErrorsAsException);
#endif
bool created = false;
std::string device = "";
config.acquire();
@ -42,12 +46,15 @@ public:
device = config.conf[_streamName]["device"];
config.release(created);
int count = audio.getDeviceCount();
RtAudio::DeviceInfo info;
#if RTAUDIO_VERSION_MAJOR >= 6
for (int i : audio.getDeviceIds()) {
#else
int count = audio.getDeviceCount();
for (int i = 0; i < count; i++) {
#endif
try {
info = audio.getDeviceInfo(i);
if (!info.probed) { continue; }
if (info.outputChannels == 0) { continue; }
if (info.isDefaultOutput) { defaultDevId = devList.size(); }
devList.push_back(info);
@ -55,8 +62,8 @@ public:
txtDevList += info.name;
txtDevList += '\0';
}
catch (std::exception e) {
flog::error("AudioSinkModule Error getting audio device info: {0}", e.what());
catch (const std::exception& e) {
flog::error("AudioSinkModule Error getting audio device info: id={0}: {1}", i, e.what());
}
}
selectByName(device);
@ -156,6 +163,23 @@ public:
}
}
#if RTAUDIO_VERSION_MAJOR >= 6
static void reportErrorsAsException(RtAudioErrorType type,
const std::string& errorText) {
switch (type) {
case RtAudioErrorType::RTAUDIO_NO_ERROR:
return;
case RtAudioErrorType::RTAUDIO_WARNING:
case RtAudioErrorType::RTAUDIO_NO_DEVICES_FOUND:
case RtAudioErrorType::RTAUDIO_DEVICE_DISCONNECT:
flog::warn("AudioSink: {0} ({1})", errorText, (int)type);
break;
default:
throw std::runtime_error(errorText);
}
}
#endif
private:
bool doStart() {
RtAudio::StreamParameters parameters;
@ -172,8 +196,8 @@ private:
audio.startStream();
stereoPacker.start();
}
catch (RtAudioError& e) {
flog::error("Could not open audio device");
catch (const std::exception& e) {
flog::error("Could not open audio device {0}", e.what());
return false;
}

View File

@ -35,6 +35,10 @@ public:
AudioSourceModule(std::string name) {
this->name = name;
#if RTAUDIO_VERSION_MAJOR >= 6
audio.setErrorCallback(&reportErrorsAsException);
#endif
sampleRate = 48000.0;
handler.ctx = this;
@ -83,21 +87,25 @@ public:
void refresh() {
devices.clear();
#if RTAUDIO_VERSION_MAJOR >= 6
for (int i : audio.getDeviceIds()) {
#else
int count = audio.getDeviceCount();
for (int i = 0; i < count; i++) {
#endif
try {
// Get info
auto info = audio.getDeviceInfo(i);
// Check that it has a stereo input
if (info.probed && info.inputChannels < 2) { continue; }
if (info.inputChannels < 2) { continue; }
// Save info
DeviceInfo dinfo = { info, i };
devices.define(info.name, info.name, dinfo);
}
catch (std::exception e) {
flog::error("Error getting audio device info: {0}", e.what());
catch (const std::exception& e) {
flog::error("Error getting audio device info: id={0}: {1}", i, e.what());
}
}
}
@ -254,6 +262,23 @@ private:
return 0;
}
#if RTAUDIO_VERSION_MAJOR >= 6
static void reportErrorsAsException(RtAudioErrorType type,
const std::string& errorText) {
switch (type) {
case RtAudioErrorType::RTAUDIO_NO_ERROR:
return;
case RtAudioErrorType::RTAUDIO_WARNING:
case RtAudioErrorType::RTAUDIO_NO_DEVICES_FOUND:
case RtAudioErrorType::RTAUDIO_DEVICE_DISCONNECT:
flog::warn("AudioSource: {0} ({1})", errorText, (int)type);
break;
default:
throw std::runtime_error(errorText);
}
}
#endif
std::string name;
bool enabled = true;
dsp::stream<dsp::complex_t> stream;