Browse Source

Update RtAudio to 5.2.0. Rewrite error handling in RtAudioDevice.

tags/v2.1.0
Andrew Belt 3 years ago
parent
commit
ac73ef478a
2 changed files with 51 additions and 64 deletions
  1. +1
    -1
      dep/rtaudio
  2. +50
    -63
      src/rtaudio.cpp

+ 1
- 1
dep/rtaudio

@@ -1 +1 @@
Subproject commit 8128053f4bd83463c7c901d9f5d40b272c2f4e4e
Subproject commit e5cfcd557a480cc1a6a1ef1204474221798abb60

+ 50
- 63
src/rtaudio.cpp View File

@@ -48,36 +48,31 @@ struct RtAudioDevice : audio::Device {
this->deviceId = deviceId; this->deviceId = deviceId;


// Create RtAudio object // Create RtAudio object
INFO("Creating RtAudio %s context", RTAUDIO_API_NAMES.at(api).c_str());
try {
rtAudio = new RtAudio(api);
}
catch (RtAudioError& e) {
throw Exception("Failed to create RtAudio %s context: %s", RTAUDIO_API_NAMES.at(api).c_str(), e.what());
}
INFO("Creating RtAudio %s device", RTAUDIO_API_NAMES.at(api).c_str());
rtAudio = new RtAudio(api, [](RtAudioErrorType type, const std::string& errorText) {
WARN("RtAudio error %d: %s", type, errorText.c_str());
});


rtAudio->showWarnings(false); rtAudio->showWarnings(false);


// Query device ID
try { try {
// Query device ID
deviceInfo = rtAudio->getDeviceInfo(deviceId); deviceInfo = rtAudio->getDeviceInfo(deviceId);
if (!deviceInfo.probed) {
throw Exception("Failed to query RtAudio %s device %d", RTAUDIO_API_NAMES.at(api).c_str(), deviceId);
}

openStream();
} }
catch (RtAudioError& e) {
throw Exception("Failed to query RtAudio %s device %d: %s", RTAUDIO_API_NAMES.at(api).c_str(), deviceId, e.what());
catch (Exception& e) {
delete rtAudio;
throw;
} }

openStream();
} }


~RtAudioDevice() { ~RtAudioDevice() {
try {
closeStream();
delete rtAudio;
}
catch (Exception& e) {
WARN("Failed to destroy RtAudio %s context: %s", RTAUDIO_API_NAMES.at(api).c_str(), e.what());
// Ignore exceptions
}
closeStream();
delete rtAudio;
} }


void openStream() { void openStream() {
@@ -102,10 +97,10 @@ struct RtAudioDevice : audio::Device {
options.numberOfBuffers = 2; options.numberOfBuffers = 2;
options.streamName = "VCV Rack"; options.streamName = "VCV Rack";


float closestSampleRate = deviceInfo.preferredSampleRate;
int32_t closestSampleRate = deviceInfo.preferredSampleRate;
if (sampleRate > 0) { if (sampleRate > 0) {
// Find the closest sample rate to the requested one. // Find the closest sample rate to the requested one.
for (float sr : deviceInfo.sampleRates) {
for (int32_t sr : deviceInfo.sampleRates) {
if (std::fabs(sr - sampleRate) < std::fabs(closestSampleRate - sampleRate)) { if (std::fabs(sr - sampleRate) < std::fabs(closestSampleRate - sampleRate)) {
closestSampleRate = sr; closestSampleRate = sr;
} }
@@ -120,52 +115,42 @@ struct RtAudioDevice : audio::Device {
blockSize = 256; blockSize = 256;
} }


INFO("Opening RtAudio %s device %d: %s (%d in, %d out, %g sample rate, %d block size)", RTAUDIO_API_NAMES.at(api).c_str(), deviceId, deviceInfo.name.c_str(), inputParameters.nChannels, outputParameters.nChannels, closestSampleRate, blockSize);
try {
rtAudio->openStream(
outputParameters.nChannels > 0 ? &outputParameters : NULL,
inputParameters.nChannels > 0 ? &inputParameters : NULL,
RTAUDIO_FLOAT32, closestSampleRate, (unsigned int*) &blockSize,
&rtAudioCallback, this, &options, NULL);
}
catch (RtAudioError& e) {
throw Exception("Failed to open RtAudio %s device %d: %s", RTAUDIO_API_NAMES.at(api).c_str(), deviceId, e.what());
INFO("Opening RtAudio %s device %d: %s (%d in, %d out, %d sample rate, %d block size)", RTAUDIO_API_NAMES.at(api).c_str(), deviceId, deviceInfo.name.c_str(), inputParameters.nChannels, outputParameters.nChannels, closestSampleRate, blockSize);
if (rtAudio->openStream(
outputParameters.nChannels > 0 ? &outputParameters : NULL,
inputParameters.nChannels > 0 ? &inputParameters : NULL,
RTAUDIO_FLOAT32, closestSampleRate, (unsigned int*) &blockSize,
&rtAudioCallback, this, &options)) {
throw Exception("Failed to open RtAudio %s device %d", RTAUDIO_API_NAMES.at(api).c_str(), deviceId);
} }


INFO("Starting RtAudio %s device %d", RTAUDIO_API_NAMES.at(api).c_str(), deviceId);
try { try {
rtAudio->startStream();
INFO("Starting RtAudio %s device %d", RTAUDIO_API_NAMES.at(api).c_str(), deviceId);
if (rtAudio->startStream()) {
throw Exception("Failed to start RtAudio %s device %d", RTAUDIO_API_NAMES.at(api).c_str(), deviceId);
}

// Update sample rate to actual value
sampleRate = rtAudio->getStreamSampleRate();

onStartStream();
} }
catch (RtAudioError& e) {
throw Exception("Failed to start RtAudio %s device %d: %s", RTAUDIO_API_NAMES.at(api).c_str(), deviceId, e.what());
catch (Exception& e) {
rtAudio->closeStream();
throw;
} }

// Update sample rate to actual value
sampleRate = rtAudio->getStreamSampleRate();
INFO("Opened RtAudio %s device %d", RTAUDIO_API_NAMES.at(api).c_str(), deviceId);
onStartStream();
} }


void closeStream() { void closeStream() {
INFO("Stopping RtAudio %s device %d", RTAUDIO_API_NAMES.at(api).c_str(), deviceId);
if (rtAudio->isStreamRunning()) { if (rtAudio->isStreamRunning()) {
try {
rtAudio->stopStream();
}
catch (RtAudioError& e) {
throw Exception("Failed to stop RtAudio %s device %d: %s", RTAUDIO_API_NAMES.at(api).c_str(), deviceId, e.what());
}
INFO("Stopping RtAudio %s device %d", RTAUDIO_API_NAMES.at(api).c_str(), deviceId);
rtAudio->stopStream();
} }
INFO("Closing RtAudio %s device %d", RTAUDIO_API_NAMES.at(api).c_str(), deviceId);
if (rtAudio->isStreamOpen()) { if (rtAudio->isStreamOpen()) {
try {
rtAudio->closeStream();
}
catch (RtAudioError& e) {
throw Exception("Failed to close RtAudio %s device %d: %s", RTAUDIO_API_NAMES.at(api).c_str(), deviceId, e.what());
}
INFO("Closing RtAudio %s device %d", RTAUDIO_API_NAMES.at(api).c_str(), deviceId);
rtAudio->closeStream();
} }
INFO("Closed RtAudio %s device %d", RTAUDIO_API_NAMES.at(api).c_str(), deviceId);

onStopStream(); onStopStream();
} }


@@ -224,7 +209,12 @@ struct RtAudioDevice : audio::Device {


int inputStride = that->getNumInputs(); int inputStride = that->getNumInputs();
int outputStride = that->getNumOutputs(); int outputStride = that->getNumOutputs();
that->processBuffer((const float*) inputBuffer, inputStride, (float*) outputBuffer, outputStride, nFrames);
try {
that->processBuffer((const float*) inputBuffer, inputStride, (float*) outputBuffer, outputStride, nFrames);
}
catch (Exception& e) {
// Log nothing to avoid spamming the log.
}
return 0; return 0;
} }
}; };
@@ -241,12 +231,9 @@ struct RtAudioDriver : audio::Driver {
this->api = api; this->api = api;


INFO("Creating RtAudio %s driver", RTAUDIO_API_NAMES.at(api).c_str()); INFO("Creating RtAudio %s driver", RTAUDIO_API_NAMES.at(api).c_str());
try {
rtAudio = new RtAudio(api);
}
catch (RtAudioError& e) {
throw Exception("Failed to create RtAudio %s driver: %s", RTAUDIO_API_NAMES.at(api).c_str(), e.what());
}
rtAudio = new RtAudio(api, [](RtAudioErrorType type, const std::string& errorText) {
WARN("RtAudio error %d: %s", type, errorText.c_str());
});


rtAudio->showWarnings(false); rtAudio->showWarnings(false);




Loading…
Cancel
Save