/* dither.h: dithering engine. dithers naitive mad_fixed_t samples into pcm samples using a linear sample quantize and dither routine - again - lifted from the mad-0.14.2b source distribution */ enum mad_dither_type { MAD_DITHER_S8 = 1, MAD_DITHER_U8 = 2, MAD_DITHER_S16_LE = 3, MAD_DITHER_S16_BE = 4, MAD_DITHER_S24_LE = 5, MAD_DITHER_S24_BE = 6, MAD_DITHER_S32_LE = 7, MAD_DITHER_S32_BE = 8, }; struct mad_dither_info { struct mad_dither_error { mad_fixed_t error[3]; mad_fixed_t random; } state[2]; unsigned long clipped; mad_fixed_t peak_clip; mad_fixed_t peak_sample; }; signed long mad_dither_linear(struct mad_dither_info *, struct mad_dither_error *, unsigned int, mad_fixed_t); typedef void mad_dither_pcmfunc_t(struct mad_dither_info *, unsigned char *, unsigned int, mad_fixed_t const *, mad_fixed_t const *); mad_dither_pcmfunc_t mad_dither_s8; mad_dither_pcmfunc_t mad_dither_u8; mad_dither_pcmfunc_t mad_dither_s16_le; mad_dither_pcmfunc_t mad_dither_s16_be; mad_dither_pcmfunc_t mad_dither_s24_le; mad_dither_pcmfunc_t mad_dither_s24_be; mad_dither_pcmfunc_t mad_dither_s32_le; mad_dither_pcmfunc_t mad_dither_s32_be; mad_dither_pcmfunc_t mad_dither_float; struct mad_dither { mad_dither_pcmfunc_t *pcmfunc; unsigned int pcmlength; struct mad_dither_info info; }; void mad_dither_init(struct mad_dither *, int);