git-svn-id: https://vgmstream.svn.sourceforge.net/svnroot/vgmstream@712 51a99a44-fe44-0410-b1ba-c3e57ba2b86b

This commit is contained in:
unknownfile 2009-11-12 00:10:58 +00:00
parent 9fb2c73d4b
commit 342303d6d9
3 changed files with 437 additions and 0 deletions

155
xmp-vgmstream/DllMain.c Normal file
View File

@ -0,0 +1,155 @@
/*
** vgmstream for XMPlay
**
** 11/11/2009 - started. this is hilariously buggy and doesnt support much yet. [unknownfile]
*/
#include <windows.h>
#include <windowsx.h>
#include <commctrl.h>
#include <stdio.h>
#include <io.h>
#include <conio.h>
#include "../src/vgmstream.h"
#include "../src/util.h"
#include "xmp_in.h"
#ifndef VERSION
#define VERSION
#endif
VGMSTREAM * vgmstream = NULL;
double timestamp=0;
#define DECODE_SIZE 1024
#define APP_NAME "vgmstream plugin"
#define PLUGIN_DESCRIPTION "vgmstream plugin " VERSION " " __DATE__
void __stdcall XMPAbout() {
MessageBox(NULL,
PLUGIN_DESCRIPTION "\n"
"by hcs, FastElbja, manakoAT, and bxaimc\n\n"
"http://sourceforge.net/projects/vgmstream"
,"about in_vgmstream",MB_OK);
}
void __stdcall Stop() {
close_vgmstream(vgmstream);
}
int __stdcall XMP_CheckFile(char *filename, BYTE *buf, DWORD length) {
VGMSTREAM* fakevgmstream = init_vgmstream(filename);
int ret;
if (!fakevgmstream) ret = 0;
else { ret = 1; close_vgmstream(fakevgmstream); }
return ret;
}
int __stdcall LoadVgmStream(char *filename, XMPFILE file) {
vgmstream = init_vgmstream(filename);
if (!vgmstream) return 0;
// just loop forever till we have configuration done
return 1;
}
int __stdcall XMP_Buffer(float* buffer, UINT32 bufsize) {
int i;
// Quick way of converting to float
for (i=0;i<bufsize;i+=vgmstream->channels) {
INT16 buf[16];
render_vgmstream(buf,vgmstream->channels,vgmstream);
*(buffer + i) = buf[0];
if (vgmstream->channels == 2) *(buffer + i + 1) = buf[1];
}
return bufsize;
}
DWORD __stdcall XMP_GetFormat(DWORD *chan, DWORD *res) {
*(chan) = vgmstream->channels;
return vgmstream->sample_rate / 2;
}
void __stdcall FormatPlayWindowText(char* txt) {
strcpy(txt,"vgmstream!");
}
void __stdcall GetAdditionalFields(char* blerp) {
strcpy(blerp,"oh god how did this get here i am not good with computers\n");
}
double __stdcall GetDecodePosition() {
return timestamp;
}
// Trap functions to catch stuff we haven't implemented.
#define TRAP_FCN(id) void* __stdcall trap_##id() {\
cprintf("trap %d hit\n",id);\
return NULL;\
}
TRAP_FCN(1);
TRAP_FCN(2);
TRAP_FCN(3);
TRAP_FCN(4);
TRAP_FCN(5);
TRAP_FCN(6);
TRAP_FCN(7);
TRAP_FCN(8);
TRAP_FCN(9);
TRAP_FCN(10);
TRAP_FCN(11);
TRAP_FCN(12);
TRAP_FCN(13);
TRAP_FCN(14);
TRAP_FCN(15);
TRAP_FCN(16);
TRAP_FCN(17);
TRAP_FCN(18);
TRAP_FCN(19);
TRAP_FCN(20);
TRAP_FCN(21);
TRAP_FCN(22);
int __stdcall Call22() {
return 1; //
}
XMPIN vgmstream_intf = {
0,
"vgmstream for XMplay",
"vgmstream files\0brstm",
XMPAbout,
NULL,
XMP_CheckFile,
NULL,
LoadVgmStream,
Stop,
XMP_GetFormat,
NULL,
NULL,
FormatPlayWindowText,
GetAdditionalFields,
NULL,
NULL,
GetDecodePosition,
NULL,//trap_18,
XMP_Buffer,
NULL,
NULL,
Call22,
};
__declspec(dllexport) XMPIN* XMPIN_GetInterface(UINT32 version, void* ifproc) {
AllocConsole();
if (version != 1) return NULL;
return &vgmstream_intf;
}

View File

@ -0,0 +1,172 @@
<?xml version="1.0" encoding="Windows-1252"?>
<VisualStudioProject
ProjectType="Visual C++"
Version="9.00"
Name="xmp-vgmstream"
ProjectGUID="{49AF76F7-CBA0-4486-9DDF-51F30DF45F33}"
RootNamespace="xmpvgmstream"
TargetFrameworkVersion="196613"
>
<Platforms>
<Platform
Name="Win32"
/>
</Platforms>
<ToolFiles>
</ToolFiles>
<Configurations>
<Configuration
Name="Debug|Win32"
OutputDirectory="$(SolutionDir)$(ConfigurationName)"
IntermediateDirectory="$(ConfigurationName)"
ConfigurationType="2"
CharacterSet="2"
>
<Tool
Name="VCPreBuildEventTool"
/>
<Tool
Name="VCCustomBuildTool"
/>
<Tool
Name="VCXMLDataGeneratorTool"
/>
<Tool
Name="VCWebServiceProxyGeneratorTool"
/>
<Tool
Name="VCMIDLTool"
/>
<Tool
Name="VCCLCompilerTool"
Optimization="0"
AdditionalIncludeDirectories="../ext_includes"
MinimalRebuild="true"
BasicRuntimeChecks="3"
RuntimeLibrary="3"
WarningLevel="3"
DebugInformationFormat="4"
/>
<Tool
Name="VCManagedResourceCompilerTool"
/>
<Tool
Name="VCResourceCompilerTool"
/>
<Tool
Name="VCPreLinkEventTool"
/>
<Tool
Name="VCLinkerTool"
AdditionalDependencies="../ext_libs/libvorbis.lib ../ext_libs/libmpg123-0.lib"
GenerateDebugInformation="true"
TargetMachine="1"
/>
<Tool
Name="VCALinkTool"
/>
<Tool
Name="VCManifestTool"
/>
<Tool
Name="VCXDCMakeTool"
/>
<Tool
Name="VCBscMakeTool"
/>
<Tool
Name="VCFxCopTool"
/>
<Tool
Name="VCAppVerifierTool"
/>
<Tool
Name="VCPostBuildEventTool"
/>
</Configuration>
<Configuration
Name="Release|Win32"
OutputDirectory="$(SolutionDir)$(ConfigurationName)"
IntermediateDirectory="$(ConfigurationName)"
ConfigurationType="1"
CharacterSet="2"
WholeProgramOptimization="1"
>
<Tool
Name="VCPreBuildEventTool"
/>
<Tool
Name="VCCustomBuildTool"
/>
<Tool
Name="VCXMLDataGeneratorTool"
/>
<Tool
Name="VCWebServiceProxyGeneratorTool"
/>
<Tool
Name="VCMIDLTool"
/>
<Tool
Name="VCCLCompilerTool"
Optimization="2"
EnableIntrinsicFunctions="true"
RuntimeLibrary="2"
EnableFunctionLevelLinking="true"
WarningLevel="3"
DebugInformationFormat="3"
/>
<Tool
Name="VCManagedResourceCompilerTool"
/>
<Tool
Name="VCResourceCompilerTool"
/>
<Tool
Name="VCPreLinkEventTool"
/>
<Tool
Name="VCLinkerTool"
GenerateDebugInformation="true"
OptimizeReferences="2"
EnableCOMDATFolding="2"
TargetMachine="1"
/>
<Tool
Name="VCALinkTool"
/>
<Tool
Name="VCManifestTool"
/>
<Tool
Name="VCXDCMakeTool"
/>
<Tool
Name="VCBscMakeTool"
/>
<Tool
Name="VCFxCopTool"
/>
<Tool
Name="VCAppVerifierTool"
/>
<Tool
Name="VCPostBuildEventTool"
/>
</Configuration>
</Configurations>
<References>
</References>
<Files>
<File
RelativePath=".\DllMain.c"
>
</File>
<File
RelativePath=".\xmp_in.h"
>
</File>
</Files>
<Globals>
</Globals>
</VisualStudioProject>

110
xmp-vgmstream/xmp_in.h Normal file
View File

@ -0,0 +1,110 @@
// XMPlay input plugin header (c) 2004-2005 Ian Luck
// new plugins can be submitted to plugins@xmplay.com
#include <wtypes.h>
#ifdef __cplusplus
extern "C" {
#endif
#ifndef XMPIN_FACE
#define XMPIN_FACE 1 // "face"
#endif
typedef void *XMPFILE;
#define XMPIN_FLAG_CANSTREAM 1 // can stream files (play while downloading from the 'net)
#define XMPIN_FLAG_OWNFILE 2 // can process files without "XMPFILE" routines
#define XMPIN_FLAG_NOXMPFILE 4 // never use "XMPFILE" routines (implies XMPIN_FLAG_OWNFILE)
// Note all texts are UTF-8 on WinNT based systems, and ANSI on Win9x
#define Utf2Uni(src,slen,dst,dlen) MultiByteToWideChar(CP_UTF8,0,src,slen,dst,dlen) // convert UTF-8 to Unicode
typedef struct {
DWORD flags; // XMPIN_FLAG_xxx
char *name; // plugin name
char *exts; // supported file extensions (description\0ext1/ext2/etc...)
void (WINAPI *About)(HWND win); // (OPTIONAL)
void (WINAPI *Config)(HWND win); // present config options to user (OPTIONAL)
BOOL (WINAPI *CheckFile)(char *filename, BYTE *buf, DWORD length); // verify file
BOOL (WINAPI *GetFileInfo)(char *filename, XMPFILE file, float *length, char *tags[7]); // get track info
//tags: 0=title,1=artist,2=album,3=year,4=track,5=genre,6=comment
// playback stuff
DWORD (WINAPI *Open)(char *filename, XMPFILE file); // open a file
void (WINAPI *Close)(); // close file
DWORD (WINAPI *GetFormat)(DWORD *chan, DWORD *res); // return sample rate (OPTIONAL: mutually exclusive with SetFormat)
void (WINAPI *SetFormat)(DWORD rate, DWORD chan); // (OPTIONAL: mutually exclusive with GetFormat)
BOOL (WINAPI *GetTags)(char *tags[7]); // get title elements, return TRUE to delay (OPTIONAL)
void (WINAPI *GetInfoText)(char *format, char *length); // get main panel info text
void (WINAPI *GetGeneralInfo)(char *buf); // get General info window text
void (WINAPI *GetMessage)(char *buf); // get Message info text (OPTIONAL)
double (WINAPI *SetPosition)(DWORD pos); // seek (pos=0x800000nn=subsong nn)
double (WINAPI *GetGranularity)(); // seeking granularity
DWORD (WINAPI *GetBuffering)(); // get buffering progress (OPTIONAL)
DWORD (WINAPI *Process)(float *buf, DWORD count); // decode some sample data
BOOL (WINAPI *WriteFile)(char *filename); // write file to disk (OPTIONAL)
#if XMPIN_FACE>=1 // "face 1" additions
void (WINAPI *GetSamples)(char *buf); // get Samples info text (OPTIONAL)
DWORD (WINAPI *GetSubSongs)(float *length); // get number (and total length) of sub-songs (OPTIONAL)
#endif
} XMPIN;
#define XMPFILE_TYPE_MEMORY 0 // file in memory
#define XMPFILE_TYPE_FILE 1 // local file
#define XMPFILE_TYPE_NETFILE 2 // file on the 'net
#define XMPFILE_TYPE_NETSTREAM 3 // 'net stream (indeterminate length)
#define XMPCONFIG_NET_BUFFER 0
#define XMPCONFIG_NET_RESTRICT 1
#define XMPCONFIG_NET_RECONNECT 2
#define XMPCONFIG_NET_NOPROXY 3
#define XMPINFO_MAIN 1 // main window info area
#define XMPINFO_GENERAL 2 // General info window
#define XMPINFO_MESSAGE 4 // Message info window
#define XMPINFO_SAMPLES 8 // Samples info window
typedef struct {
struct { // file functions
DWORD (WINAPI *GetType)(XMPFILE file); // return XMPFILE_TYPE_xxx
DWORD (WINAPI *GetSize)(XMPFILE file); // file size
void *(WINAPI *GetMemory)(XMPFILE file); // memory location (XMPFILE_TYPE_MEMORY)
DWORD (WINAPI *Read)(XMPFILE file, void *buf, DWORD len); // read from file
BOOL (WINAPI *Seek)(XMPFILE file, DWORD pos); // seek in file
DWORD (WINAPI *Tell)(XMPFILE file); // get current file pos
// net-only stuff
void (WINAPI *NetSetRate)(XMPFILE file, DWORD rate); // set bitrate in bytes/sec (decides buffer size)
BOOL (WINAPI *NetIsActive)(XMPFILE file); // connection is still up?
BOOL (WINAPI *NetPreBuf)(XMPFILE file); // pre-buffer data
DWORD (WINAPI *NetAvailable)(XMPFILE file); // get amount of data ready to go
#if XMPIN_FACE>=1
// additional file opening stuff
XMPFILE (WINAPI *Open)(char *filename); // open a file (local file/archive only, no 'net)
void (WINAPI *Close)(XMPFILE file); // close an opened file
#endif
} file;
struct { // tag functions - return new strings in native form (UTF8/ANSI)
char *(WINAPI *Ansi)(char *tag, int len); // ANSI string (len=-1=null terminated)
char *(WINAPI *Unicode)(WCHAR *tag, int len); // Unicode string
char *(WINAPI *Utf8)(char *tag, int len); // UTF-8 string
} tag;
DWORD (WINAPI *GetConfig)(DWORD option); // get a config (XMPCONFIG_xxx) value
BOOL (WINAPI *CheckCancel)(); // user wants to cancel?
void (WINAPI *SetLength)(float length, BOOL seekable); // set track length (-1=unchanged) and if it's seekable
void (WINAPI *SetGain)(DWORD mode, float gain); // set replaygain (mode 0=track, 1=album)
BOOL (WINAPI *UpdateTitle)(char *track); // set track title (NULL=refresh tags/title)
#if XMPIN_FACE>=1
void (WINAPI *RefreshInfo)(DWORD mode); // refresh info displays (XMPINFO_xxx flags)
#endif
} XMPIN_FUNCS;
#ifdef __cplusplus
}
#endif