vgmstream/src/meta/s14_sss.c
halleyscometsw e5ddad3b1f G.722.1 support for mingw32 and MSVC (needs testing) build.
.s14 and .sss support.
Other builds will probably not build correctly, I'll follow up with something to disable G.722.1 there in a bit.


git-svn-id: https://vgmstream.svn.sourceforge.net/svnroot/vgmstream@760 51a99a44-fe44-0410-b1ba-c3e57ba2b86b
2010-03-23 20:57:12 +00:00

106 lines
2.6 KiB
C

#include "../vgmstream.h"
#ifdef VGM_USE_G7221
#include "meta.h"
#include "../util.h"
#include "../coding/coding.h"
/* .s14 and .sss - from Idolm@ster DS (and others?)
* Raw 24kbit Siren 14 stream, s14 is mono and sss is
* frame-interleaved stereo
*/
VGMSTREAM * init_vgmstream_s14_sss(STREAMFILE *streamFile) {
VGMSTREAM * vgmstream = NULL;
char filename[260];
int channel_count;
size_t file_size;
/* check extension, case insensitive */
/* this is all we have to go on, rsf is completely headerless */
streamFile->get_name(streamFile,filename,sizeof(filename));
if (!strcasecmp("sss",filename_extension(filename)))
{
channel_count = 2;
}
else if (!strcasecmp("s14",filename_extension(filename)))
{
channel_count = 1;
}
else
{
goto fail;
}
file_size = get_streamfile_size(streamFile);
/* build the VGMSTREAM */
vgmstream = allocate_vgmstream(channel_count,0);
if (!vgmstream) goto fail;
/* fill in the vital statistics */
vgmstream->num_samples = file_size/0x3c/channel_count*(32000/50);
vgmstream->sample_rate = 32768;
vgmstream->coding_type = coding_G7221C;
vgmstream->layout_type = layout_interleave;
vgmstream->interleave_block_size = 0x3c;
if (1 == channel_count)
{
vgmstream->meta_type = meta_S14;
}
else
{
vgmstream->meta_type = meta_SSS;
}
{
int i;
g7221_codec_data *data;
/* one data structure per channel */
data = malloc(sizeof(g7221_codec_data) * channel_count);
if (!data)
{
goto fail;
}
memset(data,0,sizeof(g7221_codec_data) * channel_count);
vgmstream->codec_data = data;
for (i = 0; i < channel_count; i++)
{
/* Siren 14 == 14khz bandwidth */
data[i].handle = g7221_init(vgmstream->interleave_block_size, 14000);
if (!data[i].handle)
{
goto fail; /* close_vgmstream is able to clean up */
}
}
}
/* open the file for reading by each channel */
{
int i;
for (i=0;i<channel_count;i++) {
vgmstream->ch[i].streamfile = streamFile->open(streamFile,filename,STREAMFILE_DEFAULT_BUFFER_SIZE);
if (!vgmstream->ch[i].streamfile) goto fail;
vgmstream->ch[i].channel_start_offset=
vgmstream->ch[i].offset=0x3c*i;
}
}
return vgmstream;
/* clean up anything we may have opened */
fail:
if (vgmstream) close_vgmstream(vgmstream);
return NULL;
}
#endif