diff options
author | paul <paul@0c269be4-1314-0410-8aa9-9f06e86f4224> | 2008-11-22 12:30:41 +0000 |
---|---|---|
committer | paul <paul@0c269be4-1314-0410-8aa9-9f06e86f4224> | 2008-11-22 12:30:41 +0000 |
commit | b43a97f961fd4bf58dd2aecdf3963e6c78e1b1f8 (patch) | |
tree | a451037095c3163f4b31ea8143d0533cb6b399e9 /drivers/alsa | |
parent | e6b3c0552477aa7d761af6b4ada4aa52f88b23c0 (diff) | |
download | jack1-b43a97f961fd4bf58dd2aecdf3963e6c78e1b1f8.tar.gz |
simon jenkin's fix for float->16bit dithering
git-svn-id: svn+ssh://jackaudio.org/trunk/jack@3099 0c269be4-1314-0410-8aa9-9f06e86f4224
Diffstat (limited to 'drivers/alsa')
-rw-r--r-- | drivers/alsa/memops.c | 38 |
1 files changed, 12 insertions, 26 deletions
diff --git a/drivers/alsa/memops.c b/drivers/alsa/memops.c index 18c1178..0f6ed05 100644 --- a/drivers/alsa/memops.c +++ b/drivers/alsa/memops.c @@ -418,7 +418,7 @@ void sample_move_dither_rect_d16_sSs (char *dst, jack_default_audio_sample_t *s int16_t tmp; while (nsamples--) { - val = (*src * SAMPLE_16BIT_SCALING) + fast_rand() / (float) INT_MAX - 1.0f; + val = (*src * SAMPLE_16BIT_SCALING) + fast_rand() / (float) UINT_MAX - 0.5f; float_16_scaled (val, tmp); #if __BYTE_ORDER == __LITTLE_ENDIAN dst[0]=(char)(tmp>>8); @@ -437,7 +437,7 @@ void sample_move_dither_rect_d16_sS (char *dst, jack_default_audio_sample_t *sr jack_default_audio_sample_t val; while (nsamples--) { - val = (*src * SAMPLE_16BIT_SCALING) + fast_rand() / (float)INT_MAX - 1.0f; + val = (*src * SAMPLE_16BIT_SCALING) + fast_rand() / (float)UINT_MAX - 0.5f; float_16_scaled (val, *((int16_t*) dst)); dst += dst_skip; src++; @@ -447,48 +447,34 @@ 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) { jack_default_audio_sample_t val; - float r; - float rm1 = state->rm1; - int16_t y; + int16_t tmp; while (nsamples--) { - r = 2.0f * (fast_rand() / (float)INT_MAX - 1.0f); - val = (*src * SAMPLE_16BIT_SCALING) + (r - rm1); - rm1 = r; - - float_16_scaled (*src, y); + val = (*src * SAMPLE_16BIT_SCALING) + ((float)fast_rand() + (float)fast_rand()) / (float)UINT_MAX - 1.0f; + float_16_scaled (val, tmp); #if __BYTE_ORDER == __LITTLE_ENDIAN - dst[0]=(char)(y>>8); - dst[1]=(char)(y); + dst[0]=(char)(tmp>>8); + dst[1]=(char)(tmp); #elif __BYTE_ORDER == __BIG_ENDIAN - dst[0]=(char)(y); - dst[1]=(char)(y>>8); + dst[0]=(char)(tmp); + dst[1]=(char)(tmp>>8); #endif dst += dst_skip; src++; } - 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) { jack_default_audio_sample_t val; - float r; - float rm1 = state->rm1; while (nsamples--) { - - r = 2.0f * (float)fast_rand() / (float)INT_MAX - 1.0f; - val = (*src * SAMPLE_16BIT_SCALING) + (r - rm1); - rm1 = r; - + val = (*src * SAMPLE_16BIT_SCALING) + ((float)fast_rand() + (float)fast_rand()) / (float)UINT_MAX - 1.0f; float_16_scaled (val, *((int16_t*) dst)); - dst += dst_skip; 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) @@ -503,7 +489,7 @@ void sample_move_dither_shaped_d16_sSs (char *dst, jack_default_audio_sample_t while (nsamples--) { x = *src * SAMPLE_16BIT_SCALING; - r = 2.0f * (float)fast_rand() / (float)INT_MAX - 1.0f; + r = ((float)fast_rand() + (float)fast_rand()) / (float)UINT_MAX - 1.0f; /* Filter the error with Lipshitz's minimally audible FIR: [2.033 -2.165 1.959 -1.590 0.6149] */ xe = x @@ -546,7 +532,7 @@ void sample_move_dither_shaped_d16_sS (char *dst, jack_default_audio_sample_t * while (nsamples--) { x = *src * SAMPLE_16BIT_SCALING; - r = 2.0f * (float)fast_rand() / (float)INT_MAX - 1.0f; + r = ((float)fast_rand() + (float)fast_rand()) / (float)UINT_MAX - 1.0f; /* Filter the error with Lipshitz's minimally audible FIR: [2.033 -2.165 1.959 -1.590 0.6149] */ xe = x |