[Scummvm-cvs-logs] CVS: scummvm/scumm/imuse_digi dimuse_script.cpp,1.26,1.27 dimuse_track.cpp,1.33,1.34

Chris Apers chrilith at users.sourceforge.net
Sun Sep 12 04:08:14 CEST 2004


Update of /cvsroot/scummvm/scummvm/scumm/imuse_digi
In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv6399

Modified Files:
	dimuse_script.cpp dimuse_track.cpp 
Log Message:
On PalmOS too

Index: dimuse_script.cpp
===================================================================
RCS file: /cvsroot/scummvm/scummvm/scumm/imuse_digi/dimuse_script.cpp,v
retrieving revision 1.26
retrieving revision 1.27
diff -u -d -r1.26 -r1.27
--- dimuse_script.cpp	4 Sep 2004 13:13:23 -0000	1.26
+++ dimuse_script.cpp	12 Sep 2004 11:07:32 -0000	1.27
@@ -1,397 +1,397 @@
-/* ScummVM - Scumm Interpreter
- * Copyright (C) 2001-2004 The ScummVM project
- *
- * 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.
- *
- * $Header$
- */
-
-#include "stdafx.h"
-#include "common/timer.h"
-
-#include "scumm/actor.h"
-#include "scumm/scumm.h"
-#include "scumm/sound.h"
-#include "scumm/imuse_digi/dimuse.h"
-#include "scumm/imuse_digi/dimuse_bndmgr.h"
-
-#include "sound/audiostream.h"
-#include "sound/mixer.h"
-
-namespace Scumm {
-
-void IMuseDigital::parseScriptCmds(int a, int b, int c, int d, int e, int f, int g, int h) {
-	int cmd = a;
-	int soundId = b;
-	int sub_cmd = c;
-
-	if (!cmd)
-		return;
-
-	switch (cmd) {
-	case 10: // ImuseStopAllSounds
-		stopAllSounds();
-		break;
-	case 12: // ImuseSetParam
-		switch (sub_cmd) {
-		case 0x400: // select group volume
-			selectVolumeGroup(soundId, d);
-			break;
-		case 0x500: // set priority
-			setPriority(soundId, d);
-			break;
-		case 0x600: // set volume
-			setVolume(soundId, d);
-			break;
-		case 0x700: // set pan
-			setPan(soundId, d);
-			break;
-		default:
-			warning("IMuseDigital::doCommand SetParam DEFAULT command %d", sub_cmd);
-			break;
-		}
-		break;
-	case 14: // ImuseFadeParam
-		switch (sub_cmd) {
-		case 0x600: // set volume fading
-			if ((d != 0) && (e == 0))
-				setVolume(soundId, d);
-			else if ((d == 0) && (e == 0))
-				stopSound(soundId);
-			else
-				setFade(soundId, d, e);
-			break;
-		default:
-			warning("IMuseDigital::doCommand FadeParam DEFAULT sub command %d", sub_cmd);
-			break;
-		}
-		break;
-	case 25: // ImuseStartStream
-		debug(5, "ImuseStartStream (%d, %d, %d)", soundId, c, d);
-		break;
-	case 26: // ImuseSwitchStream
-		debug(5, "ImuseSwitchStream (%d, %d, %d, %d, %d)", soundId, c, d, e, f);
-		break;
-	case 0x1000: // ImuseSetState
-		debug(5, "ImuseSetState (%d)", b);
-		if ((_vm->_gameId == GID_DIG) && (_vm->_features & GF_DEMO)) {
-			if (b == 1) {
-				fadeOutMusic(200);
-				startMusic(1, 127);
-			} else {
-				if (getSoundStatus(2) == 0) {
-					fadeOutMusic(200);
-					startMusic(2, 127);
-				}
-			}
-		} else if ((_vm->_gameId == GID_CMI) && (_vm->_features & GF_DEMO)) {
-			fadeOutMusic(120);
-			if (b == 2) {
-				startMusic("in1.imx", 1100, 0, 127);
-			} else if (b == 4) {
-				startMusic("in2.imx", 1120, 0, 127);
-			} else if (b == 8) {
-				startMusic("out1.imx", 1140, 0, 127);
-			} else if (b == 9) {
-				startMusic("out2.imx", 1150, 0, 127);
-			} else if (b == 16) {
-				startMusic("gun.imx", 1210, 0, 127);
-			} else {
-				warning("imuse digital: set state unknown for cmi demo: %d, room: %d", b, _vm->_currentRoom);
-			}
-		} else if (_vm->_gameId == GID_DIG) {
-			setDigMusicState(b);
-		} else if (_vm->_gameId == GID_CMI) {
-			setComiMusicState(b);
-		} else if (_vm->_gameId == GID_FT) {
-			setFtMusicState(b);
-		}
-		break;
-	case 0x1001: // ImuseSetSequence
-		debug(5, "ImuseSetSequence (%d)", b);
-		if (_vm->_gameId == GID_DIG) {
-			setDigMusicSequence(b);
-		} else if (_vm->_gameId == GID_CMI) {
-			setComiMusicSequence(b);
-		} else if (_vm->_gameId == GID_FT) {
-			setFtMusicSequence(b);
-		}
-		break;
-	case 0x1002: // ImuseSetCuePoint
-		debug(5, "ImuseSetCuePoint (%d)", b);
-		if (_vm->_gameId == GID_FT) {
-			setFtMusicCuePoint(b);
-		}
-		break;
-	case 0x1003: // ImuseSetAttribute
-		debug(5, "ImuseSetAttribute (%d, %d)", b, c);
-		assert((_vm->_gameId == GID_DIG) || (_vm->_gameId == GID_FT));
-		if (_vm->_gameId == GID_DIG) {
-			_attributes[b] = c;
-		}
-		break;
-	case 0x2000: // ImuseSetGroupSfxVolume
-		debug(5, "ImuseSetGroupSFXVolume (%d)", b);
-//		setGroupSfxVolume(b);
-		break;
-	case 0x2001: // ImuseSetGroupVoiceVolume
-		debug(5, "ImuseSetGroupVoiceVolume (%d)", b);
-//		setGroupVoiceVolume(b);
-		break;
-	case 0x2002: // ImuseSetGroupMusicVolume
-		debug(5, "ImuseSetGroupMusicVolume (%d)", b);
-//		setGroupMusicVolume(b);
-		break;
-	default:
-		error("IMuseDigital::doCommand DEFAULT command %d", cmd);
-	}
-}
-
-void IMuseDigital::flushTracks() {
-	debug(5, "flushTracks()");
-	for (int l = 0; l < MAX_DIGITAL_TRACKS + MAX_DIGITAL_FADETRACKS; l++) {
-		Track *track = _track[l];
-		if (track->used && (track->readyToRemove ||
-				(_vm->_insaneRunning && track->toBeRemoved))) { // INSANE hack for sync timer mode
-			if (track->stream) {
-				if (!track->stream->endOfStream()) {
-	 				track->stream->finish();
-	 			}
-				if (track->stream->endOfStream()
-						|| _vm->_mixer->isPaused() // hack for paused SoundMixer
-						|| _vm->_insaneRunning) { // INSANE hack for sync timer mode
-					_vm->_mixer->stopHandle(track->handle);
-					delete track->stream;
-					track->stream = NULL;
-					_sound->closeSound(track->soundHandle);
-					track->soundHandle = NULL;
-					track->used = false;
-				}
-			} else if (track->stream2) {
-				_vm->_mixer->stopHandle(track->handle);
-				delete track->stream2;
-				track->stream2 = NULL;
-				track->used = false;
-			}
-		}
-	}
-}
-
-void IMuseDigital::refreshScripts() {
-	debug(5, "refreshScripts()");
-	bool found = false;
-	for (int l = 0; l < MAX_DIGITAL_TRACKS; l++) {
-		Track *track = _track[l];
-		if (track->used && !track->toBeRemoved && (track->volGroupId == IMUSE_VOLGRP_MUSIC)) {
-			found = true;
-		}
-	}
-
-	if (!found && (_curMusicSeq != 0)) {
-		debug(5, "refreshScripts() Start Sequence");
-		parseScriptCmds(0x1001, 0, 0, 0, 0, 0, 0, 0);
-	}
-}
-
-void IMuseDigital::startVoice(int soundId, AudioStream *input) {
-	debug(5, "startVoiceStream(%d)", soundId);
-	startSound(soundId, "", 0, IMUSE_VOLGRP_VOICE, input, 0, 127, 127);
-}
-
-void IMuseDigital::startVoice(int soundId, const char *soundName) {
-	debug(5, "startVoiceBundle(%s)", soundName);
-	startSound(soundId, soundName, IMUSE_BUNDLE, IMUSE_VOLGRP_VOICE, NULL, 0, 127, 127);
-}
-
-void IMuseDigital::startMusic(int soundId, int volume) {
-	debug(5, "startMusicResource(%d)", soundId);
-	startSound(soundId, "", IMUSE_RESOURCE, IMUSE_VOLGRP_MUSIC, NULL, 0, volume, 126);
-}
-
-void IMuseDigital::startMusic(const char *soundName, int soundId, int hookId, int volume) {
-	debug(5, "startMusicBundle(%s)", soundName);
-	startSound(soundId, soundName, IMUSE_BUNDLE, IMUSE_VOLGRP_MUSIC, NULL, hookId, volume, 126);
-}
-
-void IMuseDigital::startSfx(int soundId, int priority) {
-	debug(5, "startSfx(%d)", soundId);
-	startSound(soundId, "", IMUSE_RESOURCE, IMUSE_VOLGRP_SFX, NULL, 0, 127, priority);
-}
-
-void IMuseDigital::getLipSync(int soundId, int syncId, int32 msPos, int32 &width, int32 &height) {
-	int32 sync_size;
-	byte *sync_ptr;
-
-	msPos /= 16;
-	if (msPos < 65536) {
-		for (int l = 0; l < MAX_DIGITAL_TRACKS; l++) {
-			Track *track = _track[l];
-			if ((track->soundId == soundId) && track->used && !track->toBeRemoved) {
-				_sound->getSyncSizeAndPtrById(track->soundHandle, syncId, sync_size, &sync_ptr);
-				if ((sync_size != 0) && (sync_ptr != NULL)) {
-					sync_size /= 4;
-					while (sync_size--) {
-						if (READ_BE_UINT16(sync_ptr) >= msPos)
-							break;
-						sync_ptr += 4;
-					}
-					if (sync_size < 0)
-						sync_ptr -= 4;
-					else
-						if (READ_BE_UINT16(sync_ptr) > msPos)
-							sync_ptr -= 4;
-
-					width = sync_ptr[2];
-					height = sync_ptr[3];
-					return;
-				}
-			}
-		}
-	}
-}
-
-int32 IMuseDigital::getPosInMs(int soundId) {
-	for (int l = 0; l < MAX_DIGITAL_TRACKS; l++) {
-		Track *track = _track[l];
-		if ((track->soundId == soundId) && track->used && !track->toBeRemoved) {
-			int32 pos = (5 * (track->dataOffset + track->regionOffset)) / (track->iteration / 200);
-			return pos;
-		}
-	}
-
-	return 0;
-}
-
-int IMuseDigital::getSoundStatus(int sound) const {
-	debug(5, "IMuseDigital::getSoundStatus(%d)", sound);
-	for (int l = 0; l < MAX_DIGITAL_TRACKS; l++) {
-		Track *track = _track[l];
-		if (track->soundId == sound) {
-			if ((track->stream2 && track->handle.isActive()) ||
-				(track->stream && track->used && !track->readyToRemove)) {
-					return 1;
-			}
-		}
-	}
-
-	return 0;
-}
-
-void IMuseDigital::stopSound(int soundId) {
-	debug(5, "IMuseDigital::stopSound(%d)", soundId);
-	for (int l = 0; l < MAX_DIGITAL_TRACKS; l++) {
-		Track *track = _track[l];
-		if ((track->soundId == soundId) && track->used && !track->toBeRemoved) {
-			track->toBeRemoved = true;
-		}
-	}
-}
-
-int32 IMuseDigital::getCurMusicPosInMs() {
-	int soundId = -1;
-
-	for (int l = 0; l < MAX_DIGITAL_TRACKS; l++) {
-		Track *track = _track[l];
-		if (track->used && !track->toBeRemoved && (track->volGroupId == IMUSE_VOLGRP_MUSIC)) {
-			soundId = track->soundId;
-		}
-	}
-
-	int32 msPos = getPosInMs(soundId);
-	debug(5, "IMuseDigital::getCurMusicPosInMs(%d) = %d", soundId, msPos);
-	return msPos;
-}
-
-int32 IMuseDigital::getCurVoiceLipSyncWidth() {
-	int32 msPos = getPosInMs(kTalkSoundID) + 50;
-	int32 width = 0, height = 0;
-
-	debug(5, "IMuseDigital::getCurVoiceLipSyncWidth(%d)", kTalkSoundID);
-	getLipSync(kTalkSoundID, 0, msPos, width, height);
-	return width;
-}
-
-int32 IMuseDigital::getCurVoiceLipSyncHeight() {
-	int32 msPos = getPosInMs(kTalkSoundID) + 50;
-	int32 width = 0, height = 0;
-
-	debug(5, "IMuseDigital::getCurVoiceLipSyncHeight(%d)", kTalkSoundID);
-	getLipSync(kTalkSoundID, 0, msPos, width, height);
-	return height;
-}
-
-int32 IMuseDigital::getCurMusicLipSyncWidth(int syncId) {
-	int soundId = -1;
-
-	for (int l = 0; l < MAX_DIGITAL_TRACKS; l++) {
-		Track *track = _track[l];
-		if (track->used && !track->toBeRemoved && (track->volGroupId == IMUSE_VOLGRP_MUSIC)) {
-			soundId = track->soundId;
-		}
-	}
-
-	int32 msPos = getPosInMs(soundId) + 50;
-	int32 width = 0, height = 0;
-
-	debug(5, "IMuseDigital::getCurVoiceLipSyncWidth(%d, %d)", soundId, msPos);
-	getLipSync(soundId, syncId, msPos, width, height);
-	return width;
-}
-
-int32 IMuseDigital::getCurMusicLipSyncHeight(int syncId) {
-	int soundId = -1;
-
-	for (int l = 0; l < MAX_DIGITAL_TRACKS; l++) {
-		Track *track = _track[l];
-		if (track->used && !track->toBeRemoved && (track->volGroupId == IMUSE_VOLGRP_MUSIC)) {
-			soundId = track->soundId;
-		}
-	}
-
-	int32 msPos = getPosInMs(soundId) + 50;
-	int32 width = 0, height = 0;
-
-	debug(5, "IMuseDigital::getCurVoiceLipSyncHeight(%d, %d)", soundId, msPos);
-	getLipSync(soundId, syncId, msPos, width, height);
-	return height;
-}
-
-void IMuseDigital::stopAllSounds() {
-	debug(5, "IMuseDigital::stopAllSounds");
-
-	for(;;) {
-		bool foundNotRemoved = false;
-		for (int l = 0; l < MAX_DIGITAL_TRACKS + MAX_DIGITAL_FADETRACKS; l++) {
-			Track *track = _track[l];
-			if (track->used) {
-				track->toBeRemoved = true;
-				foundNotRemoved = true;
-			}
-		}
-		if (!foundNotRemoved)
-			break;
-		flushTracks();
-		_vm->_system->delay_msecs(50);
-#ifdef _WIN32_WCE
-		_vm->parseEvents(); // timers are events, we need to consume them
-#endif
-	}
-}
-
-void IMuseDigital::pause(bool p) {
-	_pause = p;
-}
-
-} // End of namespace Scumm
+/* ScummVM - Scumm Interpreter

+ * Copyright (C) 2001-2004 The ScummVM project

+ *

+ * 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.

+ *

+ * $Header$

+ */

+

+#include "stdafx.h"

+#include "common/timer.h"

+

+#include "scumm/actor.h"

+#include "scumm/scumm.h"

+#include "scumm/sound.h"

+#include "scumm/imuse_digi/dimuse.h"

+#include "scumm/imuse_digi/dimuse_bndmgr.h"

+

+#include "sound/audiostream.h"

+#include "sound/mixer.h"

+

+namespace Scumm {

+

+void IMuseDigital::parseScriptCmds(int a, int b, int c, int d, int e, int f, int g, int h) {

+	int cmd = a;

+	int soundId = b;

+	int sub_cmd = c;

+

+	if (!cmd)

+		return;

+

+	switch (cmd) {

+	case 10: // ImuseStopAllSounds

+		stopAllSounds();

+		break;

+	case 12: // ImuseSetParam

+		switch (sub_cmd) {

+		case 0x400: // select group volume

+			selectVolumeGroup(soundId, d);

+			break;

+		case 0x500: // set priority

+			setPriority(soundId, d);

+			break;

+		case 0x600: // set volume

+			setVolume(soundId, d);

+			break;

+		case 0x700: // set pan

+			setPan(soundId, d);

+			break;

+		default:

+			warning("IMuseDigital::doCommand SetParam DEFAULT command %d", sub_cmd);

+			break;

+		}

+		break;

+	case 14: // ImuseFadeParam

+		switch (sub_cmd) {

+		case 0x600: // set volume fading

+			if ((d != 0) && (e == 0))

+				setVolume(soundId, d);

+			else if ((d == 0) && (e == 0))

+				stopSound(soundId);

+			else

+				setFade(soundId, d, e);

+			break;

+		default:

+			warning("IMuseDigital::doCommand FadeParam DEFAULT sub command %d", sub_cmd);

+			break;

+		}

+		break;

+	case 25: // ImuseStartStream

+		debug(5, "ImuseStartStream (%d, %d, %d)", soundId, c, d);

+		break;

+	case 26: // ImuseSwitchStream

+		debug(5, "ImuseSwitchStream (%d, %d, %d, %d, %d)", soundId, c, d, e, f);

+		break;

+	case 0x1000: // ImuseSetState

+		debug(5, "ImuseSetState (%d)", b);

+		if ((_vm->_gameId == GID_DIG) && (_vm->_features & GF_DEMO)) {

+			if (b == 1) {

+				fadeOutMusic(200);

+				startMusic(1, 127);

+			} else {

+				if (getSoundStatus(2) == 0) {

+					fadeOutMusic(200);

+					startMusic(2, 127);

+				}

+			}

+		} else if ((_vm->_gameId == GID_CMI) && (_vm->_features & GF_DEMO)) {

+			fadeOutMusic(120);

+			if (b == 2) {

+				startMusic("in1.imx", 1100, 0, 127);

+			} else if (b == 4) {

+				startMusic("in2.imx", 1120, 0, 127);

+			} else if (b == 8) {

+				startMusic("out1.imx", 1140, 0, 127);

+			} else if (b == 9) {

+				startMusic("out2.imx", 1150, 0, 127);

+			} else if (b == 16) {

+				startMusic("gun.imx", 1210, 0, 127);

+			} else {

+				warning("imuse digital: set state unknown for cmi demo: %d, room: %d", b, _vm->_currentRoom);

+			}

+		} else if (_vm->_gameId == GID_DIG) {

+			setDigMusicState(b);

+		} else if (_vm->_gameId == GID_CMI) {

+			setComiMusicState(b);

+		} else if (_vm->_gameId == GID_FT) {

+			setFtMusicState(b);

+		}

+		break;

+	case 0x1001: // ImuseSetSequence

+		debug(5, "ImuseSetSequence (%d)", b);

+		if (_vm->_gameId == GID_DIG) {

+			setDigMusicSequence(b);

+		} else if (_vm->_gameId == GID_CMI) {

+			setComiMusicSequence(b);

+		} else if (_vm->_gameId == GID_FT) {

+			setFtMusicSequence(b);

+		}

+		break;

+	case 0x1002: // ImuseSetCuePoint

+		debug(5, "ImuseSetCuePoint (%d)", b);

+		if (_vm->_gameId == GID_FT) {

+			setFtMusicCuePoint(b);

+		}

+		break;

+	case 0x1003: // ImuseSetAttribute

+		debug(5, "ImuseSetAttribute (%d, %d)", b, c);

+		assert((_vm->_gameId == GID_DIG) || (_vm->_gameId == GID_FT));

+		if (_vm->_gameId == GID_DIG) {

+			_attributes[b] = c;

+		}

+		break;

+	case 0x2000: // ImuseSetGroupSfxVolume

+		debug(5, "ImuseSetGroupSFXVolume (%d)", b);

+//		setGroupSfxVolume(b);

+		break;

+	case 0x2001: // ImuseSetGroupVoiceVolume

+		debug(5, "ImuseSetGroupVoiceVolume (%d)", b);

+//		setGroupVoiceVolume(b);

+		break;

+	case 0x2002: // ImuseSetGroupMusicVolume

+		debug(5, "ImuseSetGroupMusicVolume (%d)", b);

+//		setGroupMusicVolume(b);

+		break;

+	default:

+		error("IMuseDigital::doCommand DEFAULT command %d", cmd);

+	}

+}

+

+void IMuseDigital::flushTracks() {

+	debug(5, "flushTracks()");

+	for (int l = 0; l < MAX_DIGITAL_TRACKS + MAX_DIGITAL_FADETRACKS; l++) {

+		Track *track = _track[l];

+		if (track->used && (track->readyToRemove ||

+				(_vm->_insaneRunning && track->toBeRemoved))) { // INSANE hack for sync timer mode

+			if (track->stream) {

+				if (!track->stream->endOfStream()) {

+	 				track->stream->finish();

+	 			}

+				if (track->stream->endOfStream()

+						|| _vm->_mixer->isPaused() // hack for paused SoundMixer

+						|| _vm->_insaneRunning) { // INSANE hack for sync timer mode

+					_vm->_mixer->stopHandle(track->handle);

+					delete track->stream;

+					track->stream = NULL;

+					_sound->closeSound(track->soundHandle);

+					track->soundHandle = NULL;

+					track->used = false;

+				}

+			} else if (track->stream2) {

+				_vm->_mixer->stopHandle(track->handle);

+				delete track->stream2;

+				track->stream2 = NULL;

+				track->used = false;

+			}

+		}

+	}

+}

+

+void IMuseDigital::refreshScripts() {

+	debug(5, "refreshScripts()");

+	bool found = false;

+	for (int l = 0; l < MAX_DIGITAL_TRACKS; l++) {

+		Track *track = _track[l];

+		if (track->used && !track->toBeRemoved && (track->volGroupId == IMUSE_VOLGRP_MUSIC)) {

+			found = true;

+		}

+	}

+

+	if (!found && (_curMusicSeq != 0)) {

+		debug(5, "refreshScripts() Start Sequence");

+		parseScriptCmds(0x1001, 0, 0, 0, 0, 0, 0, 0);

+	}

+}

+

+void IMuseDigital::startVoice(int soundId, AudioStream *input) {

+	debug(5, "startVoiceStream(%d)", soundId);

+	startSound(soundId, "", 0, IMUSE_VOLGRP_VOICE, input, 0, 127, 127);

+}

+

+void IMuseDigital::startVoice(int soundId, const char *soundName) {

+	debug(5, "startVoiceBundle(%s)", soundName);

+	startSound(soundId, soundName, IMUSE_BUNDLE, IMUSE_VOLGRP_VOICE, NULL, 0, 127, 127);

+}

+

+void IMuseDigital::startMusic(int soundId, int volume) {

+	debug(5, "startMusicResource(%d)", soundId);

+	startSound(soundId, "", IMUSE_RESOURCE, IMUSE_VOLGRP_MUSIC, NULL, 0, volume, 126);

+}

+

+void IMuseDigital::startMusic(const char *soundName, int soundId, int hookId, int volume) {

+	debug(5, "startMusicBundle(%s)", soundName);

+	startSound(soundId, soundName, IMUSE_BUNDLE, IMUSE_VOLGRP_MUSIC, NULL, hookId, volume, 126);

+}

+

+void IMuseDigital::startSfx(int soundId, int priority) {

+	debug(5, "startSfx(%d)", soundId);

+	startSound(soundId, "", IMUSE_RESOURCE, IMUSE_VOLGRP_SFX, NULL, 0, 127, priority);

+}

+

+void IMuseDigital::getLipSync(int soundId, int syncId, int32 msPos, int32 &width, int32 &height) {

+	int32 sync_size;

+	byte *sync_ptr;

+

+	msPos /= 16;

+	if (msPos < 65536) {

+		for (int l = 0; l < MAX_DIGITAL_TRACKS; l++) {

+			Track *track = _track[l];

+			if ((track->soundId == soundId) && track->used && !track->toBeRemoved) {

+				_sound->getSyncSizeAndPtrById(track->soundHandle, syncId, sync_size, &sync_ptr);

+				if ((sync_size != 0) && (sync_ptr != NULL)) {

+					sync_size /= 4;

+					while (sync_size--) {

+						if (READ_BE_UINT16(sync_ptr) >= msPos)

+							break;

+						sync_ptr += 4;

+					}

+					if (sync_size < 0)

+						sync_ptr -= 4;

+					else

+						if (READ_BE_UINT16(sync_ptr) > msPos)

+							sync_ptr -= 4;

+

+					width = sync_ptr[2];

+					height = sync_ptr[3];

+					return;

+				}

+			}

+		}

+	}

+}

+

+int32 IMuseDigital::getPosInMs(int soundId) {

+	for (int l = 0; l < MAX_DIGITAL_TRACKS; l++) {

+		Track *track = _track[l];

+		if ((track->soundId == soundId) && track->used && !track->toBeRemoved) {

+			int32 pos = (5 * (track->dataOffset + track->regionOffset)) / (track->iteration / 200);

+			return pos;

+		}

+	}

+

+	return 0;

+}

+

+int IMuseDigital::getSoundStatus(int sound) const {

+	debug(5, "IMuseDigital::getSoundStatus(%d)", sound);

+	for (int l = 0; l < MAX_DIGITAL_TRACKS; l++) {

+		Track *track = _track[l];

+		if (track->soundId == sound) {

+			if ((track->stream2 && track->handle.isActive()) ||

+				(track->stream && track->used && !track->readyToRemove)) {

+					return 1;

+			}

+		}

+	}

+

+	return 0;

+}

+

+void IMuseDigital::stopSound(int soundId) {

+	debug(5, "IMuseDigital::stopSound(%d)", soundId);

+	for (int l = 0; l < MAX_DIGITAL_TRACKS; l++) {

+		Track *track = _track[l];

+		if ((track->soundId == soundId) && track->used && !track->toBeRemoved) {

+			track->toBeRemoved = true;

+		}

+	}

+}

+

+int32 IMuseDigital::getCurMusicPosInMs() {

+	int soundId = -1;

+

+	for (int l = 0; l < MAX_DIGITAL_TRACKS; l++) {

+		Track *track = _track[l];

+		if (track->used && !track->toBeRemoved && (track->volGroupId == IMUSE_VOLGRP_MUSIC)) {

+			soundId = track->soundId;

+		}

+	}

+

+	int32 msPos = getPosInMs(soundId);

+	debug(5, "IMuseDigital::getCurMusicPosInMs(%d) = %d", soundId, msPos);

+	return msPos;

+}

+

+int32 IMuseDigital::getCurVoiceLipSyncWidth() {

+	int32 msPos = getPosInMs(kTalkSoundID) + 50;

+	int32 width = 0, height = 0;

+

+	debug(5, "IMuseDigital::getCurVoiceLipSyncWidth(%d)", kTalkSoundID);

+	getLipSync(kTalkSoundID, 0, msPos, width, height);

+	return width;

+}

+

+int32 IMuseDigital::getCurVoiceLipSyncHeight() {

+	int32 msPos = getPosInMs(kTalkSoundID) + 50;

+	int32 width = 0, height = 0;

+

+	debug(5, "IMuseDigital::getCurVoiceLipSyncHeight(%d)", kTalkSoundID);

+	getLipSync(kTalkSoundID, 0, msPos, width, height);

+	return height;

+}

+

+int32 IMuseDigital::getCurMusicLipSyncWidth(int syncId) {

+	int soundId = -1;

+

+	for (int l = 0; l < MAX_DIGITAL_TRACKS; l++) {

+		Track *track = _track[l];

+		if (track->used && !track->toBeRemoved && (track->volGroupId == IMUSE_VOLGRP_MUSIC)) {

+			soundId = track->soundId;

+		}

+	}

+

+	int32 msPos = getPosInMs(soundId) + 50;

+	int32 width = 0, height = 0;

+

+	debug(5, "IMuseDigital::getCurVoiceLipSyncWidth(%d, %d)", soundId, msPos);

+	getLipSync(soundId, syncId, msPos, width, height);

+	return width;

+}

+

+int32 IMuseDigital::getCurMusicLipSyncHeight(int syncId) {

+	int soundId = -1;

+

+	for (int l = 0; l < MAX_DIGITAL_TRACKS; l++) {

+		Track *track = _track[l];

+		if (track->used && !track->toBeRemoved && (track->volGroupId == IMUSE_VOLGRP_MUSIC)) {

+			soundId = track->soundId;

+		}

+	}

+

+	int32 msPos = getPosInMs(soundId) + 50;

+	int32 width = 0, height = 0;

+

+	debug(5, "IMuseDigital::getCurVoiceLipSyncHeight(%d, %d)", soundId, msPos);

+	getLipSync(soundId, syncId, msPos, width, height);

+	return height;

+}

+

+void IMuseDigital::stopAllSounds() {

+	debug(5, "IMuseDigital::stopAllSounds");

+

+	for(;;) {

+		bool foundNotRemoved = false;

+		for (int l = 0; l < MAX_DIGITAL_TRACKS + MAX_DIGITAL_FADETRACKS; l++) {

+			Track *track = _track[l];

+			if (track->used) {

+				track->toBeRemoved = true;

+				foundNotRemoved = true;

+			}

+		}

+		if (!foundNotRemoved)

+			break;

+		flushTracks();

+		_vm->_system->delay_msecs(50);

+#if defined(_WIN32_WCE) || defined (__PALM_OS__)

+		_vm->parseEvents(); // timers are events, we need to consume them

+#endif

+	}

+}

+

+void IMuseDigital::pause(bool p) {

+	_pause = p;

+}

+

+} // End of namespace Scumm


Index: dimuse_track.cpp
===================================================================
RCS file: /cvsroot/scummvm/scummvm/scumm/imuse_digi/dimuse_track.cpp,v
retrieving revision 1.33
retrieving revision 1.34
diff -u -d -r1.33 -r1.34
--- dimuse_track.cpp	18 Jul 2004 16:30:01 -0000	1.33
+++ dimuse_track.cpp	12 Sep 2004 11:07:32 -0000	1.34
@@ -1,323 +1,323 @@
-/* ScummVM - Scumm Interpreter
- * Copyright (C) 2001-2004 The ScummVM project
- *
- * 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.
- *
- * $Header$
- */
-
-#include "stdafx.h"
-#include "common/timer.h"
-
-#include "scumm/actor.h"
-#include "scumm/scumm.h"
-#include "scumm/sound.h"
-#include "scumm/imuse_digi/dimuse.h"
-#include "scumm/imuse_digi/dimuse_bndmgr.h"
-
-#include "sound/audiostream.h"
-#include "sound/mixer.h"
-
-namespace Scumm {
-
-int IMuseDigital::allocSlot(int priority) {
-	int l, lower_priority = 127;
-	int trackId = -1;
-
-	for (l = 0; l < MAX_DIGITAL_TRACKS; l++) {
-		if (!_track[l]->used) {
-			trackId = l;
-			break;
-		}
-	}
-
-	if (trackId == -1) {
-		debug(5, "IMuseDigital::startSound(): All slots are full");
-		for (l = 0; l < MAX_DIGITAL_TRACKS; l++) {
-			Track *track = _track[l];
-			if (track->used && !track->toBeRemoved &&
-					(lower_priority > track->priority) && !track->stream2)
-				lower_priority = track->priority;
-		}
-		if (lower_priority <= priority) {
-			for (l = 0; l < MAX_DIGITAL_TRACKS; l++) {
-				Track *track = _track[l];
-				if (track->used && !track->toBeRemoved &&
-						(lower_priority == track->priority) && !track->stream2) {
-					trackId = l;
-				}
-			}
-			assert(trackId != -1);
-			_track[trackId]->toBeRemoved = true;
-			debug(5, "IMuseDigital::startSound(): Removed sound %d from track %d", _track[trackId]->soundId, trackId);
-		} else {
-			debug(5, "IMuseDigital::startSound(): Priority sound too low");
-			return -1;
-		}
-	}
-
-	return trackId;
-}
-
-void IMuseDigital::startSound(int soundId, const char *soundName, int soundType, int volGroupId, AudioStream *input, int hookId, int volume, int priority) {
-	debug(5, "IMuseDigital::startSound(%d)", soundId);
-
-	int l = allocSlot(priority);
-	if (l == -1) {
-		warning("IMuseDigital::startSound() Can't start sound - no free slots");
-		return;
-	}
-
-	Track *track = _track[l];
-	for (;;) {
-#ifdef _WIN32_WCE
-		_vm->parseEvents(); // timers are events, we need to consume them
-#endif
-		flushTracks();
-		if (!track->used) {
-			track->pan = 64;
-			track->vol = volume * 1000;
-			track->volFadeDest = 0;
-			track->volFadeStep = 0;
-			track->volFadeDelay = 0;
-			track->volFadeUsed = false;
-			track->soundId = soundId;
-			track->started = false;
-			track->volGroupId = volGroupId;
-			track->curHookId = hookId;
-			track->priority = priority;
-			track->curRegion = -1;
-			track->dataOffset = 0;
-			track->regionOffset = 0;
-			track->mod = 0;
-			track->mixerFlags = 0;
-			track->mixerPan = 0;
-			track->mixerVol = volume;
-			track->toBeRemoved = false;
-			track->readyToRemove = false;
-			track->soundType = soundType;
-
-			int bits = 0, freq = 0, channels = 0;
-
-			if (input) {
-				track->iteration = 0;
-				track->souStream = true;
-				track->soundName[0] = 0;
-			} else {
-				track->souStream = false;
-				strcpy(track->soundName, soundName);
-				track->soundHandle = _sound->openSound(soundId, soundName, soundType, volGroupId, -1);
-
-				if (track->soundHandle == NULL)
-					return;
-
-				bits = _sound->getBits(track->soundHandle);
-				channels = _sound->getChannels(track->soundHandle);
-				freq = _sound->getFreq(track->soundHandle);
-
-				if ((soundId == kTalkSoundID) && (soundType == IMUSE_BUNDLE)) {
-					if (_vm->_actorToPrintStrFor != 0xFF && _vm->_actorToPrintStrFor != 0) {
-						Actor *a = _vm->derefActor(_vm->_actorToPrintStrFor, "IMuseDigital::startSound");
-						freq = (freq * a->talkFrequency) / 256;
-						track->pan = a->talkPan;
-						track->vol = a->talkVolume * 1000;
-					}
-				}
-
-				assert(bits == 8 || bits == 12 || bits == 16);
-				assert(channels == 1 || channels == 2);
-				assert(0 < freq && freq <= 65535);
-
-				track->iteration = freq * channels;
-				if (channels == 2)
-					track->mixerFlags = SoundMixer::FLAG_STEREO | SoundMixer::FLAG_REVERSE_STEREO;
-
-				if ((bits == 12) || (bits == 16)) {
-					track->mixerFlags |= SoundMixer::FLAG_16BITS;
-					track->iteration *= 2;
-				} else if (bits == 8) {
-					track->mixerFlags |= SoundMixer::FLAG_UNSIGNED;
-				} else
-					error("IMuseDigital::startSound(): Can't handle %d bit samples", bits);
-			}
-
-			if (input) {
-				track->stream2 = input;
-				track->stream = NULL;
-				track->started = false;
-			} else {
-				int pan = (track->pan != 64) ? 2 * track->pan - 127 : 0;
-				int vol = track->vol / 1000;
-
-				if (track->volGroupId == 1)
-					vol = (vol * _volVoice) / 128;
-				if (track->volGroupId == 2)
-					vol = (vol * _volSfx) / 128;
-				if (track->volGroupId == 3)
-					vol = (vol * _volMusic) / 128;
-
-				track->mixerPan = pan;
-				track->mixerVol = vol;
-
-				// setup 1 second stream wrapped buffer
-				int32 streamBufferSize = track->iteration;
-				track->stream2 = NULL;
-				track->stream = makeAppendableAudioStream(freq, track->mixerFlags, streamBufferSize);
-				_vm->_mixer->playInputStream(&track->handle, track->stream, false, track->mixerVol, track->mixerPan, -1, false);
-				track->started = true;
-			}
-
-			track->used = true;
-			return;
-		}
-	}
-}
-
-void IMuseDigital::setPriority(int soundId, int priority) {
-	debug(5, "IMuseDigital::setPriority(%d, %d)", soundId, priority);
-	assert ((priority >= 0) && (priority <= 127));
-
-	for (int l = 0; l < MAX_DIGITAL_TRACKS; l++) {
-		Track *track = _track[l];
-		if ((track->soundId == soundId) && track->used && !track->toBeRemoved) {
-			track->priority = priority;
-		}
-	}
-}
-
-void IMuseDigital::setVolume(int soundId, int volume) {
-	debug(5, "IMuseDigital::setVolume(%d, %d)", soundId, volume);
-
-	for (int l = 0; l < MAX_DIGITAL_TRACKS; l++) {
-		Track *track = _track[l];
-		if ((track->soundId == soundId) && track->used && !track->toBeRemoved) {
-			track->vol = volume * 1000;
-		}
-	}
-}
-
-void IMuseDigital::setPan(int soundId, int pan) {
-	debug(5, "IMuseDigital::setPan(%d, %d)", soundId, pan);
-
-	for (int l = 0; l < MAX_DIGITAL_TRACKS; l++) {
-		Track *track = _track[l];
-		if ((track->soundId == soundId) && track->used && !track->toBeRemoved) {
-			track->pan = pan;
-		}
-	}
-}
-
-void IMuseDigital::selectVolumeGroup(int soundId, int volGroupId) {
-	debug(5, "IMuseDigital::setGroupVolume(%d, %d)", soundId, volGroupId);
-	assert((volGroupId >= 1) && (volGroupId <= 4));
-
-	if (volGroupId == 4)
-		volGroupId = 3;
-
-	for (int l = 0; l < MAX_DIGITAL_TRACKS; l++) {
-		Track *track = _track[l];
-		if ((track->soundId == soundId) && track->used && !track->toBeRemoved) {
-			track->volGroupId = volGroupId;
-		}
-	}
-}
-
-void IMuseDigital::setFade(int soundId, int destVolume, int delay60HzTicks) {
-	Common::StackLock lock(_mutex, "IMuseDigital::setFade()");
-	debug(5, "IMuseDigital::setFade(%d, %d, %d)", soundId, destVolume, delay60HzTicks);
-
-	for (int l = 0; l < MAX_DIGITAL_TRACKS; l++) {
-		Track *track = _track[l];
-		if ((track->soundId == soundId) && track->used && !track->toBeRemoved) {
-			track->volFadeDelay = delay60HzTicks;
-			track->volFadeDest = destVolume * 1000;
-			track->volFadeStep = (track->volFadeDest - track->vol) * 60 * (1000 / _callbackFps) / (1000 * delay60HzTicks);
-			track->volFadeUsed = true;
-		}
-	}
-}
-
-void IMuseDigital::fadeOutMusic(int fadeDelay) {
-	debug(5, "IMuseDigital::fadeOutMusic");
-	for (int l = 0; l < MAX_DIGITAL_TRACKS; l++) {
-		Track *track = _track[l];
-		if (track->used && !track->toBeRemoved && (track->volGroupId == IMUSE_VOLGRP_MUSIC)) {
-			cloneToFadeOutTrack(l, fadeDelay);
-			track->toBeRemoved = true;
-		}
-	}
-}
-
-int IMuseDigital::cloneToFadeOutTrack(int trackId, int fadeDelay) {
-	int fadeTrackId = -1;
-	Track *track;
-	Track *fadeTrack;
-
-	debug(5, "IMuseDigital::cloneToFadeOutTrack(%d, %d)", trackId, fadeDelay);
-
-	{
-		Common::StackLock lock(_mutex, "IMuseDigital::cloneToFadeOutTrack()");
-		for (int l = MAX_DIGITAL_TRACKS; l < MAX_DIGITAL_TRACKS + MAX_DIGITAL_FADETRACKS; l++) {
-			if (!_track[l]->used) {
-				fadeTrackId = l;
-				break;
-			}
-		}
-		if (fadeTrackId == -1)
-			error("IMuseDigital::cloneTofadeTrackId() Can't find free fade track");
-
-		track = _track[trackId];
-		fadeTrack = _track[fadeTrackId];
-		fadeTrack->pan = track->pan;
-		fadeTrack->vol = track->vol;
-		fadeTrack->volGroupId = track->volGroupId;
-		fadeTrack->priority = track->priority;
-		fadeTrack->soundId = track->soundId;
-		fadeTrack->dataOffset = track->dataOffset;
-		fadeTrack->regionOffset = track->regionOffset;
-		fadeTrack->curRegion = track->curRegion;
-		fadeTrack->curHookId = track->curHookId;
-		fadeTrack->iteration = track->iteration;
-		fadeTrack->mixerFlags = track->mixerFlags;
-		fadeTrack->mixerVol = track->mixerVol;
-		fadeTrack->mixerPan = track->mixerPan;
-		fadeTrack->mod = track->mod;
-		fadeTrack->toBeRemoved = track->toBeRemoved;
-		fadeTrack->readyToRemove = track->readyToRemove;
-		fadeTrack->souStream = track->souStream;
-		fadeTrack->started = track->started;
-		fadeTrack->stream2 = track->stream2;
-		strcpy(fadeTrack->soundName, track->soundName);
-		fadeTrack->soundType = track->soundType;
-		fadeTrack->soundHandle = _sound->cloneSound(track->soundHandle);
-		assert(fadeTrack->soundHandle);
-	}
-
-	fadeTrack->volFadeDelay = fadeDelay;
-	fadeTrack->volFadeDest = 0;
-	fadeTrack->volFadeStep = (fadeTrack->volFadeDest - fadeTrack->vol) * 60 * (1000 / _callbackFps) / (1000 * fadeDelay);
-	fadeTrack->volFadeUsed = true;
-
-	// setup 1 second stream wrapped buffer
-	int32 streamBufferSize = fadeTrack->iteration;
-	fadeTrack->stream = makeAppendableAudioStream(_sound->getFreq(fadeTrack->soundHandle), fadeTrack->mixerFlags, streamBufferSize);
-	_vm->_mixer->playInputStream(&fadeTrack->handle, fadeTrack->stream, false, fadeTrack->vol / 1000, fadeTrack->pan, -1, false);
-	fadeTrack->started = true;
-	fadeTrack->used = true;
-
-	return fadeTrackId;
-}
-
-} // End of namespace Scumm
+/* ScummVM - Scumm Interpreter

+ * Copyright (C) 2001-2004 The ScummVM project

+ *

+ * 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.

+ *

+ * $Header$

+ */

+

+#include "stdafx.h"

+#include "common/timer.h"

+

+#include "scumm/actor.h"

+#include "scumm/scumm.h"

+#include "scumm/sound.h"

+#include "scumm/imuse_digi/dimuse.h"

+#include "scumm/imuse_digi/dimuse_bndmgr.h"

+

+#include "sound/audiostream.h"

+#include "sound/mixer.h"

+

+namespace Scumm {

+

+int IMuseDigital::allocSlot(int priority) {

+	int l, lower_priority = 127;

+	int trackId = -1;

+

+	for (l = 0; l < MAX_DIGITAL_TRACKS; l++) {

+		if (!_track[l]->used) {

+			trackId = l;

+			break;

+		}

+	}

+

+	if (trackId == -1) {

+		debug(5, "IMuseDigital::startSound(): All slots are full");

+		for (l = 0; l < MAX_DIGITAL_TRACKS; l++) {

+			Track *track = _track[l];

+			if (track->used && !track->toBeRemoved &&

+					(lower_priority > track->priority) && !track->stream2)

+				lower_priority = track->priority;

+		}

+		if (lower_priority <= priority) {

+			for (l = 0; l < MAX_DIGITAL_TRACKS; l++) {

+				Track *track = _track[l];

+				if (track->used && !track->toBeRemoved &&

+						(lower_priority == track->priority) && !track->stream2) {

+					trackId = l;

+				}

+			}

+			assert(trackId != -1);

+			_track[trackId]->toBeRemoved = true;

+			debug(5, "IMuseDigital::startSound(): Removed sound %d from track %d", _track[trackId]->soundId, trackId);

+		} else {

+			debug(5, "IMuseDigital::startSound(): Priority sound too low");

+			return -1;

+		}

+	}

+

+	return trackId;

+}

+

+void IMuseDigital::startSound(int soundId, const char *soundName, int soundType, int volGroupId, AudioStream *input, int hookId, int volume, int priority) {

+	debug(5, "IMuseDigital::startSound(%d)", soundId);

+

+	int l = allocSlot(priority);

+	if (l == -1) {

+		warning("IMuseDigital::startSound() Can't start sound - no free slots");

+		return;

+	}

+

+	Track *track = _track[l];

+	for (;;) {

+#if defined(_WIN32_WCE) || defined (__PALM_OS__)

+		_vm->parseEvents(); // timers are events, we need to consume them

+#endif

+		flushTracks();

+		if (!track->used) {

+			track->pan = 64;

+			track->vol = volume * 1000;

+			track->volFadeDest = 0;

+			track->volFadeStep = 0;

+			track->volFadeDelay = 0;

+			track->volFadeUsed = false;

+			track->soundId = soundId;

+			track->started = false;

+			track->volGroupId = volGroupId;

+			track->curHookId = hookId;

+			track->priority = priority;

+			track->curRegion = -1;

+			track->dataOffset = 0;

+			track->regionOffset = 0;

+			track->mod = 0;

+			track->mixerFlags = 0;

+			track->mixerPan = 0;

+			track->mixerVol = volume;

+			track->toBeRemoved = false;

+			track->readyToRemove = false;

+			track->soundType = soundType;

+

+			int bits = 0, freq = 0, channels = 0;

+

+			if (input) {

+				track->iteration = 0;

+				track->souStream = true;

+				track->soundName[0] = 0;

+			} else {

+				track->souStream = false;

+				strcpy(track->soundName, soundName);

+				track->soundHandle = _sound->openSound(soundId, soundName, soundType, volGroupId, -1);

+

+				if (track->soundHandle == NULL)

+					return;

+

+				bits = _sound->getBits(track->soundHandle);

+				channels = _sound->getChannels(track->soundHandle);

+				freq = _sound->getFreq(track->soundHandle);

+

+				if ((soundId == kTalkSoundID) && (soundType == IMUSE_BUNDLE)) {

+					if (_vm->_actorToPrintStrFor != 0xFF && _vm->_actorToPrintStrFor != 0) {

+						Actor *a = _vm->derefActor(_vm->_actorToPrintStrFor, "IMuseDigital::startSound");

+						freq = (freq * a->talkFrequency) / 256;

+						track->pan = a->talkPan;

+						track->vol = a->talkVolume * 1000;

+					}

+				}

+

+				assert(bits == 8 || bits == 12 || bits == 16);

+				assert(channels == 1 || channels == 2);

+				assert(0 < freq && freq <= 65535);

+

+				track->iteration = freq * channels;

+				if (channels == 2)

+					track->mixerFlags = SoundMixer::FLAG_STEREO | SoundMixer::FLAG_REVERSE_STEREO;

+

+				if ((bits == 12) || (bits == 16)) {

+					track->mixerFlags |= SoundMixer::FLAG_16BITS;

+					track->iteration *= 2;

+				} else if (bits == 8) {

+					track->mixerFlags |= SoundMixer::FLAG_UNSIGNED;

+				} else

+					error("IMuseDigital::startSound(): Can't handle %d bit samples", bits);

+			}

+

+			if (input) {

+				track->stream2 = input;

+				track->stream = NULL;

+				track->started = false;

+			} else {

+				int pan = (track->pan != 64) ? 2 * track->pan - 127 : 0;

+				int vol = track->vol / 1000;

+

+				if (track->volGroupId == 1)

+					vol = (vol * _volVoice) / 128;

+				if (track->volGroupId == 2)

+					vol = (vol * _volSfx) / 128;

+				if (track->volGroupId == 3)

+					vol = (vol * _volMusic) / 128;

+

+				track->mixerPan = pan;

+				track->mixerVol = vol;

+

+				// setup 1 second stream wrapped buffer

+				int32 streamBufferSize = track->iteration;

+				track->stream2 = NULL;

+				track->stream = makeAppendableAudioStream(freq, track->mixerFlags, streamBufferSize);

+				_vm->_mixer->playInputStream(&track->handle, track->stream, false, track->mixerVol, track->mixerPan, -1, false);

+				track->started = true;

+			}

+

+			track->used = true;

+			return;

+		}

+	}

+}

+

+void IMuseDigital::setPriority(int soundId, int priority) {

+	debug(5, "IMuseDigital::setPriority(%d, %d)", soundId, priority);

+	assert ((priority >= 0) && (priority <= 127));

+

+	for (int l = 0; l < MAX_DIGITAL_TRACKS; l++) {

+		Track *track = _track[l];

+		if ((track->soundId == soundId) && track->used && !track->toBeRemoved) {

+			track->priority = priority;

+		}

+	}

+}

+

+void IMuseDigital::setVolume(int soundId, int volume) {

+	debug(5, "IMuseDigital::setVolume(%d, %d)", soundId, volume);

+

+	for (int l = 0; l < MAX_DIGITAL_TRACKS; l++) {

+		Track *track = _track[l];

+		if ((track->soundId == soundId) && track->used && !track->toBeRemoved) {

+			track->vol = volume * 1000;

+		}

+	}

+}

+

+void IMuseDigital::setPan(int soundId, int pan) {

+	debug(5, "IMuseDigital::setPan(%d, %d)", soundId, pan);

+

+	for (int l = 0; l < MAX_DIGITAL_TRACKS; l++) {

+		Track *track = _track[l];

+		if ((track->soundId == soundId) && track->used && !track->toBeRemoved) {

+			track->pan = pan;

+		}

+	}

+}

+

+void IMuseDigital::selectVolumeGroup(int soundId, int volGroupId) {

+	debug(5, "IMuseDigital::setGroupVolume(%d, %d)", soundId, volGroupId);

+	assert((volGroupId >= 1) && (volGroupId <= 4));

+

+	if (volGroupId == 4)

+		volGroupId = 3;

+

+	for (int l = 0; l < MAX_DIGITAL_TRACKS; l++) {

+		Track *track = _track[l];

+		if ((track->soundId == soundId) && track->used && !track->toBeRemoved) {

+			track->volGroupId = volGroupId;

+		}

+	}

+}

+

+void IMuseDigital::setFade(int soundId, int destVolume, int delay60HzTicks) {

+	Common::StackLock lock(_mutex, "IMuseDigital::setFade()");

+	debug(5, "IMuseDigital::setFade(%d, %d, %d)", soundId, destVolume, delay60HzTicks);

+

+	for (int l = 0; l < MAX_DIGITAL_TRACKS; l++) {

+		Track *track = _track[l];

+		if ((track->soundId == soundId) && track->used && !track->toBeRemoved) {

+			track->volFadeDelay = delay60HzTicks;

+			track->volFadeDest = destVolume * 1000;

+			track->volFadeStep = (track->volFadeDest - track->vol) * 60 * (1000 / _callbackFps) / (1000 * delay60HzTicks);

+			track->volFadeUsed = true;

+		}

+	}

+}

+

+void IMuseDigital::fadeOutMusic(int fadeDelay) {

+	debug(5, "IMuseDigital::fadeOutMusic");

+	for (int l = 0; l < MAX_DIGITAL_TRACKS; l++) {

+		Track *track = _track[l];

+		if (track->used && !track->toBeRemoved && (track->volGroupId == IMUSE_VOLGRP_MUSIC)) {

+			cloneToFadeOutTrack(l, fadeDelay);

+			track->toBeRemoved = true;

+		}

+	}

+}

+

+int IMuseDigital::cloneToFadeOutTrack(int trackId, int fadeDelay) {

+	int fadeTrackId = -1;

+	Track *track;

+	Track *fadeTrack;

+

+	debug(5, "IMuseDigital::cloneToFadeOutTrack(%d, %d)", trackId, fadeDelay);

+

+	{

+		Common::StackLock lock(_mutex, "IMuseDigital::cloneToFadeOutTrack()");

+		for (int l = MAX_DIGITAL_TRACKS; l < MAX_DIGITAL_TRACKS + MAX_DIGITAL_FADETRACKS; l++) {

+			if (!_track[l]->used) {

+				fadeTrackId = l;

+				break;

+			}

+		}

+		if (fadeTrackId == -1)

+			error("IMuseDigital::cloneTofadeTrackId() Can't find free fade track");

+

+		track = _track[trackId];

+		fadeTrack = _track[fadeTrackId];

+		fadeTrack->pan = track->pan;

+		fadeTrack->vol = track->vol;

+		fadeTrack->volGroupId = track->volGroupId;

+		fadeTrack->priority = track->priority;

+		fadeTrack->soundId = track->soundId;

+		fadeTrack->dataOffset = track->dataOffset;

+		fadeTrack->regionOffset = track->regionOffset;

+		fadeTrack->curRegion = track->curRegion;

+		fadeTrack->curHookId = track->curHookId;

+		fadeTrack->iteration = track->iteration;

+		fadeTrack->mixerFlags = track->mixerFlags;

+		fadeTrack->mixerVol = track->mixerVol;

+		fadeTrack->mixerPan = track->mixerPan;

+		fadeTrack->mod = track->mod;

+		fadeTrack->toBeRemoved = track->toBeRemoved;

+		fadeTrack->readyToRemove = track->readyToRemove;

+		fadeTrack->souStream = track->souStream;

+		fadeTrack->started = track->started;

+		fadeTrack->stream2 = track->stream2;

+		strcpy(fadeTrack->soundName, track->soundName);

+		fadeTrack->soundType = track->soundType;

+		fadeTrack->soundHandle = _sound->cloneSound(track->soundHandle);

+		assert(fadeTrack->soundHandle);

+	}

+

+	fadeTrack->volFadeDelay = fadeDelay;

+	fadeTrack->volFadeDest = 0;

+	fadeTrack->volFadeStep = (fadeTrack->volFadeDest - fadeTrack->vol) * 60 * (1000 / _callbackFps) / (1000 * fadeDelay);

+	fadeTrack->volFadeUsed = true;

+

+	// setup 1 second stream wrapped buffer

+	int32 streamBufferSize = fadeTrack->iteration;

+	fadeTrack->stream = makeAppendableAudioStream(_sound->getFreq(fadeTrack->soundHandle), fadeTrack->mixerFlags, streamBufferSize);

+	_vm->_mixer->playInputStream(&fadeTrack->handle, fadeTrack->stream, false, fadeTrack->vol / 1000, fadeTrack->pan, -1, false);

+	fadeTrack->started = true;

+	fadeTrack->used = true;

+

+	return fadeTrackId;

+}

+

+} // End of namespace Scumm






More information about the Scummvm-git-logs mailing list