Merged coding-specific things into vgmstream so the layouts don't need to know

everything.


git-svn-id: https://vgmstream.svn.sourceforge.net/svnroot/vgmstream@17 51a99a44-fe44-0410-b1ba-c3e57ba2b86b
This commit is contained in:
halleyscometsw 2008-02-05 02:17:35 +00:00
parent 7472c2e4f9
commit d80919154b
4 changed files with 89 additions and 97 deletions

View File

@ -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;chan<vgmstream->channels;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;chan<vgmstream->channels;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;chan<vgmstream->channels;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;chan<vgmstream->channels;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;chan<vgmstream->channels;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;

View File

@ -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) {
int samples_to_do;
@ -74,23 +58,7 @@ void render_vgmstream_nolayout(sample * buffer, int32_t sample_count, VGMSTREAM
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;chan<vgmstream->channels;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;chan<vgmstream->channels;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;

View File

@ -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;chan<vgmstream->channels;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;chan<vgmstream->channels;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;chan<vgmstream->channels;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;chan<vgmstream->channels;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;chan<vgmstream->channels;chan++) {
decode_pcm8(&vgmstream->ch[chan],buffer+samples_written*vgmstream->channels+chan,
vgmstream->channels,vgmstream->samples_into_block,
samples_to_do);
}
break;
}
}

View File

@ -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