From 5910e32b36d99a7b417f58a98b6399815aff724b Mon Sep 17 00:00:00 2001 From: Filippos Karapetis Date: Wed, 4 Nov 2009 16:11:46 +0000 Subject: Applied patch #2891232 - "SCI sfx: Let each SongIterator remap its own channels" svn-id: r45672 --- engines/sci/sfx/iterator.cpp | 46 ++++++++++++++++++------------------- engines/sci/sfx/iterator.h | 2 ++ engines/sci/sfx/iterator_internal.h | 4 ---- 3 files changed, 25 insertions(+), 27 deletions(-) (limited to 'engines') diff --git a/engines/sci/sfx/iterator.cpp b/engines/sci/sfx/iterator.cpp index 69fedbd456..53d4de23c5 100644 --- a/engines/sci/sfx/iterator.cpp +++ b/engines/sci/sfx/iterator.cpp @@ -376,6 +376,18 @@ int BaseSongIterator::parseMidiCommand(byte *buf, int *result, SongIteratorChann if ((cmd & 0xf0) == 0x90) /* note on? */ channel->notes_played++; +#if 0 + /* Perform remapping, if neccessary */ + if (cmd != SCI_MIDI_SET_SIGNAL + && cmd < 0xf0) { /* Not a generic command */ + int chan = cmd & 0xf; + int op = cmd & 0xf0; + + chan = channel_remap[chan]; + buf[0] = chan | op; + } +#endif + /* Process as normal MIDI operation */ return 0; } @@ -1364,12 +1376,6 @@ TeeSongIterator::TeeSongIterator(SongIterator *left, SongIterator *right) { _children[TEE_LEFT].it = left; _children[TEE_RIGHT].it = right; - // By default, don't remap - for (i = 0; i < 16; i++) { - _children[TEE_LEFT].channel_remap[i] = i; - _children[TEE_RIGHT].channel_remap[i] = i; - } - /* Default to lhs channels */ channel_mask = left->channel_mask; for (i = 0; i < 16; i++) @@ -1386,7 +1392,7 @@ TeeSongIterator::TeeSongIterator(SongIterator *left, SongIterator *right) { //warning("[songit-tee <%08lx,%08lx>] Could not remap right channel #%d: Out of channels", // left->ID, right->ID, i); } else { - _children[TEE_RIGHT].channel_remap[i] = firstfree; + _children[TEE_RIGHT].it->channel_remap[i] = firstfree; channel_mask |= (1 << firstfree); } @@ -1402,7 +1408,7 @@ TeeSongIterator::TeeSongIterator(SongIterator *left, SongIterator *right) { for (c = 0 ; c < 2; c++) for (i = 0 ; i < 16; i++) fprintf(stderr, " map [%d][%d] -> %d\n", - c, i, _children[c].channel_remap[i]); + c, i, _children[c].it->channel_remap[i]); } #endif @@ -1514,21 +1520,6 @@ int TeeSongIterator::nextCommand(byte *buf, int *result) { fprintf(stderr, "\tl:%d / r:%d / chose %d\n", _children[TEE_LEFT].retval, _children[TEE_RIGHT].retval, retid); #endif -#if 0 - if (_children[retid].retval == 0) { - /* Perform remapping, if neccessary */ - byte *buf = _children[retid].buf; - if (*buf != SCI_MIDI_SET_SIGNAL - && *buf < 0xf0) { /* Not a generic command */ - int chan = *buf & 0xf; - int op = *buf & 0xf0; - - chan = _children[retid].channel_remap[chan]; - - *buf = chan | op; - } - } -#endif /* Adjust delta times */ if (_children[retid].retval > 0 @@ -1660,6 +1651,8 @@ int songit_next(SongIterator **it, byte *buf, int *result, int mask) { SongIterator *old_it = *it; *it = new CleanupSongIterator(channel_mask); + for(uint i = 0; i < MIDI_CHANNELS; i++) + (*it)->channel_remap[i] = old_it->channel_remap[i]; song_iterator_transfer_death_listeners(*it, old_it); if (mask & IT_READER_MAY_FREE) delete old_it; @@ -1691,6 +1684,10 @@ SongIterator::SongIterator() { fade.action = FADE_ACTION_NONE; priority = 0; memset(_deathListeners, 0, sizeof(_deathListeners)); + + // By default, don't remap + for (uint i = 0; i < 16; i++) + channel_remap[i] = i; } SongIterator::SongIterator(const SongIterator &si) { @@ -1699,6 +1696,9 @@ SongIterator::SongIterator(const SongIterator &si) { fade = si.fade; priority = si.priority; memset(_deathListeners, 0, sizeof(_deathListeners)); + + for (uint i = 0; i < 16; i++) + channel_remap[i] = si.channel_remap[i]; } diff --git a/engines/sci/sfx/iterator.h b/engines/sci/sfx/iterator.h index 4e6df367c9..d66faa1b2d 100644 --- a/engines/sci/sfx/iterator.h +++ b/engines/sci/sfx/iterator.h @@ -29,6 +29,7 @@ #define SCI_SFX_SFX_ITERATOR_H #include "sci/sfx/sfx_pcm.h" +#include "sci/sfx/sci_midi.h" namespace Audio { class AudioStream; @@ -156,6 +157,7 @@ public: /* See songit_* for the constructor and non-virtual member functions */ + byte channel_remap[MIDI_CHANNELS]; ///< Remapping for channels public: SongIterator(); diff --git a/engines/sci/sfx/iterator_internal.h b/engines/sci/sfx/iterator_internal.h index faf06726b0..15b15ed308 100644 --- a/engines/sci/sfx/iterator_internal.h +++ b/engines/sci/sfx/iterator_internal.h @@ -256,10 +256,6 @@ public: byte buf[4]; int result; int retval; - - /* Remapping for channels */ - byte channel_remap[MIDI_CHANNELS]; - } _children[2]; public: -- cgit v1.2.3