From: <man...@us...> - 2013-05-11 14:53:47
|
Revision: 2015 http://sourceforge.net/p/modplug/code/2015 Author: manxorist Date: 2013-05-11 14:53:38 +0000 (Sat, 11 May 2013) Log Message: ----------- [New] Add foo_openmpt, a foobar2000 compatible input component (currently still untested). Modified Paths: -------------- trunk/OpenMPT/include/readme.txt trunk/OpenMPT/soundlib/Tables.cpp Added Paths: ----------- trunk/OpenMPT/include/foobar2000sdk/ trunk/OpenMPT/libopenmpt/libopenmpt_foobar2000.cpp trunk/OpenMPT/libopenmpt/libopenmpt_foobar2000.sln trunk/OpenMPT/libopenmpt/libopenmpt_foobar2000.vcxproj trunk/OpenMPT/libopenmpt/libopenmpt_foobar2000.vcxproj.filters Index: trunk/OpenMPT/include/foobar2000sdk =================================================================== --- trunk/OpenMPT/include/foobar2000sdk 2013-05-11 14:51:10 UTC (rev 2014) +++ trunk/OpenMPT/include/foobar2000sdk 2013-05-11 14:53:38 UTC (rev 2015) Property changes on: trunk/OpenMPT/include/foobar2000sdk ___________________________________________________________________ Added: svn:ignore ## -0,0 +1 ## +* Added: tsvn:logminsize ## -0,0 +1 ## +10 \ No newline at end of property Modified: trunk/OpenMPT/include/readme.txt =================================================================== --- trunk/OpenMPT/include/readme.txt 2013-05-11 14:51:10 UTC (rev 2014) +++ trunk/OpenMPT/include/readme.txt 2013-05-11 14:53:38 UTC (rev 2015) @@ -48,3 +48,8 @@ To build libopenmpt with xmplay input plugin support, copy the contents of xmpin.zip into include/xmplay/. Use #define NO_XMPLAY in common/BuildSettings.h to disable. + +foobar2000 SDK +============== +Building the openmpt fooobar input service requires the contents of +SDK-2011-03-11.zip being placed in include/foobar2000sdk/. Added: trunk/OpenMPT/libopenmpt/libopenmpt_foobar2000.cpp =================================================================== --- trunk/OpenMPT/libopenmpt/libopenmpt_foobar2000.cpp (rev 0) +++ trunk/OpenMPT/libopenmpt/libopenmpt_foobar2000.cpp 2013-05-11 14:53:38 UTC (rev 2015) @@ -0,0 +1,170 @@ + +#include "foobar2000/SDK/foobar2000.h" +#include "foobar2000/helpers/helpers.h" + +#define LIBOPENMPT_ALPHA_WARNING_SEEN_AND_I_KNOW_WHAT_I_AM_DOING +#include "libopenmpt.hpp" + +#include <algorithm> +#include <locale> +#include <string> +#include <vector> + + + +// Declaration of your component's version information +// Since foobar2000 v1.0 having at least one of these in your DLL is mandatory to let the troubleshooter tell different versions of your component apart. +// Note that it is possible to declare multiple components within one DLL, but it's strongly recommended to keep only one declaration per DLL. +// As for 1.1, the version numbers are used by the component update finder to find updates; for that to work, you must have ONLY ONE declaration per DLL. If there are multiple declarations, the component is assumed to be outdated and a version number of "0" is assumed, to overwrite the component with whatever is currently on the site assuming that it comes with proper version numbers. +DECLARE_COMPONENT_VERSION("OpenMPT component","0.1","libopenmpt based module file player"); + + + +// This will prevent users from renaming your component around (important for proper troubleshooter behaviors) or loading multiple instances of it. +VALIDATE_COMPONENT_FILENAME("foo_openmpt.dll"); + + + +// Sample initquit implementation. See also: initquit class documentation in relevant header. + +class myinitquit : public initquit { +public: + void on_init() { + // console::print("Sample component: on_init()"); + } + void on_quit() { + // console::print("Sample component: on_quit()"); + } +}; + +static initquit_factory_t<myinitquit> g_myinitquit_factory; + + + +// No inheritance. Our methods get called over input framework templates. See input_singletrack_impl for descriptions of what each method does. +class input_openmpt { +public: + void open(service_ptr_t<file> p_filehint,const char * p_path,t_input_open_reason p_reason,abort_callback & p_abort) { + if ( p_reason == input_open_info_write ) { + throw exception_io_unsupported_format(); // our input does not support retagging. + } + m_file = p_filehint; // p_filehint may be null, hence next line + input_open_file_helper(m_file,p_path,p_reason,p_abort); // if m_file is null, opens file with appropriate privileges for our operation (read/write for writing tags, read-only otherwise). + if ( m_file->get_size( p_abort ) >= (std::numeric_limits<std::size_t>::max)() ) { + throw exception_io_unsupported_format(); + } + std::vector<char> data( static_cast<std::size_t>( m_file->get_size( p_abort ) ) ); + m_file->read( data.data(), data.size(), p_abort ); + mod = new openmpt::module( data ); + } + void get_info(file_info & p_info,abort_callback & p_abort) { + p_info.set_length( mod->get_duration_seconds() ); + p_info.info_set_int( "samplerate", 48000 ); + p_info.info_set_int( "channels", 2 ); + p_info.info_set_int( "bitspersample", 32 ); + std::vector<std::string> keys = mod->get_metadata_keys(); + for ( std::vector<std::string>::iterator key = keys.begin(); key != keys.end(); ++key ) { + p_info.meta_set( (*key).c_str(), mod->get_metadata( *key ).c_str() ); + } + } + t_filestats get_file_stats(abort_callback & p_abort) { + return m_file->get_stats(p_abort); + } + void decode_initialize(unsigned p_flags,abort_callback & p_abort) { + m_file->reopen(p_abort); // equivalent to seek to zero, except it also works on nonseekable streams + } + bool decode_run(audio_chunk & p_chunk,abort_callback & p_abort) { + std::size_t count = mod->read( 48000, buffersize, left.data(), right.data() ); + if ( count == 0 ) { + return false; + } + for ( std::size_t frame = 0; frame < count; frame++ ) { + buffer[frame*2+0] = left[frame]; + buffer[frame*2+1] = right[frame]; + } + p_chunk.set_data_32( buffer.data(), count, 2, 48000 ); + return true; + } + void decode_seek(double p_seconds,abort_callback & p_abort) { + mod->seek_seconds( p_seconds ); + } + bool decode_can_seek() { + return true; + } + bool decode_get_dynamic_info(file_info & p_out, double & p_timestamp_delta) { // deals with dynamic information such as VBR bitrates + return false; + } + bool decode_get_dynamic_info_track(file_info & p_out, double & p_timestamp_delta) { // deals with dynamic information such as track changes in live streams + return false; + } + void decode_on_idle(abort_callback & p_abort) { + m_file->on_idle( p_abort ); + } + void retag(const file_info & p_info,abort_callback & p_abort) { + throw exception_io_unsupported_format(); + } + static bool g_is_our_content_type(const char * p_content_type) { // match against supported mime types here + return false; + } + static bool g_is_our_path(const char * p_path,const char * p_extension) { + if ( !p_extension ) { + return false; + } + std::vector<std::string> extensions = openmpt::get_supported_extensions(); + std::string ext = p_extension; + std::transform( ext.begin(), ext.end(), ext.begin(), tolower ); + return std::find( extensions.begin(), extensions.end(), ext ) != extensions.end(); + } +public: + service_ptr_t<file> m_file; + static const std::size_t buffersize = 1024; + openmpt::module * mod; + std::vector<float> left; + std::vector<float> right; + std::vector<float> buffer; + input_openmpt() : mod(0), left(buffersize), right(buffersize), buffer(2*buffersize) {} + ~input_openmpt() { delete mod; mod = 0; } +}; + +static input_singletrack_factory_t<input_openmpt> g_input_openmpt_factory; + + + +// copied table from soundlib/Tables.cpp +// the foobar2000 interface is stupid demanding to declare those statically + +DECLARE_FILE_TYPE("OpenMPT compatibel module files", + "*.mod" ";" + "*.s3m" ";" + "*.xm" ";" + "*.it" ";" + "*.mptm" ";" + "*.stm" ";" + "*.nst" ";" + "*.m15" ";" + "*.stk" ";" + "*.wow" ";" + "*.ult" ";" + "*.669" ";" + "*.mtm" ";" + "*.med" ";" + "*.far" ";" + "*.mdl" ";" + "*.ams" ";" + "*.ams" ";" + "*.dsm" ";" + "*.amf" ";" + "*.amf" ";" + "*.okt" ";" + "*.dmf" ";" + "*.ptm" ";" + "*.psm" ";" + "*.mt2" ";" + "*.dbm" ";" + "*.digi" ";" + "*.imf" ";" + "*.j2b" ";" + "*.gdm" ";" + "*.umx" ";" + "*.uax" ";" + "*.mo3" ); Property changes on: trunk/OpenMPT/libopenmpt/libopenmpt_foobar2000.cpp ___________________________________________________________________ Added: svn:mime-type ## -0,0 +1 ## +text/x-c++src \ No newline at end of property Added: svn:eol-style ## -0,0 +1 ## +native \ No newline at end of property Added: trunk/OpenMPT/libopenmpt/libopenmpt_foobar2000.sln =================================================================== --- trunk/OpenMPT/libopenmpt/libopenmpt_foobar2000.sln (rev 0) +++ trunk/OpenMPT/libopenmpt/libopenmpt_foobar2000.sln 2013-05-11 14:53:38 UTC (rev 2015) @@ -0,0 +1,56 @@ + +Microsoft Visual Studio Solution File, Format Version 11.00 +# Visual Studio 2010 +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "libopenmpt_foobar2000", "libopenmpt_foobar2000.vcxproj", "{3F14BF17-016A-44C3-9B8D-C875C2EC8A18}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "foobar2000_SDK", "..\include\foobar2000sdk\foobar2000\SDK\foobar2000_SDK.vcxproj", "{E8091321-D79D-4575-86EF-064EA1A4A20D}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "foobar2000_component_client", "..\include\foobar2000sdk\foobar2000\foobar2000_component_client\foobar2000_component_client.vcxproj", "{71AD2674-065B-48F5-B8B0-E1F9D3892081}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "foobar2000_sdk_helpers", "..\include\foobar2000sdk\foobar2000\helpers\foobar2000_sdk_helpers.vcxproj", "{EE47764E-A202-4F85-A767-ABDAB4AFF35F}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "pfc", "..\include\foobar2000sdk\pfc\pfc.vcxproj", "{EBFFFB4E-261D-44D3-B89C-957B31A0BF9C}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "libopenmpt", "libopenmpt.vcxproj", "{812A654D-99BE-4D13-B97F-86332AD3E363}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "zlibstat", "..\include\zlib\contrib\vstudio\vc10\zlibstat.vcxproj", "{745DEC58-EBB3-47A9-A9B8-4C6627C01BF8}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|Win32 = Debug|Win32 + Release|Win32 = Release|Win32 + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {3F14BF17-016A-44C3-9B8D-C875C2EC8A18}.Debug|Win32.ActiveCfg = Debug|Win32 + {3F14BF17-016A-44C3-9B8D-C875C2EC8A18}.Debug|Win32.Build.0 = Debug|Win32 + {3F14BF17-016A-44C3-9B8D-C875C2EC8A18}.Release|Win32.ActiveCfg = Release|Win32 + {3F14BF17-016A-44C3-9B8D-C875C2EC8A18}.Release|Win32.Build.0 = Release|Win32 + {E8091321-D79D-4575-86EF-064EA1A4A20D}.Debug|Win32.ActiveCfg = Debug|Win32 + {E8091321-D79D-4575-86EF-064EA1A4A20D}.Debug|Win32.Build.0 = Debug|Win32 + {E8091321-D79D-4575-86EF-064EA1A4A20D}.Release|Win32.ActiveCfg = Release|Win32 + {E8091321-D79D-4575-86EF-064EA1A4A20D}.Release|Win32.Build.0 = Release|Win32 + {71AD2674-065B-48F5-B8B0-E1F9D3892081}.Debug|Win32.ActiveCfg = Debug|Win32 + {71AD2674-065B-48F5-B8B0-E1F9D3892081}.Debug|Win32.Build.0 = Debug|Win32 + {71AD2674-065B-48F5-B8B0-E1F9D3892081}.Release|Win32.ActiveCfg = Release|Win32 + {71AD2674-065B-48F5-B8B0-E1F9D3892081}.Release|Win32.Build.0 = Release|Win32 + {EE47764E-A202-4F85-A767-ABDAB4AFF35F}.Debug|Win32.ActiveCfg = Debug|Win32 + {EE47764E-A202-4F85-A767-ABDAB4AFF35F}.Debug|Win32.Build.0 = Debug|Win32 + {EE47764E-A202-4F85-A767-ABDAB4AFF35F}.Release|Win32.ActiveCfg = Release|Win32 + {EE47764E-A202-4F85-A767-ABDAB4AFF35F}.Release|Win32.Build.0 = Release|Win32 + {EBFFFB4E-261D-44D3-B89C-957B31A0BF9C}.Debug|Win32.ActiveCfg = Debug|Win32 + {EBFFFB4E-261D-44D3-B89C-957B31A0BF9C}.Debug|Win32.Build.0 = Debug|Win32 + {EBFFFB4E-261D-44D3-B89C-957B31A0BF9C}.Release|Win32.ActiveCfg = Release|Win32 + {EBFFFB4E-261D-44D3-B89C-957B31A0BF9C}.Release|Win32.Build.0 = Release|Win32 + {812A654D-99BE-4D13-B97F-86332AD3E363}.Debug|Win32.ActiveCfg = DebugStatic|Win32 + {812A654D-99BE-4D13-B97F-86332AD3E363}.Debug|Win32.Build.0 = DebugStatic|Win32 + {812A654D-99BE-4D13-B97F-86332AD3E363}.Release|Win32.ActiveCfg = ReleaseStatic|Win32 + {812A654D-99BE-4D13-B97F-86332AD3E363}.Release|Win32.Build.0 = ReleaseStatic|Win32 + {745DEC58-EBB3-47A9-A9B8-4C6627C01BF8}.Debug|Win32.ActiveCfg = Debug|Win32 + {745DEC58-EBB3-47A9-A9B8-4C6627C01BF8}.Debug|Win32.Build.0 = Debug|Win32 + {745DEC58-EBB3-47A9-A9B8-4C6627C01BF8}.Release|Win32.ActiveCfg = ReleaseWithoutAsm|Win32 + {745DEC58-EBB3-47A9-A9B8-4C6627C01BF8}.Release|Win32.Build.0 = ReleaseWithoutAsm|Win32 + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection +EndGlobal Property changes on: trunk/OpenMPT/libopenmpt/libopenmpt_foobar2000.sln ___________________________________________________________________ Added: svn:mime-type ## -0,0 +1 ## +text/x-ms-sln \ No newline at end of property Added: svn:eol-style ## -0,0 +1 ## +CRLF \ No newline at end of property Added: trunk/OpenMPT/libopenmpt/libopenmpt_foobar2000.vcxproj =================================================================== --- trunk/OpenMPT/libopenmpt/libopenmpt_foobar2000.vcxproj (rev 0) +++ trunk/OpenMPT/libopenmpt/libopenmpt_foobar2000.vcxproj 2013-05-11 14:53:38 UTC (rev 2015) @@ -0,0 +1,101 @@ +<?xml version="1.0" encoding="utf-8"?> +<Project DefaultTargets="Build" ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003"> + <ItemGroup Label="ProjectConfigurations"> + <ProjectConfiguration Include="Debug|Win32"> + <Configuration>Debug</Configuration> + <Platform>Win32</Platform> + </ProjectConfiguration> + <ProjectConfiguration Include="Release|Win32"> + <Configuration>Release</Configuration> + <Platform>Win32</Platform> + </ProjectConfiguration> + </ItemGroup> + <PropertyGroup Label="Globals"> + <ProjectGuid>{3F14BF17-016A-44C3-9B8D-C875C2EC8A18}</ProjectGuid> + <RootNamespace>libopenmpt_foobar2000</RootNamespace> + </PropertyGroup> + <Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" /> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration"> + <ConfigurationType>DynamicLibrary</ConfigurationType> + <UseDebugLibraries>true</UseDebugLibraries> + <CharacterSet>Unicode</CharacterSet> + </PropertyGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration"> + <ConfigurationType>DynamicLibrary</ConfigurationType> + <UseDebugLibraries>false</UseDebugLibraries> + <WholeProgramOptimization>true</WholeProgramOptimization> + <CharacterSet>Unicode</CharacterSet> + </PropertyGroup> + <Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" /> + <ImportGroup Label="ExtensionSettings"> + </ImportGroup> + <ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'"> + <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" /> + </ImportGroup> + <ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Release|Win32'"> + <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" /> + </ImportGroup> + <PropertyGroup Label="UserMacros" /> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'"> + <TargetName>foo_openmpt</TargetName> + </PropertyGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'"> + <TargetName>foo_openmpt</TargetName> + <OutDir>bin\</OutDir> + </PropertyGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'"> + <ClCompile> + <WarningLevel>Level3</WarningLevel> + <Optimization>Disabled</Optimization> + <AdditionalIncludeDirectories>../include/foobar2000sdk</AdditionalIncludeDirectories> + </ClCompile> + <Link> + <GenerateDebugInformation>true</GenerateDebugInformation> + <AdditionalDependencies>..\include\foobar2000sdk\foobar2000\shared\shared.lib;%(AdditionalDependencies)</AdditionalDependencies> + </Link> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'"> + <ClCompile> + <WarningLevel>Level3</WarningLevel> + <Optimization>Full</Optimization> + <FunctionLevelLinking>true</FunctionLevelLinking> + <IntrinsicFunctions>true</IntrinsicFunctions> + <InlineFunctionExpansion>AnySuitable</InlineFunctionExpansion> + <FavorSizeOrSpeed>Speed</FavorSizeOrSpeed> + <RuntimeLibrary>MultiThreaded</RuntimeLibrary> + <AdditionalIncludeDirectories>../include/foobar2000sdk</AdditionalIncludeDirectories> + </ClCompile> + <Link> + <GenerateDebugInformation>true</GenerateDebugInformation> + <EnableCOMDATFolding>true</EnableCOMDATFolding> + <OptimizeReferences>true</OptimizeReferences> + <AdditionalDependencies>..\include\foobar2000sdk\foobar2000\shared\shared.lib;%(AdditionalDependencies)</AdditionalDependencies> + </Link> + </ItemDefinitionGroup> + <ItemGroup> + <ClCompile Include="libopenmpt_foobar2000.cpp" /> + </ItemGroup> + <ItemGroup> + <ProjectReference Include="..\include\foobar2000sdk\foobar2000\foobar2000_component_client\foobar2000_component_client.vcxproj"> + <Project>{71ad2674-065b-48f5-b8b0-e1f9d3892081}</Project> + </ProjectReference> + <ProjectReference Include="..\include\foobar2000sdk\foobar2000\helpers\foobar2000_sdk_helpers.vcxproj"> + <Project>{ee47764e-a202-4f85-a767-abdab4aff35f}</Project> + </ProjectReference> + <ProjectReference Include="..\include\foobar2000sdk\foobar2000\SDK\foobar2000_SDK.vcxproj"> + <Project>{e8091321-d79d-4575-86ef-064ea1a4a20d}</Project> + </ProjectReference> + <ProjectReference Include="..\include\foobar2000sdk\pfc\pfc.vcxproj"> + <Project>{ebfffb4e-261d-44d3-b89c-957b31a0bf9c}</Project> + </ProjectReference> + <ProjectReference Include="..\include\zlib\contrib\vstudio\vc10\zlibstat.vcxproj"> + <Project>{745dec58-ebb3-47a9-a9b8-4c6627c01bf8}</Project> + </ProjectReference> + <ProjectReference Include="libopenmpt.vcxproj"> + <Project>{812a654d-99be-4d13-b97f-86332ad3e363}</Project> + </ProjectReference> + </ItemGroup> + <Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" /> + <ImportGroup Label="ExtensionTargets"> + </ImportGroup> +</Project> \ No newline at end of file Added: trunk/OpenMPT/libopenmpt/libopenmpt_foobar2000.vcxproj.filters =================================================================== --- trunk/OpenMPT/libopenmpt/libopenmpt_foobar2000.vcxproj.filters (rev 0) +++ trunk/OpenMPT/libopenmpt/libopenmpt_foobar2000.vcxproj.filters 2013-05-11 14:53:38 UTC (rev 2015) @@ -0,0 +1,22 @@ +<?xml version="1.0" encoding="utf-8"?> +<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003"> + <ItemGroup> + <Filter Include="Source Files"> + <UniqueIdentifier>{4FC737F1-C7A5-4376-A066-2A32D752A2FF}</UniqueIdentifier> + <Extensions>cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx</Extensions> + </Filter> + <Filter Include="Header Files"> + <UniqueIdentifier>{93995380-89BD-4b04-88EB-625FBE52EBFB}</UniqueIdentifier> + <Extensions>h;hpp;hxx;hm;inl;inc;xsd</Extensions> + </Filter> + <Filter Include="Resource Files"> + <UniqueIdentifier>{67DA6AB6-F800-4c08-8B7A-83BB121AAD01}</UniqueIdentifier> + <Extensions>rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav;mfcribbon-ms</Extensions> + </Filter> + </ItemGroup> + <ItemGroup> + <ClCompile Include="libopenmpt_foobar2000.cpp"> + <Filter>Source Files</Filter> + </ClCompile> + </ItemGroup> +</Project> \ No newline at end of file Modified: trunk/OpenMPT/soundlib/Tables.cpp =================================================================== --- trunk/OpenMPT/soundlib/Tables.cpp 2013-05-11 14:51:10 UTC (rev 2014) +++ trunk/OpenMPT/soundlib/Tables.cpp 2013-05-11 14:53:38 UTC (rev 2015) @@ -53,6 +53,7 @@ char *extension; // "mod" }; +// remember to also update libopenmpt/libopenmpt_foobar2000.cpp (all other plugins read these dynamically) static const ModFormatInfo modFormatInfo[] = { { MOD_TYPE_MOD, "ProTracker", "mod" }, This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |