diff options
-rw-r--r-- | engines/sci/module.mk | 3 | ||||
-rw-r--r-- | engines/sci/sfx/core.cpp | 2 | ||||
-rw-r--r-- | engines/sci/sfx/device/alsa-midi.cpp | 213 | ||||
-rw-r--r-- | engines/sci/sfx/device/camd-midi.cpp | 150 | ||||
-rw-r--r-- | engines/sci/sfx/device/devices.cpp | 78 | ||||
-rw-r--r-- | engines/sci/sfx/device/unixraw-midi.cpp | 90 | ||||
-rw-r--r-- | engines/sci/sfx/player/polled.cpp | 393 | ||||
-rw-r--r-- | engines/sci/sfx/player/polled.h | 49 | ||||
-rw-r--r-- | engines/sci/sfx/player/realtime.cpp | 256 | ||||
-rw-r--r-- | engines/sci/sfx/player/realtime.h | 50 | ||||
-rw-r--r-- | engines/sci/sfx/sequencer.h | 1 |
11 files changed, 0 insertions, 1285 deletions
diff --git a/engines/sci/module.mk b/engines/sci/module.mk index 239637b975..1f04c0ebc3 100644 --- a/engines/sci/module.mk +++ b/engines/sci/module.mk @@ -62,10 +62,7 @@ MODULE_OBJS = \ sfx/core.o \ sfx/iterator.o \ sfx/songlib.o \ - sfx/device/devices.o \ sfx/player/new_player.o \ - sfx/player/polled.o \ - sfx/player/realtime.o \ sfx/seq/gm.o \ sfx/seq/instrument-map.o \ sfx/seq/map-mt32-to-gm.o \ diff --git a/engines/sci/sfx/core.cpp b/engines/sci/sfx/core.cpp index cbf32049a2..f542d86ae4 100644 --- a/engines/sci/sfx/core.cpp +++ b/engines/sci/sfx/core.cpp @@ -28,8 +28,6 @@ #include "sci/tools.h" #include "sci/sfx/core.h" #include "sci/sfx/player/new_player.h" -#include "sci/sfx/player/polled.h" -#include "sci/sfx/player/realtime.h" #include "sci/sfx/sci_midi.h" #include "common/system.h" diff --git a/engines/sci/sfx/device/alsa-midi.cpp b/engines/sci/sfx/device/alsa-midi.cpp deleted file mode 100644 index 0041e4a3c8..0000000000 --- a/engines/sci/sfx/device/alsa-midi.cpp +++ /dev/null @@ -1,213 +0,0 @@ -/* ScummVM - Graphic Adventure Engine - * - * ScummVM is the legal property of its developers, whose names - * are too numerous to list here. Please refer to the COPYRIGHT - * file distributed with this source distribution. - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * as published by the Free Software Foundation; either version 2 - * of the License, or (at your option) any later version. - - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. - * - * $URL$ - * $Id$ - * - */ - -#include <sfx_engine.h> -#include "../device.h" -#ifdef HAVE_ALSA - -#include <alsa/asoundlib.h> - -namespace Sci { - -#define SCI_ALSA_MIDI_VERSION "0.1" - -static snd_midi_event_t *parser = NULL; -static snd_seq_t *seq = NULL; -static int queue = -1; -static int delta = 0; -static int port_out = -1; -static int port_nr = 128; -static int subport_nr = 0; - -static const char *seq_name = "default"; - -static void _set_tempo(void) { - int resolution = 60; - int tempo = 1; - snd_seq_queue_tempo_t *queue_tempo; - - snd_seq_queue_tempo_malloc(&queue_tempo); - - memset(queue_tempo, 0, snd_seq_queue_tempo_sizeof()); - snd_seq_queue_tempo_set_ppq(queue_tempo, resolution); - snd_seq_queue_tempo_set_tempo(queue_tempo, 1000000 / tempo); - - snd_seq_set_queue_tempo(seq, queue, queue_tempo); - - snd_seq_queue_tempo_free(queue_tempo); - -#if 0 - int tempo = 1000000 / 60; - snd_seq_queue_tempo_t *queue_tempo; - - snd_seq_queue_tempo_malloc(&queue_tempo); - snd_seq_queue_tempo_set_tempo(queue_tempo, tempo); - snd_seq_queue_tempo_set_ppq(queue_tempo, 1); - snd_seq_set_queue_tempo(seq, queue, queue_tempo); - snd_seq_queue_tempo_free(queue_tempo); -#endif -} - - -static Common::Error am_subscribe_to_ports(void) { - if ((port_out = snd_seq_connect_to(seq, port_out, port_nr, subport_nr)) < 0) { - fprintf(stderr, "[SFX] Could not connect to ALSA sequencer port: %s\n", snd_strerror(port_out)); - return Common::kUnknownError; - } - return Common::kNoError; -} - - -static Common::Error aminit(midi_writer_t *self) { - int err; - - snd_midi_event_new(4096, &parser); - snd_midi_event_init(parser); - - sciprintf("[SFX] Initialising ALSA MIDI backend, v%s\n", SCI_ALSA_MIDI_VERSION); - - if (snd_seq_open(&seq, seq_name, SND_SEQ_OPEN_OUTPUT, SND_SEQ_NONBLOCK)) { - fprintf(stderr, "[SFX] Failed to open ALSA MIDI sequencer '%s' for output\n", - seq_name); - return Common::kUnknownError; - } - - if ((port_out = snd_seq_create_simple_port(seq, "FreeSCI", - SND_SEQ_PORT_CAP_WRITE | - SND_SEQ_PORT_CAP_SUBS_WRITE | - SND_SEQ_PORT_CAP_READ, - SND_SEQ_PORT_TYPE_MIDI_GENERIC)) < 0) { - fprintf(stderr, "[SFX] Could not create ALSA sequencer port\n"); - return Common::kUnknownError; - } - - if (am_subscribe_to_ports()) - return Common::kUnknownError; - - queue = snd_seq_alloc_queue(seq); - _set_tempo(); - - snd_seq_start_queue(seq, queue, NULL); - - if ((err = snd_seq_drain_output(seq))) { - fflush(NULL); - fprintf(stderr, "[SFX] Error while draining: %s\n", - snd_strerror(err)); - return Common::kUnknownError; - } - - return Common::kNoError; -} - -static Common::Error amsetopt(midi_writer_t *self, char *name, char *value) { - return Common::kUnknownError; -} - - -static Common::Error amwrite(midi_writer_t *self, unsigned char *buf, int len) { - snd_seq_event_t evt; - -#if 0 - { - int i; - fprintf(stderr, "[MID] "); - for (i = 0; i < len; i++) - fprintf(stderr, " %02x", buf[i]); - fprintf(stderr, "\n"); - } -#endif - - snd_seq_ev_clear(&evt); - snd_seq_ev_set_source(&evt, port_out); - snd_seq_ev_set_subs(&evt); /* Broadcast to all subscribers */ - - snd_midi_event_encode(parser, buf, len, &evt); - snd_seq_ev_schedule_tick(&evt, queue, 0, delta); - - snd_seq_event_output_direct(seq, &evt); - -#if 0 - { - snd_seq_queue_status_t *status; - snd_seq_queue_status_malloc(&status); - - snd_seq_get_queue_status(seq, queue, status); - //snd_seq_tick_time_t snd_seq_queue_status_get_tick_time(const snd_seq_queue_status_t *info); - fprintf(stderr, "Queue at %d/%d\n", delta, snd_seq_queue_status_get_tick_time(status)); - - snd_seq_queue_status_free(status); - } -#endif - - - return Common::kNoError; -} - -static void amdelay(midi_writer_t *self, int ticks) { - delta += ticks; -} - -static void amreset_timer(midi_writer_t *self) { - snd_seq_drain_output(seq); - snd_seq_stop_queue(seq, queue, NULL); - - - { - snd_seq_event_t evt; - snd_seq_ev_clear(&evt); - snd_seq_ev_set_source(&evt, port_out); - snd_seq_ev_set_subs(&evt); /* Broadcast to all subscribers */ - - snd_seq_ev_set_queue_pos_tick(&evt, queue, 0); - - snd_seq_event_output_direct(seq, &evt); - } - delta = 0; - - - - snd_seq_start_queue(seq, queue, NULL); -} - -static void amclose(midi_writer_t *self) { - snd_midi_event_free(parser); - parser = NULL; -} - - -midi_writer_t sfx_device_midi_alsa = { - "alsa", - aminit, - amsetopt, - amwrite, - amdelay, - NULL, - amreset_timer, - amclose, -}; - -} // End of namespace Sci - -#endif diff --git a/engines/sci/sfx/device/camd-midi.cpp b/engines/sci/sfx/device/camd-midi.cpp deleted file mode 100644 index 26e3db6520..0000000000 --- a/engines/sci/sfx/device/camd-midi.cpp +++ /dev/null @@ -1,150 +0,0 @@ -/* ScummVM - Graphic Adventure Engine - * - * ScummVM is the legal property of its developers, whose names - * are too numerous to list here. Please refer to the COPYRIGHT - * file distributed with this source distribution. - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * as published by the Free Software Foundation; either version 2 - * of the License, or (at your option) any later version. - - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. - * - * $URL$ - * $Id$ - * - */ - -#ifdef HAVE_CONFIG_H -# include <config.h> -#endif -#ifdef HAVE_PROTO_CAMD_H - -#include "sfx_engine.h" -#include "../device.h" - -#include <proto/camd.h> -#include <proto/dos.h> -#include <proto/exec.h> -#include <proto/intuition.h> -#include <stdio.h> - -namespace Sci { - -#define SWAP_BYTES -#define FILL_BYTES - -#define SCI_CAMD_MIDI_VERSION "0.1" -#define SYSEX_PREFIX 0xf0 - -static const char *devicename = "via686.out.0"; - -struct Library *CamdBase = NULL; -struct CamdIFace *ICamd = NULL; -static struct MidiLink *midi_link = NULL; -static struct MidiNode *midi_node = NULL; - -#define ABORT(m) { \ - if (CamdBase) \ - IExec->CloseLibrary(CamdBase); \ - sciprintf("[SFX] CAMD driver: "); \ - sciprintf(m); \ - sciprintf("\n"); \ - return Common::kUnknownError; \ - } - -static Common::Error camd_init(midi_writer_t *self) { - sciprintf("[SFX] Initialising CAMD raw MIDI backend, v%s\n", SCI_CAMD_MIDI_VERSION); - - CamdBase = IExec->OpenLibrary("camd.library", 36L); - if (!CamdBase) - ABORT("Could not open 'camd.library'"); - - ICamd = (struct CamdIFace *) IExec->GetInterface(CamdBase, "main", 1, NULL); - if (!ICamd) - ABORT("Error while retrieving CAMD interface\n"); - - midi_node = ICamd->CreateMidi(MIDI_MsgQueue, 0L, MIDI_SysExSize, 4096L, MIDI_Name, "freesci", TAG_END); - if (!midi_node) - ABORT("Could not create CAMD MIDI node"); - - midi_link = ICamd->AddMidiLink(midi_node, MLTYPE_Sender, MLINK_Location, devicename, TAG_END); - if (!midi_link) - ABORT(("Could not create CAMD MIDI link to '%s'", devicename)); - - sciprintf("[SFX] CAMD initialisation completed\n"); - - return Common::kNoError; -} - -static Common::Error camd_set_option(midi_writer_t *self, char *name, char *value) { - return Common::kUnknownError; -} - -#define MAX_MIDI_LEN 3 - -static Common::Error camd_write(midi_writer_t *self, unsigned char *buffer, int len) { - if (len == 0) - return Common::kNoError; - - if (buffer[0] == SYSEX_PREFIX) { - /* Must send this as a SysEx */ - ICamd->PutSysEx(midi_link, buffer); - } else { - ULONG data = 0l; - int i; - int readlen = (len > MAX_MIDI_LEN) ? MAX_MIDI_LEN : len; - - for (i = 0; i < readlen; i++) - if (len >= i) { - data <<= 8; - data |= buffer[i]; - } - data <<= (8 * (sizeof(ULONG) - readlen)); - - if (len > MAX_MIDI_LEN) - sciprintf("[SFX] Warning: Truncated MIDI message to fit CAMD format (sent %d: %02x %02x %02x, real length %d)\n", - MAX_MIDI_LEN, buffer[0], buffer[1], buffer[2], len); - - ICamd->PutMidi(midi_link, data); - } - - return Common::kNoError; -} - -static void camd_delay(midi_writer_t *self, int ticks) { -} - -static void camd_reset_timer(midi_writer_t *self) { -} - -static void camd_close(midi_writer_t *self) { -#ifdef NO_OP - return; -#endif - if (CamdBase) - IExec->CloseLibrary(CamdBase); -} - -midi_writer_t sfx_device_midi_camd = { - "camd-midi", - &camd_init, - &camd_set_option, - &camd_write, - &camd_delay, - NULL, - &camd_reset_timer, - &camd_close -}; - -} // End of namespace Sci - -#endif /* HAVE_PROTO_CAMD_H */ diff --git a/engines/sci/sfx/device/devices.cpp b/engines/sci/sfx/device/devices.cpp deleted file mode 100644 index c4a9f4808f..0000000000 --- a/engines/sci/sfx/device/devices.cpp +++ /dev/null @@ -1,78 +0,0 @@ -/* ScummVM - Graphic Adventure Engine - * - * ScummVM is the legal property of its developers, whose names - * are too numerous to list here. Please refer to the COPYRIGHT - * file distributed with this source distribution. - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * as published by the Free Software Foundation; either version 2 - * of the License, or (at your option) any later version. - - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. - * - * $URL$ - * $Id$ - * - */ - -#include "common/scummsys.h" -#include "sci/sfx/device.h" - -#include "sci/tools.h" - -namespace Sci { - -static struct _midi_device *devices_midi[] = { - NULL -}; - -static struct _midi_device *devices_opl2[] = { - NULL -}; - - -/** -- **/ - -struct _midi_device **devices[] = { - NULL, /* No device */ - devices_midi, - devices_opl2, -}; - -void *sfx_find_device(int type, char *name) { - struct _midi_device *dev = NULL; - int i = 0; - - if (!type) - return NULL; - - if (!name) { - dev = devices[type][0]; - } else { - while (devices[type][i] && !strcmp(name, devices[type][i]->name)) - ++i; - - dev = devices[type][i]; - } - - if (dev) { - if (dev->init(dev)) { - fprintf(stderr, "[SFX] Opening device '%s' failed\n", dev->name); - return NULL; - } - - return dev; - }; - - return NULL; -} - -} // End of namespace Sci diff --git a/engines/sci/sfx/device/unixraw-midi.cpp b/engines/sci/sfx/device/unixraw-midi.cpp deleted file mode 100644 index bc9e8b7427..0000000000 --- a/engines/sci/sfx/device/unixraw-midi.cpp +++ /dev/null @@ -1,90 +0,0 @@ -/* ScummVM - Graphic Adventure Engine - * - * ScummVM is the legal property of its developers, whose names - * are too numerous to list here. Please refer to the COPYRIGHT - * file distributed with this source distribution. - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * as published by the Free Software Foundation; either version 2 - * of the License, or (at your option) any later version. - - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. - * - * $URL$ - * $Id$ - * - */ - -#include <sfx_engine.h> -#include "../device.h" - -#include <sys/types.h> -#include <sys/stat.h> -#include <fcntl.h> - -namespace Sci { - -#define SCI_UNIXRAW_MIDI_VERSION "0.1" - -#ifndef O_SYNC -# define O_SYNC 0 -#endif - -static int fd; -static const char *devicename = "/dev/midi"; - -static Common::Error unixraw_init(midi_writer_t *self) { - sciprintf("[SFX] Initialising UNIX raw MIDI backend, v%s\n", SCI_UNIXRAW_MIDI_VERSION); - - fd = open(devicename, O_WRONLY | O_SYNC); - - if (!IS_VALID_FD(fd)) { - sciprintf("[SFX] Failed to open %s\n", devicename); - return Common::kUnknownError; - } - - return Common::kNoError; -} - -static Common::Error unixraw_set_option(midi_writer_t *self, char *name, char *value) { - return Common::kUnknownError; -} - -static Common::Error unixraw_write(midi_writer_t *self, unsigned char *buffer, int len) { - if (write(fd, buffer, len) != len) { - sciprintf("[SFX] MIDI write error\n"); - return Common::kUnknownError; - } - return Common::kNoError; -} - -static void unixraw_delay(midi_writer_t *self, int ticks) { -} - -static void unixraw_reset_timer(midi_writer_t *self) { -} - -static void unixraw_close(midi_writer_t *self) { - close(fd); -} - -midi_writer_t sfx_device_midi_unixraw = { - "unixraw-midi", - &unixraw_init, - &unixraw_set_option, - &unixraw_write, - &unixraw_delay, - NULL, - &unixraw_reset_timer, - &unixraw_close -}; - -} // End of namespace Sci diff --git a/engines/sci/sfx/player/polled.cpp b/engines/sci/sfx/player/polled.cpp deleted file mode 100644 index 5ec4e3e5e2..0000000000 --- a/engines/sci/sfx/player/polled.cpp +++ /dev/null @@ -1,393 +0,0 @@ -/* ScummVM - Graphic Adventure Engine - * - * ScummVM is the legal property of its developers, whose names - * are too numerous to list here. Please refer to the COPYRIGHT - * file distributed with this source distribution. - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * as published by the Free Software Foundation; either version 2 - * of the License, or (at your option) any later version. - - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. - * - * $URL$ - * $Id$ - * - */ - -/* Polled player, mostly for PCM-based thingies (which _can_ poll, after all) */ - -#include "common/util.h" -#include "common/file.h" -#include "sci/sfx/player/polled.h" -#include "sci/sfx/softseq.h" -#include "sci/sfx/iterator.h" - -#include "sound/audiostream.h" -#include "sound/mixer.h" - -namespace Sci { - -// TODO: Turn the following static vars into member vars -static SongIterator *play_it; -static int play_paused = 0; -static sfx_softseq_t *seq; -static int volume = 100; -static Audio::Timestamp new_timestamp; -static int new_song = 0; - -/* The time counter is used to determine how close to the end of a tick we are. -** For each frame played, it is decreased by 60. */ -#define TIME_INC 60 -static int time_counter = 0; - -void PolledPlayer::tell_synth(int buf_nr, byte *buf) { - seq->handle_command(seq, buf[0], buf_nr - 1, buf + 1); -} - - -class PolledPlayerAudioStream : public Audio::AudioStream { -protected: - enum FeedMode { - FEED_MODE_ALIVE, - FEED_MODE_IDLE, - FEED_MODE_RESTART - }; - - /* Whether feed is alive or dead. */ - FeedMode _mode; - - /* Blank gap in frames. */ - int _gap; - - /* Audio format. */ - sfx_pcm_config_t _conf; - - /* Timestamp of next frame requested by stream driver. */ - Audio::Timestamp _time; - -public: - PolledPlayerAudioStream(sfx_pcm_config_t conf) - : _conf(conf), - _time(g_system->getMillis(), conf.rate) { - - _mode = FEED_MODE_ALIVE; - _gap = 0; - } - - ~PolledPlayerAudioStream() { - } - - virtual int readBuffer(int16 *buffer, const int numSamples); - - virtual bool isStereo() const { return _conf.stereo; } - virtual int getRate() const { return _conf.rate; } - - virtual bool endOfData() const { return false; } - -protected: - void queryTimestamp(); -}; - - -void PolledPlayerAudioStream::queryTimestamp() { - Audio::Timestamp stamp; - - if (!new_song) { - _mode = FEED_MODE_IDLE; - } else { - // Otherwise, we have a timestamp: - stamp = new_timestamp; - new_song = 0; - - _gap = stamp.frameDiff(_time); - if (_gap >= 0) - _mode = FEED_MODE_ALIVE; - else { - // FIXME: I don't quite understand what FEED_MODE_RESTART is for. - // The original DC mixer seemed to just stop and restart the stream. - // But why? To catch up with lagging sound? - // - // Walter says the following: - // "The FEED_MODE_RESTART might be there to re-sync after a debugger - // session where time passes for the mixer but not for the engine. - // I may have added this as a workaround for not being able to come - // up with a convenient way to implement mixer->pause() and mixer->resume() - // on DC." - // That makes some sense. However, maybe it is sufficient to just - // go to FEED_MODE_ALIVE ? With the current code, the player will - // permanently get stuck in FEED_MODE_RESTART if we ever get here... - _mode = FEED_MODE_RESTART; - _time = Audio::Timestamp(g_system->getMillis(), _conf.rate); - _gap = stamp.frameDiff(_time); - - if (_gap < 0) - _gap = 0; - } - } -} - -static void U8_to_S16(byte *buf, int samples) { - for (int i = samples - 1; i >= 0; i--) { - buf[i * 2 + 1] = buf[i] - 0x80; - buf[i * 2] = 0; - } -} - -static int ppf_poll(int frame_size, byte *dest, int size); - -int PolledPlayerAudioStream::readBuffer(int16 *buffer, const int numSamples) { - // FIXME: If ScummVM's mixer supported timestamps, then it would pass them - // as a parameter to this function. But currently, it doesn't. Therefore, we - // create a fake timestamp based on the current time. For comparison, a real - // timestamp could be adjusted for pauses in sound processing. And it would - // be synced for all audio streams. - Audio::Timestamp timestamp(g_system->getMillis(), _conf.rate); - _time = timestamp; - - const int channels = _conf.stereo == SFX_PCM_MONO ? 1 : 2; - const int frames_req = numSamples / channels; - int frames_recv = 0; - - while (frames_req != frames_recv) { - int frames = 0; - int frames_left = frames_req - frames_recv; - byte *buf_pos = ((byte *)buffer) + frames_recv * channels * 2; - - if (_mode == FEED_MODE_IDLE) - queryTimestamp(); - - if (_mode == FEED_MODE_IDLE) { - frames = frames_left; - memset(buf_pos, 0, frames * channels * 2); - - } else if (_gap) { - frames = MIN(_gap, frames_left); - _gap -= frames; - memset(buf_pos, 0, frames * channels * 2); - - } else { - frames = ppf_poll(channels * ((_conf.format & SFX_PCM_FORMAT_16) ? 2 : 1), buf_pos, frames_left); - - if (_conf.format == SFX_PCM_FORMAT_U8) - U8_to_S16(buf_pos, frames * channels); - - if (frames < frames_left) - _mode = FEED_MODE_IDLE; - } - - frames_recv += frames; - _time = _time.addFrames(frames); - } - - return numSamples; -} - -/*----------------------*/ -/* Mixer implementation */ -/*----------------------*/ -static int ppf_poll(int frame_size, byte *dest, int size) { - int written = 0; - byte buf[4]; - int buf_nr; - - if (!play_it) - return 0; - - if (play_paused) - return 0; - - while (written < size) { - int can_play; - int do_play; - - while (time_counter <= TIME_INC) { - int next_stat = songit_next(&play_it, - &(buf[0]), &buf_nr, - IT_READER_MASK_ALL - | IT_READER_MAY_FREE - | IT_READER_MAY_CLEAN); - - switch (next_stat) { - case SI_PCM: - sfx_play_iterator_pcm(play_it, 0); - break; - - case SI_FINISHED: - delete play_it; - play_it = NULL; - return written; /* We're done... */ - - case SI_IGNORE: - case SI_LOOP: - case SI_RELATIVE_CUE: - case SI_ABSOLUTE_CUE: - break; /* Boooring... .*/ - - case 0: /* MIDI command */ - - seq->handle_command(seq, buf[0], buf_nr - 1, buf + 1); - break; - - default: - time_counter += next_stat * seq->pcm_conf.rate; - } - } - - can_play = time_counter / TIME_INC; - do_play = (can_play > (size - written)) ? (size - written) : can_play; - - time_counter -= do_play * TIME_INC; - - seq->poll(seq, dest + written * frame_size, do_play); - written += do_play; - } - - return size; /* Apparently, we wrote all that was requested */ -} - -/*=======================*/ -/* Player implementation */ -/*=======================*/ - - -/*--------------------*/ -/* API implementation */ -/*--------------------*/ - -Common::Error PolledPlayer::init(ResourceManager *resmgr, int expected_latency) { - if (!g_system->getMixer()->isReady()) - return Common::kUnknownError; - - Resource *res = NULL, *res2 = NULL; - - /* FIXME Temporary hack to detect Amiga games. */ - if (!Common::File::exists("bank.001")) - seq = sfx_find_softseq(NULL); - else - seq = sfx_find_softseq("amiga"); - - if (!seq) { - sciprintf("[sfx:seq:polled] Initialisation failed: Could not find software sequencer\n"); - return Common::kUnknownError; - } - - if (seq->patch_nr != SFX_SEQ_PATCHFILE_NONE) { - res = resmgr->findResource(kResourceTypePatch, seq->patch_nr, 0); - } - - if (seq->patch2_nr != SFX_SEQ_PATCHFILE_NONE) { - res2 = resmgr->findResource(kResourceTypePatch, seq->patch2_nr, 0); - } - - if (seq->init(seq, - (res) ? res->data : NULL, - (res) ? res->size : 0, - (res2) ? res2->data : NULL, - (res2) ? res2->size : 0)) { - sciprintf("[sfx:seq:polled] Initialisation failed: Sequencer '%s', v%s failed to initialise\n", - seq->name, seq->version); - return Common::kUnknownError; - } - - seq->set_volume(seq, volume); - - // FIXME: Keep a SoundHandle and use that to stop the feed in the exit method - PolledPlayerAudioStream *newStream = new PolledPlayerAudioStream(seq->pcm_conf); - // FIXME: Is this sound type appropriate? - g_system->getMixer()->playInputStream(Audio::Mixer::kSFXSoundType, 0, newStream); - - this->polyphony = seq->polyphony; - return Common::kNoError; -} - -Common::Error PolledPlayer::add_iterator(SongIterator *it, uint32 start_time) { - SongIterator *old = play_it; - - SIMSG_SEND(it, SIMSG_SET_PLAYMASK(seq->playmask)); - SIMSG_SEND(it, SIMSG_SET_RHYTHM(seq->play_rhythm)); - - if (play_it == NULL) - seq->allstop(seq); - - play_it = sfx_iterator_combine(play_it, it); - - seq->set_volume(seq, volume); - - /* The check must happen HERE, and not at the beginning of the - function, to avoid a race condition with the mixer. */ - if (old == NULL) { - new_timestamp = Audio::Timestamp(start_time, seq->pcm_conf.rate); - /* ASAP otherwise */ - time_counter = 0; - new_song = 1; - } - - return Common::kNoError; -} - -Common::Error PolledPlayer::stop() { - SongIterator *it = play_it; - - play_it = NULL; - warning("[play] Now stopping it %p", (void *)it); - delete it; - - seq->allstop(seq); - - return Common::kNoError; -} - -Common::Error PolledPlayer::iterator_message(const SongIterator::Message &msg) { - if (!play_it) - return Common::kUnknownError; - - songit_handle_message(&play_it, msg); - return Common::kNoError; -} - -Common::Error PolledPlayer::pause() { - play_paused = 1; - seq->set_volume(seq, 0); - - return Common::kNoError; -} - -Common::Error PolledPlayer::resume() { - if (!play_it) { - play_paused = 0; - return Common::kNoError; /* Nothing to resume */ - } - - if (play_paused) - new_song = 1; /* Fake starting a new song, re-using the old - ** time stamp (now long in the past) to indicate - ** resuming ASAP */ - - play_paused = 0; - seq->set_volume(seq, volume); - return Common::kNoError; -} - -Common::Error PolledPlayer::exit() { - seq->exit(seq); - delete play_it; - play_it = NULL; - - return Common::kNoError; -} - -PolledPlayer::PolledPlayer() { - name = "polled"; - version = "0.1"; -} - -} // End of namespace Sci diff --git a/engines/sci/sfx/player/polled.h b/engines/sci/sfx/player/polled.h deleted file mode 100644 index f3485aae8e..0000000000 --- a/engines/sci/sfx/player/polled.h +++ /dev/null @@ -1,49 +0,0 @@ -/* ScummVM - Graphic Adventure Engine - * - * ScummVM is the legal property of its developers, whose names - * are too numerous to list here. Please refer to the COPYRIGHT - * file distributed with this source distribution. - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * as published by the Free Software Foundation; either version 2 - * of the License, or (at your option) any later version. - - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. - * - * $URL$ - * $Id$ - * - */ - -#ifndef SCI_SFX_SFX_PLAYER_POLLED_H -#define SCI_SFX_SFX_PLAYER_POLLED_H - -#include "sci/sfx/player.h" - -namespace Sci { - -class PolledPlayer : public SfxPlayer { -public: - PolledPlayer(); - - virtual Common::Error init(ResourceManager *resmgr, int expected_latency); - virtual Common::Error add_iterator(SongIterator *it, uint32 start_time); - virtual Common::Error stop(); - virtual Common::Error iterator_message(const SongIterator::Message &msg); - virtual Common::Error pause(); - virtual Common::Error resume(); - virtual Common::Error exit(); - virtual void tell_synth(int buf_nr, byte *buf); -}; - -} // End of namespace Sci - -#endif diff --git a/engines/sci/sfx/player/realtime.cpp b/engines/sci/sfx/player/realtime.cpp deleted file mode 100644 index 85c6ffe0cc..0000000000 --- a/engines/sci/sfx/player/realtime.cpp +++ /dev/null @@ -1,256 +0,0 @@ -/* ScummVM - Graphic Adventure Engine - * - * ScummVM is the legal property of its developers, whose names - * are too numerous to list here. Please refer to the COPYRIGHT - * file distributed with this source distribution. - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * as published by the Free Software Foundation; either version 2 - * of the License, or (at your option) any later version. - - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. - * - * $URL$ - * $Id$ - * - */ - -/* OK... 'realtime' may be a little too euphemistic, as this one just -** prays for some reasonable amount of soft real-time, but it's close -** enough, I guess. */ - -#include "sci/tools.h" -#include "sci/sfx/player/realtime.h" -#include "sci/sfx/sequencer.h" -#include "sci/sfx/iterator.h" -#include "sci/sfx/core.h" - -#include "common/system.h" - -namespace Sci { - -/* Playing mechanism */ - -static inline int delta_time(const uint32 comp, const uint32 base) { - return long(comp) - long(base); -} - -// TODO: Turn the following static vars into member vars -static sfx_sequencer_t *seq; - -static SongIterator *play_it = NULL; -static uint32 play_last_time; -static uint32 play_pause_started; /* Beginning of the last pause */ -static uint32 play_pause_counter; /* Last point in time to mark a - ** play position augmentation */ -static int play_paused = 0; -static int play_it_done = 0; -static int play_writeahead = 0; -static int play_moredelay = 0; - -static void play_song(SongIterator *it, uint32 *wakeup_time, int writeahead_time) { - unsigned char buf[8]; - int result; - - if (play_paused) { - uint32 ct = g_system->getMillis(); - - *wakeup_time += delta_time(play_pause_counter, ct); - - play_pause_counter = ct; - } else - /* Not paused: */ - while (play_it && delta_time(*wakeup_time, g_system->getMillis()) - < writeahead_time) { - int delay; - - switch ((delay = songit_next(&(play_it), - &(buf[0]), &result, - IT_READER_MASK_ALL - | IT_READER_MAY_FREE - | IT_READER_MAY_CLEAN))) { - - case SI_FINISHED: - play_it_done = 1; - return; - - case SI_IGNORE: - case SI_LOOP: - case SI_RELATIVE_CUE: - case SI_ABSOLUTE_CUE: - break; - - case SI_PCM: - sfx_play_iterator_pcm(play_it, 0); - break; - - case 0: - seq->event(buf[0], result - 1, buf + 1); - - break; - - default: - play_moredelay = delay - 1; - *wakeup_time += delay * 1000 / SFX_TICKS_PER_SEC; - if (seq->delay) - seq->delay(delay); - } - } -} - -void RealtimePlayer::tell_synth(int buf_nr, byte *buf) { - seq->event(buf[0], buf_nr - 1, buf + 1); -} - -void RealtimePlayer::maintenance() { - if (play_it && !play_it_done) { - if (!play_moredelay) { - int delta = delta_time(play_last_time, g_system->getMillis()); - - if (delta < 0) { - play_writeahead -= (int)((double)delta * 1.2); /* Adjust upwards */ - } else if (delta > 15) { - play_writeahead -= 3; /* Adjust downwards */ - } - } else - --play_moredelay; - - if (play_writeahead < seq->min_write_ahead_ms) - play_writeahead = seq->min_write_ahead_ms; - - play_song(play_it, &play_last_time, play_writeahead); - } -} - -static Resource *find_patch(ResourceManager *resmgr, const char *seq_name, int patchfile) { - Resource *res = NULL; - - if (patchfile != SFX_SEQ_PATCHFILE_NONE) { - res = resmgr->findResource(kResourceTypePatch, patchfile, 0); - if (!res) { - warning("[SFX] " __FILE__": patch.%03d requested by sequencer (%s), but not found", - patchfile, seq_name); - } - } - - return res; -} - -/* API implementation */ - -Common::Error RealtimePlayer::init(ResourceManager *resmgr, int expected_latency) { - Resource *res = NULL, *res2 = NULL; - void *seq_dev = NULL; - - seq = sfx_find_sequencer(NULL); - - if (!seq) { - warning("[SFX] " __FILE__": Could not find sequencer"); - return Common::kUnknownError; - } - - this->polyphony = seq->polyphony; - - res = find_patch(resmgr, seq->name, seq->patchfile); - res2 = find_patch(resmgr, seq->name, seq->patchfile2); - - if (seq->device) - seq_dev = sfx_find_device(seq->device, NULL); - - if (seq->open(res ? res->size : 0, - res ? res->data : NULL, - res2 ? res2->size : 0, - res2 ? res2->data : NULL, - seq_dev)) { - warning("[SFX] " __FILE__": Sequencer failed to initialize"); - return Common::kUnknownError; - } - - play_writeahead = expected_latency; - if (play_writeahead < seq->min_write_ahead_ms) - play_writeahead = seq->min_write_ahead_ms; - - play_writeahead *= 1; /* milliseconds */ - - if (seq->reset_timer) - seq->reset_timer(0); - - return Common::kNoError; -} - -Common::Error RealtimePlayer::add_iterator(SongIterator *it, uint32 start_time) { - if (seq->reset_timer) /* Restart timer counting if possible */ - seq->reset_timer(start_time); - - SIMSG_SEND(it, SIMSG_SET_PLAYMASK(seq->playmask)); - SIMSG_SEND(it, SIMSG_SET_RHYTHM(seq->play_rhythm)); - - play_last_time = start_time; - play_it = sfx_iterator_combine(play_it, it); - play_it_done = 0; - play_moredelay = 0; - - return Common::kNoError; -} - -Common::Error RealtimePlayer::stop(void) { - SongIterator *it = play_it; - - play_it = NULL; - - delete it; - if (seq && seq->allstop) - seq->allstop(); - - return Common::kNoError; -} - -Common::Error RealtimePlayer::iterator_message(const SongIterator::Message &msg) { - if (!play_it) - return Common::kUnknownError; - - songit_handle_message(&play_it, msg); - return Common::kNoError; -} - -Common::Error RealtimePlayer::pause(void) { - play_pause_started = g_system->getMillis(); - // Also, indicate that we haven't modified the time counter yet - play_pause_counter = play_pause_started; - - play_paused = 1; - if (!seq->allstop) { - sciprintf("[SFX] Cannot suspend sequencer, sound will continue for a bit\n"); - return Common::kNoError; - } else - return seq->allstop(); -} - -Common::Error RealtimePlayer::resume(void) { - play_paused = 0; - return Common::kNoError; -} - -Common::Error RealtimePlayer::exit(void) { - if (seq->close()) { - warning("[SFX] Sequencer reported error on close"); - return Common::kUnknownError; - } - - return Common::kNoError; -} - -RealtimePlayer::RealtimePlayer() { - name = "realtime"; - version = "0.1"; -} - -} // End of namespace Sci diff --git a/engines/sci/sfx/player/realtime.h b/engines/sci/sfx/player/realtime.h deleted file mode 100644 index 3aeeb6e1e7..0000000000 --- a/engines/sci/sfx/player/realtime.h +++ /dev/null @@ -1,50 +0,0 @@ -/* ScummVM - Graphic Adventure Engine - * - * ScummVM is the legal property of its developers, whose names - * are too numerous to list here. Please refer to the COPYRIGHT - * file distributed with this source distribution. - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * as published by the Free Software Foundation; either version 2 - * of the License, or (at your option) any later version. - - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. - * - * $URL$ - * $Id$ - * - */ - -#ifndef SCI_SFX_SFX_PLAYER_REALTIME_H -#define SCI_SFX_SFX_PLAYER_REALTIME_H - -#include "sci/sfx/player.h" - -namespace Sci { - -class RealtimePlayer : public SfxPlayer { -public: - RealtimePlayer(); - - virtual Common::Error init(ResourceManager *resmgr, int expected_latency); - virtual Common::Error add_iterator(SongIterator *it, uint32 start_time); - virtual Common::Error stop(); - virtual Common::Error iterator_message(const SongIterator::Message &msg); - virtual Common::Error pause(); - virtual Common::Error resume(); - virtual Common::Error exit(); - virtual void maintenance(); - virtual void tell_synth(int buf_nr, byte *buf); -}; - -} // End of namespace Sci - -#endif diff --git a/engines/sci/sfx/sequencer.h b/engines/sci/sfx/sequencer.h index ba9edcdad7..70b1c73453 100644 --- a/engines/sci/sfx/sequencer.h +++ b/engines/sci/sfx/sequencer.h @@ -30,7 +30,6 @@ #include "common/scummsys.h" #include "common/error.h" -#include "sci/sfx/device.h" namespace Sci { |