summaryrefslogtreecommitdiff
path: root/linux
diff options
context:
space:
mode:
authorfalkTX <falktx@falktx.com>2019-10-28 11:16:09 +0100
committerfalkTX <falktx@falktx.com>2019-10-28 11:16:09 +0100
commitf19176657cd8bf3d672554c97872b1f1bc0b7054 (patch)
tree687a499ccd80385184b5b4397b570054fe423c5a /linux
parent5286020560aeef2c7ef48972a42ed6ee0c111326 (diff)
downloadjack2-f19176657cd8bf3d672554c97872b1f1bc0b7054.tar.gz
Fix blocking DBus device reservation, so it plays nice with others
Diffstat (limited to 'linux')
-rw-r--r--linux/alsa/JackAlsaDriver.cpp23
-rw-r--r--linux/alsa/JackAlsaDriver.h1
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();