mirror of
https://github.com/vgmstream/vgmstream.git
synced 2024-11-30 17:24:31 +01:00
113 lines
4.8 KiB
C
113 lines
4.8 KiB
C
|
// XMPlay input plugin header
|
||
|
// new plugins can be submitted to plugins@xmplay.com
|
||
|
|
||
|
#pragma once
|
||
|
|
||
|
#include "xmpfunc.h"
|
||
|
|
||
|
#ifdef __cplusplus
|
||
|
extern "C" {
|
||
|
#endif
|
||
|
|
||
|
#ifndef XMPIN_FACE
|
||
|
#define XMPIN_FACE 4 // "face"
|
||
|
#endif
|
||
|
|
||
|
#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)
|
||
|
#define XMPIN_FLAG_LOOP 8 // custom looping
|
||
|
#define XMPIN_FLAG_TAIL 16 // output tail (decay/fadeout)
|
||
|
#define XMPIN_FLAG_CONFIG 64 // can save config
|
||
|
#define XMPIN_FLAG_LOOPSOUND 128 // allow "auto-loop any track ending with sound" with XMPIN_FLAG_LOOP
|
||
|
|
||
|
// SetPosition special positions
|
||
|
#define XMPIN_POS_LOOP -1 // loop
|
||
|
#define XMPIN_POS_AUTOLOOP -2 // auto-loop
|
||
|
#define XMPIN_POS_TAIL -3 // output tail (decay/fadeout)
|
||
|
#define XMPIN_POS_SUBSONG 0x80000000 // subsong (LOWORD=subsong)
|
||
|
#define XMPIN_POS_SUBSONG1 0x40000000 // single subsong mode (don't show info on other subsongs), used with XMPIN_POS_SUBSONG
|
||
|
|
||
|
// VisRender/DC flags
|
||
|
#define XMPIN_VIS_INIT 1 // DC/buffer is uninitialized
|
||
|
#define XMPIN_VIS_FULL 2 // fullscreen
|
||
|
#define XMPIN_VIS_MAIN 4 // main window
|
||
|
|
||
|
// GetFileInfo return flags
|
||
|
#define XMPIN_INFO_NOSUBTAGS 0x10000 // subsongs don't have their own tags
|
||
|
|
||
|
typedef struct {
|
||
|
DWORD flags; // XMPIN_FLAG_xxx
|
||
|
const char *name; // plugin name
|
||
|
const 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)(const char *filename, XMPFILE file); // verify file
|
||
|
#if XMPIN_FACE==4
|
||
|
DWORD (WINAPI *GetFileInfo)(const char *filename, XMPFILE file, float **length, char **tags); // get track info
|
||
|
// only the following tags are currently used by XMPlay (rest is ignored): title, artist, album, date, track/tracknumber, genre, comment, filetype, cuesheet
|
||
|
#else
|
||
|
BOOL (WINAPI *GetFileInfo)(const char *filename, XMPFILE file, float *length, char *tags[8]); // get track info
|
||
|
#endif
|
||
|
|
||
|
// playback stuff
|
||
|
DWORD (WINAPI *Open)(const char *filename, XMPFILE file); // open a file
|
||
|
void (WINAPI *Close)(); // close file
|
||
|
void *reserved1;
|
||
|
void (WINAPI *SetFormat)(XMPFORMAT *form); // set sample format
|
||
|
|
||
|
#if XMPIN_FACE==4
|
||
|
char *(WINAPI *GetTags)(); // get tags, return NULL to delay (OPTIONAL)
|
||
|
// XMPlay uses the same tags as with GetFileInfo, but other tags are available via XMPFUNC_MISC:GetTag
|
||
|
#else
|
||
|
BOOL (WINAPI *GetTags)(char *tags[8]); // get title elements, return TRUE to delay (OPTIONAL)
|
||
|
#endif
|
||
|
void (WINAPI *GetInfoText)(char *format, char *length); // get main panel info text
|
||
|
void (WINAPI *GetGeneralInfo)(char *buf); // get General info window text (buf is ~40K)
|
||
|
void (WINAPI *GetMessage)(char *buf); // get Message info text (OPTIONAL)
|
||
|
double (WINAPI *SetPosition)(DWORD pos); // seek
|
||
|
double (WINAPI *GetGranularity)(); // seeking granularity (OPTIONAL, default=milliseconds)
|
||
|
DWORD (WINAPI *GetBuffering)(); // get buffering progress (OPTIONAL)
|
||
|
DWORD (WINAPI *Process)(float *buf, DWORD count); // decode some sample data
|
||
|
BOOL (WINAPI *WriteFile)(const char *filename); // write file to disk (OPTIONAL)
|
||
|
|
||
|
void (WINAPI *GetSamples)(char *buf); // get Samples info text (OPTIONAL)
|
||
|
DWORD (WINAPI *GetSubSongs)(float *length); // get number (and total length) of sub-songs (OPTIONAL)
|
||
|
#if XMPIN_FACE==4
|
||
|
void *reserved3;
|
||
|
#else
|
||
|
char *(WINAPI *GetCues)(); // get CUE sheet (OPTIONAL)
|
||
|
#endif
|
||
|
|
||
|
float (WINAPI *GetDownloaded)(); // get download progress (OPTIONAL)
|
||
|
|
||
|
// vis stuff (all OPTIONAL)
|
||
|
const char *visname; // visualisation name
|
||
|
BOOL (WINAPI *VisOpen)(DWORD colors[3]); // initialize vis
|
||
|
void (WINAPI *VisClose)(); // close vis
|
||
|
void (WINAPI *VisSize)(HDC dc, SIZE *size); // get ideal vis dimensions
|
||
|
BOOL (WINAPI *VisRender)(DWORD *buf, SIZE size, DWORD flags); // render vis
|
||
|
BOOL (WINAPI *VisRenderDC)(HDC dc, SIZE size, DWORD flags); // render vis
|
||
|
void (WINAPI *VisButton)(DWORD x, DWORD y); // mouse click in vis
|
||
|
|
||
|
void *reserved2;
|
||
|
|
||
|
DWORD (WINAPI *GetConfig)(void *config); // get config (return size of config data) (OPTIONAL)
|
||
|
void (WINAPI *SetConfig)(void *config, DWORD size); // apply config (OPTIONAL)
|
||
|
} XMPIN;
|
||
|
|
||
|
#define XMPFUNC_IN_FACE 11
|
||
|
|
||
|
typedef struct {
|
||
|
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, 2=peak)
|
||
|
BOOL (WINAPI *UpdateTitle)(const char *track); // set track title (NULL=refresh tags/title)
|
||
|
// version 3.8
|
||
|
BOOL (WINAPI *GetLooping)(); // looping is enabled? (TRUE=stop processing at loop point, FALSE=continue to end)
|
||
|
} XMPFUNC_IN;
|
||
|
|
||
|
#ifdef __cplusplus
|
||
|
}
|
||
|
#endif
|