diff --git a/src/audio.cpp b/src/audio.cpp index 523140d6..502e1d86 100644 --- a/src/audio.cpp +++ b/src/audio.cpp @@ -136,19 +136,22 @@ int Port::getNumOutputs() { json_t* Port::toJson() { json_t* rootJ = json_object(); - if (driver) { - json_object_set_new(rootJ, "driver", json_integer(getDriverId())); - std::string deviceName = driver->getDeviceName(getDeviceId()); - if (!deviceName.empty()) - json_object_set_new(rootJ, "deviceName", json_string(deviceName.c_str())); - json_object_set_new(rootJ, "sampleRate", json_integer(getSampleRate())); - json_object_set_new(rootJ, "blockSize", json_integer(getBlockSize())); - json_object_set_new(rootJ, "offset", json_integer(offset)); + json_object_set_new(rootJ, "driver", json_integer(getDriverId())); + + if (device) { + std::string deviceName = device->getName(); + json_object_set_new(rootJ, "deviceName", json_string(deviceName.c_str())); } + + json_object_set_new(rootJ, "sampleRate", json_integer(getSampleRate())); + json_object_set_new(rootJ, "blockSize", json_integer(getBlockSize())); + json_object_set_new(rootJ, "offset", json_integer(offset)); return rootJ; } void Port::fromJson(json_t* rootJ) { + setDriverId(-1); + json_t* driverJ = json_object_get(rootJ, "driver"); if (driverJ) setDriverId(json_number_value(driverJ)); diff --git a/src/engine/Engine.cpp b/src/engine/Engine.cpp index b3c7e401..0f6f2529 100644 --- a/src/engine/Engine.cpp +++ b/src/engine/Engine.cpp @@ -959,7 +959,9 @@ json_t* Engine::toJson() { void Engine::fromJson(json_t* rootJ) { - std::lock_guard lock(internal->mutex); + // Don't lock here because Module::fromJson for example might deadlock, and we actually don't really need thread safety other than the addModule() and addCable() calls, which are already behind locks. + // std::lock_guard lock(internal->mutex); + // modules json_t* modulesJ = json_object_get(rootJ, "modules"); if (!modulesJ) diff --git a/src/rtaudio.cpp b/src/rtaudio.cpp index 8fe63f02..51f20ed3 100644 --- a/src/rtaudio.cpp +++ b/src/rtaudio.cpp @@ -76,8 +76,8 @@ struct RtAudioDevice : audio::Device { } } + INFO("Opening audio RtAudio device %d with %d in %d out", deviceId, inputParameters.nChannels, outputParameters.nChannels); try { - INFO("Opening audio RtAudio device %d with %d in %d out", deviceId, inputParameters.nChannels, outputParameters.nChannels); rtAudio->openStream( outputParameters.nChannels == 0 ? NULL : &outputParameters, inputParameters.nChannels == 0 ? NULL : &inputParameters, @@ -89,8 +89,8 @@ struct RtAudioDevice : audio::Device { return; } + INFO("Starting RtAudio stream %d", deviceId); try { - INFO("Starting RtAudio stream %d", deviceId); rtAudio->startStream(); } catch (RtAudioError& e) { @@ -100,6 +100,7 @@ struct RtAudioDevice : audio::Device { // Update sample rate to actual value sampleRate = rtAudio->getStreamSampleRate(); + INFO("Opened RtAudio stream"); onOpenStream(); } @@ -122,6 +123,7 @@ struct RtAudioDevice : audio::Device { WARN("Failed to close RtAudio stream %s", e.what()); } } + INFO("Closed RtAudio stream"); onCloseStream(); }