mirror of
https://github.com/vgmstream/vgmstream.git
synced 2025-02-17 19:19:16 +01:00
Add FSB5 PCMFLOAT + decoder [Anima Gate of Memories (PC)]
This commit is contained in:
parent
4d127df129
commit
6642607d0e
@ -63,6 +63,7 @@ void decode_pcm8_sb_int(VGMSTREAMCHANNEL * stream, sample * outbuf, int channels
|
|||||||
void decode_pcm8_unsigned_int(VGMSTREAMCHANNEL * stream, sample * outbuf, int channelspacing, int32_t first_sample, int32_t samples_to_do);
|
void decode_pcm8_unsigned_int(VGMSTREAMCHANNEL * stream, sample * outbuf, int channelspacing, int32_t first_sample, int32_t samples_to_do);
|
||||||
void decode_pcm8_unsigned(VGMSTREAMCHANNEL * stream, sample * outbuf, int channelspacing, int32_t first_sample, int32_t samples_to_do);
|
void decode_pcm8_unsigned(VGMSTREAMCHANNEL * stream, sample * outbuf, int channelspacing, int32_t first_sample, int32_t samples_to_do);
|
||||||
void decode_ulaw(VGMSTREAMCHANNEL * stream, sample * outbuf, int channelspacing, int32_t first_sample, int32_t samples_to_do);
|
void decode_ulaw(VGMSTREAMCHANNEL * stream, sample * outbuf, int channelspacing, int32_t first_sample, int32_t samples_to_do);
|
||||||
|
void decode_pcmfloat(VGMSTREAM *vgmstream, VGMSTREAMCHANNEL * stream, sample * outbuf, int channelspacing, int32_t first_sample, int32_t samples_to_do);
|
||||||
size_t pcm_bytes_to_samples(size_t bytes, int channels, int bits_per_sample);
|
size_t pcm_bytes_to_samples(size_t bytes, int channels, int bits_per_sample);
|
||||||
|
|
||||||
/* psx_decoder */
|
/* psx_decoder */
|
||||||
|
@ -118,6 +118,22 @@ void decode_ulaw(VGMSTREAMCHANNEL * stream, sample * outbuf, int channelspacing,
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void decode_pcmfloat(VGMSTREAM *vgmstream, VGMSTREAMCHANNEL * stream, sample * outbuf, int channelspacing, int32_t first_sample, int32_t samples_to_do) {
|
||||||
|
int i, sample_count;
|
||||||
|
int32_t (*read_32bit)(off_t,STREAMFILE*) = vgmstream->codec_endian ? read_32bitBE : read_32bitLE;
|
||||||
|
|
||||||
|
for (i=first_sample,sample_count=0; i<first_sample+samples_to_do; i++,sample_count+=channelspacing) {
|
||||||
|
uint32_t sample_int = read_32bit(stream->offset+i*4,stream->streamfile);
|
||||||
|
float sample_float;
|
||||||
|
int sample_pcm;
|
||||||
|
|
||||||
|
memcpy(&sample_float, &sample_int, 4); /* maybe unorthodox but simplest */
|
||||||
|
sample_pcm = floor(sample_float * 32767.f + .5f);
|
||||||
|
|
||||||
|
outbuf[sample_count] = clamp16(sample_pcm);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
size_t pcm_bytes_to_samples(size_t bytes, int channels, int bits_per_sample) {
|
size_t pcm_bytes_to_samples(size_t bytes, int channels, int bits_per_sample) {
|
||||||
return bytes / channels / (bits_per_sample/8);
|
return bytes / channels / (bits_per_sample/8);
|
||||||
}
|
}
|
||||||
|
@ -404,6 +404,7 @@ static const coding_info coding_info_list[] = {
|
|||||||
{coding_PCM8_int, "8-bit PCM with 1 byte interleave"},
|
{coding_PCM8_int, "8-bit PCM with 1 byte interleave"},
|
||||||
{coding_PCM8_SB_int, "8-bit PCM with sign bit, 1 byte interleave"},
|
{coding_PCM8_SB_int, "8-bit PCM with sign bit, 1 byte interleave"},
|
||||||
{coding_ULAW, "8-bit u-Law"},
|
{coding_ULAW, "8-bit u-Law"},
|
||||||
|
{coding_PCMFLOAT, "32-bit float PCM"},
|
||||||
{coding_CRI_ADX, "CRI ADX 4-bit ADPCM"},
|
{coding_CRI_ADX, "CRI ADX 4-bit ADPCM"},
|
||||||
{coding_CRI_ADX_exp, "CRI ADX 4-bit ADPCM with exponential scale"},
|
{coding_CRI_ADX_exp, "CRI ADX 4-bit ADPCM with exponential scale"},
|
||||||
{coding_CRI_ADX_fixed, "CRI ADX 4-bit ADPCM with fixed coefficients"},
|
{coding_CRI_ADX_fixed, "CRI ADX 4-bit ADPCM with fixed coefficients"},
|
||||||
|
@ -212,10 +212,13 @@ VGMSTREAM * init_vgmstream_fsb5(STREAMFILE *streamFile) {
|
|||||||
case 0x04: /* FMOD_SOUND_FORMAT_PCM32 */
|
case 0x04: /* FMOD_SOUND_FORMAT_PCM32 */
|
||||||
goto fail;
|
goto fail;
|
||||||
|
|
||||||
case 0x05: /* FMOD_SOUND_FORMAT_PCMFLOAT */
|
case 0x05: /* FMOD_SOUND_FORMAT_PCMFLOAT [Anima - Gate of Memories (PC)]*/
|
||||||
goto fail;
|
vgmstream->coding_type = coding_PCMFLOAT;
|
||||||
|
vgmstream->layout_type = (ChannelCount == 1) ? layout_none : layout_interleave;
|
||||||
|
vgmstream->interleave_block_size = 0x04;
|
||||||
|
break;
|
||||||
|
|
||||||
case 0x06: /* FMOD_SOUND_FORMAT_GCADPCM */
|
case 0x06: /* FMOD_SOUND_FORMAT_GCADPCM [Sonic Boom - Fire and Ice (3DS)] */
|
||||||
if (ChannelCount == 1) {
|
if (ChannelCount == 1) {
|
||||||
vgmstream->layout_type = layout_none;
|
vgmstream->layout_type = layout_none;
|
||||||
} else {
|
} else {
|
||||||
|
@ -975,6 +975,8 @@ int get_vgmstream_samples_per_frame(VGMSTREAM * vgmstream) {
|
|||||||
case coding_PCM8_SB_int:
|
case coding_PCM8_SB_int:
|
||||||
case coding_PCM8_U_int:
|
case coding_PCM8_U_int:
|
||||||
case coding_ULAW:
|
case coding_ULAW:
|
||||||
|
case coding_PCMFLOAT:
|
||||||
|
return 1;
|
||||||
#ifdef VGM_USE_VORBIS
|
#ifdef VGM_USE_VORBIS
|
||||||
case coding_ogg_vorbis:
|
case coding_ogg_vorbis:
|
||||||
case coding_VORBIS_custom:
|
case coding_VORBIS_custom:
|
||||||
@ -1128,6 +1130,9 @@ int get_vgmstream_frame_size(VGMSTREAM * vgmstream) {
|
|||||||
case coding_PCM8_SB_int:
|
case coding_PCM8_SB_int:
|
||||||
case coding_PCM8_U_int:
|
case coding_PCM8_U_int:
|
||||||
case coding_ULAW:
|
case coding_ULAW:
|
||||||
|
return 1;
|
||||||
|
case coding_PCMFLOAT:
|
||||||
|
return 4;
|
||||||
case coding_SDX2:
|
case coding_SDX2:
|
||||||
case coding_SDX2_int:
|
case coding_SDX2_int:
|
||||||
case coding_CBD2:
|
case coding_CBD2:
|
||||||
@ -1358,6 +1363,14 @@ void decode_vgmstream(VGMSTREAM * vgmstream, int samples_written, int samples_to
|
|||||||
samples_to_do);
|
samples_to_do);
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
case coding_PCMFLOAT:
|
||||||
|
for (chan=0;chan<vgmstream->channels;chan++) {
|
||||||
|
decode_pcmfloat(vgmstream, &vgmstream->ch[chan],buffer+samples_written*vgmstream->channels+chan,
|
||||||
|
vgmstream->channels,vgmstream->samples_into_block,
|
||||||
|
samples_to_do);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
|
||||||
case coding_NDS_IMA:
|
case coding_NDS_IMA:
|
||||||
for (chan=0;chan<vgmstream->channels;chan++) {
|
for (chan=0;chan<vgmstream->channels;chan++) {
|
||||||
decode_nds_ima(&vgmstream->ch[chan],buffer+samples_written*vgmstream->channels+chan,
|
decode_nds_ima(&vgmstream->ch[chan],buffer+samples_written*vgmstream->channels+chan,
|
||||||
|
@ -72,21 +72,23 @@ enum { STREAM_NAME_SIZE = 255 }; /* reasonable max */
|
|||||||
|
|
||||||
/* The encoding type specifies the format the sound data itself takes */
|
/* The encoding type specifies the format the sound data itself takes */
|
||||||
typedef enum {
|
typedef enum {
|
||||||
/* 16-bit PCM */
|
/* PCM */
|
||||||
coding_PCM16LE, /* little endian 16-bit PCM */
|
coding_PCM16LE, /* little endian 16-bit PCM */
|
||||||
coding_PCM16LE_int, /* little endian 16-bit PCM with sample-level interleave */
|
coding_PCM16LE_int, /* little endian 16-bit PCM with sample-level interleave */
|
||||||
coding_PCM16LE_XOR_int, /* little endian 16-bit PCM with sample-level xor */
|
coding_PCM16LE_XOR_int, /* little endian 16-bit PCM with sample-level xor */
|
||||||
coding_PCM16BE, /* big endian 16-bit PCM */
|
coding_PCM16BE, /* big endian 16-bit PCM */
|
||||||
|
|
||||||
/* 8-bit PCM */
|
|
||||||
coding_PCM8, /* 8-bit PCM */
|
coding_PCM8, /* 8-bit PCM */
|
||||||
coding_PCM8_int, /* 8-Bit PCM with sample-level interleave */
|
coding_PCM8_int, /* 8-Bit PCM with sample-level interleave */
|
||||||
coding_PCM8_U, /* 8-bit PCM, unsigned (0x80 = 0) */
|
coding_PCM8_U, /* 8-bit PCM, unsigned (0x80 = 0) */
|
||||||
coding_PCM8_U_int, /* 8-bit PCM, unsigned (0x80 = 0) with sample-level interleave */
|
coding_PCM8_U_int, /* 8-bit PCM, unsigned (0x80 = 0) with sample-level interleave */
|
||||||
coding_PCM8_SB_int, /* 8-bit PCM, sign bit (others are 2's complement) with sample-level interleave */
|
coding_PCM8_SB_int, /* 8-bit PCM, sign bit (others are 2's complement) with sample-level interleave */
|
||||||
|
|
||||||
coding_ULAW, /* 8-bit u-Law (non-linear PCM) */
|
coding_ULAW, /* 8-bit u-Law (non-linear PCM) */
|
||||||
|
|
||||||
/* 4-bit ADPCM */
|
coding_PCMFLOAT, /* 32 bit float PCM */
|
||||||
|
|
||||||
|
/* ADPCM */
|
||||||
coding_CRI_ADX, /* CRI ADX */
|
coding_CRI_ADX, /* CRI ADX */
|
||||||
coding_CRI_ADX_fixed, /* CRI ADX, encoding type 2 with fixed coefficients */
|
coding_CRI_ADX_fixed, /* CRI ADX, encoding type 2 with fixed coefficients */
|
||||||
coding_CRI_ADX_exp, /* CRI ADX, encoding type 4 with exponential scale */
|
coding_CRI_ADX_exp, /* CRI ADX, encoding type 4 with exponential scale */
|
||||||
|
Loading…
x
Reference in New Issue
Block a user