[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