Implemented ATRAC3plus support

This commit is contained in:
Chris Moeller 2013-06-26 02:54:15 -07:00
parent bd4f5c4d50
commit 98e90f8a25
13 changed files with 1146 additions and 956 deletions

View File

@ -0,0 +1,28 @@
// The following ifdef block is the standard way of creating macros which make exporting
// from a DLL simpler. All files within this DLL are compiled with the MAIATRAC3PLUS_EXPORTS
// symbol defined on the command line. This symbol should not be defined on any project
// that uses this DLL. This way any other project whose source files include this file see
// MAIATRAC3PLUS_API functions as being imported from a DLL, whereas this DLL sees symbols
// defined with this macro as being exported.
#ifdef _WIN32
#ifdef MAIATRAC3PLUS_EXPORTS
#define MAIATRAC3PLUS_API __declspec(dllexport)
#else
#define MAIATRAC3PLUS_API __declspec(dllimport)
#endif
#else
#define MAIATRAC3PLUS_API
#endif
#ifdef __cplusplus
extern "C" {
#endif
MAIATRAC3PLUS_API void* Atrac3plusDecoder_openContext();
MAIATRAC3PLUS_API int Atrac3plusDecoder_closeContext(void* context);
MAIATRAC3PLUS_API int Atrac3plusDecoder_decodeFrame(void* context, void* inbuf, int inbytes, int* channels, void** outbuf);
#ifdef __cplusplus
}
#endif

View File

@ -0,0 +1,5 @@
LIBRARY at3plusdecoder.dll
EXPORTS
Atrac3plusDecoder_openContext @1
Atrac3plusDecoder_closeContext @2
Atrac3plusDecoder_decodeFrame @3

BIN
ext_libs/at3plusdecoder.dll Normal file

Binary file not shown.

View File

@ -50,6 +50,14 @@
<ItemDefinitionGroup>
</ItemDefinitionGroup>
<ItemGroup>
<CustomBuild Include="at3plusdecoder.def">
<Message Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">Building library stub</Message>
<Command Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">lib /def:at3plusdecoder.def /machine:x86</Command>
<Outputs Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">at3plusdecoder.lib;at3plusdecoder.exp;%(Outputs)</Outputs>
<Message Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">Building library stub</Message>
<Command Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">lib /def:at3plusdecoder.def /machine:x86</Command>
<Outputs Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">at3plusdecoder.lib;at3plusdecoder.exp;%(Outputs)</Outputs>
</CustomBuild>
<CustomBuild Include="libmpg123-0.def">
<Message Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">Building library stub</Message>
<Command Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">lib /def:libmpg123-0.def /machine:x86

View File

@ -68,7 +68,7 @@
<ClCompile>
<Optimization>Disabled</Optimization>
<AdditionalIncludeDirectories>../ext_includes;..\..\foobar\foobar2000\SDK;..\..\foobar\foobar2000\helpers;..\..\foobar\foobar2000\ATLHelpers;..\..\foobar\foobar2000\shared;../../qaac/mp4v2/include;../../fdk-aac/libSYS/include;../../fdk-aac/libAACdec/include;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
<PreprocessorDefinitions>WIN32;VGM_USE_G7221;VGM_USE_MP4V2;VGM_USE_FDKAAC;_DEBUG;_WINDOWS;_USRDLL;IN_VGMSTREAM_EXPORTS;%(PreprocessorDefinitions)</PreprocessorDefinitions>
<PreprocessorDefinitions>WIN32;VGM_USE_G7221;VGM_USE_MP4V2;VGM_USE_FDKAAC;VGM_USE_MAIATRAC3PLUS;_DEBUG;_WINDOWS;_USRDLL;IN_VGMSTREAM_EXPORTS;%(PreprocessorDefinitions)</PreprocessorDefinitions>
<MinimalRebuild>true</MinimalRebuild>
<BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>
<RuntimeLibrary>MultiThreadedDebug</RuntimeLibrary>
@ -78,7 +78,7 @@
<DebugInformationFormat>EditAndContinue</DebugInformationFormat>
</ClCompile>
<Link>
<AdditionalDependencies>../ext_libs/libg7221_decode.lib;../ext_libs/libvorbis.lib;../ext_libs/libmpg123-0.lib;%(AdditionalDependencies)</AdditionalDependencies>
<AdditionalDependencies>../ext_libs/libvorbis.lib;../ext_libs/libmpg123-0.lib;../ext_libs/libg7221_decode.lib;../ext_libs/at3plusdecoder.lib;%(AdditionalDependencies)</AdditionalDependencies>
<AdditionalLibraryDirectories>%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
<DelayLoadDLLs>%(DelayLoadDLLs)</DelayLoadDLLs>
<GenerateDebugInformation>true</GenerateDebugInformation>
@ -93,7 +93,7 @@
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
<ClCompile>
<AdditionalIncludeDirectories>../ext_includes;..\..\foobar\foobar2000\SDK;..\..\foobar\foobar2000\helpers;..\..\foobar\foobar2000\ATLHelpers;..\..\foobar\foobar2000\shared;../../qaac/mp4v2/include;../../fdk-aac/libSYS/include;../../fdk-aac/libAACdec/include;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
<PreprocessorDefinitions>WIN32;VGM_USE_G7221;VGM_USE_MP4V2;VGM_USE_FDKAAC;NDEBUG;_WINDOWS;_USRDLL;IN_VGMSTREAM_EXPORTS;%(PreprocessorDefinitions)</PreprocessorDefinitions>
<PreprocessorDefinitions>WIN32;VGM_USE_G7221;VGM_USE_MP4V2;VGM_USE_FDKAAC;VGM_USE_MAIATRAC3PLUS;NDEBUG;_WINDOWS;_USRDLL;IN_VGMSTREAM_EXPORTS;%(PreprocessorDefinitions)</PreprocessorDefinitions>
<RuntimeLibrary>MultiThreaded</RuntimeLibrary>
<PrecompiledHeader>
</PrecompiledHeader>
@ -103,7 +103,7 @@
<EnableEnhancedInstructionSet>NoExtensions</EnableEnhancedInstructionSet>
</ClCompile>
<Link>
<AdditionalDependencies>../ext_libs/libvorbis.lib;../ext_libs/libmpg123-0.lib;../ext_libs/libg7221_decode.lib;%(AdditionalDependencies)</AdditionalDependencies>
<AdditionalDependencies>../ext_libs/libvorbis.lib;../ext_libs/libmpg123-0.lib;../ext_libs/libg7221_decode.lib;../ext_libs/at3plusdecoder.lib;%(AdditionalDependencies)</AdditionalDependencies>
<AdditionalLibraryDirectories>%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
<IgnoreSpecificDefaultLibraries>%(IgnoreSpecificDefaultLibraries)</IgnoreSpecificDefaultLibraries>
<DelayLoadDLLs>%(DelayLoadDLLs)</DelayLoadDLLs>

View File

@ -288,6 +288,7 @@ bool input_vgmstream::g_is_our_path(const char * p_path,const char * p_extension
if(!stricmp_utf8(p_extension,"ast")) return 1;
if(!stricmp_utf8(p_extension,"asr")) return 1;
if(!stricmp_utf8(p_extension,"ass")) return 1;
if(!stricmp_utf8(p_extension,"at3")) return 1;
if(!stricmp_utf8(p_extension,"aud")) return 1;
if(!stricmp_utf8(p_extension,"aus")) return 1;

28
src/coding/at3_decoder.c Normal file
View File

@ -0,0 +1,28 @@
#include "../vgmstream.h"
#ifdef VGM_USE_MAIATRAC3PLUS
#include "maiatrac3plus.h"
#include "coding.h"
#include "../util.h"
void decode_at3(VGMSTREAM * vgmstream,
sample * outbuf, int channelspacing, int32_t samples_to_do, int channel) {
VGMSTREAMCHANNEL *ch = &vgmstream->ch[0];
maiatrac3plus_codec_data *data = vgmstream->codec_data;
int i;
if ((0 == vgmstream->samples_into_block || data->samples_discard == vgmstream->samples_into_block) && 0 == channel)
{
uint8_t code_buffer[0x8000];
vgmstream->ch[channel].streamfile->read(ch->streamfile, code_buffer, ch->offset, vgmstream->interleave_block_size * vgmstream->channels);
Atrac3plusDecoder_decodeFrame(data->handle, code_buffer, vgmstream->interleave_block_size * vgmstream->channels, &data->channels, (void**)&data->buffer);
data->samples_discard = 0;
}
for (i = 0; i < samples_to_do; i++)
{
outbuf[i*channelspacing] = data->buffer[(vgmstream->samples_into_block+i)*data->channels+channel];
}
}
#endif

View File

@ -96,6 +96,11 @@ void decode_g7221(VGMSTREAM *vgmstream,
sample * outbuf, int channelspacing, int32_t samples_to_do, int channel);
#endif
#ifdef VGM_USE_MAIATRAC3PLUS
void decode_at3(VGMSTREAM *vgmstream,
sample * outbuf, int channelspacing, int32_t samples_to_do, int channel);
#endif
void decode_acm(ACMStream * acm, sample * outbuf,
int32_t samples_to_do, int channelspacing);

View File

@ -56,7 +56,7 @@
<ClCompile>
<Optimization>Disabled</Optimization>
<AdditionalIncludeDirectories>../ext_includes;../../qaac/mp4v2/include;../../fdk-aac/libSYS/include;../../fdk-aac/libAACdec/include;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
<PreprocessorDefinitions>WIN32;VGM_USE_G7221;VGM_USE_MP4V2;VGM_USE_FDKAAC;_DEBUG;_LIB;%(PreprocessorDefinitions)</PreprocessorDefinitions>
<PreprocessorDefinitions>WIN32;VGM_USE_G7221;VGM_USE_MP4V2;VGM_USE_FDKAAC;VGM_USE_MAIATRAC3PLUS;_DEBUG;_LIB;%(PreprocessorDefinitions)</PreprocessorDefinitions>
<MinimalRebuild>true</MinimalRebuild>
<BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>
<RuntimeLibrary>MultiThreadedDebug</RuntimeLibrary>
@ -70,7 +70,7 @@
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
<ClCompile>
<AdditionalIncludeDirectories>../ext_includes;../../qaac/mp4v2/include;../../fdk-aac/libSYS/include;../../fdk-aac/libAACdec/include;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
<PreprocessorDefinitions>WIN32;VGM_USE_G7221;VGM_USE_MP4V2;VGM_USE_FDKAAC;NDEBUG;_LIB;%(PreprocessorDefinitions)</PreprocessorDefinitions>
<PreprocessorDefinitions>WIN32;VGM_USE_G7221;VGM_USE_MP4V2;VGM_USE_FDKAAC;VGM_USE_MAIATRAC3PLUS;NDEBUG;_LIB;%(PreprocessorDefinitions)</PreprocessorDefinitions>
<RuntimeLibrary>MultiThreaded</RuntimeLibrary>
<PrecompiledHeader>
</PrecompiledHeader>
@ -93,6 +93,7 @@
<ClInclude Include="layout\layout.h" />
</ItemGroup>
<ItemGroup>
<ClCompile Include="coding\at3_decoder.c" />
<ClCompile Include="coding\lsf_decoder.c" />
<ClCompile Include="coding\mp4_aac_decoder.c" />
<ClCompile Include="coding\mtaf_decoder.c" />

File diff suppressed because it is too large Load Diff

View File

@ -165,6 +165,21 @@ int read_fmt(int big_endian,
fmt->coding_type = coding_NGC_DSP;
fmt->interleave = 8;
break;
#ifdef VGM_USE_MAIATRAC3PLUS
case 0xFFFE: /* WAVEFORMATEXTENSIBLE */
if (read_32bit(current_chunk+0x20,streamFile) == 0xE923AABF &&
read_16bit(current_chunk+0x24,streamFile) == (int16_t)0xCB58 &&
read_16bit(current_chunk+0x26,streamFile) == 0x4471 &&
read_32bitLE(current_chunk+0x28,streamFile) == 0xFAFF19A1 &&
read_32bitLE(current_chunk+0x2C,streamFile) == 0x62CEE401) {
uint16_t bztmp = read_16bit(current_chunk+0x32,streamFile);
bztmp = (bztmp >> 8) | (bztmp << 8);
fmt->coding_type = coding_AT3;
fmt->block_size = (bztmp & 0x3FF) * 8 + 8;
fmt->interleave = 0;
}
break;
#endif
default:
goto fail;
}
@ -208,7 +223,11 @@ VGMSTREAM * init_vgmstream_riff(STREAMFILE *streamFile) {
/* check extension, case insensitive */
streamFile->get_name(streamFile,filename,sizeof(filename));
if (strcasecmp("wav",filename_extension(filename)) &&
strcasecmp("lwav",filename_extension(filename)))
strcasecmp("lwav",filename_extension(filename))
#ifdef VGM_USE_MAIATRAC3PLUS
&& strcasecmp("at3",filename_extension(filename))
#endif
)
{
if (!strcasecmp("mwv",filename_extension(filename)))
mwv = 1;
@ -341,6 +360,11 @@ VGMSTREAM * init_vgmstream_riff(STREAMFILE *streamFile) {
break;
case coding_NGC_DSP:
break;
#ifdef VGM_USE_MAIATRAC3PLUS
case coding_AT3:
sample_count = (data_size / fmt.block_size) * 2048 * fmt.channel_count;
break;
#endif
default:
goto fail;
}
@ -384,11 +408,25 @@ VGMSTREAM * init_vgmstream_riff(STREAMFILE *streamFile) {
// override interleave_block_size with frame size
vgmstream->interleave_block_size = fmt.block_size;
break;
#ifdef VGM_USE_MAIATRAC3PLUS
case coding_AT3:
vgmstream->interleave_block_size = fmt.block_size / fmt.channel_count;
#endif
default:
// use interleave from above
break;
}
#ifdef VGM_USE_MAIATRAC3PLUS
if (fmt.coding_type == coding_AT3) {
maiatrac3plus_codec_data *data = malloc(sizeof(maiatrac3plus_codec_data));
data->buffer = 0;
data->samples_discard = 0;
data->handle = Atrac3plusDecoder_openContext();
vgmstream->codec_data = data;
}
#endif
if (loop_flag) {
if (loop_start_ms >= 0)
{

View File

@ -453,6 +453,16 @@ void reset_vgmstream(VGMSTREAM * vgmstream) {
}
#endif
#ifdef VGM_USE_MAIATRAC3PLUS
if (vgmstream->coding_type==coding_AT3) {
maiatrac3plus_codec_data *data = vgmstream->codec_data;
if (data->handle) Atrac3plusDecoder_closeContext(data->handle);
data->handle = Atrac3plusDecoder_openContext();
data->samples_discard = 0;
}
#endif
if (vgmstream->coding_type==coding_ACM) {
mus_acm_codec_data *data = vgmstream->codec_data;
int i;
@ -642,6 +652,18 @@ void close_vgmstream(VGMSTREAM * vgmstream) {
}
#endif
#ifdef VGM_USE_MAIATRAC3PLUS
if (vgmstream->coding_type == coding_AT3) {
maiatrac3plus_codec_data *data = vgmstream->codec_data;
if (data)
{
if (data->handle) Atrac3plusDecoder_closeContext(data->handle);
free(data);
}
}
#endif
if (vgmstream->coding_type==coding_ACM) {
mus_acm_codec_data *data = vgmstream->codec_data;
@ -952,6 +974,10 @@ int get_vgmstream_samples_per_frame(VGMSTREAM * vgmstream) {
#if defined(VGM_USE_MP4V2) && defined(VGM_USE_FDKAAC)
case coding_MP4_AAC:
return ((mp4_aac_codec_data*)vgmstream->codec_data)->samples_per_frame;
#endif
#ifdef VGM_USE_MAIATRAC3PLUS
case coding_AT3:
return 2048 - ((maiatrac3plus_codec_data*)vgmstream->codec_data)->samples_discard;
#endif
default:
return 0;
@ -1047,6 +1073,9 @@ int get_vgmstream_frame_size(VGMSTREAM * vgmstream) {
#ifdef VGM_USE_G7221
case coding_G7221C:
case coding_G7221:
#endif
#ifdef VGM_USE_MAIATRAC3PLUS
case coding_AT3:
#endif
case coding_MSADPCM:
case coding_MTAF:
@ -1433,6 +1462,17 @@ void decode_vgmstream(VGMSTREAM * vgmstream, int samples_written, int samples_to
chan);
}
break;
#endif
#ifdef VGM_USE_MAIATRAC3PLUS
case coding_AT3:
for (chan=0;chan<vgmstream->channels;chan++) {
decode_at3(vgmstream,
buffer+samples_written*vgmstream->channels+chan,
vgmstream->channels,
samples_to_do,
chan);
}
break;
#endif
case coding_ACM:
/* handled in its own layout, here to quiet compiler */
@ -1592,6 +1632,17 @@ int vgmstream_do_loop(VGMSTREAM * vgmstream) {
data->samples_discard = vgmstream->loop_sample;
}
#endif
#ifdef VGM_USE_MAIATRAC3PLUS
if (vgmstream->coding_type==coding_AT3) {
int blocks_to_skip = vgmstream->loop_sample / 2048;
int samples_to_discard = vgmstream->loop_sample % 2048;
maiatrac3plus_codec_data *data = (maiatrac3plus_codec_data *)(vgmstream->codec_data);
vgmstream->loop_ch[0].offset =
vgmstream->loop_ch[0].channel_start_offset +
vgmstream->interleave_block_size * vgmstream->channels * blocks_to_skip;
data->samples_discard = samples_to_discard;
}
#endif
#ifdef VGM_USE_MPEG
/* won't work for fake MPEG */
if (vgmstream->layout_type==layout_mpeg) {
@ -1857,6 +1908,11 @@ void describe_vgmstream(VGMSTREAM * vgmstream, char * desc, int length) {
case coding_G7221C:
snprintf(temp,TEMPSIZE,"ITU G.722.1 annex C (Polycom Siren 14)");
break;
#endif
#ifdef VGM_USE_MAIATRAC3PLUS
case coding_AT3:
snprintf(temp,TEMPSIZE,"ATRAC3plus");
break;
#endif
case coding_ACM:
snprintf(temp,TEMPSIZE,"InterPlay ACM");

View File

@ -38,6 +38,10 @@ enum { PATH_LIMIT = 32768 };
#include <aacdecoder_lib.h>
#endif
#ifdef VGM_USE_MAIATRAC3PLUS
#include <maiatrac3plus.h>
#endif
#include "coding/acm_decoder.h"
#include "coding/nwa_decoder.h"
@ -142,6 +146,10 @@ typedef enum {
#if defined(VGM_USE_MP4V2) && defined(VGM_USE_FDKAAC)
coding_MP4_AAC,
#endif
#ifdef VGM_USE_MAIATRAC3PLUS
coding_AT3,
#endif
} coding_t;
/* The layout type specifies how the sound data is laid out in the file */
@ -720,6 +728,15 @@ typedef struct {
} g7221_codec_data;
#endif
#ifdef VGM_USE_MAIATRAC3PLUS
typedef struct {
sample *buffer;
int channels;
int samples_discard;
void *handle;
} maiatrac3plus_codec_data;
#endif
/* with one file this is also used for just
ACM */
typedef struct {