diff --git a/linux/alsa/JackAlsaDriver.cpp b/linux/alsa/JackAlsaDriver.cpp index fb976f7a..7d812720 100644 --- a/linux/alsa/JackAlsaDriver.cpp +++ b/linux/alsa/JackAlsaDriver.cpp @@ -564,6 +564,8 @@ int JackAlsaDriver::TargetState(int init, int connections_count) state = SND_PCM_STATE_RUNNING; } else if (init) { state = SND_PCM_STATE_RUNNING; + } else if (driver->features & ALSA_DRIVER_FEAT_CLOSE_IDLE_DEVS) { + state = SND_PCM_STATE_NOTREADY; } else { state = SND_PCM_STATE_PREPARED; } @@ -858,6 +860,9 @@ SERVER_EXPORT const jack_driver_desc_t* driver_get_descriptor () "ALSA MIDI driver", NULL); + value.i = 0; + jack_driver_descriptor_add_parameter(desc, &filler, "close-idle-devs", 'c', JackDriverParamBool, &value, NULL, "Close idle devices on alsa driver restart request", NULL); + return desc; } @@ -1043,6 +1048,11 @@ SERVER_EXPORT Jack::JackDriverClientInterface* driver_initialize(Jack::JackLocke free(info.midi_name); info.midi_name = strdup(param->value.str); break; + + case 'c': + info.features |= param->value.i ? ALSA_DRIVER_FEAT_CLOSE_IDLE_DEVS : 0; + break; + } } diff --git a/linux/alsa/alsa_driver.c b/linux/alsa/alsa_driver.c index 371dc587..738ee7ec 100644 --- a/linux/alsa/alsa_driver.c +++ b/linux/alsa/alsa_driver.c @@ -1387,7 +1387,7 @@ alsa_driver_open (alsa_driver_t *driver) alsa_device_t *device = &driver->devices[i]; int do_capture = 0, do_playback = 0; - if (!device->capture_handle && (i devices_c_count)) { + if (!device->capture_handle && (i devices_c_count) && (device->capture_target_state != SND_PCM_STATE_NOTREADY)) { err = alsa_driver_open_device (driver, &driver->devices[i], SND_PCM_STREAM_CAPTURE); if (err < 0) { jack_error ("\n\nATTENTION: Opening of the capture device \"%s\" failed.", @@ -1398,7 +1398,7 @@ alsa_driver_open (alsa_driver_t *driver) do_capture = 1; } - if (!device->playback_handle && (i devices_p_count)) { + if (!device->playback_handle && (i devices_p_count) && (device->playback_target_state != SND_PCM_STATE_NOTREADY)) { err = alsa_driver_open_device (driver, &driver->devices[i], SND_PCM_STREAM_PLAYBACK); if (err < 0) { jack_error ("\n\nATTENTION: Opening of the playback device \"%s\" failed.", diff --git a/linux/alsa/alsa_driver.h b/linux/alsa/alsa_driver.h index 17aa31f4..91022b25 100644 --- a/linux/alsa/alsa_driver.h +++ b/linux/alsa/alsa_driver.h @@ -58,14 +58,19 @@ #define SND_PCM_STATE_SUSPENDED SND_PCM_STATUS_SUSPENDED #define SND_PCM_STATE_XRUN SND_PCM_STATUS_UNDERRUN #define SND_PCM_STATE_RUNNING SND_PCM_STATUS_RUNNING +#define SND_PCM_STATE_NOTREADY SND_PCM_STATUS_NOTREADY #define SND_PCM_STREAM_PLAYBACK SND_PCM_CHANNEL_PLAYBACK #define SND_PCM_STREAM_CAPTURE SND_PCM_CHANNEL_CAPTURE typedef unsigned long snd_pcm_uframes_t; typedef signed long snd_pcm_sframes_t; typedef int32_t alsa_driver_default_format_t; +#else +#define SND_PCM_STATE_NOTREADY (SND_PCM_STATE_LAST + 1) #endif +#define ALSA_DRIVER_FEAT_CLOSE_IDLE_DEVS (1 << 1) + #ifdef __cplusplus extern "C" {