From cd40c899b2da2b9f0bf857946ac74be119b90bd6 Mon Sep 17 00:00:00 2001 From: Travis Howell Date: Thu, 14 Aug 2003 02:28:19 +0000 Subject: Inital support for v1 maniac sound from Hoenicke Had to move music init for v1/v2 games to get this working svn-id: r9675 --- scumm/module.mk | 1 + scumm/player_v2.h | 30 +++++++++++++++--------------- scumm/resource_v2.cpp | 16 ++++++++++++++++ scumm/scummvm.cpp | 13 +++++-------- scumm/sound.cpp | 20 +++----------------- 5 files changed, 40 insertions(+), 40 deletions(-) (limited to 'scumm') diff --git a/scumm/module.mk b/scumm/module.mk index 241fcf2cab..81e4415c06 100644 --- a/scumm/module.mk +++ b/scumm/module.mk @@ -20,6 +20,7 @@ SCUMM_OBJS = \ scumm/help.o \ scumm/nut_renderer.o \ scumm/object.o \ + scumm/player_v1.o\ scumm/player_v2.o\ scumm/resource.o \ scumm/resource_v2.o \ diff --git a/scumm/player_v2.h b/scumm/player_v2.h index 6aec549407..c023237ea6 100644 --- a/scumm/player_v2.h +++ b/scumm/player_v2.h @@ -73,18 +73,18 @@ class SoundMixer; class Player_V2 { public: Player_V2(Scumm *scumm); - ~Player_V2(); + virtual ~Player_V2(); - void set_pcjr(bool pcjr); - void set_master_volume(int vol); + virtual void set_pcjr(bool pcjr); + virtual void set_master_volume(int vol); - void startSound(int nr, byte *data); - void stopSound(int nr); - void stopAllSounds(); - bool getSoundStatus(int nr) const; - int getMusicTimer() const; + virtual void startSound(int nr, byte *data); + virtual void stopSound(int nr); + virtual void stopAllSounds(); + virtual bool getSoundStatus(int nr) const; + virtual int getMusicTimer() const; -private: +protected: bool _isV3Game; SoundMixer *_mixer; OSystem *_system; @@ -121,15 +121,15 @@ private: void mutex_up() { _system->lock_mutex (_mutex); } void mutex_down() { _system->unlock_mutex (_mutex); } - void restartSound(); + virtual void restartSound(); void execute_cmd(ChannelInfo *channel); - void next_freqs(ChannelInfo *channel); - void clear_channel(int i); - void chainSound(int nr, byte *data); - void chainNextSound(); + virtual void next_freqs(ChannelInfo *channel); + virtual void clear_channel(int i); + virtual void chainSound(int nr, byte *data); + virtual void chainNextSound(); static void premix_proc(void *param, int16 *buf, uint len); - void do_mix (int16 *buf, uint len); + virtual void do_mix (int16 *buf, uint len); void lowPassFilter(int16 *data, uint len); void squareGenerator(int channel, int freq, int vol, diff --git a/scumm/resource_v2.cpp b/scumm/resource_v2.cpp index 89fa40409c..5ef6fb98b0 100644 --- a/scumm/resource_v2.cpp +++ b/scumm/resource_v2.cpp @@ -22,18 +22,27 @@ #include "stdafx.h" #include "scumm.h" #include "intern.h" +#include "player_v2.h" +#include "player_v1.h" #include "resource.h" +#include "sound/mididrv.h" void Scumm_v2::readClassicIndexFile() { int i; if (_gameId == GID_MANIAC) { + if (!(_features & GF_AMIGA)) + _playerV2 = new Player_V1(this); + _numGlobalObjects = 800; _numRooms = 55; _numCostumes = 35; _numScripts = 200; _numSounds = 100; } else if (_gameId == GID_ZAK) { + if (!(_features & GF_AMIGA)) + _playerV2 = new Player_V2(this); + _numGlobalObjects = 775; _numRooms = 61; _numCostumes = 37; @@ -96,6 +105,13 @@ void Scumm_v2::readClassicIndexFile() { } void Scumm_v2::readEnhancedIndexFile() { + + if (!(_features & GF_AMIGA)) { + _playerV2 = new Player_V2(this); + if (_midiDriver == MD_PCSPK) + _playerV2->set_pcjr(false); + } + _numGlobalObjects = _fileHandle.readUint16LE(); _fileHandle.seek(_numGlobalObjects, SEEK_CUR); // Skip object flags _numRooms = _fileHandle.readByte(); diff --git a/scumm/scummvm.cpp b/scumm/scummvm.cpp index a87dc31017..2da0b29a70 100644 --- a/scumm/scummvm.cpp +++ b/scumm/scummvm.cpp @@ -32,6 +32,7 @@ #include "intern.h" #include "object.h" #include "player_v2.h" +#include "player_v1.h" #include "resource.h" #include "sound.h" #include "string.h" @@ -620,14 +621,10 @@ Scumm::Scumm (GameDetector *detector, OSystem *syst) _imuseDigital = new IMuseDigital(this); } else if ((_features & GF_AMIGA) && (_features & GF_OLD_BUNDLE)) { _playerV2 = NULL; - } else if (((_midiDriver == MD_PCJR) || (_midiDriver == MD_PCSPK) && (_version < 5)) || (_version <= 2)) { - if ((_version == 1) && (_gameId == GID_MANIAC)) { - _playerV2 = NULL; - } else { - _playerV2 = new Player_V2(this); - if (_midiDriver == MD_PCSPK) - _playerV2->set_pcjr(false); - } + } else if (((_midiDriver == MD_PCJR) || (_midiDriver == MD_PCSPK)) && ((_version > 2) && (_version < 5))) { + _playerV2 = new Player_V2(this); + if (_midiDriver == MD_PCSPK) + _playerV2->set_pcjr(false); } else { _imuse = IMuse::create (syst, _mixer, detector->createMidi()); if (_imuse) { diff --git a/scumm/sound.cpp b/scumm/sound.cpp index 7c5f9e922f..1af8974381 100644 --- a/scumm/sound.cpp +++ b/scumm/sound.cpp @@ -178,6 +178,7 @@ void Sound::playSound(int soundID) { debug(3,"playSound #%d (room %d)", soundID, _scumm->getResourceRoomNr(rtSound, soundID)); ptr = _scumm->getResourceAddress(rtSound, soundID); if (ptr) { + //hexdump(ptr, 0x400); if (READ_UINT32(ptr) == MKID('iMUS')){ assert(_scumm->_imuseDigital); _scumm->_imuseDigital->startSound(soundID); @@ -453,23 +454,8 @@ void Sound::playSound(int soundID) { return; } - if (((_scumm->_midiDriver == MD_PCJR) || (_scumm->_midiDriver == MD_PCSPK) && (_scumm->_version < 5)) || (_scumm->_version <= 2)) { - //TODO: support maniac v1 sounds - if ((_scumm->_version == 1) && (_scumm->_gameId == GID_MANIAC)) - return; - // other versions seem to be 0000 at this point... - // hopefully this test is correct - // 0xfe7f seems to be sound and 0x764a music - bool amigatest = (READ_LE_UINT16(ptr + 12) == 0xfe7f) || (READ_LE_UINT16(ptr + 12) == 0x764a); - if (amigatest) { - // TODO: support amiga sounds - } else { - if (_scumm->_playerV2) { - _scumm->_playerV2->startSound (soundID, ptr); - } - } - return; - } + if (_scumm->_playerV2) + _scumm->_playerV2->startSound (soundID, ptr); if (_scumm->_imuse) { _scumm->getResourceAddress(rtSound, soundID); -- cgit v1.2.3