From 6afe197889b141251f7f68d8b76706097c7ebd57 Mon Sep 17 00:00:00 2001 From: Nedko Arnaudov Date: Sat, 24 Nov 2012 04:39:46 +0200 Subject: [PATCH] Fixes for alsa device reservation * Don't attempt to use device reservation when card_to_num() mapping has failed. In case of card_to_num() failures, "Audio-1" device was reserved on start but not released on stop. This was causing next start to fail with out of memory error, and since previous commit, with "A handler is already registered for /org/freedesktop/ReserveDevice1/Audio-1" error. * In case of playback device reservation failure, release the capture device * Remove unused fReservedCaptureDevice and fReservedPlaybackDevice data members of the JackAlsaDriver class --- linux/alsa/JackAlsaDriver.cpp | 16 +++++++++++----- linux/alsa/JackAlsaDriver.h | 4 +--- 2 files changed, 12 insertions(+), 8 deletions(-) diff --git a/linux/alsa/JackAlsaDriver.cpp b/linux/alsa/JackAlsaDriver.cpp index a79772f2..2465b551 100644 --- a/linux/alsa/JackAlsaDriver.cpp +++ b/linux/alsa/JackAlsaDriver.cpp @@ -278,16 +278,22 @@ int JackAlsaDriver::Open(jack_nframes_t nframes, int playback_card = card_to_num(playback_driver_name); char audio_name[32]; - snprintf(audio_name, sizeof(audio_name), "Audio%d", capture_card); - if (!JackServerGlobals::on_device_acquire(audio_name)) { - jack_error("Audio device %s cannot be acquired...", capture_driver_name); - return -1; + if (capture_card >= 0) { + snprintf(audio_name, sizeof(audio_name), "Audio%d", capture_card); + if (!JackServerGlobals::on_device_acquire(audio_name)) { + jack_error("Audio device %s cannot be acquired...", capture_driver_name); + return -1; + } } - if (playback_card != capture_card) { + if (playback_card >= 0 && playback_card != capture_card) { snprintf(audio_name, sizeof(audio_name), "Audio%d", playback_card); if (!JackServerGlobals::on_device_acquire(audio_name)) { jack_error("Audio device %s cannot be acquired...", playback_driver_name); + if (capture_card >= 0) { + snprintf(audio_name, sizeof(audio_name), "Audio%d", capture_card); + JackServerGlobals::on_device_release(audio_name); + } return -1; } } diff --git a/linux/alsa/JackAlsaDriver.h b/linux/alsa/JackAlsaDriver.h index a88d4a01..c62ff541 100644 --- a/linux/alsa/JackAlsaDriver.h +++ b/linux/alsa/JackAlsaDriver.h @@ -39,15 +39,13 @@ class JackAlsaDriver : public JackAudioDriver private: jack_driver_t* fDriver; - int fReservedCaptureDevice; - int fReservedPlaybackDevice; void UpdateLatencies(); public: JackAlsaDriver(const char* name, const char* alias, JackLockedEngine* engine, JackSynchro* table) - : JackAudioDriver(name, alias, engine, table),fDriver(NULL),fReservedCaptureDevice(-1),fReservedPlaybackDevice(-1) + : JackAudioDriver(name, alias, engine, table),fDriver(NULL) {} virtual ~JackAlsaDriver() {} -- 2.11.4.GIT