diff options
| -rw-r--r-- | main.cpp | 7 | ||||
| -rw-r--r-- | scumm.h | 3 | ||||
| -rw-r--r-- | scummvm.cpp | 2 | ||||
| -rw-r--r-- | sound/mididrv.cpp | 53 | 
4 files changed, 60 insertions, 5 deletions
| @@ -32,6 +32,9 @@ GameDetector detector;  Gui gui;  Scumm *g_scumm; +/* FIXME */ +OSystem *g_system; +SoundMixer *g_mixer;  Config * scummcfg; @@ -182,6 +185,8 @@ game settings!  		MidiDriver *midi = detector.createMidi();  		SimonState *simon = SimonState::create(system, midi); +		g_system = simon->_system; +		g_mixer = &simon->_mixer[0];  		simon->_game = detector._gameId - GID_SIMON_FIRST;  		simon->set_volume(detector._sfx_volume);  		simon->_game_path = detector._gameDataPath; @@ -190,6 +195,8 @@ game settings!  	} else {  		Scumm *scumm = Scumm::createFromDetector(&detector, system);  		g_scumm = scumm; +		g_system = scumm->_system; +		g_mixer = &scumm->_mixer[0];  		g_scumm->_sound_volume_master = 0;  		g_scumm->_sound_volume_music = detector._music_volume;  		g_scumm->_sound_volume_sfx = detector._sfx_volume; @@ -45,6 +45,9 @@ typedef void (Scumm::*OpcodeProc)();  /* Use this one from error() ONLY */  extern Scumm *g_scumm; +/* BIG HACK for MidiEmu - FIXME */ +extern OSystem *g_system; +extern SoundMixer *g_mixer;  /* System Wide Constants */  enum { diff --git a/scummvm.cpp b/scummvm.cpp index 08a851d38d..d00fa6113f 100644 --- a/scummvm.cpp +++ b/scummvm.cpp @@ -1425,6 +1425,8 @@ Scumm *Scumm::createFromDetector(GameDetector *detector, OSystem *syst)  	/* HACK !!! */  	g_scumm = scumm; +	g_system = scumm->_system; +	g_mixer = &scumm->_mixer[0];  	/* END HACK */  //	scumm->_fullScreen = detector->_fullScreen; diff --git a/sound/mididrv.cpp b/sound/mididrv.cpp index f2aa0a43f8..65dcee84ae 100644 --- a/sound/mididrv.cpp +++ b/sound/mididrv.cpp @@ -964,13 +964,14 @@ static int my_midi_fm_vol_table[128] = {  class MidiDriver_MIDIEMU : public MidiDriver {  public: -        MidiDriver_MIDIEMU(); +    MidiDriver_MIDIEMU();  	int open(int mode);  	void close();  	void send(uint32 b);  	void pause(bool pause);  	void set_stream_callback(void *param, StreamCallback *sc); - +	static int midiemu_callback_thread(void *param); +	  private:  	struct midi_channel {  		int inum; @@ -1001,9 +1002,9 @@ private:  	StreamCallback *_stream_proc;  	void *_stream_param;  	int _mode; -	FM_OPL *_opl;  	int chp[9][3];  	unsigned char myinsbank[128][11]; +	FM_OPL *_opl;  	midi_channel ch[16];  }; @@ -1035,8 +1036,10 @@ MidiDriver_MIDIEMU::MidiDriver_MIDIEMU(){  }  int MidiDriver_MIDIEMU::open(int mode) { -	_opl = OPLCreate(OPL_TYPE_YM3812, 3579545, g_scumm->_system->property(OSystem::PROP_GET_SAMPLE_RATE,0)); -	g_scumm->_mixer->setup_premix((void*) this, premix_proc); +	_opl = OPLCreate(OPL_TYPE_YM3812, 3579545, g_system->property(OSystem::PROP_GET_SAMPLE_RATE,0)); +	g_mixer->setup_premix((void*) this, premix_proc); +	if (_stream_proc) +		g_system->create_thread(midiemu_callback_thread, this);  	return 0;  } @@ -1242,6 +1245,46 @@ void MidiDriver_MIDIEMU::pause(bool pause) {  	}  } +#define NUMBER_MIDI_EVENTS 64 + +int MidiDriver_MIDIEMU::midiemu_callback_thread(void *param) { +	MidiDriver_MIDIEMU *driver = (MidiDriver_MIDIEMU*) param; +	MidiEvent my_evs[NUMBER_MIDI_EVENTS]; +	bool need_midi_data = true; + +	for (;;) { +		int number; +		int i; + +		if (need_midi_data) { +			number = driver->_stream_proc(driver->_stream_param, my_evs, NUMBER_MIDI_EVENTS); +			if (!number) { +				// No MIDI data available for the moment +				g_system->delay_msecs(10); +				continue; +			} +			need_midi_data = false; +		} + +		for (i=0; i<number; i++) { +			uint32 event; + +			event = my_evs[i].event; +			if ((event>>24) == ME_TEMPO) { +				event = (MEVT_TEMPO << 24) | (event & 0xFFFFFF); +			} +			driver->send(event);			 +			if (my_evs[i].delta) { +				g_system->delay_msecs(my_evs[i].delta); +			} +		} + +		need_midi_data = true; +	} + +	return 0; +} +  void MidiDriver_MIDIEMU::set_stream_callback(void *param, StreamCallback *sc) {  	_stream_param = param;  	_stream_proc = sc; | 
