Browse Source

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
tags/0.115.6
sletz 17 years ago
parent
commit
c17e21ee12
5 changed files with 203 additions and 167 deletions
  1. +1
    -1
      configure.ac
  2. +128
    -109
      drivers/alsa/alsa_driver.c
  3. +40
    -45
      drivers/alsa/memops.c
  4. +4
    -0
      drivers/alsa/memops.h
  5. +30
    -12
      libjack/client.c

+ 1
- 1
configure.ac View File

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


+ 128
- 109
drivers/alsa/alsa_driver.c View File

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


+ 40
- 45
drivers/alsa/memops.c View File

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


+ 4
- 0
drivers/alsa/memops.h View File

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


+ 30
- 12
libjack/client.c View File

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


Loading…
Cancel
Save