[Scummvm-cvs-logs] SF.net SVN: scummvm:[42375] scummvm/trunk/engines/sci

thebluegr at users.sourceforge.net thebluegr at users.sourceforge.net
Sat Jul 11 08:53:40 CEST 2009


Revision: 42375
          http://scummvm.svn.sourceforge.net/scummvm/?rev=42375&view=rev
Author:   thebluegr
Date:     2009-07-11 06:53:39 +0000 (Sat, 11 Jul 2009)

Log Message:
-----------
Applied patch 2818733 - "SCI: Timer iterator for audio resources played via doSound"

Modified Paths:
--------------
    scummvm/trunk/engines/sci/engine/ksound.cpp
    scummvm/trunk/engines/sci/sfx/iterator.cpp
    scummvm/trunk/engines/sci/sfx/iterator.h
    scummvm/trunk/engines/sci/sfx/iterator_internal.h

Modified: scummvm/trunk/engines/sci/engine/ksound.cpp
===================================================================
--- scummvm/trunk/engines/sci/engine/ksound.cpp	2009-07-11 06:43:01 UTC (rev 42374)
+++ scummvm/trunk/engines/sci/engine/ksound.cpp	2009-07-11 06:53:39 UTC (rev 42375)
@@ -148,6 +148,9 @@
 	return songit_new(song->data, song->size, type, id);
 }
 
+SongIterator *build_timeriterator(EngineState *s, int delta) {
+	return new_timer_iterator(delta);
+}
 
 void process_sound_events(EngineState *s) { /* Get all sound events, apply their changes to the heap */
 	int result;
@@ -798,6 +801,7 @@
 		int looping = GET_SEL32V(obj, loop);
 		//int vol = GET_SEL32V(obj, vol);
 		int pri = GET_SEL32V(obj, pri);
+		int sampleLen = 0;
 		Song *song = s->_sound._songlib.findSong(handle);
 
 		if (GET_SEL32V(obj, nodePtr) && (song && number != song->_resourceNum)) {
@@ -815,8 +819,11 @@
 				s->_version >= SCI_VERSION_1_1) {
 				// Found a relevant audio resource, play it
 				s->_sound.stopAudio();
-				PUT_SEL32V(obj, signal, s->_sound.startAudio(65535, number));
-				return s->r_acc;
+				warning("Initializing audio resource instead of requested sound resource %d\n", number);
+				sampleLen = s->_sound.startAudio(65535, number);
+				// Also create iterator, that will fire SI_FINISHED event, when the sound is done playing
+				s->_sound.sfx_add_song(build_timeriterator(s, sampleLen), 0, handle, number);
+				PUT_SEL32V(obj, signal, sampleLen);
 			} else {
 				if (!s->resmgr->testResource(ResourceId(kResourceTypeSound, number))) {
 					warning("Could not open song number %d", number);
@@ -825,11 +832,11 @@
 					PUT_SEL32V(obj, signal, -1);
 					return s->r_acc;
 				}
+				debugC(2, kDebugLevelSound, "Initializing song number %d\n", number);
+				s->_sound.sfx_add_song(build_iterator(s, number, SCI_SONG_ITERATOR_TYPE_SCI1,
+				                          handle), 0, handle, number);
 			}
 
-			debugC(2, kDebugLevelSound, "Initializing song number %d\n", number);
-			s->_sound.sfx_add_song(build_iterator(s, number, SCI_SONG_ITERATOR_TYPE_SCI1,
-			                          handle), 0, handle, number);
 			PUT_SEL32(obj, nodePtr, obj);
 			PUT_SEL32(obj, handle, obj);
 		}

Modified: scummvm/trunk/engines/sci/sfx/iterator.cpp
===================================================================
--- scummvm/trunk/engines/sci/sfx/iterator.cpp	2009-07-11 06:43:01 UTC (rev 42374)
+++ scummvm/trunk/engines/sci/sfx/iterator.cpp	2009-07-11 06:53:39 UTC (rev 42375)
@@ -1164,6 +1164,41 @@
 		return SI_FINISHED;
 }
 
+/**********************/
+/*-- Timer iterator --*/
+/**********************/
+TimerSongIterator::TimerSongIterator(int delta)
+	: _delta(delta) {
+}
+
+int TimerSongIterator::nextCommand(byte *buf, int *result) {
+	if (_delta) {
+	   return _delta;
+	}
+	return SI_FINISHED;
+}
+
+SongIterator *TimerSongIterator::handleMessage(Message msg) {
+	return NULL;
+}
+
+int TimerSongIterator::getTimepos() {
+	return 0;
+}
+
+Audio::AudioStream *TimerSongIterator::getAudioStream() {
+	return NULL;
+}
+
+SongIterator *TimerSongIterator::clone(int delta) {
+	TimerSongIterator *newit = new TimerSongIterator(*this);
+	return newit;
+}
+
+SongIterator *new_timer_iterator(int delta) {
+	return new TimerSongIterator(delta);
+}
+
 /**********************************/
 /*-- Fast-forward song iterator --*/
 /**********************************/

Modified: scummvm/trunk/engines/sci/sfx/iterator.h
===================================================================
--- scummvm/trunk/engines/sci/sfx/iterator.h	2009-07-11 06:43:01 UTC (rev 42374)
+++ scummvm/trunk/engines/sci/sfx/iterator.h	2009-07-11 06:53:39 UTC (rev 42375)
@@ -281,6 +281,12 @@
 */
 SongIterator *songit_new(byte *data, uint size, SongIteratorType type, songit_id_t id);
 
+/* Constructs a new song timer iterator object
+** Parameters: (int) delta: The delta after which to fire SI_FINISHED
+** Returns   : (SongIterator *) A newly allocated but uninitialized song
+**             iterator
+*/
+SongIterator *new_timer_iterator(int delta);
 
 /* Handles a message to the song iterator
 ** Parameters: (SongIterator **): A reference to the variable storing the song iterator

Modified: scummvm/trunk/engines/sci/sfx/iterator_internal.h
===================================================================
--- scummvm/trunk/engines/sci/sfx/iterator_internal.h	2009-07-11 06:43:01 UTC (rev 42374)
+++ scummvm/trunk/engines/sci/sfx/iterator_internal.h	2009-07-11 06:53:39 UTC (rev 42375)
@@ -181,6 +181,28 @@
 
 #define PLAYMASK_NONE 0x0
 
+/***************************/
+/*--------- Timer ---------*/
+/***************************/
+
+/**
+ * A song iterator which waits a specified time and then fires
+ * SI_FINISHED. Used by DoSound, where audio resources are played (SCI1)
+ */
+class TimerSongIterator : public SongIterator {
+protected:
+	int _delta; /**!< Remaining time */
+
+public:
+	TimerSongIterator(int delta);
+
+	int nextCommand(byte *buf, int *result);
+	Audio::AudioStream *getAudioStream();
+	SongIterator *handleMessage(Message msg);
+	int getTimepos();
+	SongIterator *clone(int delta);
+};
+
 /**********************************/
 /*--------- Fast Forward ---------*/
 /**********************************/


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