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

Pawel Kolodziejski aquadran at users.sourceforge.net
Sun Sep 12 07:22:17 CEST 2004


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

Modified Files:
	dimuse_script.cpp dimuse_track.cpp 
Log Message:
fixed endlines

Index: dimuse_script.cpp
===================================================================
RCS file: /cvsroot/scummvm/scummvm/scumm/imuse_digi/dimuse_script.cpp,v
retrieving revision 1.27
retrieving revision 1.28
diff -u -d -r1.27 -r1.28
--- dimuse_script.cpp	12 Sep 2004 11:07:32 -0000	1.27
+++ dimuse_script.cpp	12 Sep 2004 14:20:57 -0000	1.28
@@ -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);

-#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

+/* 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.34
retrieving revision 1.35
diff -u -d -r1.34 -r1.35
--- dimuse_track.cpp	12 Sep 2004 11:07:32 -0000	1.34
+++ dimuse_track.cpp	12 Sep 2004 14:20:57 -0000	1.35
@@ -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 (;;) {

-#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

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