diff --git a/src/layout/interleave.c b/src/layout/interleave.c index 1e99ee4f..d5d5319e 100644 --- a/src/layout/interleave.c +++ b/src/layout/interleave.c @@ -1,33 +1,12 @@ #include "interleave.h" -#include "../coding/adx_decoder.h" -#include "../coding/gcdsp_decoder.h" -#include "../coding/pcm_decoder.h" +#include "../vgmstream.h" void render_vgmstream_interleave(sample * buffer, int32_t sample_count, VGMSTREAM * vgmstream) { int samples_written=0; - int frame_size; - int samples_per_frame; + int frame_size = get_vgmstream_frame_size(vgmstream); + int samples_per_frame = get_vgmstream_samples_per_frame(vgmstream);; int samples_this_block; - switch (vgmstream->coding_type) { - case coding_CRI_ADX: - frame_size=18; - samples_per_frame=32; - break; - case coding_NGC_DSP: - frame_size=8; - samples_per_frame=14; - break; - case coding_PCM16LE: - case coding_PCM16BE: - frame_size=2; - samples_per_frame=1; - break; - case coding_PCM8: - frame_size=1; - samples_per_frame=1; - break; - } samples_this_block = vgmstream->interleave_block_size / frame_size * samples_per_frame; @@ -106,44 +85,7 @@ void render_vgmstream_interleave(sample * buffer, int32_t sample_count, VGMSTREA if (samples_written+samples_to_do > sample_count) samples_to_do=sample_count-samples_written; - switch (vgmstream->coding_type) { - case coding_CRI_ADX: - for (chan=0;chanchannels;chan++) { - decode_adx(&vgmstream->ch[chan],buffer+samples_written*vgmstream->channels+chan, - vgmstream->channels,vgmstream->samples_into_block, - samples_to_do); - } - - break; - case coding_NGC_DSP: - for (chan=0;chanchannels;chan++) { - decode_gcdsp(&vgmstream->ch[chan],buffer+samples_written*vgmstream->channels+chan, - vgmstream->channels,vgmstream->samples_into_block, - samples_to_do); - } - break; - case coding_PCM16LE: - for (chan=0;chanchannels;chan++) { - decode_pcm16LE(&vgmstream->ch[chan],buffer+samples_written*vgmstream->channels+chan, - vgmstream->channels,vgmstream->samples_into_block, - samples_to_do); - } - break; - case coding_PCM16BE: - for (chan=0;chanchannels;chan++) { - decode_pcm16BE(&vgmstream->ch[chan],buffer+samples_written*vgmstream->channels+chan, - vgmstream->channels,vgmstream->samples_into_block, - samples_to_do); - } - break; - case coding_PCM8: - for (chan=0;chanchannels;chan++) { - decode_pcm8(&vgmstream->ch[chan],buffer+samples_written*vgmstream->channels+chan, - vgmstream->channels,vgmstream->samples_into_block, - samples_to_do); - } - break; - } + decode_vgmstream(vgmstream, samples_written, samples_to_do, buffer); samples_written += samples_to_do; vgmstream->current_sample += samples_to_do; diff --git a/src/layout/nolayout.c b/src/layout/nolayout.c index e99983a5..d52d6a1a 100644 --- a/src/layout/nolayout.c +++ b/src/layout/nolayout.c @@ -1,27 +1,11 @@ #include "nolayout.h" -#include "../coding/adx_decoder.h" -#include "../coding/gcdsp_decoder.h" -#include "../coding/pcm_decoder.h" +#include "../vgmstream.h" void render_vgmstream_nolayout(sample * buffer, int32_t sample_count, VGMSTREAM * vgmstream) { int samples_written=0; const int samples_this_block = vgmstream->num_samples; - int samples_per_frame; - - switch(vgmstream->coding_type) { - case coding_CRI_ADX: - samples_per_frame = 32; - break; - case coding_NGC_DSP: - samples_per_frame = 14; - break; - case coding_PCM16LE: - case coding_PCM16BE: - case coding_PCM8: - samples_per_frame = 1; - break; - } + int samples_per_frame = get_vgmstream_samples_per_frame(vgmstream); while (samples_written sample_count) samples_to_do=sample_count-samples_written; - switch (vgmstream->coding_type) { - case coding_CRI_ADX: - for (chan=0;chanchannels;chan++) { - decode_adx(&vgmstream->ch[chan],buffer+samples_written*vgmstream->channels+chan, - vgmstream->channels,vgmstream->samples_into_block, - samples_to_do); - } - - break; - case coding_NGC_DSP: - for (chan=0;chanchannels;chan++) { - decode_gcdsp(&vgmstream->ch[chan],buffer+samples_written*vgmstream->channels+chan, - vgmstream->channels,vgmstream->samples_into_block, - samples_to_do); - } - break; - } + decode_vgmstream(vgmstream, samples_written, samples_to_do, buffer); samples_written += samples_to_do; vgmstream->current_sample += samples_to_do; diff --git a/src/vgmstream.c b/src/vgmstream.c index 74c0a23d..a62fd9fc 100644 --- a/src/vgmstream.c +++ b/src/vgmstream.c @@ -3,6 +3,9 @@ #include "meta/brstm.h" #include "layout/interleave.h" #include "layout/nolayout.h" +#include "coding/adx_decoder.h" +#include "coding/gcdsp_decoder.h" +#include "coding/pcm_decoder.h" /* * List of functions that will recognize files. These should correspond pretty @@ -111,3 +114,77 @@ void render_vgmstream(sample * buffer, int32_t sample_count, VGMSTREAM * vgmstre break; } } + +int get_vgmstream_samples_per_frame(VGMSTREAM * vgmstream) { + switch (vgmstream->coding_type) { + case coding_CRI_ADX: + return 32; + case coding_NGC_DSP: + return 14; + case coding_PCM16LE: + case coding_PCM16BE: + case coding_PCM8: + return 1; + default: + return 0; + } +} + +int get_vgmstream_frame_size(VGMSTREAM * vgmstream) { + switch (vgmstream->coding_type) { + case coding_CRI_ADX: + return 18; + case coding_NGC_DSP: + return 8; + case coding_PCM16LE: + case coding_PCM16BE: + return 2; + case coding_PCM8: + return 1; + default: + return 0; + } +} + +void decode_vgmstream(VGMSTREAM * vgmstream, int samples_written, int samples_to_do, sample * buffer) { + int chan; + + switch (vgmstream->coding_type) { + case coding_CRI_ADX: + for (chan=0;chanchannels;chan++) { + decode_adx(&vgmstream->ch[chan],buffer+samples_written*vgmstream->channels+chan, + vgmstream->channels,vgmstream->samples_into_block, + samples_to_do); + } + + break; + case coding_NGC_DSP: + for (chan=0;chanchannels;chan++) { + decode_gcdsp(&vgmstream->ch[chan],buffer+samples_written*vgmstream->channels+chan, + vgmstream->channels,vgmstream->samples_into_block, + samples_to_do); + } + break; + case coding_PCM16LE: + for (chan=0;chanchannels;chan++) { + decode_pcm16LE(&vgmstream->ch[chan],buffer+samples_written*vgmstream->channels+chan, + vgmstream->channels,vgmstream->samples_into_block, + samples_to_do); + } + break; + case coding_PCM16BE: + for (chan=0;chanchannels;chan++) { + decode_pcm16BE(&vgmstream->ch[chan],buffer+samples_written*vgmstream->channels+chan, + vgmstream->channels,vgmstream->samples_into_block, + samples_to_do); + } + break; + case coding_PCM8: + for (chan=0;chanchannels;chan++) { + decode_pcm8(&vgmstream->ch[chan],buffer+samples_written*vgmstream->channels+chan, + vgmstream->channels,vgmstream->samples_into_block, + samples_to_do); + } + break; + } +} diff --git a/src/vgmstream.h b/src/vgmstream.h index a3f1d860..80e619bd 100644 --- a/src/vgmstream.h +++ b/src/vgmstream.h @@ -144,4 +144,9 @@ int32_t get_vgmstream_play_samples(double looptimes, double fadetime, VGMSTREAM /* render! */ void render_vgmstream(sample * buffer, int32_t sample_count, VGMSTREAM * vgmstream); +int get_vgmstream_samples_per_frame(VGMSTREAM * vgmstream); +int get_vgmstream_frame_size(VGMSTREAM * vgmstream); + +void decode_vgmstream(VGMSTREAM * vgmstream, int samples_written, int samples_to_do, sample * buffer); + #endif