Browse Source

ALSA: Always enable tstamp mode, other small fixes

tags/v1.9.13
falkTX 6 years ago
parent
commit
756b4fa1cb
4 changed files with 30 additions and 35 deletions
  1. +3
    -13
      linux/alsa/JackAlsaDriver.cpp
  2. +1
    -2
      linux/alsa/JackAlsaDriver.h
  3. +25
    -17
      linux/alsa/alsa_driver.c
  4. +1
    -3
      linux/alsa/alsa_driver.h

+ 3
- 13
linux/alsa/JackAlsaDriver.cpp View File

@@ -279,8 +279,7 @@ int JackAlsaDriver::Open(jack_nframes_t nframes,
const char* playback_driver_name,
jack_nframes_t capture_latency,
jack_nframes_t playback_latency,
const char* midi_driver_name,
int hw_timestamping)
const char* midi_driver_name)
{
// Generic JackAudioDriver Open
if (JackAudioDriver::Open(nframes, samplerate, capturing, playing,
@@ -340,8 +339,7 @@ int JackAlsaDriver::Open(jack_nframes_t nframes,
shorts_first,
capture_latency,
playback_latency,
midi,
hw_timestamping);
midi);
if (fDriver) {
// ALSA driver may have changed the in/out values
fCaptureChannels = ((alsa_driver_t *)fDriver)->capture_nchannels;
@@ -752,9 +750,6 @@ SERVER_EXPORT const jack_driver_desc_t* driver_get_descriptor ()
"ALSA MIDI driver",
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;
}

@@ -782,7 +777,6 @@ SERVER_EXPORT Jack::JackDriverClientInterface* driver_initialize(Jack::JackLocke
const JSList * node;
const jack_driver_param_t * param;
const char *midi_driver = "none";
int hw_timestamping = FALSE;

for (node = params; node; node = jack_slist_next (node)) {
param = (const jack_driver_param_t *) node->data;
@@ -881,10 +875,6 @@ SERVER_EXPORT Jack::JackDriverClientInterface* driver_initialize(Jack::JackLocke
case 'X':
midi_driver = strdup(param->value.str);
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...
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,
systemic_input_latency, systemic_output_latency, midi_driver, hw_timestamping) == 0) {
systemic_input_latency, systemic_output_latency, midi_driver) == 0) {
return threaded_driver;
} else {
delete threaded_driver; // Delete the decorated driver


+ 1
- 2
linux/alsa/JackAlsaDriver.h View File

@@ -67,8 +67,7 @@ class JackAlsaDriver : public JackAudioDriver
const char* playback_driver_name,
jack_nframes_t capture_latency,
jack_nframes_t playback_latency,
const char* midi_driver_name,
int hw_timestamping);
const char* midi_driver_name);

int Close();
int Attach();


+ 25
- 17
linux/alsa/alsa_driver.c View File

@@ -589,19 +589,17 @@ alsa_driver_configure_stream (alsa_driver_t *driver, char *device_name,
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) {
@@ -1416,6 +1414,12 @@ alsa_driver_wait (alsa_driver_t *driver, int extra_fd, int *status, float
return 0;
}

if (revents & POLLNVAL) {
jack_error ("ALSA: playback device disconnected");
*status = -7;
return 0;
}

if (revents & POLLERR) {
xrun_detected = TRUE;
}
@@ -1439,6 +1443,12 @@ alsa_driver_wait (alsa_driver_t *driver, int extra_fd, int *status, float
return 0;
}

if (revents & POLLNVAL) {
jack_error ("ALSA: capture device disconnected");
*status = -7;
return 0;
}

if (revents & POLLERR) {
xrun_detected = TRUE;
}
@@ -1860,7 +1870,7 @@ discover_alsa_using_apps ()
while (dir) {
char maybe[PATH_MAX+1];
snprintf (maybe, sizeof(maybe), "%s/lsof", dir);
if (access (maybe, X_OK)) {
if (access (maybe, X_OK) == 0) {
break;
}
dir = strtok (NULL, ":");
@@ -1957,8 +1967,7 @@ alsa_driver_new (char *name, char *playback_alsa_device,
int shorts_first,
jack_nframes_t capture_latency,
jack_nframes_t playback_latency,
alsa_midi_t *midi_driver,
int hw_timestamping
alsa_midi_t *midi_driver
)
{
int err;
@@ -2044,7 +2053,6 @@ alsa_driver_new (char *name, char *playback_alsa_device,
driver->alsa_name_capture = strdup (capture_alsa_device);

driver->midi = midi_driver;
driver->hw_timestamping = hw_timestamping;
driver->xrun_recovery = 0;

if (alsa_driver_check_card_type (driver)) {


+ 1
- 3
linux/alsa/alsa_driver.h View File

@@ -124,7 +124,6 @@ typedef struct _alsa_driver {
char has_hw_monitoring;
char has_hw_metering;
char quirk_bswap;
char hw_timestamping;

ReadCopyFunction read_via_copy;
WriteCopyFunction write_via_copy;
@@ -249,8 +248,7 @@ alsa_driver_new (char *name, char *playback_alsa_device,
int shorts_first,
jack_nframes_t capture_latency,
jack_nframes_t playback_latency,
alsa_midi_t *midi_driver,
int hw_timestamping
alsa_midi_t *midi_driver
);
void
alsa_driver_delete (alsa_driver_t *driver);


Loading…
Cancel
Save