diff --git a/src/coding/coding.h b/src/coding/coding.h index 98cde6df..46c45fd1 100644 --- a/src/coding/coding.h +++ b/src/coding/coding.h @@ -21,7 +21,6 @@ void decode_xbox_ima(VGMSTREAM * vgmstream,VGMSTREAMCHANNEL * stream, sample * o void decode_xbox_ima_int(VGMSTREAMCHANNEL * stream, sample * outbuf, int channelspacing, int32_t first_sample, int32_t samples_to_do,int channel); void decode_snds_ima(VGMSTREAMCHANNEL * stream, sample * outbuf, int channelspacing, int32_t first_sample, int32_t samples_to_do, int channel); void decode_standard_ima(VGMSTREAMCHANNEL * stream, sample * outbuf, int channelspacing, int32_t first_sample, int32_t samples_to_do, int channel, int is_stereo, int is_high_first); -void decode_ima(VGMSTREAMCHANNEL * stream, sample * outbuf, int channelspacing, int32_t first_sample, int32_t samples_to_do); void decode_3ds_ima(VGMSTREAMCHANNEL * stream, sample * outbuf, int channelspacing, int32_t first_sample, int32_t samples_to_do); void decode_rad_ima(VGMSTREAM * vgmstream,VGMSTREAMCHANNEL * stream, sample * outbuf, int channelspacing, int32_t first_sample, int32_t samples_to_do,int channel); void decode_rad_ima_mono(VGMSTREAMCHANNEL * stream, sample * outbuf, int channelspacing, int32_t first_sample, int32_t samples_to_do); diff --git a/src/coding/ima_decoder.c b/src/coding/ima_decoder.c index 2be5c5c1..10d45f7b 100644 --- a/src/coding/ima_decoder.c +++ b/src/coding/ima_decoder.c @@ -45,7 +45,6 @@ static const int IMA_IndexTable[16] = static void n3ds_ima_expand_nibble(VGMSTREAMCHANNEL * stream, off_t byte_offset, int nibble_shift, int32_t * hist1, int32_t * step_index) { int sample_nibble, sample_decoded, step, delta; - //"original" ima nibble expansion sample_nibble = (read_8bit(byte_offset,stream->streamfile) >> nibble_shift)&0xf; sample_decoded = *hist1; @@ -169,6 +168,7 @@ static void ubi_ima_expand_nibble(VGMSTREAMCHANNEL * stream, off_t byte_offset, *hist1 = clamp16(sample_decoded); } +/* *** */ void decode_nds_ima(VGMSTREAMCHANNEL * stream, sample * outbuf, int channelspacing, int32_t first_sample, int32_t samples_to_do) { int i, sample_count; @@ -458,28 +458,6 @@ void decode_standard_ima(VGMSTREAMCHANNEL * stream, sample * outbuf, int channel stream->adpcm_step_index = step_index; } -void decode_ima(VGMSTREAMCHANNEL * stream, sample * outbuf, int channelspacing, int32_t first_sample, int32_t samples_to_do) { - int i, sample_count; - - int32_t hist1 = stream->adpcm_history1_32; - int step_index = stream->adpcm_step_index; - - //external interleave - - //no header - - for (i=first_sample,sample_count=0; ioffset + i/2; - int nibble_shift = (i&1?4:0); //low nibble order - - ms_ima_expand_nibble(stream, byte_offset,nibble_shift, &hist1, &step_index); - outbuf[sample_count] = (short)(hist1); - } - - stream->adpcm_history1_32 = hist1; - stream->adpcm_step_index = step_index; -} - void decode_3ds_ima(VGMSTREAMCHANNEL * stream, sample * outbuf, int channelspacing, int32_t first_sample, int32_t samples_to_do) { int i, sample_count; diff --git a/src/formats.c b/src/formats.c index e734f446..3a9822e9 100644 --- a/src/formats.c +++ b/src/formats.c @@ -401,51 +401,53 @@ static const coding_info coding_info_list[] = { {coding_PCM16LE, "Little Endian 16-bit PCM"}, {coding_PCM16LE_XOR_int, "Little Endian 16-bit PCM with 2 byte interleave and XOR obfuscation"}, {coding_PCM16BE, "Big Endian 16-bit PCM"}, - {coding_PCM16_int, "16-bit PCM with 2 byte interleave"}, + {coding_PCM16_int, "16-bit PCM with 2 byte interleave (block)"}, {coding_PCM8, "8-bit PCM"}, + {coding_PCM8_int, "8-bit PCM with 1 byte interleave (block)"}, {coding_PCM8_U, "8-bit unsigned PCM"}, - {coding_PCM8_U_int, "8-bit unsigned 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_U_int, "8-bit unsigned PCM with 1 byte interleave (block)"}, + {coding_PCM8_SB_int, "8-bit PCM with sign bit, 1 byte interleave (block)"}, {coding_ULAW, "8-bit u-Law"}, {coding_ALAW, "8-bit a-Law"}, {coding_PCMFLOAT, "32-bit float PCM"}, + {coding_CRI_ADX, "CRI ADX 4-bit ADPCM"}, - {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 (fixed coefficients)"}, + {coding_CRI_ADX_exp, "CRI ADX 4-bit ADPCM (exponential scale)"}, {coding_CRI_ADX_enc_8, "CRI ADX 4-bit ADPCM (type 8 encryption)"}, {coding_CRI_ADX_enc_9, "CRI ADX 4-bit ADPCM (type 9 encryption)"}, + {coding_NGC_DSP, "Nintendo DSP 4-bit ADPCM"}, {coding_NGC_DTK, "Nintendo DTK 4-bit ADPCM"}, {coding_NGC_AFC, "Nintendo AFC 4-bit ADPCM"}, - {coding_CRI_HCA, "CRI HCA"}, - {coding_NDS_IMA, "NDS-style 4-bit IMA ADPCM"}, - {coding_DAT4_IMA, "Eurocom DAT4 4-bit IMA ADPCM"}, + {coding_G721, "CCITT G.721 4-bit ADPCM"}, + + {coding_XA, "CD-ROM XA 4-bit ADPCM"}, {coding_PSX, "Playstation 4-bit ADPCM"}, {coding_PSX_badflags, "Playstation 4-bit ADPCM (bad flags)"}, {coding_PSX_bmdx, "Playstation 4-bit ADPCM (BMDX encryption)"}, {coding_PSX_cfg, "Playstation 4-bit ADPCM (configurable)"}, {coding_HEVAG, "Playstation Vita HEVAG 4-bit ADPCM"}, - {coding_XA, "CD-ROM XA 4-bit ADPCM"}, - {coding_XBOX, "XBOX 4-bit IMA ADPCM"}, - {coding_XBOX_int, "XBOX 4-bit IMA ADPCM (interleaved)"}, - {coding_EA_XA, "Electronic Arts EA-XA 4-bit ADPCM (v1)"}, - {coding_EA_XA_int, "Electronic Arts EA-XA 4-bit ADPCM (v1) (interleaved)"}, - {coding_EA_XA_V2, "Electronic Arts EA-XA 4-bit ADPCM (v2)"}, + + {coding_EA_XA, "Electronic Arts EA-XA 4-bit ADPCM v1"}, + {coding_EA_XA_int, "Electronic Arts EA-XA 4-bit ADPCM v1 (mono/interleave)"}, + {coding_EA_XA_V2, "Electronic Arts EA-XA 4-bit ADPCM v2"}, {coding_MAXIS_XA, "Maxis EA-XA 4-bit ADPCM"}, - {coding_SDX2, "Squareroot-delta-exact (SDX2) 8-bit DPCM"}, - {coding_SDX2_int, "Squareroot-delta-exact (SDX2) 8-bit DPCM with 1 byte interleave"}, - {coding_CBD2, "Cuberoot-delta-exact (CBD2) 8-bit DPCM"}, - {coding_CBD2_int, "Cuberoot-delta-exact (CBD2) 8-bit DPCM with 1 byte interleave"}, - {coding_DVI_IMA, "Intel DVI 4-bit IMA ADPCM"}, - {coding_DVI_IMA_int, "Intel DVI 4-bit IMA ADPCM (interleaved)"}, - {coding_IMA_int, "IMA 4-bit ADPCM (interleaved)"}, + {coding_EA_XAS, "Electronic Arts EA-XAS 4-bit ADPCM"}, + {coding_IMA, "IMA 4-bit ADPCM"}, + {coding_IMA_int, "IMA 4-bit ADPCM (mono/interleave)"}, + {coding_DVI_IMA, "Intel DVI 4-bit IMA ADPCM"}, + {coding_DVI_IMA_int, "Intel DVI 4-bit IMA ADPCM (mono/interleave)"}, {coding_3DS_IMA, "3DS IMA 4-bit ADPCM"}, {coding_MS_IMA, "Microsoft 4-bit IMA ADPCM"}, + {coding_XBOX, "XBOX 4-bit IMA ADPCM"}, + {coding_XBOX_int, "XBOX 4-bit IMA ADPCM (mono/interleave)"}, + {coding_NDS_IMA, "NDS-style 4-bit IMA ADPCM"}, + {coding_DAT4_IMA, "Eurocom DAT4 4-bit IMA ADPCM"}, {coding_RAD_IMA, "Radical 4-bit IMA ADPCM"}, - {coding_RAD_IMA_mono, "Radical 4-bit IMA ADPCM (mono)"}, + {coding_RAD_IMA_mono, "Radical 4-bit IMA ADPCM (mono/interleave)"}, {coding_APPLE_IMA4, "Apple Quicktime 4-bit IMA ADPCM"}, {coding_SNDS_IMA, "Heavy Iron .snds 4-bit IMA ADPCM"}, {coding_OTNS_IMA, "Omikron: The Nomad Soul 4-bit IMA ADPCM"}, @@ -454,15 +456,9 @@ static const coding_info coding_info_list[] = { {coding_REF_IMA, "Reflections 4-bit IMA ADPCM"}, {coding_AWC_IMA, "Rockstar AWC 4-bit IMA ADPCM"}, {coding_UBI_IMA, "Ubisoft 4-bit IMA ADPCM"}, - {coding_WS, "Westwood Studios VBR ADPCM"}, - {coding_ACM, "InterPlay ACM"}, - {coding_NWA0, "NWA DPCM Level 0"}, - {coding_NWA1, "NWA DPCM Level 1"}, - {coding_NWA2, "NWA DPCM Level 2"}, - {coding_NWA3, "NWA DPCM Level 3"}, - {coding_NWA4, "NWA DPCM Level 4"}, - {coding_NWA5, "NWA DPCM Level 5"}, + {coding_MSADPCM, "Microsoft 4-bit ADPCM"}, + {coding_WS, "Westwood Studios VBR ADPCM"}, {coding_AICA, "Yamaha AICA 4-bit ADPCM"}, {coding_NDS_PROCYON, "Procyon Studio Digital Sound Elements NDS 4-bit APDCM"}, {coding_L5_555, "Level-5 0x555 4-bit ADPCM"}, @@ -471,7 +467,20 @@ static const coding_info coding_info_list[] = { {coding_MTAF, "Konami MTAF 4-bit ADPCM"}, {coding_MTA2, "Konami MTA2 4-bit ADPCM"}, {coding_MC3, "Paradigm MC3 3-bit ADPCM"}, - {coding_EA_XAS, "Electronic Arts EA-XAS 4-bit ADPCM"}, + + {coding_SDX2, "Squareroot-delta-exact (SDX2) 8-bit DPCM"}, + {coding_SDX2_int, "Squareroot-delta-exact (SDX2) 8-bit DPCM with 1 byte interleave"}, + {coding_CBD2, "Cuberoot-delta-exact (CBD2) 8-bit DPCM"}, + {coding_CBD2_int, "Cuberoot-delta-exact (CBD2) 8-bit DPCM with 1 byte interleave"}, + {coding_ACM, "InterPlay ACM"}, + {coding_NWA0, "NWA DPCM Level 0"}, + {coding_NWA1, "NWA DPCM Level 1"}, + {coding_NWA2, "NWA DPCM Level 2"}, + {coding_NWA3, "NWA DPCM Level 3"}, + {coding_NWA4, "NWA DPCM Level 4"}, + {coding_NWA5, "NWA DPCM Level 5"}, + + {coding_CRI_HCA, "CRI HCA"}, #ifdef VGM_USE_VORBIS {coding_ogg_vorbis, "Ogg Vorbis"}, @@ -772,7 +781,7 @@ static const meta_info meta_info_list[] = { {meta_WII_WAS, "WAS (iSWS) DSP header"}, {meta_XBOX_HLWAV, "Half Life 2 bgm header"}, {meta_STX, "Nintendo .stx header"}, - {meta_MYSPD, "U-Sing .myspd header"}, + {meta_MYSPD, "U-Sing .MYSPD header"}, {meta_HIS, "Her Interactive Sound header"}, {meta_PS2_AST, "KOEI AST header"}, {meta_CAPDSP, "Capcom DSP header"}, diff --git a/src/vgmstream.c b/src/vgmstream.c index 8bfcc422..7c6c4ef7 100644 --- a/src/vgmstream.c +++ b/src/vgmstream.c @@ -1018,9 +1018,9 @@ int get_vgmstream_samples_per_frame(VGMSTREAM * vgmstream) { case coding_NGC_DTK: return 28; case coding_G721: + case coding_IMA: case coding_DVI_IMA: case coding_SNDS_IMA: - case coding_IMA: case coding_OTNS_IMA: case coding_UBI_IMA: return 1; @@ -1175,7 +1175,6 @@ int get_vgmstream_frame_size(VGMSTREAM * vgmstream) { return 0x14; case coding_NGC_DTK: return 32; - case coding_IMA: case coding_G721: case coding_SNDS_IMA: case coding_OTNS_IMA: @@ -1209,12 +1208,14 @@ int get_vgmstream_frame_size(VGMSTREAM * vgmstream) { return 0x4c*vgmstream->channels; case coding_WS: return vgmstream->current_block_size; + case coding_IMA: case coding_IMA_int: case coding_DVI_IMA: case coding_DVI_IMA_int: case coding_3DS_IMA: + return 0x01; case coding_AICA: - return 1; + return 1; case coding_APPLE_IMA4: return 34; case coding_LSF: @@ -1610,10 +1611,13 @@ void decode_vgmstream(VGMSTREAM * vgmstream, int samples_written, int samples_to samples_to_do); } break; + case coding_IMA: + case coding_IMA_int: case coding_DVI_IMA: case coding_DVI_IMA_int: for (chan=0;chanchannels;chan++) { - int is_stereo = vgmstream->channels > 1 && vgmstream->coding_type == coding_DVI_IMA; + int is_stereo = (vgmstream->channels > 1 && vgmstream->coding_type == coding_IMA) + || (vgmstream->channels > 1 && vgmstream->coding_type == coding_DVI_IMA); int is_high_first = vgmstream->coding_type == coding_DVI_IMA || vgmstream->coding_type == coding_DVI_IMA_int; decode_standard_ima(&vgmstream->ch[chan],buffer+samples_written*vgmstream->channels+chan, @@ -1621,14 +1625,6 @@ void decode_vgmstream(VGMSTREAM * vgmstream, int samples_written, int samples_to samples_to_do, chan, is_stereo, is_high_first); } break; - case coding_IMA: - case coding_IMA_int: - for (chan=0;chanchannels;chan++) { - decode_ima(&vgmstream->ch[chan],buffer+samples_written*vgmstream->channels+chan, - vgmstream->channels,vgmstream->samples_into_block, - samples_to_do); - } - break; case coding_3DS_IMA: for (chan=0;chanchannels;chan++) { decode_3ds_ima(&vgmstream->ch[chan],buffer+samples_written*vgmstream->channels+chan, diff --git a/src/vgmstream.h b/src/vgmstream.h index 8e5b277f..5c749af4 100644 --- a/src/vgmstream.h +++ b/src/vgmstream.h @@ -116,18 +116,19 @@ typedef enum { coding_MAXIS_XA, /* Maxis EA-XA ADPCM */ coding_EA_XAS, /* Electronic Arts EA-XAS ADPCM */ - coding_XBOX, /* XBOX IMA ADPCM */ - coding_XBOX_int, /* XBOX IMA ADPCM (interleaved) */ - coding_IMA, /* IMA ADPCM (low nibble first) */ - coding_IMA_int, /* IMA ADPCM (interleaved) */ + coding_IMA, /* IMA ADPCM (stereo or mono, low nibble first) */ + coding_IMA_int, /* IMA ADPCM (mono/interleave, low nibble first) */ coding_DVI_IMA, /* DVI IMA ADPCM (stereo or mono, high nibble first) */ coding_DVI_IMA_int, /* DVI IMA ADPCM (mono/interleave, high nibble first) */ - coding_NDS_IMA, /* IMA ADPCM w/ NDS layout */ + coding_3DS_IMA, /* 3DS IMA ADPCM */ coding_MS_IMA, /* Microsoft IMA ADPCM */ + coding_XBOX, /* XBOX IMA ADPCM */ + coding_XBOX_int, /* XBOX IMA ADPCM (interleaved) */ + coding_NDS_IMA, /* IMA ADPCM w/ NDS layout */ + coding_DAT4_IMA, /* Eurocom 'DAT4' IMA ADPCM */ coding_RAD_IMA, /* Radical IMA ADPCM */ coding_RAD_IMA_mono, /* Radical IMA ADPCM, mono (for interleave) */ coding_APPLE_IMA4, /* Apple Quicktime IMA4 */ - coding_DAT4_IMA, /* Eurocom 'DAT4' IMA ADPCM */ coding_SNDS_IMA, /* Heavy Iron Studios .snds IMA ADPCM */ coding_OTNS_IMA, /* Omikron The Nomad Soul IMA ADPCM */ coding_FSB_IMA, /* FMOD's FSB multichannel IMA ADPCM */ @@ -135,7 +136,6 @@ typedef enum { coding_REF_IMA, /* Reflections IMA ADPCM */ coding_AWC_IMA, /* Rockstar AWC IMA ADPCM */ coding_UBI_IMA, /* Ubisoft IMA ADPCM */ - coding_3DS_IMA, /* 3DS IMA ADPCM */ coding_MSADPCM, /* Microsoft ADPCM */ coding_WS, /* Westwood Studios VBR ADPCM */ @@ -153,9 +153,7 @@ typedef enum { coding_SDX2_int, /* SDX2 2:1 Squareroot-Delta-Exact compression with sample-level interleave */ coding_CBD2, /* CBD2 2:1 Cuberoot-Delta-Exact compression DPCM */ coding_CBD2_int, /* CBD2 2:1 Cuberoot-Delta-Exact compression, with sample-level interleave */ - coding_ACM, /* InterPlay ACM */ - coding_NWA0, /* Visual Art's NWA (compressed at various levels) */ coding_NWA1, coding_NWA2,