@@ -279,8 +279,7 @@ int JackAlsaDriver::Open(jack_nframes_t nframes, | |||||
const char* playback_driver_name, | const char* playback_driver_name, | ||||
jack_nframes_t capture_latency, | jack_nframes_t capture_latency, | ||||
jack_nframes_t playback_latency, | jack_nframes_t playback_latency, | ||||
const char* midi_driver_name, | |||||
int hw_timestamping) | |||||
const char* midi_driver_name) | |||||
{ | { | ||||
// Generic JackAudioDriver Open | // Generic JackAudioDriver Open | ||||
if (JackAudioDriver::Open(nframes, samplerate, capturing, playing, | if (JackAudioDriver::Open(nframes, samplerate, capturing, playing, | ||||
@@ -340,8 +339,7 @@ int JackAlsaDriver::Open(jack_nframes_t nframes, | |||||
shorts_first, | shorts_first, | ||||
capture_latency, | capture_latency, | ||||
playback_latency, | playback_latency, | ||||
midi, | |||||
hw_timestamping); | |||||
midi); | |||||
if (fDriver) { | if (fDriver) { | ||||
// ALSA driver may have changed the in/out values | // ALSA driver may have changed the in/out values | ||||
fCaptureChannels = ((alsa_driver_t *)fDriver)->capture_nchannels; | fCaptureChannels = ((alsa_driver_t *)fDriver)->capture_nchannels; | ||||
@@ -752,9 +750,6 @@ SERVER_EXPORT const jack_driver_desc_t* driver_get_descriptor () | |||||
"ALSA MIDI driver", | "ALSA MIDI driver", | ||||
NULL); | NULL); | ||||
value.i = 0; | |||||
jack_driver_descriptor_add_parameter(desc, &filler, "htstamps", 't', JackDriverParamBool, &value, NULL, "Enable htimestamping for the ALSA devices", NULL); | |||||
return desc; | return desc; | ||||
} | } | ||||
@@ -782,7 +777,6 @@ SERVER_EXPORT Jack::JackDriverClientInterface* driver_initialize(Jack::JackLocke | |||||
const JSList * node; | const JSList * node; | ||||
const jack_driver_param_t * param; | const jack_driver_param_t * param; | ||||
const char *midi_driver = "none"; | const char *midi_driver = "none"; | ||||
int hw_timestamping = FALSE; | |||||
for (node = params; node; node = jack_slist_next (node)) { | for (node = params; node; node = jack_slist_next (node)) { | ||||
param = (const jack_driver_param_t *) node->data; | param = (const jack_driver_param_t *) node->data; | ||||
@@ -881,10 +875,6 @@ SERVER_EXPORT Jack::JackDriverClientInterface* driver_initialize(Jack::JackLocke | |||||
case 'X': | case 'X': | ||||
midi_driver = strdup(param->value.str); | midi_driver = strdup(param->value.str); | ||||
break; | break; | ||||
case 't': | |||||
hw_timestamping = param->value.i; | |||||
break; | |||||
} | } | ||||
} | } | ||||
@@ -899,7 +889,7 @@ SERVER_EXPORT Jack::JackDriverClientInterface* driver_initialize(Jack::JackLocke | |||||
// Special open for ALSA driver... | // Special open for ALSA driver... | ||||
if (g_alsa_driver->Open(frames_per_interrupt, user_nperiods, srate, hw_monitoring, hw_metering, capture, playback, dither, soft_mode, monitor, | if (g_alsa_driver->Open(frames_per_interrupt, user_nperiods, srate, hw_monitoring, hw_metering, capture, playback, dither, soft_mode, monitor, | ||||
user_capture_nchnls, user_playback_nchnls, shorts_first, capture_pcm_name, playback_pcm_name, | user_capture_nchnls, user_playback_nchnls, shorts_first, capture_pcm_name, playback_pcm_name, | ||||
systemic_input_latency, systemic_output_latency, midi_driver, hw_timestamping) == 0) { | |||||
systemic_input_latency, systemic_output_latency, midi_driver) == 0) { | |||||
return threaded_driver; | return threaded_driver; | ||||
} else { | } else { | ||||
delete threaded_driver; // Delete the decorated driver | delete threaded_driver; // Delete the decorated driver | ||||
@@ -67,8 +67,7 @@ class JackAlsaDriver : public JackAudioDriver | |||||
const char* playback_driver_name, | const char* playback_driver_name, | ||||
jack_nframes_t capture_latency, | jack_nframes_t capture_latency, | ||||
jack_nframes_t playback_latency, | jack_nframes_t playback_latency, | ||||
const char* midi_driver_name, | |||||
int hw_timestamping); | |||||
const char* midi_driver_name); | |||||
int Close(); | int Close(); | ||||
int Attach(); | int Attach(); | ||||
@@ -589,19 +589,17 @@ alsa_driver_configure_stream (alsa_driver_t *driver, char *device_name, | |||||
return -1; | return -1; | ||||
} | } | ||||
if (driver->hw_timestamping) { | |||||
err = snd_pcm_sw_params_set_tstamp_mode(handle, sw_params, | |||||
SND_PCM_TSTAMP_ENABLE); | |||||
if (err < 0) { | |||||
jack_info("Could not enable ALSA time stamp mode for %s (err %d)", | |||||
stream_name, err); | |||||
} | |||||
err = snd_pcm_sw_params_set_tstamp_type(handle, sw_params, | |||||
SND_PCM_TSTAMP_TYPE_MONOTONIC); | |||||
if (err < 0) { | |||||
jack_info("Could not use monotonic ALSA time stamps for %s (err %d)", | |||||
stream_name, err); | |||||
} | |||||
err = snd_pcm_sw_params_set_tstamp_mode(handle, sw_params, SND_PCM_TSTAMP_ENABLE); | |||||
if (err < 0) { | |||||
jack_info("Could not enable ALSA time stamp mode for %s (err %d)", | |||||
stream_name, err); | |||||
} | |||||
// TODO check if SND_PCM_TSTAMP_TYPE_MONOTONIC is valid | |||||
err = snd_pcm_sw_params_set_tstamp_type(handle, sw_params, SND_PCM_TSTAMP_TYPE_MONOTONIC); | |||||
if (err < 0) { | |||||
jack_info("Could not use monotonic ALSA time stamps for %s (err %d)", | |||||
stream_name, err); | |||||
} | } | ||||
if ((err = snd_pcm_sw_params (handle, sw_params)) < 0) { | if ((err = snd_pcm_sw_params (handle, sw_params)) < 0) { | ||||
@@ -1416,6 +1414,12 @@ alsa_driver_wait (alsa_driver_t *driver, int extra_fd, int *status, float | |||||
return 0; | return 0; | ||||
} | } | ||||
if (revents & POLLNVAL) { | |||||
jack_error ("ALSA: playback device disconnected"); | |||||
*status = -7; | |||||
return 0; | |||||
} | |||||
if (revents & POLLERR) { | if (revents & POLLERR) { | ||||
xrun_detected = TRUE; | xrun_detected = TRUE; | ||||
} | } | ||||
@@ -1439,6 +1443,12 @@ alsa_driver_wait (alsa_driver_t *driver, int extra_fd, int *status, float | |||||
return 0; | return 0; | ||||
} | } | ||||
if (revents & POLLNVAL) { | |||||
jack_error ("ALSA: capture device disconnected"); | |||||
*status = -7; | |||||
return 0; | |||||
} | |||||
if (revents & POLLERR) { | if (revents & POLLERR) { | ||||
xrun_detected = TRUE; | xrun_detected = TRUE; | ||||
} | } | ||||
@@ -1860,7 +1870,7 @@ discover_alsa_using_apps () | |||||
while (dir) { | while (dir) { | ||||
char maybe[PATH_MAX+1]; | char maybe[PATH_MAX+1]; | ||||
snprintf (maybe, sizeof(maybe), "%s/lsof", dir); | snprintf (maybe, sizeof(maybe), "%s/lsof", dir); | ||||
if (access (maybe, X_OK)) { | |||||
if (access (maybe, X_OK) == 0) { | |||||
break; | break; | ||||
} | } | ||||
dir = strtok (NULL, ":"); | dir = strtok (NULL, ":"); | ||||
@@ -1957,8 +1967,7 @@ alsa_driver_new (char *name, char *playback_alsa_device, | |||||
int shorts_first, | int shorts_first, | ||||
jack_nframes_t capture_latency, | jack_nframes_t capture_latency, | ||||
jack_nframes_t playback_latency, | jack_nframes_t playback_latency, | ||||
alsa_midi_t *midi_driver, | |||||
int hw_timestamping | |||||
alsa_midi_t *midi_driver | |||||
) | ) | ||||
{ | { | ||||
int err; | int err; | ||||
@@ -2044,7 +2053,6 @@ alsa_driver_new (char *name, char *playback_alsa_device, | |||||
driver->alsa_name_capture = strdup (capture_alsa_device); | driver->alsa_name_capture = strdup (capture_alsa_device); | ||||
driver->midi = midi_driver; | driver->midi = midi_driver; | ||||
driver->hw_timestamping = hw_timestamping; | |||||
driver->xrun_recovery = 0; | driver->xrun_recovery = 0; | ||||
if (alsa_driver_check_card_type (driver)) { | if (alsa_driver_check_card_type (driver)) { | ||||
@@ -124,7 +124,6 @@ typedef struct _alsa_driver { | |||||
char has_hw_monitoring; | char has_hw_monitoring; | ||||
char has_hw_metering; | char has_hw_metering; | ||||
char quirk_bswap; | char quirk_bswap; | ||||
char hw_timestamping; | |||||
ReadCopyFunction read_via_copy; | ReadCopyFunction read_via_copy; | ||||
WriteCopyFunction write_via_copy; | WriteCopyFunction write_via_copy; | ||||
@@ -249,8 +248,7 @@ alsa_driver_new (char *name, char *playback_alsa_device, | |||||
int shorts_first, | int shorts_first, | ||||
jack_nframes_t capture_latency, | jack_nframes_t capture_latency, | ||||
jack_nframes_t playback_latency, | jack_nframes_t playback_latency, | ||||
alsa_midi_t *midi_driver, | |||||
int hw_timestamping | |||||
alsa_midi_t *midi_driver | |||||
); | ); | ||||
void | void | ||||
alsa_driver_delete (alsa_driver_t *driver); | alsa_driver_delete (alsa_driver_t *driver); | ||||