diff options
author | falkTX <falktx@falktx.com> | 2019-10-28 11:16:09 +0100 |
---|---|---|
committer | falkTX <falktx@falktx.com> | 2019-10-28 11:16:09 +0100 |
commit | f19176657cd8bf3d672554c97872b1f1bc0b7054 (patch) | |
tree | 687a499ccd80385184b5b4397b570054fe423c5a /linux | |
parent | 5286020560aeef2c7ef48972a42ed6ee0c111326 (diff) | |
download | jack2-f19176657cd8bf3d672554c97872b1f1bc0b7054.tar.gz |
Fix blocking DBus device reservation, so it plays nice with others
Diffstat (limited to 'linux')
-rw-r--r-- | linux/alsa/JackAlsaDriver.cpp | 23 | ||||
-rw-r--r-- | linux/alsa/JackAlsaDriver.h | 1 |
2 files changed, 24 insertions, 0 deletions
diff --git a/linux/alsa/JackAlsaDriver.cpp b/linux/alsa/JackAlsaDriver.cpp index 529ec8d3..5349c13e 100644 --- a/linux/alsa/JackAlsaDriver.cpp +++ b/linux/alsa/JackAlsaDriver.cpp @@ -67,6 +67,18 @@ static struct jack_constraint_enum_char_descriptor dither_constraint_descr_array namespace Jack { +static volatile bool device_reservation_loop_running = false; + +static void* on_device_reservation_loop(void*) +{ + while (device_reservation_loop_running && JackServerGlobals::on_device_reservation_loop != NULL) { + JackServerGlobals::on_device_reservation_loop(); + usleep(50*1000); + } + + return NULL; +} + int JackAlsaDriver::SetBufferSize(jack_nframes_t buffer_size) { jack_log("JackAlsaDriver::SetBufferSize %ld", buffer_size); @@ -344,6 +356,12 @@ int JackAlsaDriver::Open(jack_nframes_t nframes, // ALSA driver may have changed the in/out values fCaptureChannels = ((alsa_driver_t *)fDriver)->capture_nchannels; fPlaybackChannels = ((alsa_driver_t *)fDriver)->playback_nchannels; + if (JackServerGlobals::on_device_reservation_loop != NULL) { + device_reservation_loop_running = true; + if (JackPosixThread::StartImp(&fReservationLoopThread, 0, 0, on_device_reservation_loop, NULL) != 0) { + device_reservation_loop_running = false; + } + } return 0; } else { Close(); @@ -360,6 +378,11 @@ int JackAlsaDriver::Close() alsa_driver_delete((alsa_driver_t*)fDriver); } + if (device_reservation_loop_running) { + device_reservation_loop_running = false; + JackPosixThread::StopImp(fReservationLoopThread); + } + if (JackServerGlobals::on_device_release != NULL) { char audio_name[32]; diff --git a/linux/alsa/JackAlsaDriver.h b/linux/alsa/JackAlsaDriver.h index b2f44afb..b7b14b33 100644 --- a/linux/alsa/JackAlsaDriver.h +++ b/linux/alsa/JackAlsaDriver.h @@ -39,6 +39,7 @@ class JackAlsaDriver : public JackAudioDriver private: jack_driver_t* fDriver; + jack_native_thread_t fReservationLoopThread; void UpdateLatencies(); |