diff options
Diffstat (limited to 'Src/Plugins/Input/in_midi/main.h')
-rw-r--r-- | Src/Plugins/Input/in_midi/main.h | 230 |
1 files changed, 230 insertions, 0 deletions
diff --git a/Src/Plugins/Input/in_midi/main.h b/Src/Plugins/Input/in_midi/main.h new file mode 100644 index 00000000..ee73606e --- /dev/null +++ b/Src/Plugins/Input/in_midi/main.h @@ -0,0 +1,230 @@ +#ifndef STRICT +#define STRICT +#endif +#include "../Agave/Language/api_language.h" +#include <windows.h> +#include <malloc.h> + +#ifndef NOVTABLE +#define NOVTABLE _declspec(novtable) +#endif + +#include <mmsystem.h> +#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<GUID> 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;
\ No newline at end of file |