Browse Source

Test audio. Fix audio deadlock in Engine::fromJson().

tags/v2.0.0
Andrew Belt 5 years ago
parent
commit
70d527d99a
3 changed files with 18 additions and 11 deletions
  1. +11
    -8
      src/audio.cpp
  2. +3
    -1
      src/engine/Engine.cpp
  3. +4
    -2
      src/rtaudio.cpp

+ 11
- 8
src/audio.cpp View File

@@ -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));


+ 3
- 1
src/engine/Engine.cpp View File

@@ -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)


+ 4
- 2
src/rtaudio.cpp View File

@@ -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();
} }




Loading…
Cancel
Save