diff options
Diffstat (limited to 'src/libmpg123/synth_mono.h')
-rw-r--r-- | src/libmpg123/synth_mono.h | 64 |
1 files changed, 64 insertions, 0 deletions
diff --git a/src/libmpg123/synth_mono.h b/src/libmpg123/synth_mono.h new file mode 100644 index 0000000..907aa25 --- /dev/null +++ b/src/libmpg123/synth_mono.h @@ -0,0 +1,64 @@ +/* + monosynth.h: generic mono related synth functions + + copyright 1995-2008 by the mpg123 project - free software under the terms of the LGPL 2.1 + see COPYING and AUTHORS files in distribution or http://mpg123.org + initially written by Michael Hipp, generalized by Thomas Orgis + + This header is used multiple times to create different variants of these functions. + See decode.c and synth.h . + Hint: BLOCK, MONO_NAME, MONO2STEREO_NAME, SYNTH_NAME and SAMPLE_T do vary. + + Thomas looked closely at the decode_1to1, decode_2to1 and decode_4to1 contents, seeing that they are too similar to be separate files. + This is what resulted... + + Reason to separate this from synth.h: + There are decoders that have a special synth_1to1 but still can use these generic derivations for the mono stuff. + It generally makes a good deal of sense to set SYNTH_NAME to opt_synth_1to1(fr) (or opt_synth_2to1(fr), etc.). +*/ + +/* Mono synth, wrapping over SYNTH_NAME */ +int MONO_NAME(real *bandPtr, mpg123_handle *fr) +{ + SAMPLE_T samples_tmp[BLOCK]; + SAMPLE_T *tmp1 = samples_tmp; + int i,ret; + + /* save buffer stuff, trick samples_tmp into there, decode, restore */ + unsigned char *samples = fr->buffer.data; + int pnt = fr->buffer.fill; + fr->buffer.data = (unsigned char*) samples_tmp; + fr->buffer.fill = 0; + ret = SYNTH_NAME(bandPtr, 0, fr, 0); /* decode into samples_tmp */ + fr->buffer.data = samples; /* restore original value */ + + /* now append samples from samples_tmp */ + samples += pnt; /* just the next mem in frame buffer */ + for(i=0;i<(BLOCK/2);i++) + { + *( (SAMPLE_T *)samples) = *tmp1; + samples += sizeof(SAMPLE_T); + tmp1 += 2; + } + fr->buffer.fill = pnt + (BLOCK/2)*sizeof(SAMPLE_T); + + return ret; +} + +/* Mono to stereo synth, wrapping over SYNTH_NAME */ +int MONO2STEREO_NAME(real *bandPtr, mpg123_handle *fr) +{ + int i,ret; + unsigned char *samples = fr->buffer.data; + + ret = SYNTH_NAME(bandPtr,0,fr,1); + samples += fr->buffer.fill - BLOCK*sizeof(SAMPLE_T); + + for(i=0;i<(BLOCK/2);i++) + { + ((SAMPLE_T *)samples)[1] = ((SAMPLE_T *)samples)[0]; + samples+=2*sizeof(SAMPLE_T); + } + + return ret; +} |