#ifndef STRICT #define STRICT #endif #include "../Agave/Language/api_language.h" #include #include #ifndef NOVTABLE #define NOVTABLE _declspec(novtable) #endif #include #include "core_api.h" #include "../pfc/string_unicode.h" #include "locale.h" #define VER L"3.57" #include "utils.h" //#define USE_LOG #ifdef USE_LOG void log_write(char*); void log_start(); void log_quit(); #else #define log_write(X) #define log_start() #define log_quit() #endif class CStream; struct CTempoMap; struct CSysexMap; class player_base; class NOVTABLE MIDI_device { friend class MIDI_driver; private: MIDI_device * next; MIDI_driver * driver; string_w dev_name,dev_info; protected: void set_name(const wchar_t * src) {dev_name=src;} void set_info(const wchar_t * src) {dev_info=src;} public: //override me virtual player_base * create()=0; virtual GUID get_guid()=0; virtual ~MIDI_device() {}; virtual bool is_default() {return 0;} virtual bool has_output() {return 0;} virtual bool has_dls() {return 0;} virtual bool has_freq() {return 0;} virtual bool volctrl_happy() {return 0;} const wchar_t * get_name() {return dev_name;} const wchar_t * get_info() {return dev_info;} MIDI_driver * get_driver() {return driver;} }; class NOVTABLE MIDI_driver//ONLY for static objects !!!!! { private: static MIDI_driver * driver_list; MIDI_driver * next; MIDI_device * device_list; bool inited; void init() {if (!inited) {do_init();inited=1;};} void deinit() {if (inited) {do_deinit();reset_devices();inited=0;};} protected: MIDI_driver(); ~MIDI_driver(); void reset_devices(); void add_device(MIDI_device * dev);//call this to add new device //override me virtual void do_init() {}; virtual void do_deinit() {} public: static MIDI_driver * driver_enumerate(int n); static int driver_count(); MIDI_device * device_enumerate(int n); int device_count(); static MIDI_device * find_device(GUID guid_driver,GUID guid_device); static MIDI_driver * find_driver(GUID guid_driver); static MIDI_device * find_device_default(); static void shutdown(); //override me virtual const wchar_t * get_name()=0; virtual GUID get_guid()=0; virtual bool is_default() {return 0;} }; #include "midifile.h" class NOVTABLE player_base { public: virtual ~player_base() {} virtual int gettime()=0; virtual int settime(int)=0; virtual void pause()=0; virtual void unpause()=0; virtual int setvol(int) {return 0;}; virtual int setpan(int) {return 0;}; }; class MIDI_core { public: static int Init(); static int UsesOutput() {return use_out;} static int OpenFile(MIDI_file * file); static void Close(); static int GetSamples(void *sample_buffer, int bytes, char *killswitch); static void GetPCM(int * srate,int * nch,int * bps) {*srate=format_srate;*nch=format_nch;*bps=format_bps;} static int SetPosition(int); static void Pause(int pause); static int GetPosition(void); static int GetLength(void); static void Eof(); static int SetVolume(int volume); static int SetPan(int pan); //setvolune/setpan safe to call at any moment static int player_getVol() {return volume;} static int player_getPan() {return pan;} static inline void player_setSource(CStream *s) {data_src=s;} static void MM_error(DWORD code); static inline MIDI_file * getFile() {return theFile;} static inline MIDI_device * getDevice() {return device;} static inline bool HavePCM() {return !!data_src;} static inline bool HavePlayer() {return !!plr;} static int IsOurFile(const char *fn); static void GlobalInit(); static void GlobalQuit(); static int Config(HWND wnd); static void WriteConfig(); static int FileTypes_GetNum(); static const char * FileTypes_GetExtension(int); static char * FileTypes_GetDescription(int); private: static BOOL CALLBACK KarProc(HWND wnd,UINT msg,WPARAM wp,LPARAM lp); static void update_vol(); static bool use_out,use_smp; static MIDI_file* theFile; static CStream* data_src; static player_base* plr; static int format_srate,format_nch,format_bps; static int volume,pan; static bool eof; static UINT volmod; static UINT mix_dev,mix_idx; static HWND kwnd; static KAR_ENTRY *kmap; static UINT kmap_size,kmap_ptr; static char * kmap_data; static critical_section sync; static MIDI_device * device; }; namespace MIDI_callback //per-winamp implementations { HWND GetMainWindow(); HINSTANCE GetInstance(); void NotifyEOF(); void Error(const char *); void Idle(int ms=0); }; //#pragma warning(disable:4800) void get_temp_file(char* fn); extern cfg_int cfg_hardware_reset; extern cfg_int cfg_smp,cfg_reverb,cfg_chorus,cfg_nosysex; extern cfg_int cfg_sampout,cfg_dm_imm; extern cfg_int cfg_loop_type,cfg_loop_count,cfg_loop_infinite; extern cfg_int cfg_wavein_dev,cfg_wavein_sr,cfg_wavein_ch,cfg_wavein_bps,cfg_wavein_src; extern cfg_int cfg_ctrl_x,cfg_ctrl_y; extern cfg_int cfg_ext_mask; extern cfg_string cfg_extra_exts; extern cfg_int cfg_volmode; extern cfg_int cfg_recover_tracks; extern cfg_int cfg_quick_seek; extern cfg_int cfg_rmi_def; extern cfg_int cfg_logvol; extern cfg_struct_t cfg_driver,cfg_device; extern cfg_int cfg_playback_mode; extern cfg_int cfg_eof_delay; extern cfg_int cfg_bugged; extern cfg_int cfg_freq; extern cfg_int cfg_cur_tab; enum{BUGGED_BLAH=0x10}; extern sysex_table cfg_sysex_table; void ReleaseObject(IUnknown* o); #include "in2.h" extern In_Module mod;