From c17e21ee12f579c01a8a63aa1b2482060d4897f9 Mon Sep 17 00:00:00 2001 From: sletz Date: Wed, 23 Jul 2008 13:45:30 +0000 Subject: [PATCH] Florian Faber native 32 bits float patch for alsa driver. git-svn-id: svn+ssh://jackaudio.org/trunk/jack@2723 0c269be4-1314-0410-8aa9-9f06e86f4224 --- configure.ac | 2 +- drivers/alsa/alsa_driver.c | 237 ++++++++++++++++++++----------------- drivers/alsa/memops.c | 85 +++++++------ drivers/alsa/memops.h | 4 + libjack/client.c | 42 +++++-- 5 files changed, 203 insertions(+), 167 deletions(-) diff --git a/configure.ac b/configure.ac index 10ba516..1f84028 100644 --- a/configure.ac +++ b/configure.ac @@ -17,7 +17,7 @@ dnl changes are made dnl --- JACK_MAJOR_VERSION=0 JACK_MINOR_VERSION=112 -JACK_MICRO_VERSION=0 +JACK_MICRO_VERSION=1 dnl --- dnl HOWTO: updating the jack protocol version diff --git a/drivers/alsa/alsa_driver.c b/drivers/alsa/alsa_driver.c index 757cca6..a360e5b 100644 --- a/drivers/alsa/alsa_driver.c +++ b/drivers/alsa/alsa_driver.c @@ -233,129 +233,145 @@ alsa_driver_hw_specific (alsa_driver_t *driver, int hw_monitoring, static void alsa_driver_setup_io_function_pointers (alsa_driver_t *driver) { - switch (driver->playback_sample_bytes) { - case 2: - if (driver->playback_interleaved) { - driver->channel_copy = memcpy_interleave_d16_s16; + if (SNDRV_PCM_FORMAT_FLOAT_LE == driver->playback_sample_format) { + if (driver->playback_interleaved) { + driver->channel_copy = memcpy_interleave_d32_s32; } else { driver->channel_copy = memcpy_fake; } - - switch (driver->dither) { + driver->read_via_copy = sample_move_floatLE_sSs; + driver->write_via_copy = sample_move_dS_floatLE; + } else { + switch (driver->playback_sample_bytes) { + case 2: + if (driver->playback_interleaved) { + driver->channel_copy = memcpy_interleave_d16_s16; + } else { + driver->channel_copy = memcpy_fake; + } + + switch (driver->dither) { case Rectangular: - jack_info("Rectangular dithering at 16 bits"); - driver->write_via_copy = driver->quirk_bswap? - sample_move_dither_rect_d16_sSs: - sample_move_dither_rect_d16_sS; - break; - - case Triangular: - jack_info("Triangular dithering at 16 bits"); - driver->write_via_copy = driver->quirk_bswap? - sample_move_dither_tri_d16_sSs: - sample_move_dither_tri_d16_sS; - break; - + jack_info("Rectangular dithering at 16 bits"); + driver->write_via_copy = driver->quirk_bswap? + sample_move_dither_rect_d16_sSs: + sample_move_dither_rect_d16_sS; + break; + + case Triangular: + jack_info("Triangular dithering at 16 bits"); + driver->write_via_copy = driver->quirk_bswap? + sample_move_dither_tri_d16_sSs: + sample_move_dither_tri_d16_sS; + break; + case Shaped: - jack_info("Noise-shaped dithering at 16 bits"); - driver->write_via_copy = driver->quirk_bswap? - sample_move_dither_shaped_d16_sSs: - sample_move_dither_shaped_d16_sS; - break; - + jack_info("Noise-shaped dithering at 16 bits"); + driver->write_via_copy = driver->quirk_bswap? + sample_move_dither_shaped_d16_sSs: + sample_move_dither_shaped_d16_sS; + break; + default: - driver->write_via_copy = driver->quirk_bswap? - sample_move_d16_sSs : sample_move_d16_sS; - break; - } - break; - - case 3: - if (driver->playback_interleaved) { - driver->channel_copy = memcpy_interleave_d24_s24; - } else { - driver->channel_copy = memcpy_fake; - } - - switch (driver->dither) { + driver->write_via_copy = driver->quirk_bswap? + sample_move_d16_sSs : + sample_move_d16_sS; + break; + } + break; + + case 3: + if (driver->playback_interleaved) { + driver->channel_copy = memcpy_interleave_d24_s24; + } else { + driver->channel_copy = memcpy_fake; + } + + switch (driver->dither) { case Rectangular: - jack_info("Rectangular dithering at 16 bits"); - driver->write_via_copy = driver->quirk_bswap? - sample_move_dither_rect_d24_sSs: - sample_move_dither_rect_d24_sS; - break; - + jack_info("Rectangular dithering at 16 bits"); + driver->write_via_copy = driver->quirk_bswap? + sample_move_dither_rect_d24_sSs: + sample_move_dither_rect_d24_sS; + break; + case Triangular: - jack_info("Triangular dithering at 16 bits"); - driver->write_via_copy = driver->quirk_bswap? - sample_move_dither_tri_d24_sSs: - sample_move_dither_tri_d24_sS; - break; - + jack_info("Triangular dithering at 16 bits"); + driver->write_via_copy = driver->quirk_bswap? + sample_move_dither_tri_d24_sSs: + sample_move_dither_tri_d24_sS; + break; + case Shaped: - jack_info("Noise-shaped dithering at 16 bits"); - driver->write_via_copy = driver->quirk_bswap? - sample_move_dither_shaped_d24_sSs: - sample_move_dither_shaped_d24_sS; - break; - + jack_info("Noise-shaped dithering at 16 bits"); + driver->write_via_copy = driver->quirk_bswap? + sample_move_dither_shaped_d24_sSs: + sample_move_dither_shaped_d24_sS; + break; + default: - driver->write_via_copy = driver->quirk_bswap? - sample_move_d24_sSs : sample_move_d24_sS; + driver->write_via_copy = driver->quirk_bswap? + sample_move_d24_sSs: + sample_move_d24_sS; + break; + } break; - } - break; - - case 4: - if (driver->playback_interleaved) { - driver->channel_copy = memcpy_interleave_d32_s32; - } else { - driver->channel_copy = memcpy_fake; - } - - switch (driver->dither) { + + case 4: + if (driver->playback_interleaved) { + driver->channel_copy = memcpy_interleave_d32_s32; + } else { + driver->channel_copy = memcpy_fake; + } + + switch (driver->dither) { case Rectangular: - jack_info("Rectangular dithering at 16 bits"); - driver->write_via_copy = driver->quirk_bswap? - sample_move_dither_rect_d32u24_sSs: - sample_move_dither_rect_d32u24_sS; - break; - + jack_info("Rectangular dithering at 16 bits"); + driver->write_via_copy = driver->quirk_bswap? + sample_move_dither_rect_d32u24_sSs: + sample_move_dither_rect_d32u24_sS; + break; + case Triangular: - jack_info("Triangular dithering at 16 bits"); - driver->write_via_copy = driver->quirk_bswap? - sample_move_dither_tri_d32u24_sSs: - sample_move_dither_tri_d32u24_sS; - break; - + jack_info("Triangular dithering at 16 bits"); + driver->write_via_copy = driver->quirk_bswap? + sample_move_dither_tri_d32u24_sSs: + sample_move_dither_tri_d32u24_sS; + break; + case Shaped: - jack_info("Noise-shaped dithering at 16 bits"); - driver->write_via_copy = driver->quirk_bswap? - sample_move_dither_shaped_d32u24_sSs: - sample_move_dither_shaped_d32u24_sS; - break; - + jack_info("Noise-shaped dithering at 16 bits"); + driver->write_via_copy = driver->quirk_bswap? + sample_move_dither_shaped_d32u24_sSs: + sample_move_dither_shaped_d32u24_sS; + break; + default: - driver->write_via_copy = driver->quirk_bswap? - sample_move_d32u24_sSs : sample_move_d32u24_sS; + driver->write_via_copy = driver->quirk_bswap? + sample_move_d32u24_sSs: + sample_move_d32u24_sS; + break; + } + break; + } + + switch (driver->capture_sample_bytes) { + case 2: + driver->read_via_copy = driver->quirk_bswap? + sample_move_dS_s16s: + sample_move_dS_s16; break; - } - break; - } - - switch (driver->capture_sample_bytes) { - case 2: - driver->read_via_copy = driver->quirk_bswap? - sample_move_dS_s16s : sample_move_dS_s16; - break; - case 3: - driver->read_via_copy = driver->quirk_bswap? - sample_move_dS_s24s : sample_move_dS_s24; - break; - case 4: - driver->read_via_copy = driver->quirk_bswap? - sample_move_dS_s32u24s : sample_move_dS_s32u24; + case 3: + driver->read_via_copy = driver->quirk_bswap? + sample_move_dS_s24s: + sample_move_dS_s24; + break; + case 4: + driver->read_via_copy = driver->quirk_bswap? + sample_move_dS_s32u24s: + sample_move_dS_s32u24; break; + } } } @@ -377,15 +393,16 @@ alsa_driver_configure_stream (alsa_driver_t *driver, char *device_name, snd_pcm_format_t format; int swapped; } formats[] = { - {"32bit little-endian", SND_PCM_FORMAT_S32_LE, IS_LE}, - {"32bit big-endian", SND_PCM_FORMAT_S32_BE, IS_BE}, + {"32bit float little-endian", SND_PCM_FORMAT_FLOAT_LE}, + {"32bit integer little-endian", SND_PCM_FORMAT_S32_LE, IS_LE}, + {"32bit integer big-endian", SND_PCM_FORMAT_S32_BE, IS_BE}, {"24bit little-endian", SND_PCM_FORMAT_S24_3LE, IS_LE}, {"24bit big-endian", SND_PCM_FORMAT_S24_3BE, IS_BE}, {"16bit little-endian", SND_PCM_FORMAT_S16_LE, IS_LE}, {"16bit big-endian", SND_PCM_FORMAT_S16_BE, IS_BE}, }; #define NUMFORMATS (sizeof(formats)/sizeof(formats[0])) -#define FIRST_16BIT_FORMAT 4 +#define FIRST_16BIT_FORMAT 5 if ((err = snd_pcm_hw_params_any (handle, hw_params)) < 0) { jack_error ("ALSA: no playback configurations available (%s)", @@ -759,6 +776,7 @@ alsa_driver_set_parameters (alsa_driver_t *driver, if (driver->playback_handle) { switch (driver->playback_sample_format) { + case SND_PCM_FORMAT_FLOAT_LE: case SND_PCM_FORMAT_S32_LE: case SND_PCM_FORMAT_S24_3LE: case SND_PCM_FORMAT_S24_3BE: @@ -776,6 +794,7 @@ alsa_driver_set_parameters (alsa_driver_t *driver, if (driver->capture_handle) { switch (driver->capture_sample_format) { + case SND_PCM_FORMAT_FLOAT_LE: case SND_PCM_FORMAT_S32_LE: case SND_PCM_FORMAT_S24_3LE: case SND_PCM_FORMAT_S24_3BE: diff --git a/drivers/alsa/memops.c b/drivers/alsa/memops.c index d293f2f..1d1d86f 100644 --- a/drivers/alsa/memops.c +++ b/drivers/alsa/memops.c @@ -49,8 +49,28 @@ inline unsigned int fast_rand() { return seed; } -void sample_move_d32u24_sSs (char *dst, jack_default_audio_sample_t *src, unsigned long nsamples, unsigned long dst_skip, dither_state_t *state) +/* functions for native float sample data */ + +void sample_move_floatLE_sSs (jack_default_audio_sample_t *dst, char *src, unsigned long nsamples, unsigned long src_skip) { + while (nsamples--) { + *dst = *((float *) src); + dst++; + src += src_skip; + } +} + +void sample_move_dS_floatLE (char *dst, jack_default_audio_sample_t *src, unsigned long nsamples, unsigned long dst_skip, dither_state_t *state) { + while (nsamples--) { + *((float *) dst) = *src; + dst += dst_skip; + src++; + } +} + +/* functions for native integer sample data */ + +void sample_move_d32u24_sSs (char *dst, jack_default_audio_sample_t *src, unsigned long nsamples, unsigned long dst_skip, dither_state_t *state) { long long y; int z; @@ -81,9 +101,8 @@ void sample_move_d32u24_sSs (char *dst, jack_default_audio_sample_t *src, unsign } void sample_move_d32u24_sS (char *dst, jack_default_audio_sample_t *src, unsigned long nsamples, unsigned long dst_skip, dither_state_t *state) - { - long long y; + long long y; while (nsamples--) { y = (long long)(*src * SAMPLE_MAX_24BIT) << 8; @@ -140,7 +159,6 @@ void sample_move_dS_s32u24 (jack_default_audio_sample_t *dst, char *src, unsigne } void sample_move_dither_rect_d32u24_sSs (char *dst, jack_default_audio_sample_t *src, unsigned long nsamples, unsigned long dst_skip, dither_state_t *state) - { /* ALERT: signed sign-extension portability !!! */ jack_default_audio_sample_t x; @@ -176,7 +194,6 @@ void sample_move_dither_rect_d32u24_sSs (char *dst, jack_default_audio_sample_t } void sample_move_dither_rect_d32u24_sS (char *dst, jack_default_audio_sample_t *src, unsigned long nsamples, unsigned long dst_skip, dither_state_t *state) - { /* ALERT: signed sign-extension portability !!! */ jack_default_audio_sample_t x; @@ -199,8 +216,7 @@ void sample_move_dither_rect_d32u24_sS (char *dst, jack_default_audio_sample_t * } } -void sample_move_dither_tri_d32u24_sSs (char *dst, jack_default_audio_sample_t *src, unsigned long nsamples, unsigned long dst_skip, dither_state_t *state) - +void sample_move_dither_tri_d32u24_sSs (char *dst, jack_default_audio_sample_t *src, unsigned long nsamples, unsigned long dst_skip, dither_state_t *state) { jack_default_audio_sample_t x; float r; @@ -240,8 +256,7 @@ void sample_move_dither_tri_d32u24_sSs (char *dst, jack_default_audio_sample_t state->rm1 = rm1; } -void sample_move_dither_tri_d32u24_sS (char *dst, jack_default_audio_sample_t *src, unsigned long nsamples, unsigned long dst_skip, dither_state_t *state) - +void sample_move_dither_tri_d32u24_sS (char *dst, jack_default_audio_sample_t *src, unsigned long nsamples, unsigned long dst_skip, dither_state_t *state) { jack_default_audio_sample_t x; float r; @@ -270,8 +285,7 @@ void sample_move_dither_tri_d32u24_sS (char *dst, jack_default_audio_sample_t * state->rm1 = rm1; } -void sample_move_dither_shaped_d32u24_sSs (char *dst, jack_default_audio_sample_t *src, unsigned long nsamples, unsigned long dst_skip, dither_state_t *state) - +void sample_move_dither_shaped_d32u24_sSs (char *dst, jack_default_audio_sample_t *src, unsigned long nsamples, unsigned long dst_skip, dither_state_t *state) { jack_default_audio_sample_t x; jack_default_audio_sample_t xe; /* the innput sample - filtered error */ @@ -330,8 +344,7 @@ void sample_move_dither_shaped_d32u24_sSs (char *dst, jack_default_audio_sample state->idx = idx; } -void sample_move_dither_shaped_d32u24_sS (char *dst, jack_default_audio_sample_t *src, unsigned long nsamples, unsigned long dst_skip, dither_state_t *state) - +void sample_move_dither_shaped_d32u24_sS (char *dst, jack_default_audio_sample_t *src, unsigned long nsamples, unsigned long dst_skip, dither_state_t *state) { jack_default_audio_sample_t x; jack_default_audio_sample_t xe; /* the innput sample - filtered error */ @@ -379,7 +392,6 @@ void sample_move_dither_shaped_d32u24_sS (char *dst, jack_default_audio_sample_ } void sample_move_d24_sSs (char *dst, jack_default_audio_sample_t *src, unsigned long nsamples, unsigned long dst_skip, dither_state_t *state) - { long long y; int z; @@ -409,7 +421,6 @@ void sample_move_d24_sSs (char *dst, jack_default_audio_sample_t *src, unsigned } void sample_move_d24_sS (char *dst, jack_default_audio_sample_t *src, unsigned long nsamples, unsigned long dst_skip, dither_state_t *state) - { long long y; @@ -483,7 +494,6 @@ void sample_move_dS_s24 (jack_default_audio_sample_t *dst, char *src, unsigned l } void sample_move_dither_rect_d24_sSs (char *dst, jack_default_audio_sample_t *src, unsigned long nsamples, unsigned long dst_skip, dither_state_t *state) - { /* ALERT: signed sign-extension portability !!! */ jack_default_audio_sample_t x; @@ -519,7 +529,6 @@ void sample_move_dither_rect_d24_sSs (char *dst, jack_default_audio_sample_t *sr } void sample_move_dither_rect_d24_sS (char *dst, jack_default_audio_sample_t *src, unsigned long nsamples, unsigned long dst_skip, dither_state_t *state) - { /* ALERT: signed sign-extension portability !!! */ jack_default_audio_sample_t x; @@ -548,8 +557,7 @@ void sample_move_dither_rect_d24_sS (char *dst, jack_default_audio_sample_t *src } } -void sample_move_dither_tri_d24_sSs (char *dst, jack_default_audio_sample_t *src, unsigned long nsamples, unsigned long dst_skip, dither_state_t *state) - +void sample_move_dither_tri_d24_sSs (char *dst, jack_default_audio_sample_t *src, unsigned long nsamples, unsigned long dst_skip, dither_state_t *state) { jack_default_audio_sample_t x; float r; @@ -588,8 +596,7 @@ void sample_move_dither_tri_d24_sSs (char *dst, jack_default_audio_sample_t *sr state->rm1 = rm1; } -void sample_move_dither_tri_d24_sS (char *dst, jack_default_audio_sample_t *src, unsigned long nsamples, unsigned long dst_skip, dither_state_t *state) - +void sample_move_dither_tri_d24_sS (char *dst, jack_default_audio_sample_t *src, unsigned long nsamples, unsigned long dst_skip, dither_state_t *state) { jack_default_audio_sample_t x; float r; @@ -622,8 +629,7 @@ void sample_move_dither_tri_d24_sS (char *dst, jack_default_audio_sample_t *src state->rm1 = rm1; } -void sample_move_dither_shaped_d24_sSs (char *dst, jack_default_audio_sample_t *src, unsigned long nsamples, unsigned long dst_skip, dither_state_t *state) - +void sample_move_dither_shaped_d24_sSs (char *dst, jack_default_audio_sample_t *src, unsigned long nsamples, unsigned long dst_skip, dither_state_t *state) { jack_default_audio_sample_t x; jack_default_audio_sample_t xe; /* the innput sample - filtered error */ @@ -680,8 +686,7 @@ void sample_move_dither_shaped_d24_sSs (char *dst, jack_default_audio_sample_t state->idx = idx; } -void sample_move_dither_shaped_d24_sS (char *dst, jack_default_audio_sample_t *src, unsigned long nsamples, unsigned long dst_skip, dither_state_t *state) - +void sample_move_dither_shaped_d24_sS (char *dst, jack_default_audio_sample_t *src, unsigned long nsamples, unsigned long dst_skip, dither_state_t *state) { jack_default_audio_sample_t x; jack_default_audio_sample_t xe; /* the innput sample - filtered error */ @@ -732,8 +737,7 @@ void sample_move_dither_shaped_d24_sS (char *dst, jack_default_audio_sample_t * state->idx = idx; } -void sample_move_d16_sSs (char *dst, jack_default_audio_sample_t *src, unsigned long nsamples, unsigned long dst_skip, dither_state_t *state) - +void sample_move_d16_sSs (char *dst, jack_default_audio_sample_t *src, unsigned long nsamples, unsigned long dst_skip, dither_state_t *state) { int tmp; @@ -758,8 +762,7 @@ void sample_move_d16_sSs (char *dst, jack_default_audio_sample_t *src, unsigned } } -void sample_move_d16_sS (char *dst, jack_default_audio_sample_t *src, unsigned long nsamples, unsigned long dst_skip, dither_state_t *state) - +void sample_move_d16_sS (char *dst, jack_default_audio_sample_t *src, unsigned long nsamples, unsigned long dst_skip, dither_state_t *state) { int tmp; @@ -779,8 +782,7 @@ void sample_move_d16_sS (char *dst, jack_default_audio_sample_t *src, unsigned } } -void sample_move_dither_rect_d16_sSs (char *dst, jack_default_audio_sample_t *src, unsigned long nsamples, unsigned long dst_skip, dither_state_t *state) - +void sample_move_dither_rect_d16_sSs (char *dst, jack_default_audio_sample_t *src, unsigned long nsamples, unsigned long dst_skip, dither_state_t *state) { jack_default_audio_sample_t val; int tmp; @@ -806,8 +808,7 @@ void sample_move_dither_rect_d16_sSs (char *dst, jack_default_audio_sample_t *s } } -void sample_move_dither_rect_d16_sS (char *dst, jack_default_audio_sample_t *src, unsigned long nsamples, unsigned long dst_skip, dither_state_t *state) - +void sample_move_dither_rect_d16_sS (char *dst, jack_default_audio_sample_t *src, unsigned long nsamples, unsigned long dst_skip, dither_state_t *state) { jack_default_audio_sample_t val; int tmp; @@ -828,8 +829,7 @@ void sample_move_dither_rect_d16_sS (char *dst, jack_default_audio_sample_t *sr } } -void sample_move_dither_tri_d16_sSs (char *dst, jack_default_audio_sample_t *src, unsigned long nsamples, unsigned long dst_skip, dither_state_t *state) - +void sample_move_dither_tri_d16_sSs (char *dst, jack_default_audio_sample_t *src, unsigned long nsamples, unsigned long dst_skip, dither_state_t *state) { jack_default_audio_sample_t x; float r; @@ -861,8 +861,7 @@ void sample_move_dither_tri_d16_sSs (char *dst, jack_default_audio_sample_t *sr state->rm1 = rm1; } -void sample_move_dither_tri_d16_sS (char *dst, jack_default_audio_sample_t *src, unsigned long nsamples, unsigned long dst_skip, dither_state_t *state) - +void sample_move_dither_tri_d16_sS (char *dst, jack_default_audio_sample_t *src, unsigned long nsamples, unsigned long dst_skip, dither_state_t *state) { jack_default_audio_sample_t x; float r; @@ -890,8 +889,7 @@ void sample_move_dither_tri_d16_sS (char *dst, jack_default_audio_sample_t *src state->rm1 = rm1; } -void sample_move_dither_shaped_d16_sSs (char *dst, jack_default_audio_sample_t *src, unsigned long nsamples, unsigned long dst_skip, dither_state_t *state) - +void sample_move_dither_shaped_d16_sSs (char *dst, jack_default_audio_sample_t *src, unsigned long nsamples, unsigned long dst_skip, dither_state_t *state) { jack_default_audio_sample_t x; jack_default_audio_sample_t xe; /* the innput sample - filtered error */ @@ -941,8 +939,7 @@ void sample_move_dither_shaped_d16_sSs (char *dst, jack_default_audio_sample_t state->idx = idx; } -void sample_move_dither_shaped_d16_sS (char *dst, jack_default_audio_sample_t *src, unsigned long nsamples, unsigned long dst_skip, dither_state_t *state) - +void sample_move_dither_shaped_d16_sS (char *dst, jack_default_audio_sample_t *src, unsigned long nsamples, unsigned long dst_skip, dither_state_t *state) { jack_default_audio_sample_t x; jack_default_audio_sample_t xe; /* the innput sample - filtered error */ @@ -987,8 +984,7 @@ void sample_move_dither_shaped_d16_sS (char *dst, jack_default_audio_sample_t * state->idx = idx; } -void sample_move_dS_s16s (jack_default_audio_sample_t *dst, char *src, unsigned long nsamples, unsigned long src_skip) - +void sample_move_dS_s16s (jack_default_audio_sample_t *dst, char *src, unsigned long nsamples, unsigned long src_skip) { short z; @@ -1042,7 +1038,6 @@ void sample_merge_d16_sS (char *dst, jack_default_audio_sample_t *src, unsigned } void sample_merge_d32u24_sS (char *dst, jack_default_audio_sample_t *src, unsigned long nsamples, unsigned long dst_skip, dither_state_t *state) - { /* ALERT: signed sign-extension portability !!! */ @@ -1129,7 +1124,6 @@ merge_memcpy_d32_s32 (char *dst, char *src, unsigned long src_bytes, void merge_memcpy_interleave_d16_s16 (char *dst, char *src, unsigned long src_bytes, unsigned long dst_skip_bytes, unsigned long src_skip_bytes) - { while (src_bytes) { *((short *) dst) += *((short *) src); @@ -1201,3 +1195,4 @@ memcpy_interleave_d32_s32 (char *dst, char *src, unsigned long src_bytes, src_bytes -= 4; } } + diff --git a/drivers/alsa/memops.h b/drivers/alsa/memops.h index 0f4c737..a5582bf 100644 --- a/drivers/alsa/memops.h +++ b/drivers/alsa/memops.h @@ -39,7 +39,11 @@ typedef struct { float e[DITHER_BUF_SIZE]; } dither_state_t; +/* float functions */ +void sample_move_floatLE_sSs (jack_default_audio_sample_t *dst, char *src, unsigned long nsamples, unsigned long dst_skip); +void sample_move_dS_floatLE (char *dst, jack_default_audio_sample_t *src, unsigned long nsamples, unsigned long dst_skip, dither_state_t *state); +/* integer functions */ void sample_move_d32u24_sSs (char *dst, jack_default_audio_sample_t *src, unsigned long nsamples, unsigned long dst_skip, dither_state_t *state); void sample_move_d32u24_sS (char *dst, jack_default_audio_sample_t *src, unsigned long nsamples, unsigned long dst_skip, dither_state_t *state); void sample_move_d24_sSs (char *dst, jack_default_audio_sample_t *src, unsigned long nsamples, unsigned long dst_skip, dither_state_t *state); diff --git a/libjack/client.c b/libjack/client.c index a5fab43..84f387f 100644 --- a/libjack/client.c +++ b/libjack/client.c @@ -1519,6 +1519,8 @@ jack_client_core_wait (jack_client_t* client) static int jack_wake_next_client (jack_client_t* client) { + struct pollfd pfds[1]; + int pret = 0; char c = 0; if (write (client->graph_next_fd, &c, sizeof (c)) @@ -1530,18 +1532,34 @@ jack_wake_next_client (jack_client_t* client) return -1; } - DEBUG ("client sent message to next stage by %" PRIu64 - ", client reading on graph_wait_fd==%d", - jack_get_microseconds(), client->graph_wait_fd); + DEBUG ("client sent message to next stage by %" PRIu64 "", + jack_get_microseconds()); DEBUG("reading cleanup byte from pipe %d\n", client->graph_wait_fd); - - if ((read (client->graph_wait_fd, &c, sizeof (c)) - != sizeof (c))) { - jack_error ("cannot complete execution of the " - "processing graph (%s)", - strerror(errno)); - return -1; + + /* "upstream client went away? readability is checked in + * jack_client_core_wait(), but that's almost a whole cycle + * before we get here. + */ + + if (client->graph_wait_fd >= 0) { + pfds[0].fd = client->graph_wait_fd; + pfds[0].events = POLLIN; + + /* 0 timeout, don't actually wait */ + pret = poll(pfds, 1, 0); + } + + if (pret > 0 && (pfds[0].revents & POLLIN)) { + if (read (client->graph_wait_fd, &c, sizeof (c)) + != sizeof (c)) { + jack_error ("cannot complete execution of the " + "processing graph (%s)", strerror(errno)); + return -1; + } + } else { + DEBUG("cleanup byte from pipe %d not available?\n", + client->graph_wait_fd); } return 0; @@ -2073,11 +2091,11 @@ jack_client_close_aux (jack_client_t *client) } #ifndef JACK_USE_MACH_THREADS - if (client->graph_wait_fd) { + if (client->graph_wait_fd >= 0) { close (client->graph_wait_fd); } - if (client->graph_next_fd) { + if (client->graph_next_fd >= 0) { close (client->graph_next_fd); } #endif