aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--scumm/resource.cpp14
-rw-r--r--scumm/scumm.h3
-rw-r--r--scumm/scummvm.cpp10
-rw-r--r--scumm/sound.cpp64
4 files changed, 22 insertions, 69 deletions
diff --git a/scumm/resource.cpp b/scumm/resource.cpp
index 60930b7c13..c8211f06a7 100644
--- a/scumm/resource.cpp
+++ b/scumm/resource.cpp
@@ -1487,11 +1487,17 @@ int Scumm::readSoundResourceSmallHeader(int type, int idx) {
// 8 bytes MTrk header
// 7 bytes MIDI tempo sysex
// + some default instruments
- // TODO: - make some real MIDI instrument definitions
- // - proper handling of the short (non-music, SFX) AD resources format
- // - check the LE/BE handling for platforms other than PC
- if (ad_offs != 0) {
+ if (((_midiDriver == MD_PCJR) || (_midiDriver == MD_PCSPK)) && wa_offs != 0) {
+ if (_features & GF_OLD_BUNDLE) {
+ _fileHandle.seek(wa_offs, SEEK_SET);
+ _fileHandle.read(createResource(type, idx, wa_size), wa_size);
+ } else {
+ _fileHandle.seek(wa_offs - 6, SEEK_SET);
+ _fileHandle.read(createResource(type, idx, wa_size + 6), wa_size + 6);
+ }
+ return 1;
+ } else if (ad_offs != 0) {
byte *ptr;
if (_features & GF_OLD_BUNDLE) {
ptr = (byte *) calloc(ad_size - 4, 1);
diff --git a/scumm/scumm.h b/scumm/scumm.h
index a8ee2cfebe..54c9dd1d82 100644
--- a/scumm/scumm.h
+++ b/scumm/scumm.h
@@ -1002,6 +1002,8 @@ protected:
public:
byte _proc_special_palette[256];
byte *_shadowPalette;
+ int _midiDriver; // Use the MD_ values from mididrv.h
+
protected:
int _shadowPaletteSize;
byte _currentPalette[3 * 256];
@@ -1011,7 +1013,6 @@ protected:
byte _haveMsg;
bool _useTalkAnims;
uint16 _defaultTalkDelay;
- int _midiDriver; // Use the MD_ values from mididrv.h
int tempMusic;
int _saveSound;
public:
diff --git a/scumm/scummvm.cpp b/scumm/scummvm.cpp
index 29cfe19125..397a9f8cf6 100644
--- a/scumm/scummvm.cpp
+++ b/scumm/scummvm.cpp
@@ -612,6 +612,7 @@ Scumm::Scumm (GameDetector *detector, OSystem *syst)
_mixer->setVolume(kDefaultSFXVolume * kDefaultMasterVolume / 255);
_mixer->setMusicVolume(kDefaultMusicVolume);
+ warning("_midiDriver is %d", _midiDriver);
// Init iMuse
_imuse = NULL;
_imuseDigital = NULL;
@@ -620,11 +621,14 @@ Scumm::Scumm (GameDetector *detector, OSystem *syst)
_imuseDigital = new IMuseDigital(this);
} else if ((_features & GF_AMIGA) && (_features & GF_OLD_BUNDLE)) {
_playerV2 = NULL;
- } else if (_version <= 2) {
- if ((_version == 1) && (_gameId == GID_MANIAC))
+ } else if (((_midiDriver == MD_PCJR) || (_midiDriver == MD_PCSPK) && (_version < 5)) || (_version <= 2)) {
+ if ((_version == 1) && (_gameId == GID_MANIAC)) {
_playerV2 = NULL;
- else
+ } else {
_playerV2 = new Player_V2(this);
+ if (_midiDriver == MD_PCJR)
+ _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 abcf1ffc97..7c5f9e922f 100644
--- a/scumm/sound.cpp
+++ b/scumm/sound.cpp
@@ -322,65 +322,6 @@ void Sound::playSound(int soundID) {
return;
} else if (_scumm->_features & GF_FMTOWNS) {
size = READ_LE_UINT32(ptr);
-#if 0
- // FIXME - this is just some debug output for Zak256
- if (size != 30) {
- char name[9];
- memcpy(name, ptr+22, 8);
- name[8] = 0;
- printf("Going to play Zak256 sound '%s':\n", name);
- hexdump(ptr, 0x40);
- }
- /*
- There seems to be some pattern in the Zak256 sound data. Two typical
- examples are these:
-
- d7 10 00 00 53 4f d1 10 |....SO..|
- 00 00 00 00 04 00 ff 00 |........|
- 64 00 00 00 01 00 64 6f |d.....do|
- 6f 72 6f 70 65 6e 40 a8 |oropen@.|
- 57 14 a1 10 00 00 50 08 |W.....P.|
- 00 00 00 00 00 00 b3 07 |........|
- 00 00 3c 00 00 00 04 80 |..<.....|
- 03 02 0a 01 8c 82 87 81 |........|
-
- 5b 07 00 00 53 4f 55 07 |[...SOU.|
- 00 00 00 00 04 00 ff 00 |........|
- 64 00 00 00 01 00 64 72 |d.....dr|
- 77 6f 70 65 6e 00 53 a8 |wopen.S.|
- 57 14 25 07 00 00 92 03 |W.%.....|
- 00 00 00 00 00 00 88 03 |........|
- 00 00 3c 00 00 00 82 82 |..<.....|
- 83 84 86 88 89 8b 89 89 |........|
-
- As you can see, there are quite some patterns, e.g.
- the "3c 00 00 00" - the sound data starts at offset 0x36
-
- Indy 3 uses a different format. The very first sound played
- in Indy 3 looks as follows:
- 5a 25 00 00 53 4f 54 25 |Z%..SOT%|
- 00 00 53 4f db 0a 00 00 |..SO....|
- 57 41 c8 00 18 00 00 00 |WA......|
- 00 00 00 00 9e 05 00 00 |........|
- 00 00 00 00 fd 32 00 f8 |.....2..|
- 02 f9 08 ff 22 08 00 ff |...."...|
- 20 5c 00 ff 10 03 00 fd | \......|
- 64 00 f8 00 f9 00 ff 22 |d......"|
-
- Indy 3, opening a door:
- d1 00 00 00 53 4f cb 00 |....SO..|
- 00 00 53 4f a2 00 00 00 |..SO....|
- 57 41 64 00 18 00 00 00 |WAd.....|
- 00 00 00 00 00 00 00 00 |........|
- 00 00 7e 00 f9 0c ff 20 |..~.... |
- 90 01 ff 22 c2 01 ff 0a |..."....|
- 03 00 ff 04 57 06 ff 00 |....W...|
- 04 00 ff 0a 00 00 ff 00 |........|
-
- So there seems to be a "SO" chunk which contains again a SO chunk and a WA chunk.
- WA probably again contains audio data?
- */
-#endif
rate = 11025;
int type = *(ptr + 0x0D);
@@ -512,7 +453,7 @@ void Sound::playSound(int soundID) {
return;
}
- if (_scumm->_version <= 2) {
+ 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;
@@ -523,8 +464,9 @@ void Sound::playSound(int soundID) {
if (amigatest) {
// TODO: support amiga sounds
} else {
- if (_scumm->_playerV2)
+ if (_scumm->_playerV2) {
_scumm->_playerV2->startSound (soundID, ptr);
+ }
}
return;
}