X-Git-Url: https://harrygodden.com/git/?p=vg.git;a=blobdiff_plain;f=vg_depencies.c;fp=vg_depencies.c;h=318bd9c3f904f72f472c8dd16e0dfa76d0b64a30;hp=0000000000000000000000000000000000000000;hb=3b14f3dcd5bf9dd3c85144f2123d667bfa4bb63f;hpb=fce86711735b15bff37de0f70716808410fcf269 diff --git a/vg_depencies.c b/vg_depencies.c new file mode 100644 index 0000000..318bd9c --- /dev/null +++ b/vg_depencies.c @@ -0,0 +1,83 @@ +#include "vg_vorbis.h" +#include "vg_image.h" + +#undef STB_VORBIS_HEADER_ONLY +#include "submodules/stb/stb_vorbis.c" +#undef L +#undef R +#undef C + +#define STB_IMAGE_WRITE_IMPLEMENTATION +#define STB_IMAGE_IMPLEMENTATION +#include "vg/submodules/stb/stb_image.h" +#include "vg/submodules/stb/stb_image_write.h" + +/* + * adapted from stb_vorbis.h, since the original does not handle mono->stereo + */ +int +stb_vorbis_get_samples_float_interleaved_stereo( stb_vorbis *f, float *buffer, + int len ) +{ + int n = 0, c = 1; + if( f->channels < 2 ) c = 0; + + while( n < len ) { + int k = f->channel_buffer_end - f->channel_buffer_start; + + if( n+k >= len ) + k = len - n; + + for( int j=0; j < k; ++j ) { + *buffer++ = f->channel_buffers[ 0 ][f->channel_buffer_start+j]; + *buffer++ = f->channel_buffers[ c ][f->channel_buffer_start+j]; + } + + n += k; + f->channel_buffer_start += k; + + if( n == len ) + break; + + if( !stb_vorbis_get_frame_float( f, NULL, NULL )) + break; + } + + return n; +} + +/* + * ........ more wrecked code sorry! + */ +int +stb_vorbis_get_samples_i16_downmixed( stb_vorbis *f, i16 *buffer, int len ) +{ + int n = 0, c = 1; + if( f->channels < 2 ) c = 0; + + while( n < len ) { + int k = f->channel_buffer_end - f->channel_buffer_start; + + if( n+k >= len ) + k = len - n; + + for( int j=0; j < k; ++j ) { + float sl = f->channel_buffers[ 0 ][f->channel_buffer_start+j], + sr = f->channel_buffers[ c ][f->channel_buffer_start+j]; + + *buffer++ = vg_clampf( 0.5f*(sl+sr), -1.0f, 1.0f ) * 32767.0f; + //*buffer++ = vg_clampf( sr, -1.0f, 1.0f ) * 32767.0f; + } + + n += k; + f->channel_buffer_start += k; + + if( n == len ) + break; + + if( !stb_vorbis_get_frame_float( f, NULL, NULL )) + break; + } + + return n; +}