[Scummvm-cvs-logs] SF.net SVN: scummvm:[46197] scummvm/trunk/engines/sci/sfx/soundcmd.cpp

thebluegr at users.sourceforge.net thebluegr at users.sourceforge.net
Sun Nov 29 15:48:15 CET 2009


Revision: 46197
          http://scummvm.svn.sourceforge.net/scummvm/?rev=46197&view=rev
Author:   thebluegr
Date:     2009-11-29 14:48:15 +0000 (Sun, 29 Nov 2009)

Log Message:
-----------
Started assigning the code from Greg's SCI engine to our sound commands - still WIP

Modified Paths:
--------------
    scummvm/trunk/engines/sci/sfx/soundcmd.cpp

Modified: scummvm/trunk/engines/sci/sfx/soundcmd.cpp
===================================================================
--- scummvm/trunk/engines/sci/sfx/soundcmd.cpp	2009-11-29 14:44:12 UTC (rev 46196)
+++ scummvm/trunk/engines/sci/sfx/soundcmd.cpp	2009-11-29 14:48:15 UTC (rev 46197)
@@ -131,10 +131,8 @@
 
 	_hasNodePtr = (((SciEngine*)g_engine)->getKernel()->_selectorCache.nodePtr != -1);
 
-#ifndef USE_OLD_MUSIC_FUNCTIONS
 	_music = new SciMusic();
 	_music->init();
-#endif
 
 	switch (doSoundVersion) {
 	case SCI_VERSION_0_EARLY:
@@ -351,6 +349,31 @@
 			PUT_SEL32V(_segMan, obj, signal, 0);
 		}
 	}
+
+#if 0
+	if (hobj == 0)
+		return;
+	Object obj(hobj);
+	HEAPHANDLE hptr = obj.getProperty(44);
+	if (hptr) {
+		sciSound *pSnd = (sciSound *)heap2Ptr(hptr);
+		if (pSnd->resnum != obj.getProperty(43)) { // another sound loaded into struct
+			KillSnd(hobj);
+			InitSnd(hobj);
+		}
+		ResMgr.ResLock(SCI_RES_SOUND, pSnd->resnum);
+		obj.setProperty(93, 0x1234/*res->getHandle()*/); // handle
+		obj.setProperty(17, 0);	// signal
+		obj.setProperty(94, 0);	// min
+		obj.setProperty(95, 0);	// sec
+		obj.setProperty(96, 0);	// frame
+		pSnd->loop = (obj.getProperty(6) == 0xFFFF ? 1 : 0);	// loop
+		pSnd->prio = obj.getProperty(63);	// priority
+		pSnd->volume = obj.getProperty(97);	// vol
+		//ChangeSndState(hobj);
+		_audio->soundPlay(pSnd);
+	}
+#endif
 }
 
 void SoundCommandParser::cmdDummy(reg_t obj, SongHandle handle, int value) {
@@ -374,6 +397,22 @@
 		if (!_hasNodePtr)
 			PUT_SEL32V(_segMan, obj, handle, 0x0000);
 	}
+
+#if 0
+	if (hobj == 0)
+		return;
+	Object obj(hobj);
+	StopSnd(hobj);
+	HEAPHANDLE hptr = obj.getProperty(44);	// nodePtr
+	if (hptr) {
+		sciSound *pSnd = (sciSound *)heap2Ptr(hptr);
+		_audio->soundKill(pSnd);
+		ResMgr.ResUnload(SCI_RES_SOUND, pSnd->resnum);
+		_soundList->DeleteNode(hptr);
+		heapDisposePtr(hptr);
+	}
+	obj.setProperty(44, 0);	// nodePtr
+#endif
 }
 
 void SoundCommandParser::cmdStopHandle(reg_t obj, SongHandle handle, int value) {
@@ -381,6 +420,20 @@
 
 	if (_hasNodePtr)
 		PUT_SEL32V(_segMan, obj, signal, SIGNAL_OFFSET);
+
+#if 0
+	if (hobj == 0)
+		return;
+	Object obj(hobj);
+	obj.setProperty(93, 0);	// handle
+	obj.setProperty(17, 0xFFFF);	// signal
+	sciSound *pSnd = (sciSound *)heap2Ptr(obj.getProperty(44));
+	if (pSnd) {
+		pSnd->dataInc = 0;
+		pSnd->signal = 0xFFFF;
+		_audio->soundStop(pSnd);
+	}
+#endif
 }
 
 void SoundCommandParser::cmdSuspendHandle(reg_t obj, SongHandle handle, int value) {
@@ -388,6 +441,21 @@
 		changeHandleStatus(obj, handle, SOUND_STATUS_SUSPENDED);
 	else
 		changeHandleStatus(obj, handle, value ? SOUND_STATUS_SUSPENDED : SOUND_STATUS_PLAYING);
+
+#if 0
+	// PauseSnd(argv[2], argv[3]); - PauseSnd(HEAPHANDLE hobj, uint16 w)
+	if (hobj == 0)
+		return;
+	Object obj(hobj);
+	HEAPHANDLE hnode = obj.getProperty(44);	// nodePtr
+	if (!hnode)
+		return;
+	sciSound *pSnd = (sciSound *)heap2Ptr(hnode);
+	if (w)
+		_audio->soundPause(pSnd);
+	else
+		_audio->soundPlay(pSnd);
+#endif
 }
 
 void SoundCommandParser::cmdResumeHandle(reg_t obj, SongHandle handle, int value) {
@@ -395,6 +463,8 @@
 }
 
 void SoundCommandParser::cmdMuteSound(reg_t obj, SongHandle handle, int value) {
+	//_acc = _music->SoundOn(argc > 1 ? argv[2] : 0xFF);
+
 	// TODO
 
 	/* if there's a parameter, we're setting it.  Otherwise, we're querying it. */
@@ -407,10 +477,9 @@
 }
 
 void SoundCommandParser::cmdVolume(reg_t obj, SongHandle handle, int value) {
-	if (obj != SIGNAL_REG)
-		_state->sfx_setVolume(obj.toSint16());
-
-	_acc = make_reg(0, _state->sfx_getVolume());
+	if (_argc > 1)
+		_music->soundSetMasterVolume(obj.toSint16());
+	_acc = make_reg(0, _music->soundGetMasterVolume());
 }
 
 void SoundCommandParser::cmdFadeHandle(reg_t obj, SongHandle handle, int value) {
@@ -446,36 +515,43 @@
 			PUT_SEL32V(_segMan, obj, signal, SIGNAL_OFFSET);
 		}
 	}
+
+#if 0
+	// FadeSnd(argv[2], argv[3], argv[4], argv[5]);
+
+//void SciEngine::FadeSnd(HEAPHANDLE hobj, uint16 tVolume, uint16 tickerstep, int16 fadestep) {
+	if (hobj == 0)
+		return;
+	Object obj(hobj);
+	HEAPHANDLE hnode = obj.getProperty(44);	// nodePtr
+	if (!hnode)
+		return;
+	sciSound *pSnd = (sciSound *)heap2Ptr(hnode);
+	pSnd->FadeTo = tVolume;
+	pSnd->FadeStep = pSnd->volume > tVolume ? -fadestep : fadestep;
+	pSnd->FadeTickerStep = tickerstep * 16667 / _audio->soundGetTempo();
+	pSnd->FadeTicker = 0;
+//}
+#endif
 }
 
 void SoundCommandParser::cmdGetPolyphony(reg_t obj, SongHandle handle, int value) {
 	_acc = make_reg(0, _state->sfx_get_player_polyphony());
+	// TODO: Amiga music
+	//_acc = make_reg(0, _music->soundGetVoices());
 }
 
-void cmdGetPlayNext(EngineState *s, reg_t obj, SongHandle handle, int value) {
-	// TODO
-	// _state->sfx_all_stop();
-}
-
 void SoundCommandParser::cmdUpdateHandle(reg_t obj, SongHandle handle, int value) {
-	// FIXME: Get these from the sound server
-	int signal = 0;
-	int min = 0;
-	int sec = 0;
-	int frame = 0;
+	if (!GET_SEL32(_segMan, obj, nodePtr).isNull()) {
+		int16 loop = GET_SEL32V(_segMan, obj, loop);
+		int16 vol = GET_SEL32V(_segMan, obj, vol);
+		int16 priority = GET_SEL32V(_segMan, obj, priority);
 
-	// FIXME: Update the sound server state with 'vol'
-	//int vol = GET_SEL32V(segMan, obj, vol);
-
-	_state->sfx_song_set_loops(handle, GET_SEL32V(_segMan, obj, loop));
-	_state->sfx_song_renice(handle, GET_SEL32V(_segMan, obj, pri));
-
-	debugC(2, kDebugLevelSound, "[sound01-update-handle] -- CUE %04x:%04x", PRINT_REG(obj));
-
-	PUT_SEL32V(_segMan, obj, signal, signal);
-	PUT_SEL32V(_segMan, obj, min, min);
-	PUT_SEL32V(_segMan, obj, sec, sec);
-	PUT_SEL32V(_segMan, obj, frame, frame);
+		// TODO: pSnd
+		//pSnd->loop = (loop == 0xFFFF ? 1 : 0);
+		//_music->soundSetVolume(pSnd, vol);
+		//_music->soundSetPriority(pSnd, prio);
+	}
 }
 
 void SoundCommandParser::cmdUpdateCues(reg_t obj, SongHandle handle, int value) {
@@ -546,6 +622,35 @@
 		PUT_SEL32V(_segMan, obj, sec, sec);
 		PUT_SEL32V(_segMan, obj, frame, frame);
 	}
+
+#if 0
+	if (hobj == 0)
+		return;
+	Object obj(hobj);
+	HEAPHANDLE hnode = obj.getProperty(44);	// nodePtr
+	if (hnode) {
+		sciSound *pSnd = (sciSound *)heap2Ptr(hnode);
+		switch (pSnd->signal) {
+		case 0:
+			if (pSnd->dataInc != obj.getProperty(92)) { // dataInc
+				obj.setProperty(92, pSnd->dataInc);	// dataInc
+				obj.setProperty(17, pSnd->dataInc + 127); // signal
+			}
+			break;
+		case 0xFFFF:
+			StopSnd(hobj);
+			break;
+		default:
+			obj.setProperty(17, pSnd->signal);	// signal
+		}
+		//D13E
+		pSnd->signal = 0;
+		obj.setProperty(94, pSnd->ticker / 3600); // .min
+		obj.setProperty(95, pSnd->ticker % 3600 / 60); // .sec
+		obj.setProperty(96, pSnd->ticker); // .frame
+		obj.setProperty(97, pSnd->volume); // volume
+	}
+#endif
 }
 
 void SoundCommandParser::cmdSendMidi(reg_t obj, SongHandle handle, int value) {
@@ -559,6 +664,7 @@
 }
 void SoundCommandParser::cmdHoldHandle(reg_t obj, SongHandle handle, int value) {
 	_state->sfx_song_set_hold(handle, value);
+	// TODO
 }
 
 void SoundCommandParser::cmdGetAudioCapability(reg_t obj, SongHandle handle, int value) {
@@ -571,17 +677,49 @@
 
 void SoundCommandParser::cmdSetHandleVolume(reg_t obj, SongHandle handle, int value) {
 	// TODO
+#if 0
+	if (hobj == 0)
+		return;
+	Object obj(hobj);
+	sciSound *pSnd;
+	HEAPHANDLE hnode = obj.getProperty(44);	// nodePtr
+	if (hnode && (pSnd = (sciSound *)heap2Ptr(hnode))) {
+		if (pSnd->volume != w) {
+			pSnd->volume = w;
+			_audio->soundSetVolume(pSnd, w);
+			obj.setProperty(97, w);	// volume
+		}
+	}
+#endif
 }
 
 void SoundCommandParser::cmdSetHandlePriority(reg_t obj, SongHandle handle, int value) {
 	script_set_priority(_resMan, _segMan, _state, obj, value);
+
+#if 0
+	if (hobj == 0)
+		return;
+	Object obj(hobj);
+	sciSound *pSnd;
+	HEAPHANDLE hnode = obj.getProperty(44);	// nodePtr
+	if (hnode && (pSnd = (sciSound *)heap2Ptr(hnode))) {
+		if (w == 0xFFFF) {
+			//pSnd->prio=0;field_15B=0
+			obj.setProperty(102, obj.getProperty(102) & 0xFD);//flags
+		} else {
+			//pSnd->field_15B=1;
+			obj.setProperty(102, obj.getProperty(102) | 2);//flags
+			//DoSOund(0xF,hobj,w)
+		}
+	}
+#endif
 }
 
 void SoundCommandParser::cmdSetHandleLoop(reg_t obj, SongHandle handle, int value) {
 	if (!GET_SEL32(_segMan, obj, nodePtr).isNull()) {
 		uint16 looping = (value == -1) ? 1 : 0xFFFF;
 		_state->sfx_song_set_loops(handle, looping);
-		PUT_SEL32V(_segMan, obj, loop, looping);
+		PUT_SEL32V(_segMan, obj, loop, (value == -1) ? 0xFFFF : 1);
 	}
 }
 
@@ -594,6 +732,19 @@
  		_state->sfx_song_set_loops(handle, GET_SEL32V(_segMan, obj, loop));
  		script_set_priority(_resMan, _segMan, _state, obj, GET_SEL32V(_segMan, obj, pri));
  	}
+
+#if 0
+	if (!GET_SEL32(_segMan, obj, nodePtr).isNull()) {
+		int16 loop = GET_SEL32V(_segMan, obj, loop);
+		int16 vol = GET_SEL32V(_segMan, obj, vol);
+		int16 priority = GET_SEL32V(_segMan, obj, priority);
+
+		// TODO: pSnd
+		//pSnd->loop = (loop == 0xFFFF ? 1 : 0);
+		//_music->soundSetVolume(pSnd, vol);
+		//_music->soundSetPriority(pSnd, prio);
+	}
+#endif
 }
 
 } // End of namespace Sci


This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.




More information about the Scummvm-git-logs mailing list