diff options
Diffstat (limited to 'engines/sci/sfx/iterator.cpp')
-rw-r--r-- | engines/sci/sfx/iterator.cpp | 882 |
1 files changed, 408 insertions, 474 deletions
diff --git a/engines/sci/sfx/iterator.cpp b/engines/sci/sfx/iterator.cpp index 618207239f..bcaf4759b8 100644 --- a/engines/sci/sfx/iterator.cpp +++ b/engines/sci/sfx/iterator.cpp @@ -33,14 +33,14 @@ #include "sci/include/sci_memory.h" static const int MIDI_cmdlen[16] = {0, 0, 0, 0, 0, 0, 0, 0, - 2, 2, 2, 2, 1, 1, 2, 0}; + 2, 2, 2, 2, 1, 1, 2, 0 + }; /*#define DEBUG_DECODING*/ /*#define DEBUG_VERBOSE*/ void -print_tabs_id(int nr, songit_id_t id) -{ +print_tabs_id(int nr, songit_id_t id) { while (nr-- > 0) fprintf(stderr, "\t"); @@ -49,8 +49,7 @@ print_tabs_id(int nr, songit_id_t id) #ifndef HAVE_MEMCHR static void * -memchr(void *_data, int c, int n) -{ +memchr(void *_data, int c, int n) { unsigned char *data = (unsigned char *) _data; while (n && !(*data == c)) { @@ -66,8 +65,7 @@ memchr(void *_data, int c, int n) #endif static void -_common_init(base_song_iterator_t *self) -{ +_common_init(base_song_iterator_t *self) { self->fade.action = FADE_ACTION_NONE; self->resetflag = 0; self->loops = 0; @@ -101,18 +99,17 @@ _common_init(base_song_iterator_t *self) static inline int -_parse_ticks(byte *data, int *offset_p, int size) -{ +_parse_ticks(byte *data, int *offset_p, int size) { int ticks = 0; int tempticks; int offset = 0; do { tempticks = data[offset++]; - ticks += (tempticks == SCI_MIDI_TIME_EXPANSION_PREFIX)? - SCI_MIDI_TIME_EXPANSION_LENGTH : tempticks; + ticks += (tempticks == SCI_MIDI_TIME_EXPANSION_PREFIX) ? + SCI_MIDI_TIME_EXPANSION_LENGTH : tempticks; } while (tempticks == SCI_MIDI_TIME_EXPANSION_PREFIX - && offset < size); + && offset < size); if (offset_p) *offset_p = offset; @@ -123,30 +120,27 @@ _parse_ticks(byte *data, int *offset_p, int size) static int _sci0_read_next_command(sci0_song_iterator_t *self, - unsigned char *buf, int *result); + unsigned char *buf, int *result); static int _sci0_get_pcm_data(sci0_song_iterator_t *self, - sfx_pcm_config_t *format, - int *xoffset, - unsigned int *xsize); + sfx_pcm_config_t *format, + int *xoffset, + unsigned int *xsize); #define PARSE_FLAG_LOOPS_UNLIMITED (1 << 0) /* Unlimited # of loops? */ #define PARSE_FLAG_PARAMETRIC_CUE (1 << 1) /* Assume that cues take an additional "cue value" argument */ /* This implements a difference between SCI0 and SCI1 cues. */ void -_reset_synth_channels(base_song_iterator_t *self, song_iterator_channel_t *channel) -{ +_reset_synth_channels(base_song_iterator_t *self, song_iterator_channel_t *channel) { int i; byte buf[5]; tell_synth_func *tell = sfx_get_player_tell_func(); - for (i = 0; i < MIDI_CHANNELS; i++) - { - if (channel->saw_notes & (1 << i)) - { + for (i = 0; i < MIDI_CHANNELS; i++) { + if (channel->saw_notes & (1 << i)) { buf[0] = 0xe0 | i; /* Pitch bend */ buf[1] = 0x80; /* Wheel center */ buf[2] = 0x40; @@ -159,9 +153,8 @@ _reset_synth_channels(base_song_iterator_t *self, song_iterator_channel_t *chann static int _parse_sci_midi_command(base_song_iterator_t *self, unsigned char *buf, int *result, - song_iterator_channel_t *channel, - int flags) -{ + song_iterator_channel_t *channel, + int flags) { unsigned char cmd; int paramsleft; int midi_op; @@ -177,8 +170,7 @@ _parse_sci_midi_command(base_song_iterator_t *self, unsigned char *buf, int *res cmd = channel->last_cmd; } - if (cmd == 0xfe) - { + if (cmd == 0xfe) { fprintf(stderr, "song iterator subsystem: Corrupted sound resource detected.\n"); return SI_FINISHED; } @@ -189,17 +181,17 @@ _parse_sci_midi_command(base_song_iterator_t *self, unsigned char *buf, int *res channel->saw_notes |= 1 << midi_channel; #if 0 -if (1) { - fprintf(stderr, "[IT]: off=%x, cmd=%02x, takes %d args ", - channel->offset - 1, cmd, paramsleft); - fprintf(stderr, "[%02x %02x <%02x> %02x %02x %02x]\n", - self->data[channel->offset-3], - self->data[channel->offset-2], - self->data[channel->offset-1], - self->data[channel->offset], - self->data[channel->offset+1], - self->data[channel->offset+2]); -} + if (1) { + fprintf(stderr, "[IT]: off=%x, cmd=%02x, takes %d args ", + channel->offset - 1, cmd, paramsleft); + fprintf(stderr, "[%02x %02x <%02x> %02x %02x %02x]\n", + self->data[channel->offset-3], + self->data[channel->offset-2], + self->data[channel->offset-1], + self->data[channel->offset], + self->data[channel->offset+1], + self->data[channel->offset+2]); + } #endif buf[0] = cmd; @@ -216,21 +208,21 @@ if (1) { /* Are we supposed to play this channel? */ if ( /* First, exclude "global" properties-- such as cues-- from consideration */ - (midi_op < 0xf - && !(cmd == SCI_MIDI_SET_SIGNAL) - && !(SCI_MIDI_CONTROLLER(cmd) - && buf[1] == SCI_MIDI_CUMULATIVE_CUE)) + (midi_op < 0xf + && !(cmd == SCI_MIDI_SET_SIGNAL) + && !(SCI_MIDI_CONTROLLER(cmd) + && buf[1] == SCI_MIDI_CUMULATIVE_CUE)) /* Next, check if the channel is allowed */ - && (!((1 << midi_channel) & channel->playmask))) + && (!((1 << midi_channel) & channel->playmask))) return /* Execute next command */ - self->next((song_iterator_t *) self, buf, result); + self->next((song_iterator_t *) self, buf, result); if (cmd == SCI_MIDI_EOT) { /* End of track? */ _reset_synth_channels(self, channel); -/* fprintf(stderr, "eot; loops = %d, notesplayed=%d\n", self->loops, channel->notes_played);*/ + /* fprintf(stderr, "eot; loops = %d, notesplayed=%d\n", self->loops, channel->notes_played);*/ if (self->loops > 1 /* && channel->notes_played*/) { /* If allowed, decrement the number of loops */ if (!(flags & PARSE_FLAG_LOOPS_UNLIMITED)) @@ -243,7 +235,7 @@ if (1) { else fprintf(stderr, "(%d)", self->loops); fprintf(stderr, " %x -> %x\n", - channel->offset, channel->loop_offset); + channel->offset, channel->loop_offset); #endif channel->offset = channel->loop_offset; channel->notes_played = 0; @@ -256,9 +248,9 @@ if (1) { channel->state = SI_STATE_FINISHED; #ifdef DEBUG_DECODING fprintf(stderr, "%s L%d: (%p):%d EOT because" - " %d notes, %d loops\n", - __FILE__, __LINE__, self, channel->id, - channel->notes_played, self->loops); + " %d notes, %d loops\n", + __FILE__, __LINE__, self, channel->id, + channel->notes_played, self->loops); #endif return SI_FINISHED; } @@ -269,7 +261,7 @@ if (1) { channel->loop_timepos = channel->total_timepos; return /* Execute next command */ - self->next((song_iterator_t *) self, buf, result); + self->next((song_iterator_t *) self, buf, result); } else { /* Used to be conditional <= 127 */ *result = buf[1]; /* Absolute cue */ @@ -283,7 +275,7 @@ if (1) { self->ccc += buf[2]; else { /* No parameter to CC */ self->ccc++; -/* channel->offset--; */ + /* channel->offset--; */ } *result = self->ccc; return SI_RELATIVE_CUE; @@ -297,22 +289,21 @@ if (1) { #if 0 { - int i; - int voices = 0; - for (i = 0; i < ((sci1_song_iterator_t *) self)->channels_nr; i++) - { - voices += self->polyphony[i]; - } - - sciprintf("SET_POLYPHONY(%d, %d) for a total of %d voices\n", midi_channel, buf[2], voices); - sciprintf("[iterator-1] DEBUG: Polyphony = [ "); - for (i = 0; i < ((sci1_song_iterator_t *) self)->channels_nr; i++) - sciprintf("%d ", self->polyphony[i]); - sciprintf("]\n"); - sciprintf("[iterator-1] DEBUG: Importance = [ "); - for (i = 0; i < ((sci1_song_iterator_t *) self)->channels_nr; i++) - sciprintf("%d ", self->importance[i]); - sciprintf("]\n"); + int i; + int voices = 0; + for (i = 0; i < ((sci1_song_iterator_t *) self)->channels_nr; i++) { + voices += self->polyphony[i]; + } + + sciprintf("SET_POLYPHONY(%d, %d) for a total of %d voices\n", midi_channel, buf[2], voices); + sciprintf("[iterator-1] DEBUG: Polyphony = [ "); + for (i = 0; i < ((sci1_song_iterator_t *) self)->channels_nr; i++) + sciprintf("%d ", self->polyphony[i]); + sciprintf("]\n"); + sciprintf("[iterator-1] DEBUG: Importance = [ "); + for (i = 0; i < ((sci1_song_iterator_t *) self)->channels_nr; i++) + sciprintf("%d ", self->importance[i]); + sciprintf("]\n"); } #endif break; @@ -324,20 +315,18 @@ if (1) { sciprintf("CHANNEL_MUTE(%d, %d)\n", midi_channel, buf[2]); break; - case SCI_MIDI_HOLD: - { + case SCI_MIDI_HOLD: { // Safe cast: This controller is only used in SCI1 sci1_song_iterator_t *self1 = (sci1_song_iterator_t *) self; - if (buf[2] == self1->hold) - { + if (buf[2] == self1->hold) { channel->offset = channel->initial_offset; channel->notes_played = 0; channel->state = SI_STATE_COMMAND; channel->total_timepos = 0; - - self1->channels_looped = self1->active_channels-1; - + + self1->channels_looped = self1->active_channels - 1; + return SI_LOOP; } @@ -349,7 +338,7 @@ if (1) { case 0x73: /* UNKNOWN NYI (happens in Hoyle) */ case 0xd1: /* UNKNOWN NYI (happens in KQ4 when riding the unicorn) */ return /* Execute next command */ - self->next((song_iterator_t *) self, buf, result); + self->next((song_iterator_t *) self, buf, result); case 0x01: /* modulation */ case 0x07: /* volume */ @@ -375,16 +364,15 @@ if (1) { static int _sci_midi_process_state(base_song_iterator_t *self, unsigned char *buf, int *result, - song_iterator_channel_t *channel, - int flags) -{ + song_iterator_channel_t *channel, + int flags) { CHECK_FOR_END(0); switch (channel->state) { case SI_STATE_PCM: { if (*(self->data + channel->offset) == 0 - && *(self->data + channel->offset + 1) == SCI_MIDI_EOT) + && *(self->data + channel->offset + 1) == SCI_MIDI_EOT) /* Fake one extra tick to trick the interpreter into not killing the song iterator right away */ channel->state = SI_STATE_PCM_MAGIC_DELTA; else @@ -417,8 +405,8 @@ _sci_midi_process_state(base_song_iterator_t *self, unsigned char *buf, int *res case SI_STATE_DELTA_TIME: { int offset; int ticks = _parse_ticks(self->data + channel->offset, - &offset, - self->size - channel->offset); + &offset, + self->size - channel->offset); channel->offset += offset; channel->delay += ticks; @@ -432,7 +420,7 @@ _sci_midi_process_state(base_song_iterator_t *self, unsigned char *buf, int *res return ticks; } - /* continute otherwise... */ + /* continute otherwise... */ case SI_STATE_COMMAND: { int retval; @@ -440,15 +428,15 @@ _sci_midi_process_state(base_song_iterator_t *self, unsigned char *buf, int *res channel->timepos_increment = 0; retval = _parse_sci_midi_command(self, buf, result, - channel, flags); + channel, flags); if (retval == SI_FINISHED) { if (self->active_channels) --(self->active_channels); #ifdef DEBUG_DECODING fprintf(stderr, "%s L%d: (%p):%d Finished channel, %d channels left\n", - __FILE__, __LINE__, self, channel->id, - self->active_channels); + __FILE__, __LINE__, self, channel->id, + self->active_channels); #endif /* If we still have channels left... */ if (self->active_channels) { @@ -464,7 +452,7 @@ _sci_midi_process_state(base_song_iterator_t *self, unsigned char *buf, int *res default: fprintf(stderr, SIPFX "Invalid iterator state %d!\n", - channel->state); + channel->state); BREAKPOINT(); return SI_FINISHED; } @@ -472,43 +460,39 @@ _sci_midi_process_state(base_song_iterator_t *self, unsigned char *buf, int *res static inline int _sci_midi_process(base_song_iterator_t *self, unsigned char *buf, int *result, - song_iterator_channel_t *channel, - int flags) -{ + song_iterator_channel_t *channel, + int flags) { return _sci_midi_process_state(self, buf, result, - channel, - flags); + channel, + flags); } static int _sci0_read_next_command(sci0_song_iterator_t *self, unsigned char *buf, - int *result) -{ + int *result) { return _sci_midi_process((base_song_iterator_t *) self, buf, result, - &(self->channel), - PARSE_FLAG_PARAMETRIC_CUE); + &(self->channel), + PARSE_FLAG_PARAMETRIC_CUE); } static inline int -_sci0_header_magic_p(unsigned char *data, int offset, int size) -{ +_sci0_header_magic_p(unsigned char *data, int offset, int size) { if (offset + 0x10 > size) return 0; return - (data[offset] == 0x1a) - && (data[offset + 1] == 0x00) - && (data[offset + 2] == 0x01) - && (data[offset + 3] == 0x00); + (data[offset] == 0x1a) + && (data[offset + 1] == 0x00) + && (data[offset + 2] == 0x01) + && (data[offset + 3] == 0x00); } static int _sci0_get_pcm_data(sci0_song_iterator_t *self, - sfx_pcm_config_t *format, - int *xoffset, - unsigned int *xsize) -{ + sfx_pcm_config_t *format, + int *xoffset, + unsigned int *xsize) { int tries = 2; int found_it = 0; unsigned char *pcm_data; @@ -522,12 +506,12 @@ _sci0_get_pcm_data(sci0_song_iterator_t *self, while ((tries--) && (offset < self->size) && (!found_it)) { /* Search through the garbage manually */ unsigned char *fc = (unsigned char*)memchr(self->data + offset, - SCI0_END_OF_SONG, - self->size - offset); + SCI0_END_OF_SONG, + self->size - offset); if (!fc) { fprintf(stderr, SIPFX "Warning: Playing unterminated" - " song!\n"); + " song!\n"); return 1; } @@ -541,8 +525,8 @@ _sci0_get_pcm_data(sci0_song_iterator_t *self, if (!found_it) { fprintf(stderr, SIPFX - "Warning: Song indicates presence of PCM, but" - " none found (finally at offset %04x)\n", offset); + "Warning: Song indicates presence of PCM, but" + " none found (finally at offset %04x)\n", offset); return 1; } @@ -560,9 +544,9 @@ _sci0_get_pcm_data(sci0_song_iterator_t *self, int d = offset + SCI0_PCM_DATA_OFFSET + size - self->size; fprintf(stderr, SIPFX - "Warning: PCM advertizes %d bytes of data, but %d" - " bytes are trailing in the resource!\n", - size, self->size - (offset + SCI0_PCM_DATA_OFFSET)); + "Warning: PCM advertizes %d bytes of data, but %d" + " bytes are trailing in the resource!\n", + size, self->size - (offset + SCI0_PCM_DATA_OFFSET)); if (d > 0) size -= d; /* Fix this */ @@ -572,11 +556,10 @@ _sci0_get_pcm_data(sci0_song_iterator_t *self, *xsize = size; return 0; - } +} static sfx_pcm_feed_t * -_sci0_check_pcm(sci0_song_iterator_t *self) -{ +_sci0_check_pcm(sci0_song_iterator_t *self) { sfx_pcm_config_t format; int offset; unsigned int size; @@ -584,25 +567,24 @@ _sci0_check_pcm(sci0_song_iterator_t *self) return NULL; self->channel.state - = SI_STATE_FINISHED; /* Don't play both PCM and music */ + = SI_STATE_FINISHED; /* Don't play both PCM and music */ return sfx_iterator_make_feed(self->data, - offset + SCI0_PCM_DATA_OFFSET, - size, - format); + offset + SCI0_PCM_DATA_OFFSET, + size, + format); } static song_iterator_t * -_sci0_handle_message(sci0_song_iterator_t *self, song_iterator_message_t msg) -{ +_sci0_handle_message(sci0_song_iterator_t *self, song_iterator_message_t msg) { if (msg.recipient == _SIMSG_BASE) { switch (msg.type) { case _SIMSG_BASEMSG_PRINT: print_tabs_id(msg.args[0].i, self->ID); fprintf(stderr, "SCI0: dev=%d, active-chan=%d, size=%d, loops=%d\n", - self->device_id, self->active_channels, self->size, - self->loops); + self->device_id, self->active_channels, self->size, + self->loops); break; case _SIMSG_BASEMSG_SET_LOOPS: @@ -615,7 +597,7 @@ _sci0_handle_message(sci0_song_iterator_t *self, song_iterator_message_t msg) memcpy(mem, self, tsize); sci_refcount_incref(mem->data); #ifdef DEBUG_VERBOSE -fprintf(stderr, "** CLONE INCREF for new %p from %p at %p\n", mem, self, mem->data); + fprintf(stderr, "** CLONE INCREF for new %p from %p at %p\n", mem, self, mem->data); #endif return (struct _song_iterator *) mem; /* Assume caller has another copy of this */ } @@ -637,10 +619,10 @@ fprintf(stderr, "** CLONE INCREF for new %p from %p at %p\n", mem, self, mem->da for (i = 0; i < MIDI_CHANNELS; i++) if (self->data[2 + (i << 1)] & self->device_id - && i != MIDI_RHYTHM_CHANNEL) + && i != MIDI_RHYTHM_CHANNEL) self->channel.playmask |= (1 << i); } - break; + break; case _SIMSG_BASEMSG_SET_RHYTHM: self->channel.playmask &= ~(1 << MIDI_RHYTHM_CHANNEL); @@ -648,8 +630,7 @@ fprintf(stderr, "** CLONE INCREF for new %p from %p at %p\n", mem, self, mem->da self->channel.playmask |= (1 << MIDI_RHYTHM_CHANNEL); break; - case _SIMSG_BASEMSG_SET_FADE: - { + case _SIMSG_BASEMSG_SET_FADE: { fade_params_t *fp = (fade_params_t *) msg.args[0].p; self->fade.action = fp->action; self->fade.final_volume = fp->final_volume; @@ -668,15 +649,13 @@ fprintf(stderr, "** CLONE INCREF for new %p from %p at %p\n", mem, self, mem->da } static int -_sci0_get_timepos(sci0_song_iterator_t *self) -{ - return self->channel.total_timepos; +_sci0_get_timepos(sci0_song_iterator_t *self) { + return self->channel.total_timepos; } static void _base_init_channel(song_iterator_channel_t *channel, int id, int offset, - int end) -{ + int end) { channel->playmask = PLAYMASK_NONE; /* Disable all channels */ channel->id = id; channel->notes_played = 0; @@ -688,23 +667,22 @@ _base_init_channel(song_iterator_channel_t *channel, int id, int offset, channel->last_cmd = 0xfe; channel->offset - = channel->loop_offset - = channel->initial_offset - = offset; + = channel->loop_offset + = channel->initial_offset + = offset; channel->end = end; channel->saw_notes = 0; } static void -_sci0_init(sci0_song_iterator_t *self) -{ +_sci0_init(sci0_song_iterator_t *self) { _common_init((base_song_iterator_t *) self); self->ccc = 0; /* Reset cumulative cue counter */ self->active_channels = 1; _base_init_channel(&(self->channel), 0, SCI0_MIDI_OFFSET, self->size); - _reset_synth_channels((base_song_iterator_t *) self, - &(self->channel)); + _reset_synth_channels((base_song_iterator_t *) self, + &(self->channel)); self->delay_remaining = 0; if (self->data[0] == 2) /* Do we have an embedded PCM? */ @@ -713,10 +691,9 @@ _sci0_init(sci0_song_iterator_t *self) static void -_sci0_cleanup(sci0_song_iterator_t *self) -{ +_sci0_cleanup(sci0_song_iterator_t *self) { #ifdef DEBUG_VERBOSE -fprintf(stderr, "** FREEING it %p: data at %p\n", self, self->data); + fprintf(stderr, "** FREEING it %p: data at %p\n", self, self->data); #endif if (self->data) sci_refcount_decref(self->data); @@ -745,8 +722,7 @@ static int sci0_to_sci1_device_map[][2] = { #define SCI1_CHANDATA(off) self->data[channel->offset + (off)] static int -_sci1_sample_init(sci1_song_iterator_t *self, int offset) -{ +_sci1_sample_init(sci1_song_iterator_t *self, int offset) { sci1_sample_t *sample, **seekerp; int rate; int length; @@ -756,7 +732,7 @@ _sci1_sample_init(sci1_song_iterator_t *self, int offset) CHECK_FOR_END_ABSOLUTE((unsigned int)offset + 10); if (self->data[offset + 1] != 0) sciprintf("[iterator-1] In sample at offset 0x04x: Byte #1 is %02x instead of zero\n", - self->data[offset + 1]); + self->data[offset + 1]); rate = getInt16(self->data + offset + 2); length = getUInt16(self->data + offset + 4); @@ -772,7 +748,7 @@ _sci1_sample_init(sci1_song_iterator_t *self, int offset) #ifdef DEBUG_VERBOSE fprintf(stderr, "[SAMPLE] %x/%x/%x/%x l=%x\n", - offset + 10, begin, end, self->size, length); + offset + 10, begin, end, self->size, length); #endif sample->format.format = SFX_PCM_FORMAT_U8; @@ -795,8 +771,7 @@ _sci1_sample_init(sci1_song_iterator_t *self, int offset) static int -_sci1_song_init(sci1_song_iterator_t *self) -{ +_sci1_song_init(sci1_song_iterator_t *self) { sci1_sample_t *seeker; int last_time; unsigned int offset = 0; @@ -805,15 +780,14 @@ _sci1_song_init(sci1_song_iterator_t *self) // self->device_id = 0x0c; CHECK_FOR_END_ABSOLUTE(0); - if (SONGDATA(0) == 0xf0) - { + if (SONGDATA(0) == 0xf0) { self->priority = SONGDATA(1); offset += 8; } while (SONGDATA(0) != 0xff - && SONGDATA(0) != self->device_id) { + && SONGDATA(0) != self->device_id) { offset++; CHECK_FOR_END_ABSOLUTE(offset + 1); while (SONGDATA(0) != 0xff) { @@ -825,8 +799,8 @@ _sci1_song_init(sci1_song_iterator_t *self) if (SONGDATA(0) == 0xff) { sciprintf("[iterator-1] Song does not support" - " hardware 0x%02x\n", - self->device_id); + " hardware 0x%02x\n", + self->device_id); return 1; } @@ -851,32 +825,32 @@ _sci1_song_init(sci1_song_iterator_t *self) /* Regular MIDI channel */ if (self->channels_nr >= MIDI_CHANNELS) { sciprintf("[iterator-1] Warning: Song has more than %d channels, cutting them off\n", - MIDI_CHANNELS); + MIDI_CHANNELS); break; /* Scan for remaining samples */ } else { int channel_nr - = self->data[track_offset] & 0xf; + = self->data[track_offset] & 0xf; song_iterator_channel_t *channel = - &(self->channels[self->channels_nr++]); + &(self->channels[self->channels_nr++]); if (self->data[track_offset] & 0xf0) - printf("Channel %d has mapping bits %02x\n", + printf("Channel %d has mapping bits %02x\n", channel_nr, self->data[track_offset] & 0xf0); _base_init_channel(channel, - channel_nr, - /* Skip over header bytes: */ - track_offset + 2, - track_offset + end); - _reset_synth_channels((base_song_iterator_t *) self, - channel); + channel_nr, + /* Skip over header bytes: */ + track_offset + 2, + track_offset + end); + _reset_synth_channels((base_song_iterator_t *) self, + channel); self->polyphony[self->channels_nr - 1] - = SCI1_CHANDATA(-1); - self->importance[self->channels_nr - 1] - = self->polyphony[self->channels_nr - 1] >> 4; + = SCI1_CHANDATA(-1); + self->importance[self->channels_nr - 1] + = self->polyphony[self->channels_nr - 1] >> 4; self->polyphony[self->channels_nr - 1] &= 15; - + channel->playmask = ~0; /* Enable all */ self->channel_mask |= (1 << channel_nr); @@ -896,7 +870,7 @@ _sci1_song_init(sci1_song_iterator_t *self) while (seeker) { int prev_last_time = last_time; sciprintf("[iterator-1] Detected sample: %d Hz, %d bytes at time %d\n", - seeker->format.rate, seeker->size, seeker->delta); + seeker->format.rate, seeker->size, seeker->delta); last_time = seeker->delta; seeker->delta -= prev_last_time; seeker = seeker->next; @@ -908,12 +882,11 @@ _sci1_song_init(sci1_song_iterator_t *self) #undef SONGDATA static inline int -_sci1_get_smallest_delta(sci1_song_iterator_t *self) -{ +_sci1_get_smallest_delta(sci1_song_iterator_t *self) { int i, d = -1; for (i = 0; i < self->channels_nr; i++) if (self->channels[i].state == SI_STATE_COMMAND - && (d == -1 || self->channels[i].delay < d)) + && (d == -1 || self->channels[i].delay < d)) d = self->channels[i].delay; if (self->next_sample && self->next_sample->delta < d) @@ -923,8 +896,7 @@ _sci1_get_smallest_delta(sci1_song_iterator_t *self) } static inline void -_sci1_update_delta(sci1_song_iterator_t *self, int delta) -{ +_sci1_update_delta(sci1_song_iterator_t *self, int delta) { int i; if (self->next_sample) @@ -936,13 +908,12 @@ _sci1_update_delta(sci1_song_iterator_t *self, int delta) } static inline int -_sci1_no_delta_time(sci1_song_iterator_t *self) -{ /* Checks that none of the channels is waiting for its delta to be read */ +_sci1_no_delta_time(sci1_song_iterator_t *self) { /* Checks that none of the channels is waiting for its delta to be read */ int i; for (i = 0; i < self->channels_nr; i++) if (self->channels[i].state == SI_STATE_DELTA_TIME) - return 0; + return 0; return 1; } @@ -950,26 +921,25 @@ _sci1_no_delta_time(sci1_song_iterator_t *self) #if 0 // Unreferenced - removed static void -_sci1_dump_state(sci1_song_iterator_t *self) -{ +_sci1_dump_state(sci1_song_iterator_t *self) { int i; sciprintf("-- [%p] ------------------------\n", self); for (i = 0; i < self->channels_nr; i++) { int j; sciprintf("%d(s%02d): d-%d:\t(%x/%x) ", - self->channels[i].id, - self->channels[i].state, - self->channels[i].delay, - self->channels[i].offset, - self->channels[i].end); + self->channels[i].id, + self->channels[i].state, + self->channels[i].delay, + self->channels[i].offset, + self->channels[i].end); for (j = -3; j < 9; j++) { if (j == 0) sciprintf(">"); else sciprintf(" "); - sciprintf("%02x", self->data[self->channels[i].offset+j]); + sciprintf("%02x", self->data[self->channels[i].offset + j]); if (j == 0) sciprintf("<"); @@ -980,7 +950,7 @@ _sci1_dump_state(sci1_song_iterator_t *self) } if (self->next_sample) { sciprintf("\t[sample %d]\n", - self->next_sample->delta); + self->next_sample->delta); } sciprintf("------------------------------------------\n"); } @@ -990,18 +960,17 @@ _sci1_dump_state(sci1_song_iterator_t *self) #define COMMAND_INDEX_PCM -2 static inline int /* Determine the channel # of the next active event, or -1 */ -_sci1_command_index(sci1_song_iterator_t *self) -{ +_sci1_command_index(sci1_song_iterator_t *self) { int i; int base_delay = 0x7ffffff; int best_chan = COMMAND_INDEX_NONE; for (i = 0; i < self->channels_nr; i++) if ((self->channels[i].state != SI_STATE_PENDING) - && (self->channels[i].state != SI_STATE_FINISHED)) { - + && (self->channels[i].state != SI_STATE_FINISHED)) { + if ((self->channels[i].state == SI_STATE_DELTA_TIME) - && (self->channels[i].delay == 0)) + && (self->channels[i].delay == 0)) return i; /* First, read all unknown delta times */ @@ -1019,16 +988,15 @@ _sci1_command_index(sci1_song_iterator_t *self) static sfx_pcm_feed_t * -_sci1_get_pcm(sci1_song_iterator_t *self) -{ +_sci1_get_pcm(sci1_song_iterator_t *self) { if (self->next_sample - && self->next_sample->delta <= 0) { + && self->next_sample->delta <= 0) { sci1_sample_t *sample = self->next_sample; sfx_pcm_feed_t *feed - = sfx_iterator_make_feed(self->data, - sample->data - self->data, - sample->size, - sample->format); + = sfx_iterator_make_feed(self->data, + sample->data - self->data, + sample->size, + sample->format); self->next_sample = self->next_sample->next; @@ -1042,14 +1010,13 @@ _sci1_get_pcm(sci1_song_iterator_t *self) static int _sci1_process_next_command(sci1_song_iterator_t *self, - unsigned char *buf, int *result) -{ + unsigned char *buf, int *result) { int retval = -42; /* Shouldn't happen, but gcc doesn't agree */ int chan; if (!self->initialised) { sciprintf("[iterator-1] DEBUG: Initialising for %d\n", - self->device_id); + self->device_id); self->initialised = 1; if (_sci1_song_init(self)) return SI_FINISHED; @@ -1074,7 +1041,7 @@ _sci1_process_next_command(sci1_song_iterator_t *self, if (self->next_sample->announced) { /* Already announced; let's discard it */ sfx_pcm_feed_t *feed - = _sci1_get_pcm(self); + = _sci1_get_pcm(self); feed->destroy(feed); } else { int delay = self->next_sample->delta; @@ -1089,45 +1056,45 @@ _sci1_process_next_command(sci1_song_iterator_t *self, } } else { /* Not a PCM */ - retval = _sci_midi_process((base_song_iterator_t *) self, - buf, result, - &(self->channels[chan]), - PARSE_FLAG_LOOPS_UNLIMITED); + retval = _sci_midi_process((base_song_iterator_t *) self, + buf, result, + &(self->channels[chan]), + PARSE_FLAG_LOOPS_UNLIMITED); - if (retval == SI_LOOP) { - self->channels_looped++; - self->channels[chan].state = SI_STATE_PENDING; - self->channels[chan].delay = 0; + if (retval == SI_LOOP) { + self->channels_looped++; + self->channels[chan].state = SI_STATE_PENDING; + self->channels[chan].delay = 0; - if (self->channels_looped == self->active_channels) { - int i; + if (self->channels_looped == self->active_channels) { + int i; - /* Everyone's ready: Let's loop */ - for (i = 0; i < self->channels_nr; i++) - if (self->channels[i].state - == SI_STATE_PENDING) - self->channels[i].state + /* Everyone's ready: Let's loop */ + for (i = 0; i < self->channels_nr; i++) + if (self->channels[i].state + == SI_STATE_PENDING) + self->channels[i].state = SI_STATE_DELTA_TIME; - self->channels_looped = 0; - return SI_LOOP; - } - } else if (retval == SI_FINISHED) { + self->channels_looped = 0; + return SI_LOOP; + } + } else if (retval == SI_FINISHED) { #ifdef DEBUG - fprintf(stderr, "FINISHED some channel\n"); + fprintf(stderr, "FINISHED some channel\n"); #endif - } else if (retval > 0) { - int sd ; - sd = _sci1_get_smallest_delta(self); + } else if (retval > 0) { + int sd ; + sd = _sci1_get_smallest_delta(self); - if (_sci1_no_delta_time(self) && sd) { - /* No other channel is ready */ - _sci1_update_delta(self, sd); + if (_sci1_no_delta_time(self) && sd) { + /* No other channel is ready */ + _sci1_update_delta(self, sd); - /* Only from here do we return delta times */ - return sd; + /* Only from here do we return delta times */ + return sd; + } } - } } /* Not a PCM */ @@ -1137,9 +1104,8 @@ _sci1_process_next_command(sci1_song_iterator_t *self, } static struct _song_iterator * -_sci1_handle_message(sci1_song_iterator_t *self, - song_iterator_message_t msg) -{ + _sci1_handle_message(sci1_song_iterator_t *self, + song_iterator_message_t msg) { if (msg.recipient == _SIMSG_BASE) { /* May extend this in the future */ switch (msg.type) { @@ -1152,9 +1118,9 @@ _sci1_handle_message(sci1_song_iterator_t *self, print_tabs_id(msg.args[0].i, self->ID); fprintf(stderr, "SCI1: chan-nr=%d, playmask=%04x\n", - self->channels_nr, playmask); + self->channels_nr, playmask); } - break; + break; case _SIMSG_BASEMSG_CLONE: { int tsize = sizeof(sci1_song_iterator_t); @@ -1172,7 +1138,7 @@ _sci1_handle_message(sci1_song_iterator_t *self, /* Clone chain of samples */ while (*samplep) { sci1_sample_t *newsample - = (sci1_sample_t*)sci_malloc(sizeof(sci1_sample_t)); + = (sci1_sample_t*)sci_malloc(sizeof(sci1_sample_t)); memcpy(newsample, *samplep, sizeof(sci1_sample_t)); *samplep = newsample; @@ -1195,54 +1161,55 @@ _sci1_handle_message(sci1_song_iterator_t *self, break; } - case _SIMSG_BASEMSG_SET_PLAYMASK: if (msg.ID == self->ID) { - self->channel_mask = 0; + case _SIMSG_BASEMSG_SET_PLAYMASK: + if (msg.ID == self->ID) { + self->channel_mask = 0; - self->device_id + self->device_id = sci0_to_sci1_device_map - [sci_ffs(msg.args[0].i & 0xff) - 1] - [sfx_pcm_available()] - ; - - if (self->device_id == 0xff) { - sciprintf("[iterator-1] Warning: Device %d(%d) not supported", - msg.args[0].i & 0xff, sfx_pcm_available()); - } - if (self->initialised) { - int i; - int toffset = -1; - - for (i = 0; i < self->channels_nr; i++) - if (self->channels[i].state != SI_STATE_FINISHED - && self->channels[i].total_timepos > toffset) { - toffset = self->channels[i].total_timepos - + self->channels[i].timepos_increment - - self->channels[i].delay; - } - - /* Find an active channel so that we can - ** get the correct time offset */ + [sci_ffs(msg.args[0].i & 0xff) - 1] + [sfx_pcm_available()] + ; - _sci1_song_init(self); + if (self->device_id == 0xff) { + sciprintf("[iterator-1] Warning: Device %d(%d) not supported", + msg.args[0].i & 0xff, sfx_pcm_available()); + } + if (self->initialised) { + int i; + int toffset = -1; + + for (i = 0; i < self->channels_nr; i++) + if (self->channels[i].state != SI_STATE_FINISHED + && self->channels[i].total_timepos > toffset) { + toffset = self->channels[i].total_timepos + + self->channels[i].timepos_increment + - self->channels[i].delay; + } + + /* Find an active channel so that we can + ** get the correct time offset */ + + _sci1_song_init(self); + + toffset -= self->delay_remaining; + self->delay_remaining = 0; + + if (toffset > 0) + return new_fast_forward_iterator((song_iterator_t *) self, + toffset); + } else { + _sci1_song_init(self); + self->initialised = 1; + } - toffset -= self->delay_remaining; - self->delay_remaining = 0; + break; - if (toffset > 0) - return new_fast_forward_iterator((song_iterator_t *) self, - toffset); - } else { - _sci1_song_init(self); - self->initialised = 1; } - break; - - } - case _SIMSG_BASEMSG_SET_LOOPS: if (msg.ID == self->ID) - self->loops = (msg.args[0].i > 32767)? 99 : 0; + self->loops = (msg.args[0].i > 32767) ? 99 : 0; /* 99 is arbitrary, but we can't use '1' because of ** the way we're testing in the decoding section. */ break; @@ -1254,8 +1221,7 @@ _sci1_handle_message(sci1_song_iterator_t *self, /* Ignore */ break; - case _SIMSG_BASEMSG_SET_FADE: - { + case _SIMSG_BASEMSG_SET_FADE: { fade_params_t *fp = (fade_params_t *) msg.args[0].p; self->fade.action = fp->action; self->fade.final_volume = fp->final_volume; @@ -1266,7 +1232,7 @@ _sci1_handle_message(sci1_song_iterator_t *self, default: fprintf(stderr, SIPFX "Unsupported command %d to" - " SCI1 iterator", msg.type); + " SCI1 iterator", msg.type); } return (song_iterator_t *) self; } @@ -1276,15 +1242,13 @@ _sci1_handle_message(sci1_song_iterator_t *self, static int _sci1_read_next_command(sci1_song_iterator_t *self, - unsigned char *buf, int *result) -{ + unsigned char *buf, int *result) { return _sci1_process_next_command(self, buf, result); } static void -_sci1_init(sci1_song_iterator_t *self) -{ +_sci1_init(sci1_song_iterator_t *self) { _common_init((base_song_iterator_t *) self); self->ccc = 127; self->device_id = 0x00; /* Default to Sound Blaster/Adlib for purposes @@ -1300,8 +1264,7 @@ _sci1_init(sci1_song_iterator_t *self) } static void -_sci1_cleanup(sci1_song_iterator_t *it) -{ +_sci1_cleanup(sci1_song_iterator_t *it) { sci1_sample_t *sample_seeker = it->next_sample; while (sample_seeker) { sci1_sample_t *old_sample = sample_seeker; @@ -1313,8 +1276,7 @@ _sci1_cleanup(sci1_song_iterator_t *it) } static int -_sci1_get_timepos(sci1_song_iterator_t *self) -{ +_sci1_get_timepos(sci1_song_iterator_t *self) { int max = 0; int i; @@ -1331,15 +1293,13 @@ _sci1_get_timepos(sci1_song_iterator_t *self) static void -_cleanup_iterator_init(song_iterator_t *it) -{ +_cleanup_iterator_init(song_iterator_t *it) { } static song_iterator_t * -_cleanup_iterator_handle_message(song_iterator_t *i, song_iterator_message_t msg) -{ +_cleanup_iterator_handle_message(song_iterator_t *i, song_iterator_message_t msg) { if (msg.recipient == _SIMSG_BASEMSG_PRINT - && msg.type == _SIMSG_BASEMSG_PRINT) { + && msg.type == _SIMSG_BASEMSG_PRINT) { print_tabs_id(msg.args[0].i, i->ID); fprintf(stderr, "CLEANUP\n"); } @@ -1348,8 +1308,7 @@ _cleanup_iterator_handle_message(song_iterator_t *i, song_iterator_message_t msg } static int -_cleanup_iterator_next(song_iterator_t *self, unsigned char *buf, int *result) -{ +_cleanup_iterator_next(song_iterator_t *self, unsigned char *buf, int *result) { /* Task: Return channel-notes-off for each channel */ if (self->channel_mask) { int bs = sci_ffs(self->channel_mask) - 1; @@ -1365,8 +1324,7 @@ _cleanup_iterator_next(song_iterator_t *self, unsigned char *buf, int *result) } song_iterator_t * -new_cleanup_iterator(unsigned int channels) -{ +new_cleanup_iterator(unsigned int channels) { song_iterator_t *it = (song_iterator_t*)sci_malloc(sizeof(song_iterator_t)); it->channel_mask = channels; it->ID = 17; @@ -1388,8 +1346,7 @@ new_cleanup_iterator(unsigned int channels) static int _ff_read_next_command(fast_forward_song_iterator_t *self, - byte *buf, int *result) -{ + byte *buf, int *result) { int rv; if (self->delta <= 0) @@ -1413,15 +1370,13 @@ _ff_read_next_command(fast_forward_song_iterator_t *self, } static sfx_pcm_feed_t * -_ff_check_pcm(fast_forward_song_iterator_t *self) -{ +_ff_check_pcm(fast_forward_song_iterator_t *self) { return self->delegate->get_pcm_feed(self->delegate); } static song_iterator_t * _ff_handle_message(fast_forward_song_iterator_t *self, - song_iterator_message_t msg) -{ + song_iterator_message_t msg) { if (msg.recipient == _SIMSG_PLASTICWRAP) switch (msg.type) { @@ -1465,27 +1420,23 @@ _ff_handle_message(fast_forward_song_iterator_t *self, static void -_ff_init(fast_forward_song_iterator_t *self) -{ +_ff_init(fast_forward_song_iterator_t *self) { return; } static int -_ff_get_timepos(fast_forward_song_iterator_t *self) -{ +_ff_get_timepos(fast_forward_song_iterator_t *self) { return self->delegate->get_timepos(self->delegate); } song_iterator_t * -new_fast_forward_iterator(song_iterator_t *capsit, int delta) -{ +new_fast_forward_iterator(song_iterator_t *capsit, int delta) { fast_forward_song_iterator_t *it = - (fast_forward_song_iterator_t*)sci_malloc(sizeof(fast_forward_song_iterator_t)); + (fast_forward_song_iterator_t*)sci_malloc(sizeof(fast_forward_song_iterator_t)); - if (capsit == NULL) - { - free(it); - return NULL; + if (capsit == NULL) { + free(it); + return NULL; } it->ID = 0; @@ -1494,18 +1445,18 @@ new_fast_forward_iterator(song_iterator_t *capsit, int delta) it->death_listeners_nr = 0; it->next = (int(*)(song_iterator_t *, unsigned char *, int *)) - _ff_read_next_command; - it->get_pcm_feed = (sfx_pcm_feed_t *(*)(song_iterator_t *)) - _ff_check_pcm; - it->handle_message = (song_iterator_t *(*)(song_iterator_t *, - song_iterator_message_t)) - _ff_handle_message; + _ff_read_next_command; + it->get_pcm_feed = (sfx_pcm_feed_t * (*)(song_iterator_t *)) + _ff_check_pcm; + it->handle_message = (song_iterator_t * (*)(song_iterator_t *, + song_iterator_message_t)) + _ff_handle_message; it->get_timepos = (int(*)(song_iterator_t *))_ff_get_timepos; it->init = (void(*)(song_iterator_t *)) - _ff_init; + _ff_init; it->cleanup = NULL; it->channel_mask = capsit->channel_mask; - + return (song_iterator_t *) it; } @@ -1518,8 +1469,7 @@ new_fast_forward_iterator(song_iterator_t *capsit, int delta) static int _tee_read_next_command(tee_song_iterator_t *it, unsigned char *buf, - int *result) -{ + int *result) { static int ready_masks[2] = {TEE_LEFT_READY, TEE_RIGHT_READY}; static int active_masks[2] = {TEE_LEFT_ACTIVE, TEE_RIGHT_ACTIVE}; static int pcm_masks[2] = {TEE_LEFT_PCM, TEE_RIGHT_PCM}; @@ -1538,7 +1488,7 @@ _tee_read_next_command(tee_song_iterator_t *it, unsigned char *buf, return SI_MORPH; if ((it->status & (TEE_LEFT_ACTIVE | TEE_RIGHT_ACTIVE)) - != (TEE_LEFT_ACTIVE | TEE_RIGHT_ACTIVE)) { + != (TEE_LEFT_ACTIVE | TEE_RIGHT_ACTIVE)) { /* Not all are is active? */ int which = 0; #ifdef DEBUG_TEE_ITERATOR @@ -1557,7 +1507,7 @@ _tee_read_next_command(tee_song_iterator_t *it, unsigned char *buf, /* First, check for unreported PCMs */ for (i = TEE_LEFT; i <= TEE_RIGHT; i++) if ((it->status & (ready_masks[i] | pcm_masks[i])) - == (ready_masks[i] | pcm_masks[i])) { + == (ready_masks[i] | pcm_masks[i])) { it->status &= ~ready_masks[i]; return SI_PCM; } @@ -1567,27 +1517,27 @@ _tee_read_next_command(tee_song_iterator_t *it, unsigned char *buf, /* Buffers aren't ready yet */ it->children[i].retval = - songit_next(&(it->children[i].it), - it->children[i].buf, - &(it->children[i].result), - IT_READER_MASK_ALL - | IT_READER_MAY_FREE - | IT_READER_MAY_CLEAN); + songit_next(&(it->children[i].it), + it->children[i].buf, + &(it->children[i].result), + IT_READER_MASK_ALL + | IT_READER_MAY_FREE + | IT_READER_MAY_CLEAN); it->status |= ready_masks[i]; #ifdef DEBUG_TEE_ITERATOR fprintf(stderr, "\t Must check %d: %d\n", i, - it->children[i].retval); + it->children[i].retval); #endif if (it->children[i].retval == SI_ABSOLUTE_CUE || - it->children[i].retval == SI_RELATIVE_CUE) - return it->children[i].retval; + it->children[i].retval == SI_RELATIVE_CUE) + return it->children[i].retval; if (it->children[i].retval == SI_FINISHED) { it->status &= ~active_masks[i]; /* Recurse to complete */ #ifdef DEBUG_TEE_ITERATOR -fprintf(stderr, "\t Child %d signalled completion, recursing w/ status %02x\n", i, it->status); + fprintf(stderr, "\t Child %d signalled completion, recursing w/ status %02x\n", i, it->status); #endif return _tee_read_next_command(it, buf, result); } else if (it->children[i].retval == SI_PCM) { @@ -1602,21 +1552,21 @@ fprintf(stderr, "\t Child %d signalled completion, recursing w/ status %02x\n", retid = TEE_LEFT; if ((it->children[TEE_LEFT].retval > 0) - /* Asked to delay */ - && (it->children[TEE_RIGHT].retval <= it->children[TEE_LEFT].retval)) + /* Asked to delay */ + && (it->children[TEE_RIGHT].retval <= it->children[TEE_LEFT].retval)) /* Is not delaying or not delaying as much */ retid = TEE_RIGHT; #ifdef DEBUG_TEE_ITERATOR -fprintf(stderr, "\tl:%d / r:%d / chose %d\n", - it->children[TEE_LEFT].retval, it->children[TEE_RIGHT].retval, retid); + fprintf(stderr, "\tl:%d / r:%d / chose %d\n", + it->children[TEE_LEFT].retval, it->children[TEE_RIGHT].retval, retid); #endif #if 0 if (it->children[retid].retval == 0) { /* Perform remapping, if neccessary */ byte *buf = it->children[retid].buf; if (*buf != SCI_MIDI_SET_SIGNAL - && *buf < 0xf0) { /* Not a generic command */ + && *buf < 0xf0) { /* Not a generic command */ int chan = *buf & 0xf; int op = *buf & 0xf0; @@ -1629,9 +1579,9 @@ fprintf(stderr, "\tl:%d / r:%d / chose %d\n", /* Adjust delta times */ if (it->children[retid].retval > 0 - && it->children[1-retid].retval > 0) { + && it->children[1-retid].retval > 0) { if (it->children[1-retid].retval - == it->children[retid].retval) + == it->children[retid].retval) /* If both children wait the same amount of time, ** we have to re-fetch commands from both */ it->status &= ~ready_masks[1-retid]; @@ -1639,7 +1589,7 @@ fprintf(stderr, "\tl:%d / r:%d / chose %d\n", /* If they don't, we can/must re-use the other ** child's delay time */ it->children[1-retid].retval - -= it->children[retid].retval; + -= it->children[retid].retval; } it->status &= ~ready_masks[retid]; @@ -1650,8 +1600,7 @@ fprintf(stderr, "\tl:%d / r:%d / chose %d\n", } static sfx_pcm_feed_t * -_tee_check_pcm(tee_song_iterator_t *it) -{ +_tee_check_pcm(tee_song_iterator_t *it) { static int pcm_masks[2] = {TEE_LEFT_PCM, TEE_RIGHT_PCM}; int i; @@ -1660,15 +1609,14 @@ _tee_check_pcm(tee_song_iterator_t *it) it->status &= ~pcm_masks[i]; return it->children[i].it-> - get_pcm_feed(it->children[i].it); + get_pcm_feed(it->children[i].it); } return NULL; /* No iterator */ } static song_iterator_t * -_tee_handle_message(tee_song_iterator_t *self, song_iterator_message_t msg) -{ +_tee_handle_message(tee_song_iterator_t *self, song_iterator_message_t msg) { if (msg.recipient == _SIMSG_BASE) { switch (msg.type) { @@ -1680,15 +1628,15 @@ _tee_handle_message(tee_song_iterator_t *self, song_iterator_message_t msg) case _SIMSG_BASEMSG_CLONE: { tee_song_iterator_t *newit - = (tee_song_iterator_t*)sci_malloc(sizeof(tee_song_iterator_t)); + = (tee_song_iterator_t*)sci_malloc(sizeof(tee_song_iterator_t)); memcpy(newit, self, sizeof(tee_song_iterator_t)); if (newit->children[TEE_LEFT].it) newit->children[TEE_LEFT].it = - songit_clone(newit->children[TEE_LEFT].it, msg.args[0].i); + songit_clone(newit->children[TEE_LEFT].it, msg.args[0].i); if (newit->children[TEE_RIGHT].it) newit->children[TEE_RIGHT].it = - songit_clone(newit->children[TEE_RIGHT].it, msg.args[0].i); + songit_clone(newit->children[TEE_RIGHT].it, msg.args[0].i); return (song_iterator_t *) newit; } @@ -1720,7 +1668,7 @@ _tee_handle_message(tee_song_iterator_t *self, song_iterator_message_t msg) return old_it; } else { sciprintf("[tee-iterator] WARNING:" - " Morphing without need\n"); + " Morphing without need\n"); return (song_iterator_t *) self; } @@ -1738,8 +1686,7 @@ _tee_handle_message(tee_song_iterator_t *self, song_iterator_message_t msg) } static void -_tee_init(tee_song_iterator_t *it) -{ +_tee_init(tee_song_iterator_t *it) { it->status = TEE_LEFT_ACTIVE | TEE_RIGHT_ACTIVE; it->children[TEE_LEFT].it->init(it->children[TEE_LEFT].it); it->children[TEE_RIGHT].it->init(it->children[TEE_RIGHT].it); @@ -1748,8 +1695,7 @@ _tee_init(tee_song_iterator_t *it) #if 0 // Unreferenced - removed static void -_tee_free(tee_song_iterator_t *it) -{ +_tee_free(tee_song_iterator_t *it) { int i; for (i = TEE_LEFT; i <= TEE_RIGHT; i++) if (it->children[i].it && it->may_destroy) @@ -1759,8 +1705,7 @@ _tee_free(tee_song_iterator_t *it) static void songit_tee_death_notification(tee_song_iterator_t *self, - song_iterator_t *corpse) -{ + song_iterator_t *corpse) { if (corpse == self->children[TEE_LEFT].it) { self->status &= ~TEE_LEFT_ACTIVE; self->children[TEE_LEFT].it = NULL; @@ -1774,8 +1719,7 @@ songit_tee_death_notification(tee_song_iterator_t *self, song_iterator_t * -songit_new_tee(song_iterator_t *left, song_iterator_t *right, int may_destroy) -{ +songit_new_tee(song_iterator_t *left, song_iterator_t *right, int may_destroy) { int i; int firstfree = 1; /* First free channel */ int incomplete_map = 0; @@ -1794,28 +1738,28 @@ songit_new_tee(song_iterator_t *left, song_iterator_t *right, int may_destroy) /* By default, don't remap */ for (i = 0; i < 16; i++) it->children[TEE_LEFT].channel_remap[i] - = it->children[TEE_RIGHT].channel_remap[i] = i; + = it->children[TEE_RIGHT].channel_remap[i] = i; /* Default to lhs channels */ it->channel_mask = left->channel_mask; for (i = 0; i < 16; i++) if (it->channel_mask & (1 << i) & right->channel_mask - && (i != MIDI_RHYTHM_CHANNEL) /* Share rhythm */) { /*conflict*/ + && (i != MIDI_RHYTHM_CHANNEL) /* Share rhythm */) { /*conflict*/ while ((firstfree == MIDI_RHYTHM_CHANNEL) - /* Either if it's the rhythm channel or if it's taken */ - || (firstfree < MIDI_CHANNELS - && ((1 << firstfree) & it->channel_mask))) + /* Either if it's the rhythm channel or if it's taken */ + || (firstfree < MIDI_CHANNELS + && ((1 << firstfree) & it->channel_mask))) ++firstfree; if (firstfree == MIDI_CHANNELS) { incomplete_map = 1; fprintf(stderr, "[songit-tee <%08lx,%08lx>] " - "Could not remap right channel #%d:" - " Out of channels\n", - left->ID, right->ID, i); + "Could not remap right channel #%d:" + " Out of channels\n", + left->ID, right->ID, i); } else { it->children[TEE_RIGHT].channel_remap[i] - = firstfree; + = firstfree; it->channel_mask |= (1 << firstfree); } @@ -1824,39 +1768,39 @@ songit_new_tee(song_iterator_t *left, song_iterator_t *right, int may_destroy) if (incomplete_map) { int c; fprintf(stderr, "[songit-tee <%08lx,%08lx>] Channels:" - " %04x <- %04x | %04x\n", - left->ID, right->ID, - it->channel_mask, - left->channel_mask, right->channel_mask); - for (c =0 ; c < 2; c++) - for (i =0 ; i < 16; i++) + " %04x <- %04x | %04x\n", + left->ID, right->ID, + it->channel_mask, + left->channel_mask, right->channel_mask); + for (c = 0 ; c < 2; c++) + for (i = 0 ; i < 16; i++) fprintf(stderr, " map [%d][%d] -> %d\n", - c, i, it->children[c].channel_remap[i]); + c, i, it->children[c].channel_remap[i]); } #endif it->next = (int(*)(song_iterator_t *, unsigned char *, int *)) - _tee_read_next_command; + _tee_read_next_command; - it->get_pcm_feed = (sfx_pcm_feed_t*(*)(song_iterator_t *)) - _tee_check_pcm; + it->get_pcm_feed = (sfx_pcm_feed_t * (*)(song_iterator_t *)) + _tee_check_pcm; - it->handle_message = (song_iterator_t *(*)(song_iterator_t *, - song_iterator_message_t)) - _tee_handle_message; + it->handle_message = (song_iterator_t * (*)(song_iterator_t *, + song_iterator_message_t)) + _tee_handle_message; it->init = (void(*)(song_iterator_t *)) - _tee_init; + _tee_init; it->get_timepos = NULL; song_iterator_add_death_listener((song_iterator_t *)it, - left, (void (*)(void *, void*)) - songit_tee_death_notification); + left, (void (*)(void *, void*)) + songit_tee_death_notification); song_iterator_add_death_listener((song_iterator_t *)it, - right, (void (*)(void *, void*)) - songit_tee_death_notification); + right, (void (*)(void *, void*)) + songit_tee_death_notification); it->cleanup = NULL; @@ -1869,8 +1813,7 @@ songit_new_tee(song_iterator_t *left, song_iterator_t *right, int may_destroy) /*************************************/ int -songit_next(song_iterator_t **it, unsigned char *buf, int *result, int mask) -{ +songit_next(song_iterator_t **it, unsigned char *buf, int *result, int mask) { int retval; if (!*it) @@ -1887,10 +1830,10 @@ songit_next(song_iterator_t **it, unsigned char *buf, int *result, int mask) if (retval == SI_FINISHED) fprintf(stderr, "[song-iterator] Song finished. mask = %04x, cm=%04x\n", - mask, (*it)->channel_mask); + mask, (*it)->channel_mask); if (retval == SI_FINISHED - && (mask & IT_READER_MAY_CLEAN) - && (*it)->channel_mask) { /* This last test will fail + && (mask & IT_READER_MAY_CLEAN) + && (*it)->channel_mask) { /* This last test will fail ** with a terminated ** cleanup iterator */ int channel_mask = (*it)->channel_mask; @@ -1900,20 +1843,20 @@ songit_next(song_iterator_t **it, unsigned char *buf, int *result, int mask) *it = new_cleanup_iterator(channel_mask); retval = -9999; /* Continue */ } - } while (! ( /* Until one of the following holds */ - (retval > 0 && (mask & IT_READER_MASK_DELAY)) - || (retval == 0 && (mask & IT_READER_MASK_MIDI)) - || (retval == SI_LOOP && (mask & IT_READER_MASK_LOOP)) - || (retval == SI_ABSOLUTE_CUE && - (mask & IT_READER_MASK_CUE)) - || (retval == SI_RELATIVE_CUE && - (mask & IT_READER_MASK_CUE)) - || (retval == SI_PCM && (mask & IT_READER_MASK_PCM)) - || (retval == SI_FINISHED) - )); + } while (!( /* Until one of the following holds */ + (retval > 0 && (mask & IT_READER_MASK_DELAY)) + || (retval == 0 && (mask & IT_READER_MASK_MIDI)) + || (retval == SI_LOOP && (mask & IT_READER_MASK_LOOP)) + || (retval == SI_ABSOLUTE_CUE && + (mask & IT_READER_MASK_CUE)) + || (retval == SI_RELATIVE_CUE && + (mask & IT_READER_MASK_CUE)) + || (retval == SI_PCM && (mask & IT_READER_MASK_PCM)) + || (retval == SI_FINISHED) + )); if (retval == SI_FINISHED - && (mask & IT_READER_MAY_FREE)) { + && (mask & IT_READER_MAY_FREE)) { songit_free(*it); *it = NULL; } @@ -1924,65 +1867,64 @@ songit_next(song_iterator_t **it, unsigned char *buf, int *result, int mask) song_iterator_t * -songit_new(unsigned char *data, unsigned int size, int type, songit_id_t id) -{ +songit_new(unsigned char *data, unsigned int size, int type, songit_id_t id) { base_song_iterator_t *it; int i; if (!data || size < 22) { fprintf(stderr, SIPFX "Attempt to instantiate song iterator for null" - " song data\n"); + " song data\n"); return NULL; } switch (type) { - case SCI_SONG_ITERATOR_TYPE_SCI0: - /**-- Playing SCI0 sound resources --**/ - it = (base_song_iterator_t*)sci_malloc(sizeof(sci0_song_iterator_t)); - it->channel_mask = 0xffff; /* Allocate all channels by default */ - - for (i = 0; i < MIDI_CHANNELS; i++) - it->polyphony[i] = data[1 + (i << 1)]; - - it->next = (int(*)(song_iterator_t *, unsigned char *, int *)) - _sci0_read_next_command; - it->get_pcm_feed = (sfx_pcm_feed_t*(*)(song_iterator_t *)) - _sci0_check_pcm; - it->handle_message = (song_iterator_t *(*)(song_iterator_t *, song_iterator_message_t)) - _sci0_handle_message; - it->init = (void(*)(song_iterator_t *))_sci0_init; - it->cleanup = (void(*)(song_iterator_t *))_sci0_cleanup; - ((sci0_song_iterator_t *)it)->channel.state - = SI_STATE_UNINITIALISED; - it->get_timepos = (int(*)(song_iterator_t *))_sci0_get_timepos; - break; - - case SCI_SONG_ITERATOR_TYPE_SCI1: - /**-- SCI01 or later sound resource --**/ - it = (base_song_iterator_t*)sci_malloc(sizeof(sci1_song_iterator_t)); - it->channel_mask = 0; /* Defer channel allocation */ - - for (i = 0; i < MIDI_CHANNELS; i++) - it->polyphony[i] = 0; /* Unknown */ - - it->next = (int(*)(song_iterator_t *, unsigned char *, int *)) - _sci1_read_next_command; - it->get_pcm_feed = (sfx_pcm_feed_t*(*)(song_iterator_t *)) - _sci1_get_pcm; - it->handle_message = (song_iterator_t *(*)(song_iterator_t *, song_iterator_message_t)) - _sci1_handle_message; - it->init = (void(*)(song_iterator_t *))_sci1_init; - it->cleanup = (void(*)(song_iterator_t *))_sci1_cleanup; - it->get_timepos = (int(*)(song_iterator_t *))_sci1_get_timepos; - break; - - default: - /**-- Invalid/unsupported sound resources --**/ - fprintf(stderr, SIPFX "Attempt to instantiate invalid/unknown" - " song iterator type %d\n", type); - return NULL; + case SCI_SONG_ITERATOR_TYPE_SCI0: + /**-- Playing SCI0 sound resources --**/ + it = (base_song_iterator_t*)sci_malloc(sizeof(sci0_song_iterator_t)); + it->channel_mask = 0xffff; /* Allocate all channels by default */ + + for (i = 0; i < MIDI_CHANNELS; i++) + it->polyphony[i] = data[1 + (i << 1)]; + + it->next = (int(*)(song_iterator_t *, unsigned char *, int *)) + _sci0_read_next_command; + it->get_pcm_feed = (sfx_pcm_feed_t * (*)(song_iterator_t *)) + _sci0_check_pcm; + it->handle_message = (song_iterator_t * (*)(song_iterator_t *, song_iterator_message_t)) + _sci0_handle_message; + it->init = (void(*)(song_iterator_t *))_sci0_init; + it->cleanup = (void(*)(song_iterator_t *))_sci0_cleanup; + ((sci0_song_iterator_t *)it)->channel.state + = SI_STATE_UNINITIALISED; + it->get_timepos = (int(*)(song_iterator_t *))_sci0_get_timepos; + break; + + case SCI_SONG_ITERATOR_TYPE_SCI1: + /**-- SCI01 or later sound resource --**/ + it = (base_song_iterator_t*)sci_malloc(sizeof(sci1_song_iterator_t)); + it->channel_mask = 0; /* Defer channel allocation */ + + for (i = 0; i < MIDI_CHANNELS; i++) + it->polyphony[i] = 0; /* Unknown */ + + it->next = (int(*)(song_iterator_t *, unsigned char *, int *)) + _sci1_read_next_command; + it->get_pcm_feed = (sfx_pcm_feed_t * (*)(song_iterator_t *)) + _sci1_get_pcm; + it->handle_message = (song_iterator_t * (*)(song_iterator_t *, song_iterator_message_t)) + _sci1_handle_message; + it->init = (void(*)(song_iterator_t *))_sci1_init; + it->cleanup = (void(*)(song_iterator_t *))_sci1_cleanup; + it->get_timepos = (int(*)(song_iterator_t *))_sci1_get_timepos; + break; + + default: + /**-- Invalid/unsupported sound resources --**/ + fprintf(stderr, SIPFX "Attempt to instantiate invalid/unknown" + " song iterator type %d\n", type); + return NULL; } it->ID = id; @@ -1997,8 +1939,7 @@ songit_new(unsigned char *data, unsigned int size, int type, songit_id_t id) } void -songit_free(song_iterator_t *it) -{ +songit_free(song_iterator_t *it) { if (it) { int i; @@ -2013,8 +1954,7 @@ songit_free(song_iterator_t *it) } song_iterator_message_t -songit_make_message(songit_id_t id, int recipient, int type, int a1, int a2) -{ +songit_make_message(songit_id_t id, int recipient, int type, int a1, int a2) { song_iterator_message_t rv; rv.ID = id; rv.recipient = recipient; @@ -2026,8 +1966,7 @@ songit_make_message(songit_id_t id, int recipient, int type, int a1, int a2) } song_iterator_message_t -songit_make_ptr_message(songit_id_t id, int recipient, int type, void * a1, int a2) -{ +songit_make_ptr_message(songit_id_t id, int recipient, int type, void * a1, int a2) { song_iterator_message_t rv; rv.ID = id; rv.recipient = recipient; @@ -2040,8 +1979,7 @@ songit_make_ptr_message(songit_id_t id, int recipient, int type, void * a1, int int -songit_handle_message(song_iterator_t **it_reg_p, song_iterator_message_t msg) -{ +songit_handle_message(song_iterator_t **it_reg_p, song_iterator_message_t msg) { song_iterator_t *it = *it_reg_p; song_iterator_t *newit; @@ -2055,8 +1993,7 @@ songit_handle_message(song_iterator_t **it_reg_p, song_iterator_message_t msg) } song_iterator_t * -songit_clone(song_iterator_t *it, int delta) -{ +songit_clone(song_iterator_t *it, int delta) { SIMSG_SEND(it, SIMSG_CLONE(delta)); it->death_listeners_nr = 0; it->flags |= SONGIT_FLAG_CLONE; @@ -2065,12 +2002,11 @@ songit_clone(song_iterator_t *it, int delta) void song_iterator_add_death_listener(song_iterator_t *it, - void *client, - void (*notify) (void *self, void *notifier)) -{ + void *client, + void (*notify)(void *self, void *notifier)) { if (it->death_listeners_nr >= SONGIT_MAX_LISTENERS) { fprintf(stderr, "FATAL: Too many death listeners for song" - " iterator\n"); + " iterator\n"); BREAKPOINT(); exit(1); } @@ -2083,32 +2019,30 @@ song_iterator_add_death_listener(song_iterator_t *it, void song_iterator_remove_death_listener(song_iterator_t *it, - void *client) -{ + void *client) { int i; for (i = 0; i < it->death_listeners_nr; i++) { if (it->death_listeners[i].self == client) { --it->death_listeners_nr; /* Overwrite, if this wasn't the last one */ - if (i+1 < it->death_listeners_nr) + if (i + 1 < it->death_listeners_nr) it->death_listeners[i] - = it->death_listeners[it->death_listeners_nr]; + = it->death_listeners[it->death_listeners_nr]; return; } } fprintf(stderr, "FATAL: Could not remove death listener from " - "song iterator\n"); + "song iterator\n"); BREAKPOINT(); exit(1); } song_iterator_t * -sfx_iterator_combine(song_iterator_t *it1, song_iterator_t *it2) -{ +sfx_iterator_combine(song_iterator_t *it1, song_iterator_t *it2) { if (it1 == NULL) return it2; if (it2 == NULL) |