Browse Source

jack alsa: implement restart request [2/3]

in case ALSA_DRIVER_FEAT_CLOSE_IDLE_DEVS is defined unused devices are
closed on restart request, otherwise unused devices will be kept in
prepared state

Change-Id: I0cd91deb957a4839c5ea8c679bdabe1d0a3c6720
Signed-off-by: Adam Miartus <amiartus@de.adit-jv.com>
(cherry picked from commit ee4fe3fde6)
Signed-off-by: Timo Wischer <twischer@de.adit-jv.com>
pull/608/head
Adam Miartus Timo Wischer 6 years ago
parent
commit
b88a85ac8d
3 changed files with 17 additions and 2 deletions
  1. +10
    -0
      linux/alsa/JackAlsaDriver.cpp
  2. +2
    -2
      linux/alsa/alsa_driver.c
  3. +5
    -0
      linux/alsa/alsa_driver.h

+ 10
- 0
linux/alsa/JackAlsaDriver.cpp View File

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

}
}



+ 2
- 2
linux/alsa/alsa_driver.c View File

@@ -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 <driver->devices_c_count)) {
if (!device->capture_handle && (i <driver->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 <driver->devices_p_count)) {
if (!device->playback_handle && (i <driver->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.",


+ 5
- 0
linux/alsa/alsa_driver.h View File

@@ -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"
{


Loading…
Cancel
Save