diff options
-rw-r--r-- | backends/morphos/morphos.cpp | 1 | ||||
-rw-r--r-- | backends/morphos/morphos.h | 13 | ||||
-rw-r--r-- | backends/morphos/morphos_sound.cpp | 41 | ||||
-rw-r--r-- | backends/morphos/morphos_start.cpp | 1 | ||||
-rw-r--r-- | scumm/imuse.cpp | 46 | ||||
-rw-r--r-- | scumm/scummvm.cpp | 1 | ||||
-rw-r--r-- | sound/mididrv.cpp | 12 |
7 files changed, 43 insertions, 72 deletions
diff --git a/backends/morphos/morphos.cpp b/backends/morphos/morphos.cpp index a949cbfd2f..0c2e9a7fce 100644 --- a/backends/morphos/morphos.cpp +++ b/backends/morphos/morphos.cpp @@ -50,6 +50,7 @@ #include <time.h> #include "morphos.h" +#include "morphos_sound.h" #include "morphos_scaler.h" static TagItem FindCDTags[] = { { CDFA_VolumeName, 0 }, diff --git a/backends/morphos/morphos.h b/backends/morphos/morphos.h index 75d2c79f7b..d89c2e7371 100644 --- a/backends/morphos/morphos.h +++ b/backends/morphos/morphos.h @@ -24,8 +24,6 @@ #ifndef MORPHOS_MORPHOS_H #define MORPHOS_MORPHOS_H -#include <exec/semaphores.h> -#include <devices/amidi.h> #include <graphics/regions.h> #include <intuition/intuition.h> #include <intuition/screens.h> @@ -187,20 +185,9 @@ class OSystem_MorphOS : public OSystem int GameID; }; -int morphos_sound_thread(OSystem_MorphOS *syst, ULONG SampleType); -bool init_morphos_music(ULONG MidiUnit); -void exit_morphos_music(); - int morphos_main(int argc, char *argv[]); extern OSystem_MorphOS *TheSystem; -extern SignalSemaphore ScummMusicThreadRunning; -extern SignalSemaphore ScummSoundThreadRunning; - -extern STRPTR ScummMusicDriver; -extern LONG ScummMidiUnit; -extern IOMidiRequest *ScummMidiRequest; -extern timerequest *MusicTimerIORequest; #endif diff --git a/backends/morphos/morphos_sound.cpp b/backends/morphos/morphos_sound.cpp index f2df81d789..fd908a31b9 100644 --- a/backends/morphos/morphos_sound.cpp +++ b/backends/morphos/morphos_sound.cpp @@ -35,6 +35,7 @@ #include <proto/ahi.h> #include "morphos.h" +#include "morphos_sound.h" #define AHI_BUF_SIZE (8*1024) @@ -51,8 +52,8 @@ static char *ahiBuf[2] = { NULL, NULL }; static MsgPort *ScummMidiPort = NULL; IOMidiRequest *ScummMidiRequest = NULL; -static MsgPort *MusicTimerMsgPort = NULL; - timerequest *MusicTimerIORequest = NULL; + + Device *AMidiBase = NULL; bool init_morphos_music(ULONG MidiUnit) { @@ -73,6 +74,7 @@ bool init_morphos_music(ULONG MidiUnit) ScummMidiRequest = NULL; ScummMidiPort = NULL; } + AMidiBase = ScummMidiRequest->amr_Std.io_Device; } else { @@ -88,33 +90,6 @@ bool init_morphos_music(ULONG MidiUnit) } } - MusicTimerMsgPort = CreateMsgPort(); - if (MusicTimerMsgPort) - { - MusicTimerIORequest = (timerequest *) CreateIORequest(MusicTimerMsgPort, sizeof (timerequest)); - if (MusicTimerIORequest) - { - if (OpenDevice("timer.device", UNIT_MICROHZ, (IORequest *) MusicTimerIORequest, 0)) - { - DeleteIORequest((IORequest *) MusicTimerIORequest); - DeleteMsgPort(MusicTimerMsgPort); - MusicTimerIORequest = NULL; - MusicTimerMsgPort = NULL; - } - } - else - { - DeleteMsgPort(MusicTimerMsgPort); - MusicTimerMsgPort = NULL; - } - } - - if (!MusicTimerIORequest) - { - warning("Could not open timer device - music will not play"); - return false; - } - return true; } @@ -126,13 +101,7 @@ void exit_morphos_music() CloseDevice((IORequest *) ScummMidiRequest); DeleteIORequest((IORequest *) ScummMidiRequest); DeleteMsgPort(ScummMidiPort); - } - - if (MusicTimerIORequest) - { - CloseDevice((IORequest *) MusicTimerIORequest); - DeleteIORequest((IORequest *) MusicTimerIORequest); - DeleteMsgPort(MusicTimerMsgPort); + AMidiBase = NULL; } } diff --git a/backends/morphos/morphos_start.cpp b/backends/morphos/morphos_start.cpp index d3305cbe14..16cd76bf00 100644 --- a/backends/morphos/morphos_start.cpp +++ b/backends/morphos/morphos_start.cpp @@ -38,6 +38,7 @@ #include "scumm.h" #include "morphos.h" #include "morphos_scaler.h" +#include "morphos_sound.h" extern "C" WBStartup *_WBenchMsg; diff --git a/scumm/imuse.cpp b/scumm/imuse.cpp index e2ef496bd3..826c4127b2 100644 --- a/scumm/imuse.cpp +++ b/scumm/imuse.cpp @@ -298,6 +298,7 @@ public: virtual uint32 get_base_tempo() = 0; virtual byte get_hardware_type() = 0; virtual void init(IMuseInternal *eng, OSystem *syst) = 0; + virtual void uninit() = 0; virtual void update_pris() = 0; virtual void set_instrument(uint slot, byte *instr) = 0; virtual void part_set_instrument(Part *part, Instrument * instr) = 0; @@ -408,7 +409,7 @@ public: IMuseDriver *driver() { return _driver; } - + int initialize(OSystem *syst, MidiDriver *midi, SoundMixer *mixer); /* Public interface */ @@ -553,7 +554,7 @@ public: IMuseAdlib(SoundMixer *mixer) { _mixer = mixer; } - void uninit(); + void uninit() {} void init(IMuseInternal *eng, OSystem *syst); void update_pris() { } @@ -1297,6 +1298,11 @@ int IMuseInternal::get_master_volume() int IMuseInternal::terminate() { + if (_driver) { + _driver->uninit(); + delete _driver; + _driver = NULL; + } return 0; /* not implemented */ } @@ -4278,30 +4284,31 @@ int IMuseGM::midi_driver_thread(void *param) } } #else -#include <exec/semaphores.h> #include <proto/exec.h> #include <proto/dos.h> -#include "../morphos/morphos.h" +#include "morphos.h" +#include "morphos_sound.h" int IMuseGM::midi_driver_thread(void *param) { IMuseGM *mid = (IMuseGM *) param; int old_time, cur_time; - bool initialized; + MsgPort *music_timer_port = NULL; + timerequest *music_timer_request = NULL; ObtainSemaphore(&ScummMusicThreadRunning); - initialized = init_morphos_music(0); - - old_time = mid->_system->get_msecs(); - - if (!initialized) + if (!OSystem_MorphOS::OpenATimer(&music_timer_port, (IORequest **) &music_timer_request, UNIT_MICROHZ, false)) { + warning("Could not open a timer - music will not play"); Wait(SIGBREAKF_CTRL_C); + } else { + old_time = mid->_system->get_msecs(); + for (;;) { - MusicTimerIORequest->tr_time.tv_micro = 10000; - MusicTimerIORequest->tr_node.io_Command = TR_ADDREQUEST; - MusicTimerIORequest->tr_time.tv_secs = 0; - DoIO((struct IORequest *)MusicTimerIORequest); + music_timer_request->tr_node.io_Command = TR_ADDREQUEST; + music_timer_request->tr_time.tv_secs = 0; + music_timer_request->tr_time.tv_micro = 10000; + DoIO((struct IORequest *)music_timer_request); if (CheckSignal(SIGBREAKF_CTRL_C)) break; @@ -4314,8 +4321,6 @@ int IMuseGM::midi_driver_thread(void *param) } } - exit_morphos_music(); - ReleaseSemaphore(&ScummMusicThreadRunning); RemTask(NULL); return 0; @@ -4342,6 +4347,11 @@ void IMuseGM::init(IMuseInternal *eng, OSystem *syst) mc->_chan = i; } +void IMuseGM::uninit() +{ + _md->close(); +} + void IMuseGM::update_pris() { Part *part, *hipart; @@ -4493,8 +4503,10 @@ IMuse::IMuse():_imuse(NULL) IMuse::~IMuse() { - if (_imuse) + if (_imuse) { + _imuse->terminate(); delete _imuse; + } } void IMuse::on_timer() diff --git a/scumm/scummvm.cpp b/scumm/scummvm.cpp index 845a8fb4d3..314ab67b90 100644 --- a/scumm/scummvm.cpp +++ b/scumm/scummvm.cpp @@ -154,6 +154,7 @@ Scumm::~Scumm () delete _bundle; delete _timer; delete _sound; + delete _imuse; } void Scumm::scummInit() diff --git a/sound/mididrv.cpp b/sound/mididrv.cpp index c261395c39..c7825673a5 100644 --- a/sound/mididrv.cpp +++ b/sound/mididrv.cpp @@ -292,8 +292,9 @@ MidiDriver *MidiDriver_WIN_create() #include <clib/alib_protos.h> #include <proto/exec.h> +#include <proto/amidi.h> -extern struct IOMidiRequest *ScummMidiRequest; +#include "morphos_sound.h" /* MorphOS MIDI driver */ class MidiDriver_AMIDI:public MidiDriver { @@ -319,11 +320,13 @@ void MidiDriver_AMIDI::set_stream_callback(void *param, StreamCallback *sc) int MidiDriver_AMIDI::open(int mode) { _mode = mode; + init_morphos_music(0); return 0; } void MidiDriver_AMIDI::close() { + exit_morphos_music(); _mode = 0; } @@ -333,11 +336,8 @@ void MidiDriver_AMIDI::send(uint32 b) error("MidiDriver_AMIDI:send called but driver is not in simple mode"); if (ScummMidiRequest) { - ULONG midi_data = b; // you never know about an int's size ;-) - ScummMidiRequest->amr_Std.io_Command = CMD_WRITE; - ScummMidiRequest->amr_Std.io_Data = &midi_data; - ScummMidiRequest->amr_Std.io_Length = 4; - DoIO((struct IORequest *)ScummMidiRequest); + ULONG midi_data = READ_LE_UINT32(&b); + SendShortMidiMsg(ScummMidiRequest, midi_data); } } |