/* 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$ * */ /* Song library */ #ifndef SCI_SFX_SFX_SONGLIB_H #define SCI_SFX_SFX_SONGLIB_H #include "common/scummsys.h" #include "sound/timestamp.h" namespace Sci { class SongIterator; #define SOUND_STATUS_STOPPED 0 #define SOUND_STATUS_PLAYING 1 #define SOUND_STATUS_SUSPENDED 2 /* suspended: only if ordered from kernel space */ #define SOUND_STATUS_WAITING 3 /* "waiting" means "tagged for playing, but not active right now" */ typedef unsigned long song_handle_t; enum RESTORE_BEHAVIOR { RESTORE_BEHAVIOR_CONTINUE, /* restart a song when restored from a saved game */ RESTORE_BEHAVIOR_RESTART /* continue it from where it was */ }; struct song_t { song_handle_t handle; int resource_num; /* Resource number */ int priority; /* Song priority (more important if priority is higher) */ int status; /* See above */ int restore_behavior; int restore_time; /* Grabbed from the sound iterator, for save/restore purposes */ int loops; int hold; SongIterator *it; int _delay; /* Delay before accessing the iterator, in ticks */ Audio::Timestamp _wakeupTime; /**< Timestamp indicating the next MIDI event */ song_t *next; /* Next song or NULL if this is the last one */ song_t *next_playing; /* Next playing song; used by the ** core song system */ song_t *next_stopping; /* Next song pending stopping; used exclusively by ** the core song system's _update_multi_song() */ }; struct songlib_t { song_t **lib; song_t *_s; }; /**************************/ /* Song library commands: */ /**************************/ song_t *song_new(song_handle_t handle, SongIterator *it, int priority); /* Initializes a new song ** Parameters: (song_handle_t) handle: The sound handle ** (SongIterator *) it: The song ** (int) priority: The song's priority ** Returns : (song_t *) A freshly allocated song ** Other values are set to predefined defaults. */ void song_lib_init(songlib_t *songlib); /* Initializes a static song library ** Parameters: (songlib_t *) songlib: Pointer to the library ** to initialize ** Returns : (void) */ void song_lib_free(const songlib_t &songlib); /* Frees a song library ** Parameters: (songlib_t) songlib: The library to free ** Returns : (void) */ void song_lib_add(const songlib_t &songlib, song_t *song); /* Adds a song to a song library. ** Parameters: (songlib_t) songlib: An existing sound library, or NULL ** (song_t *) song: The song to add ** Returns : (void) */ song_t *song_lib_find(const songlib_t &songlib, song_handle_t handle); /* Looks up the song with the specified handle ** Parameters: (songlib_t) songlib: An existing sound library, may point to NULL ** (song_handle_t) handle: The sound handle to look for ** Returns : (song_t *) The song or NULL if it wasn't found */ song_t *song_lib_find_active(const songlib_t &songlib); /* Finds the first song playing with the highest priority ** Parameters: (songlib_t) songlib: An existing sound library ** Returns : (song_t *) The song that should be played next, or NULL if there is none */ song_t *song_lib_find_next_active(const songlib_t &songlib, song_t *song); /* Finds the next song playing with the highest priority ** Parameters: (songlib_t) songlib: The song library to operate on ** (song_t *) song: A song previously returned from the song library ** Returns : (song_t *) The next song to play relative to 'song', or ** NULL if none are left ** The functions 'song_lib_find_active' and 'song_lib_find_next_active ** allow to iterate over all songs that satisfy the requirement of ** being 'playable'. */ int song_lib_remove(const songlib_t &songlib, song_handle_t handle); /* Removes a song from the library ** Parameters: (songlib_t) songlib: An existing sound library ** (song_handle_t) handle: Handle of the song to remove ** Returns : (int) The status of the song that was removed */ void song_lib_resort(const songlib_t &songlib, song_t *song); /* Removes a song from the library and sorts it in again; for use after renicing ** Parameters: (songlib_t) songlib: An existing sound library ** (song_t *) song: The song to work on ** Returns : (void) */ int song_lib_count(const songlib_t &songlib); /* Counts the number of songs in a song library ** Parameters: (songlib_t) songlib: The library to count ** Returns : (int) The number of songs */ void song_lib_set_restore_behavior(const songlib_t &songlib, song_handle_t handle, RESTORE_BEHAVIOR action); /* Determines what should be done with the song "handle" when ** restoring it from a saved game. ** Parameters: (songlib_t) songlib: The library that contains the song ** (song_handle_t) handle: Its handle ** (RESTORE_BEHAVIOR) action: The desired action */ } // End of namespace Sci #endif // SCI_SSFX_SFX_SONGLIB_H