Ticket #9040: scummvm-sci-timeriterator.patch

File scummvm-sci-timeriterator.patch, 4.5 KB (added by m-kiewitz, 11 years ago)
  • engine/ksound.cpp

     
    148148        return songit_new(song->data, song->size, type, id);
    149149}
    150150
     151SongIterator *build_timeriterator(EngineState *s, int delta) {
     152        return new_timer_iterator(delta);
     153}
    151154
    152155void process_sound_events(EngineState *s) { /* Get all sound events, apply their changes to the heap */
    153156        int result;
     
    798801                int looping = GET_SEL32V(obj, loop);
    799802                //int vol = GET_SEL32V(obj, vol);
    800803                int pri = GET_SEL32V(obj, pri);
     804                int sampleLen = 0;
    801805                Song *song = s->_sound._songlib.findSong(handle);
    802806
    803807                if (GET_SEL32V(obj, nodePtr) && (song && number != song->_resourceNum)) {
     
    815819                                s->_version >= SCI_VERSION_1_1) {
    816820                                // Found a relevant audio resource, play it
    817821                                s->_sound.stopAudio();
    818                                 PUT_SEL32V(obj, signal, s->_sound.startAudio(65535, number));
    819                                 return s->r_acc;
     822                                warning("Initializing audio resource instead of requested sound resource %d\n", number);
     823                                sampleLen = s->_sound.startAudio(65535, number);
     824                                // Also create iterator, that will fire SI_FINISHED event, when the sound is done playing
     825                                s->_sound.sfx_add_song(build_timeriterator(s, sampleLen), 0, handle, number);
     826                                PUT_SEL32V(obj, signal, sampleLen);
    820827                        } else {
    821828                                if (!s->resmgr->testResource(ResourceId(kResourceTypeSound, number))) {
    822829                                        warning("Could not open song number %d", number);
     
    825832                                        PUT_SEL32V(obj, signal, -1);
    826833                                        return s->r_acc;
    827834                                }
     835                                debugC(2, kDebugLevelSound, "Initializing song number %d\n", number);
     836                                s->_sound.sfx_add_song(build_iterator(s, number, SCI_SONG_ITERATOR_TYPE_SCI1,
     837                                                          handle), 0, handle, number);
    828838                        }
    829839
    830                         debugC(2, kDebugLevelSound, "Initializing song number %d\n", number);
    831                         s->_sound.sfx_add_song(build_iterator(s, number, SCI_SONG_ITERATOR_TYPE_SCI1,
    832                                                   handle), 0, handle, number);
    833840                        PUT_SEL32(obj, nodePtr, obj);
    834841                        PUT_SEL32(obj, handle, obj);
    835842                }
  • sfx/iterator.cpp

     
    11641164                return SI_FINISHED;
    11651165}
    11661166
     1167/**********************/
     1168/*-- Timer iterator --*/
     1169/**********************/
     1170TimerSongIterator::TimerSongIterator(int delta)
     1171        : _delta(delta) {
     1172}
     1173
     1174int TimerSongIterator::nextCommand(byte *buf, int *result) {
     1175        if (_delta) {
     1176           return _delta;
     1177        }
     1178        return SI_FINISHED;
     1179}
     1180
     1181SongIterator *TimerSongIterator::handleMessage(Message msg) {
     1182        return NULL;
     1183}
     1184
     1185int TimerSongIterator::getTimepos() {
     1186        return 0;
     1187}
     1188
     1189Audio::AudioStream *TimerSongIterator::getAudioStream() {
     1190        return NULL;
     1191}
     1192
     1193SongIterator *TimerSongIterator::clone(int delta) {
     1194        TimerSongIterator *newit = new TimerSongIterator(*this);
     1195        return newit;
     1196}
     1197
     1198SongIterator *new_timer_iterator(int delta) {
     1199        return new TimerSongIterator(delta);
     1200}
     1201
    11671202/**********************************/
    11681203/*-- Fast-forward song iterator --*/
    11691204/**********************************/
  • sfx/iterator.h

     
    281281*/
    282282SongIterator *songit_new(byte *data, uint size, SongIteratorType type, songit_id_t id);
    283283
     284/* Constructs a new song timer iterator object
     285** Parameters: (int) delta: The delta after which to fire SI_FINISHED
     286** Returns   : (SongIterator *) A newly allocated but uninitialized song
     287**             iterator
     288*/
     289SongIterator *new_timer_iterator(int delta);
    284290
    285291/* Handles a message to the song iterator
    286292** Parameters: (SongIterator **): A reference to the variable storing the song iterator
  • sfx/iterator_internal.h

     
    181181
    182182#define PLAYMASK_NONE 0x0
    183183
     184/***************************/
     185/*--------- Timer ---------*/
     186/***************************/
     187
     188/**
     189 * A song iterator which waits a specified time and then fires
     190 * SI_FINISHED. Used by DoSound, where audio resources are played (SCI1)
     191 */
     192class TimerSongIterator : public SongIterator {
     193protected:
     194        int _delta; /**!< Remaining time */
     195
     196public:
     197        TimerSongIterator(int delta);
     198
     199        int nextCommand(byte *buf, int *result);
     200        Audio::AudioStream *getAudioStream();
     201        SongIterator *handleMessage(Message msg);
     202        int getTimepos();
     203        SongIterator *clone(int delta);
     204};
     205
    184206/**********************************/
    185207/*--------- Fast Forward ---------*/
    186208/**********************************/