2009-02-17 15:05:16 +00:00
|
|
|
/* 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$
|
|
|
|
*
|
|
|
|
*/
|
2009-02-15 06:10:59 +00:00
|
|
|
|
|
|
|
/* Song library */
|
|
|
|
|
2009-02-24 15:33:40 +00:00
|
|
|
#ifndef SCI_SFX_SFX_SONGLIB_H
|
|
|
|
#define SCI_SFX_SFX_SONGLIB_H
|
2009-02-15 06:10:59 +00:00
|
|
|
|
2009-02-21 19:01:32 +00:00
|
|
|
#include "common/scummsys.h"
|
2009-03-09 16:15:35 +00:00
|
|
|
#include "sound/timestamp.h"
|
2009-02-21 19:01:32 +00:00
|
|
|
|
2009-02-21 10:23:36 +00:00
|
|
|
namespace Sci {
|
|
|
|
|
2009-03-06 18:11:12 +00:00
|
|
|
class SongIterator;
|
|
|
|
|
2009-02-15 06:10:59 +00:00
|
|
|
#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;
|
|
|
|
|
2009-02-26 16:16:46 +00:00
|
|
|
enum RESTORE_BEHAVIOR {
|
2009-02-15 06:10:59 +00:00
|
|
|
RESTORE_BEHAVIOR_CONTINUE, /* restart a song when restored from
|
|
|
|
a saved game */
|
|
|
|
RESTORE_BEHAVIOR_RESTART /* continue it from where it was */
|
2009-02-26 16:16:46 +00:00
|
|
|
};
|
2009-02-15 06:10:59 +00:00
|
|
|
|
2009-02-21 22:06:42 +00:00
|
|
|
struct song_t {
|
2009-02-15 06:10:59 +00:00
|
|
|
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;
|
|
|
|
|
2009-02-15 22:32:57 +00:00
|
|
|
/* Grabbed from the sound iterator, for save/restore purposes */
|
|
|
|
int loops;
|
|
|
|
int hold;
|
2009-02-15 06:10:59 +00:00
|
|
|
|
2009-03-06 07:25:06 +00:00
|
|
|
SongIterator *it;
|
2009-03-09 16:15:35 +00:00
|
|
|
int _delay; /* Delay before accessing the iterator, in ticks */
|
2009-02-15 06:10:59 +00:00
|
|
|
|
2009-03-09 16:15:35 +00:00
|
|
|
Audio::Timestamp _wakeupTime; /**< Timestamp indicating the next MIDI event */
|
2009-02-15 06:10:59 +00:00
|
|
|
|
2009-02-21 22:06:42 +00:00
|
|
|
song_t *next; /* Next song or NULL if this is the last one */
|
|
|
|
song_t *next_playing; /* Next playing song; used by the
|
2009-02-15 06:10:59 +00:00
|
|
|
** core song system */
|
2009-02-21 22:06:42 +00:00
|
|
|
song_t *next_stopping; /* Next song pending stopping; used exclusively by
|
2009-02-15 06:10:59 +00:00
|
|
|
** the core song system's _update_multi_song() */
|
2009-02-21 22:06:42 +00:00
|
|
|
};
|
2009-02-15 06:10:59 +00:00
|
|
|
|
|
|
|
|
2009-02-21 22:06:42 +00:00
|
|
|
struct songlib_t {
|
2009-02-15 06:10:59 +00:00
|
|
|
song_t **lib;
|
|
|
|
song_t *_s;
|
2009-02-21 22:06:42 +00:00
|
|
|
};
|
2009-02-15 06:10:59 +00:00
|
|
|
|
|
|
|
/**************************/
|
|
|
|
/* Song library commands: */
|
|
|
|
/**************************/
|
|
|
|
|
2009-03-06 07:25:06 +00:00
|
|
|
song_t *song_new(song_handle_t handle, SongIterator *it, int priority);
|
2009-02-15 06:10:59 +00:00
|
|
|
/* Initializes a new song
|
|
|
|
** Parameters: (song_handle_t) handle: The sound handle
|
2009-03-06 07:25:06 +00:00
|
|
|
** (SongIterator *) it: The song
|
2009-02-15 06:10:59 +00:00
|
|
|
** (int) priority: The song's priority
|
|
|
|
** Returns : (song_t *) A freshly allocated song
|
|
|
|
** Other values are set to predefined defaults.
|
|
|
|
*/
|
|
|
|
|
|
|
|
|
2009-02-21 16:08:04 +00:00
|
|
|
void song_lib_init(songlib_t *songlib);
|
2009-02-15 06:10:59 +00:00
|
|
|
/* Initializes a static song library
|
|
|
|
** Parameters: (songlib_t *) songlib: Pointer to the library
|
|
|
|
** to initialize
|
|
|
|
** Returns : (void)
|
|
|
|
*/
|
|
|
|
|
2009-03-15 20:31:15 +00:00
|
|
|
void song_lib_free(const songlib_t &songlib);
|
2009-02-15 06:10:59 +00:00
|
|
|
/* Frees a song library
|
|
|
|
** Parameters: (songlib_t) songlib: The library to free
|
|
|
|
** Returns : (void)
|
|
|
|
*/
|
|
|
|
|
2009-03-15 20:31:15 +00:00
|
|
|
void song_lib_add(const songlib_t &songlib, song_t *song);
|
2009-02-15 06:10:59 +00:00
|
|
|
/* 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)
|
|
|
|
*/
|
|
|
|
|
2009-03-15 20:31:15 +00:00
|
|
|
song_t *song_lib_find(const songlib_t &songlib, song_handle_t handle);
|
2009-02-15 06:10:59 +00:00
|
|
|
/* 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
|
|
|
|
*/
|
|
|
|
|
2009-03-15 20:31:15 +00:00
|
|
|
song_t *song_lib_find_active(const songlib_t &songlib);
|
2009-02-15 06:10:59 +00:00
|
|
|
/* 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
|
|
|
|
*/
|
|
|
|
|
2009-03-15 20:31:15 +00:00
|
|
|
song_t *song_lib_find_next_active(const songlib_t &songlib, song_t *song);
|
2009-02-15 06:10:59 +00:00
|
|
|
/* 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'.
|
|
|
|
*/
|
|
|
|
|
2009-03-15 20:31:15 +00:00
|
|
|
int song_lib_remove(const songlib_t &songlib, song_handle_t handle);
|
2009-02-15 06:10:59 +00:00
|
|
|
/* 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
|
|
|
|
*/
|
|
|
|
|
2009-03-15 20:31:15 +00:00
|
|
|
void song_lib_resort(const songlib_t &songlib, song_t *song);
|
2009-02-15 06:10:59 +00:00
|
|
|
/* 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)
|
|
|
|
*/
|
|
|
|
|
2009-03-15 20:31:15 +00:00
|
|
|
int song_lib_count(const songlib_t &songlib);
|
2009-02-15 06:10:59 +00:00
|
|
|
/* Counts the number of songs in a song library
|
|
|
|
** Parameters: (songlib_t) songlib: The library to count
|
|
|
|
** Returns : (int) The number of songs
|
|
|
|
*/
|
|
|
|
|
2009-03-15 20:31:15 +00:00
|
|
|
void song_lib_set_restore_behavior(const songlib_t &songlib, song_handle_t handle,
|
2009-02-22 13:11:43 +00:00
|
|
|
RESTORE_BEHAVIOR action);
|
2009-02-15 06:10:59 +00:00
|
|
|
/* 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
|
|
|
|
*/
|
|
|
|
|
2009-02-21 10:23:36 +00:00
|
|
|
} // End of namespace Sci
|
|
|
|
|
2009-02-24 15:33:40 +00:00
|
|
|
#endif // SCI_SSFX_SFX_SONGLIB_H
|