diff options
Diffstat (limited to 'morphos/morphos_sound.cpp')
| -rw-r--r-- | morphos/morphos_sound.cpp | 284 |
1 files changed, 0 insertions, 284 deletions
diff --git a/morphos/morphos_sound.cpp b/morphos/morphos_sound.cpp deleted file mode 100644 index 0585b8708b..0000000000 --- a/morphos/morphos_sound.cpp +++ /dev/null @@ -1,284 +0,0 @@ -/* ScummVM - Scumm Interpreter - * Copyright (C) 2002 Rüdiger Hanke - * - * 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 - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. - * - * MorphOS sound support - * - * $Header$ - * - */ - -#include "stdafx.h" -#include "scumm.h" - -#include <dos/dos.h> -#include <exec/memory.h> -#include <devices/ahi.h> -#include <devices/amidi.h> - -#include <clib/alib_protos.h> -#include <proto/exec.h> -#include <proto/dos.h> -#include <proto/ahi.h> - -#include "morphos.h" - -#define AHI_BUF_SIZE (8*1024) - -SignalSemaphore ScummMusicThreadRunning; -SignalSemaphore ScummSoundThreadRunning; - -static MsgPort *ahiPort = NULL; -static AHIRequest *ahiReq[2] = { NULL, NULL }; -static UWORD ahiCurBuf = 0; -static bool ahiReqSent[2] = { false, false }; -static BYTE ahiDevice = -1; - UBYTE ahiUnit = AHI_DEFAULT_UNIT; -static char *ahiBuf[2] = { NULL, NULL }; - -static MsgPort *ScummMidiPort = NULL; - IOMidiRequest *ScummMidiRequest = NULL; -static MsgPort *MusicTimerMsgPort = NULL; - timerequest *MusicTimerIORequest = NULL; - -bool init_morphos_music(ULONG MidiUnit) -{ - if (ScummMusicDriver && !stricmp(ScummMusicDriver, "-eamidi")) // just as ugly as the line below ... - { - MidiUnit = ScummMidiUnit; // Ugly fix, but ... - ScummMidiPort = CreateMsgPort(); - if (ScummMidiPort) - { - ScummMidiRequest = (IOMidiRequest *) CreateIORequest(ScummMidiPort, sizeof (IOMidiRequest)); - if (ScummMidiRequest) - { - ScummMidiRequest->amr_Version = 2; - if (OpenDevice("amidi.device", MidiUnit, (IORequest *) ScummMidiRequest, AMIDIF_MIDISERVER)) - { - DeleteIORequest((IORequest *) ScummMidiRequest); - DeleteMsgPort(ScummMidiPort); - ScummMidiRequest = NULL; - ScummMidiPort = NULL; - } - } - else - { - DeleteMsgPort(ScummMidiPort); - ScummMidiPort = NULL; - } - } - - if (!ScummMidiRequest) - { - warning("Could not open AMidi - music will not play"); - return false; - } - } - - 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; -} - - -void exit_morphos_music() -{ - if (ScummMidiRequest) - { - CloseDevice((IORequest *) ScummMidiRequest); - DeleteIORequest((IORequest *) ScummMidiRequest); - DeleteMsgPort(ScummMidiPort); - } - - if (MusicTimerIORequest) - { - CloseDevice((IORequest *) MusicTimerIORequest); - DeleteIORequest((IORequest *) MusicTimerIORequest); - DeleteMsgPort(MusicTimerMsgPort); - } -} - - -static bool init_morphos_sound() -{ - if (!(ahiPort = CreateMsgPort())) - return false; - - if (!(ahiReq[0] = (AHIRequest *) CreateIORequest(ahiPort, sizeof (AHIRequest)))) - { - DeleteMsgPort(ahiPort); - ahiPort = NULL; - return false; - } - - if (!(ahiReq[1] = (AHIRequest *) AllocVec(sizeof (AHIRequest), MEMF_PUBLIC))) - { - DeleteIORequest(ahiReq[0]); - DeleteMsgPort(ahiPort); - ahiReq[0] = NULL; - ahiPort = NULL; - return false; - } - - if (!(ahiBuf[0] = (char *) AllocVec(2*AHI_BUF_SIZE, MEMF_PUBLIC))) - { - FreeVec(ahiReq[1]); - DeleteIORequest(ahiReq[0]); - DeleteMsgPort(ahiPort); - ahiReq[0] = NULL; - ahiReq[1] = NULL; - ahiPort = NULL; - return false; - } - ahiBuf[1] = &ahiBuf[0][AHI_BUF_SIZE]; - - ahiReq[0]->ahir_Version = 4; - if (ahiDevice = OpenDevice(AHINAME, 0, (IORequest *) ahiReq[0], 0)) - { - FreeVec(ahiBuf[0]); - FreeVec(ahiReq[1]); - DeleteIORequest(ahiReq[0]); - DeleteMsgPort(ahiPort); - ahiBuf[0] = NULL; - ahiReq[0] = NULL; - ahiReq[1] = NULL; - ahiPort = NULL; - return false; - } - - CopyMem(ahiReq[0], ahiReq[1], sizeof (AHIRequest)); - - ahiCurBuf = 0; - ahiReqSent[0] = FALSE; - ahiReqSent[1] = FALSE; - - return true; -} - - -static void exit_morphos_sound() -{ - if (ahiReq[1]) - FreeVec(ahiReq[1]); - - if (ahiReq[0]) - { - CloseDevice((IORequest *) ahiReq[0]); - DeleteIORequest(ahiReq[0]); - } - - if (ahiBuf[0]) - FreeVec((APTR) ahiBuf[0]); - - if (ahiPort) - DeleteMsgPort(ahiPort); -} - -int morphos_sound_thread(OSystem_MorphOS *syst, ULONG SampleType) -{ - ULONG signals; - bool initialized; - - ObtainSemaphore(&ScummSoundThreadRunning); - - initialized = init_morphos_sound(); - if (!initialized) - { - warning("Sound could not be initialized. The game may hang at some point (press Ctrl-z then)."); - Wait(SIGBREAKF_CTRL_C); - } - else - { - for (;;) - { - while (!ahiReqSent[ahiCurBuf] || CheckIO((IORequest *) ahiReq[ahiCurBuf])) - { - AHIRequest *req = ahiReq[ahiCurBuf]; - UWORD ahiOtherBuf = !ahiCurBuf; - - if (ahiReqSent[ahiCurBuf]) - WaitIO((IORequest *) req); - - syst->fill_sound((byte *) ahiBuf[ahiCurBuf], AHI_BUF_SIZE); - - req->ahir_Std.io_Message.mn_Node.ln_Pri = 0; - req->ahir_Std.io_Command = CMD_WRITE; - req->ahir_Std.io_Data = ahiBuf[ahiCurBuf]; - req->ahir_Std.io_Length = AHI_BUF_SIZE; - req->ahir_Type = SampleType; - req->ahir_Frequency = SAMPLES_PER_SEC; - req->ahir_Position = 0x8000; - req->ahir_Volume = 0x10000; - req->ahir_Link = (ahiReqSent[ahiOtherBuf] && !CheckIO((IORequest *) ahiReq[ahiOtherBuf])) ? ahiReq[ahiOtherBuf] : NULL; - SendIO((IORequest *)req); - - ahiReqSent[ahiCurBuf] = true; - ahiCurBuf = ahiOtherBuf; - } - - signals = Wait(SIGBREAKF_CTRL_C | (1 << ahiPort->mp_SigBit)); - - if (signals & SIGBREAKF_CTRL_C) - break; - } - - if (ahiReqSent[ahiCurBuf]) - { - AbortIO((IORequest *) ahiReq[ahiCurBuf]); - WaitIO((IORequest *) ahiReq[ahiCurBuf]); - ahiReqSent[ahiCurBuf] = false; - } - - if (ahiReqSent[!ahiCurBuf]) - { - AbortIO((IORequest *) ahiReq[!ahiCurBuf]); - WaitIO((IORequest *) ahiReq[!ahiCurBuf]); - ahiReqSent[!ahiCurBuf] = false; - } - } - - exit_morphos_sound(); - - ReleaseSemaphore(&ScummSoundThreadRunning); - RemTask(NULL); - return 0; -} - |
