diff --git a/configure.ac b/configure.ac index e2a37ae..892f70a 100644 --- a/configure.ac +++ b/configure.ac @@ -15,7 +15,7 @@ dnl changes are made dnl --- JACK_MAJOR_VERSION=0 JACK_MINOR_VERSION=100 -JACK_MICRO_VERSION=2 +JACK_MICRO_VERSION=3 dnl --- dnl HOWTO: updating the jack protocol version diff --git a/drivers/alsa/alsa_driver.c b/drivers/alsa/alsa_driver.c index ad880be..239e2b5 100644 --- a/drivers/alsa/alsa_driver.c +++ b/drivers/alsa/alsa_driver.c @@ -1681,10 +1681,10 @@ alsa_driver_run_cycle (alsa_driver_t *driver) DEBUG ("alsaback from wait, nframes = %lu", nframes); - if (wait_status < 0) + if (unlikely(wait_status < 0)) return -1; /* driver failed */ - if (nframes == 0) { + if (unlikely(nframes == 0)) { /* we detected an xrun and restarted: notify * clients about the delay. diff --git a/drivers/alsa/usx2y.c b/drivers/alsa/usx2y.c index 3384e6e..ef9c4f5 100644 --- a/drivers/alsa/usx2y.c +++ b/drivers/alsa/usx2y.c @@ -31,7 +31,12 @@ #define ARRAY_SIZE(x) (sizeof(x) / sizeof((x)[0])) #endif +//#define DBGHWDEP +#ifdef DBGHWDEP +int dbg_offset; +char dbg_buffer[8096]; +#endif static int usx2y_set_input_monitor_mask (jack_hardware_t *hw, unsigned long mask) { @@ -118,7 +123,7 @@ usx2y_driver_get_channel_addresses_playback (alsa_driver_t *driver, if (dbg_offset < (sizeof(dbg_buffer) - 256)) dbg_offset += sprintf(dbg_buffer + dbg_offset, "avail %li@%p\n", *playback_avail, driver->playback_addr[0]); else { - jack_error(dbg_buffer); + printf(dbg_buffer); return -1; } #endif @@ -143,7 +148,7 @@ usx2y_driver_get_channel_addresses_capture (alsa_driver_t *driver, return 0; /* FIXME: return -1; */ h->capture_iso_bytes_done = 0; #ifdef DBGHWDEP - dbg_offset = sprintf(dbg_buffer, "first iso = %i %i@%p:%i\n", + dbg_offset = sprintf(dbg_buffer, "cfirst iso = %i %i@%p:%i\n", iso, h->hwdep_pcm_shm->captured_iso[iso].length, h->hwdep_pcm_shm->capture0x8, h->hwdep_pcm_shm->captured_iso[iso].offset); @@ -152,7 +157,7 @@ usx2y_driver_get_channel_addresses_capture (alsa_driver_t *driver, iso = h->capture_iso_start; } #ifdef DBGHWDEP - dbg_offset += sprintf(dbg_buffer + dbg_offset, "iso = %i(%i;%i); ", iso, + dbg_offset += sprintf(dbg_buffer + dbg_offset, "ciso = %i(%i;%i); ", iso, h->hwdep_pcm_shm->captured_iso[iso].offset, h->hwdep_pcm_shm->captured_iso[iso].frame); #endif @@ -178,10 +183,21 @@ usx2y_driver_get_channel_addresses_capture (alsa_driver_t *driver, ((chn & 1) ? driver->capture_sample_bytes : 0); } #ifdef DBGHWDEP + { + int f = 0; + unsigned *u = driver->capture_addr[0]; + static unsigned last; + dbg_offset += sprintf(dbg_buffer + dbg_offset, "\nvon %6u bis %6u\n", last, u[0]); + while (f < *capture_avail && dbg_offset < (sizeof(dbg_buffer) - 256)) { + if (u[f] != last + 1) + dbg_offset += sprintf(dbg_buffer + dbg_offset, "\nooops %6u %6u\n", last, u[f]); + last = u[f++]; + } + } if (dbg_offset < (sizeof(dbg_buffer) - 256)) dbg_offset += sprintf(dbg_buffer + dbg_offset, "avail %li@%p\n", *capture_avail, driver->capture_addr[0]); else { - jack_error(dbg_buffer); + printf(dbg_buffer); return -1; } #endif @@ -197,6 +213,12 @@ usx2y_driver_start (alsa_driver_t *driver) usx2y_t *h = (usx2y_t *) driver->hw->private; + if (driver->capture_nchannels == 4) { + // US428 channels 3+4 are on a seperate 2 channel stream. + // ALSA thinks its 1 stream with 4 channels, so we have to hack here. + driver->capture_interleave_skip = 2 * driver->capture_sample_bytes; + } + driver->poll_last = 0; driver->poll_next = 0; diff --git a/jack/internal.h b/jack/internal.h index 59ce749..fc319d2 100644 --- a/jack/internal.h +++ b/jack/internal.h @@ -445,5 +445,13 @@ jack_port_t *jack_port_by_id_int (const jack_client_t *client, jack_port_t *jack_port_by_name_int (jack_client_t *client, const char *port_name); +#ifdef __GNUC__ +# define likely(x) __builtin_expect((x),1) +# define unlikely(x) __builtin_expect((x),0) +#else +# define likely(x) (x) +# define unlikely(x) (x) +#endif + #endif /* __jack_internal_h__ */