shithub: duke3d

ref: 09ba7616f3ba9bf367aab25731191b96678ea492
dir: /Game/src/midi/win_midiout.h/

View raw version
/*
Copyright (C) 2000, 2001, 2002  Ryan Nunn

This program is free software; you can redistribute it and/or
modify it under the terms of the GNU General Public License
as published by the Free Software Foundation; either version 2
of the License, or (at your option) any later version.

This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
GNU General Public License for more details.

You should have received a copy of the GNU General Public License
aint32_t with this program; if not, write to the Free Software
Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
*/

#ifndef WIN_MIDIOUT_H
#define WIN_MIDIOUT_H



#if (__GNUG__ >= 2) && (!defined WIN32)
#  pragma interface
#endif

#ifdef WIN32

#ifndef WIN32_LEAN_AND_MEAN
#define WIN32_LEAN_AND_MEAN
#endif

// These will prevent inclusion of mmsystem sections
#define MMNODRV         // Installable driver support
#define MMNOSOUND       // Sound support
#define MMNOWAVE        // Waveform support
#define MMNOAUX         // Auxiliary audio support
#define MMNOMIXER       // Mixer support
#define MMNOTIMER       // Timer support
#define MMNOJOY         // Joystick support
#define MMNOMCI         // MCI support
#define MMNOMMIO        // Multimedia file I/O support

#include <windows.h>
#include <mmsystem.h>
#include "xmidi.h"

#ifdef _WIN32
   #include "../../Engine/src/windows/inttypes.h"
   #define inline
#else
   #include <inttypes.h>
#endif

class	Windows_MidiOut
{
public:
	virtual void		start_track(XMIDIEventList *, bool repeat);
	virtual void		start_sfx(XMIDIEventList *);
	virtual void		stop_track(void);
	virtual void		stop_sfx(void);
	virtual bool		is_playing(void);
	virtual const char 	*copyright(void);

	// PSMDEX - Pentagram Streaming Midi Driver Extensions
	virtual int			max_streams();
	virtual void		start_stream(int str_num, XMIDIEventList *, bool repeat, bool activate, int vol);
	virtual void		activate_stream(int str_num);
	virtual void		stop_stream(int str_num);
	virtual void		set_volume(int str_num, int level);
	virtual bool		is_playing(int str_num);
	virtual int			get_active();

	Windows_MidiOut();
	virtual ~Windows_MidiOut();

//private:

	struct mid_data {
		XMIDIEventList	*list;
		bool			repeat;
	};

	static const unsigned short	centre_value;
	static const uint8_t 	fine_value;
	static const uint8_t 	coarse_value;
	static const unsigned short	combined_value;

	signed int	dev_num;
	HMIDIOUT	midi_port;
	
	HANDLE	 	*thread_handle;
	DWORD		thread_id;

	// Thread communicatoins
	LONG		is_available;
	LONG		playing;
	LONG		s_playing;
	LONG		thread_com;
	LONG		sfx_com;

	LONG		new_volume;
	LONG		volumes[16];
	LONG		vol_multi;

	mid_data *thread_data;
	mid_data *sfx_data;

	mid_data data;
	mid_data sdata;

	// Methods
	static DWORD __stdcall thread_start(void *data);
	void init_device();
	DWORD thread_main();
	void thread_play ();
	void reset_channel (int i);

	// Microsecond Clock
	uint32_t start;
	uint32_t sfx_start;

	inline void wmoInitClock ()
	{ start = GetTickCount()*6; }

	inline void wmoAddOffset (uint32_t offset)
	{ start += offset; }

	inline uint32_t wmoGetTime ()
	{ return GetTickCount()*6 - start; }

	inline uint32_t wmoGetStart ()
	{ return start; }

	inline uint32_t wmoGetRealTime ()
	{ return GetTickCount()*6; }

	inline void wmoInitSFXClock ()
	{ sfx_start = GetTickCount()*6; }

	inline void wmoAddSFXOffset (uint32_t offset)
	{ sfx_start += offset; }

	inline uint32_t wmoGetSFXTime ()
	{ return GetTickCount()*6 - sfx_start; }

	inline uint32_t wmoGetSFXStart ()
	{ return sfx_start; }
};

#endif //WIN32

extern "C"
{
    int get_MusicDevice();
}

#endif //WIN_MIDIOUT_H