@@ -136,19 +136,22 @@ int Port::getNumOutputs() { | |||||
json_t* Port::toJson() { | json_t* Port::toJson() { | ||||
json_t* rootJ = json_object(); | 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; | return rootJ; | ||||
} | } | ||||
void Port::fromJson(json_t* rootJ) { | void Port::fromJson(json_t* rootJ) { | ||||
setDriverId(-1); | |||||
json_t* driverJ = json_object_get(rootJ, "driver"); | json_t* driverJ = json_object_get(rootJ, "driver"); | ||||
if (driverJ) | if (driverJ) | ||||
setDriverId(json_number_value(driverJ)); | setDriverId(json_number_value(driverJ)); | ||||
@@ -959,7 +959,9 @@ json_t* Engine::toJson() { | |||||
void Engine::fromJson(json_t* rootJ) { | void Engine::fromJson(json_t* rootJ) { | ||||
std::lock_guard<std::recursive_mutex> 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<std::recursive_mutex> lock(internal->mutex); | |||||
// modules | // modules | ||||
json_t* modulesJ = json_object_get(rootJ, "modules"); | json_t* modulesJ = json_object_get(rootJ, "modules"); | ||||
if (!modulesJ) | if (!modulesJ) | ||||
@@ -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 { | try { | ||||
INFO("Opening audio RtAudio device %d with %d in %d out", deviceId, inputParameters.nChannels, outputParameters.nChannels); | |||||
rtAudio->openStream( | rtAudio->openStream( | ||||
outputParameters.nChannels == 0 ? NULL : &outputParameters, | outputParameters.nChannels == 0 ? NULL : &outputParameters, | ||||
inputParameters.nChannels == 0 ? NULL : &inputParameters, | inputParameters.nChannels == 0 ? NULL : &inputParameters, | ||||
@@ -89,8 +89,8 @@ struct RtAudioDevice : audio::Device { | |||||
return; | return; | ||||
} | } | ||||
INFO("Starting RtAudio stream %d", deviceId); | |||||
try { | try { | ||||
INFO("Starting RtAudio stream %d", deviceId); | |||||
rtAudio->startStream(); | rtAudio->startStream(); | ||||
} | } | ||||
catch (RtAudioError& e) { | catch (RtAudioError& e) { | ||||
@@ -100,6 +100,7 @@ struct RtAudioDevice : audio::Device { | |||||
// Update sample rate to actual value | // Update sample rate to actual value | ||||
sampleRate = rtAudio->getStreamSampleRate(); | sampleRate = rtAudio->getStreamSampleRate(); | ||||
INFO("Opened RtAudio stream"); | |||||
onOpenStream(); | onOpenStream(); | ||||
} | } | ||||
@@ -122,6 +123,7 @@ struct RtAudioDevice : audio::Device { | |||||
WARN("Failed to close RtAudio stream %s", e.what()); | WARN("Failed to close RtAudio stream %s", e.what()); | ||||
} | } | ||||
} | } | ||||
INFO("Closed RtAudio stream"); | |||||
onCloseStream(); | onCloseStream(); | ||||
} | } | ||||