Use a 2D array to allow playing of songs by track number in future
This commit is contained in:
parent
8c4d0f62df
commit
26a648365c
|
@ -3,6 +3,7 @@ D2X-Rebirth Changelog
|
|||
20090113
|
||||
--------
|
||||
main/physics.c: Actually set velocity from movement when colliding with objects
|
||||
arch/sdl/jukebox.c: Use a 2D array to allow playing of songs by track number in future
|
||||
|
||||
20090108
|
||||
--------
|
||||
|
|
|
@ -20,63 +20,30 @@
|
|||
#define JUKEBOX_HUDMSG_PLAYING "Now playing:"
|
||||
#define JUKEBOX_HUDMSG_STOPPED "Jukebox stopped"
|
||||
|
||||
static int jukebox_loaded = 0;
|
||||
static int jukebox_playing = 0;
|
||||
static dl_list *JukeboxSongs;
|
||||
static int jukebox_playing = -1;
|
||||
static int jukebox_numsongs = 0;
|
||||
static char **JukeboxSongs = NULL;
|
||||
char hud_msg_buf[MUSIC_HUDMSG_MAXLEN+4];
|
||||
|
||||
|
||||
char *select_prev_song(dl_list *list) {
|
||||
char *ret;
|
||||
if (dl_is_empty(list)) {
|
||||
ret = NULL;
|
||||
}
|
||||
else {
|
||||
if (list->first == list->current) {
|
||||
list->current = list->last;
|
||||
}
|
||||
else {
|
||||
dl_backward(list);
|
||||
}
|
||||
ret = (char *) list->current->data;
|
||||
}
|
||||
return ret;
|
||||
}
|
||||
|
||||
char *select_next_song(dl_list *list) {
|
||||
char *ret;
|
||||
if (dl_is_empty(list)) {
|
||||
ret = NULL;
|
||||
}
|
||||
else {
|
||||
if (list->last == list->current) {
|
||||
list->current = list->first;
|
||||
}
|
||||
else {
|
||||
dl_forward(list);
|
||||
}
|
||||
ret = (char *) list->current->data;
|
||||
}
|
||||
return ret;
|
||||
}
|
||||
|
||||
void jukebox_unload()
|
||||
{
|
||||
int i;
|
||||
|
||||
if (JukeboxSongs == NULL)
|
||||
return;
|
||||
|
||||
while (JukeboxSongs->first!=NULL)
|
||||
for (i = 0; JukeboxSongs[i]!=NULL; i++)
|
||||
{
|
||||
dl_remove(JukeboxSongs,JukeboxSongs->first);
|
||||
free(JukeboxSongs[i]);
|
||||
}
|
||||
d_free(JukeboxSongs);
|
||||
jukebox_loaded = 0;
|
||||
free(JukeboxSongs);
|
||||
JukeboxSongs = NULL;
|
||||
}
|
||||
|
||||
/* Loads music file names from a given directory */
|
||||
void jukebox_load() {
|
||||
int count = 0;
|
||||
char **files;
|
||||
int count;
|
||||
char *music_exts[] = { ".mp3", ".ogg", ".wav", ".aif", NULL };
|
||||
static char curpath[PATH_MAX+1];
|
||||
|
||||
|
@ -86,45 +53,38 @@ void jukebox_load() {
|
|||
jukebox_unload();
|
||||
}
|
||||
|
||||
if (jukebox_loaded)
|
||||
if (JukeboxSongs)
|
||||
return;
|
||||
|
||||
if (GameCfg.JukeboxOn) {
|
||||
// Adding as a mount point is an option, but wouldn't work for older versions of PhysicsFS
|
||||
PHYSFS_addToSearchPath(GameCfg.JukeboxPath, 1);
|
||||
|
||||
JukeboxSongs = dl_init();
|
||||
files = PHYSFSX_findFiles("", music_exts);
|
||||
JukeboxSongs = PHYSFSX_findFiles("", music_exts);
|
||||
|
||||
if (files != NULL && *files != NULL) {
|
||||
char **i;
|
||||
|
||||
for (i=files; *i!=NULL; i++)
|
||||
{
|
||||
dl_add(JukeboxSongs, *i);
|
||||
count++;
|
||||
}
|
||||
if (JukeboxSongs != NULL) {
|
||||
for (count = 0; JukeboxSongs[count]!=NULL; count++) {}
|
||||
if (count)
|
||||
{
|
||||
con_printf(CON_DEBUG,"Jukebox: %d music file(s) found in %s\n", count, GameCfg.JukeboxPath);
|
||||
memcpy(curpath,GameCfg.JukeboxPath,PATH_MAX);
|
||||
jukebox_loaded = 1;
|
||||
jukebox_numsongs = count;
|
||||
}
|
||||
else { con_printf(CON_DEBUG,"Jukebox music could not be found!\n"); }
|
||||
}
|
||||
else
|
||||
{ Int3(); } // should at least find a directory in some search path, otherwise how did D2X load?
|
||||
|
||||
if (files != NULL)
|
||||
free(files);
|
||||
}
|
||||
}
|
||||
|
||||
void jukebox_play(int loop) {
|
||||
char *music_filename;
|
||||
|
||||
if (!jukebox_loaded) return;
|
||||
music_filename = (char *) JukeboxSongs->current->data;
|
||||
if (!JukeboxSongs) return;
|
||||
|
||||
if (jukebox_playing == -1)
|
||||
jukebox_playing = 0; // For now - will allow track numbers as arguments in future
|
||||
music_filename = JukeboxSongs[jukebox_playing];
|
||||
|
||||
mix_play_file(music_filename, loop);
|
||||
|
||||
|
@ -138,19 +98,18 @@ void jukebox_play(int loop) {
|
|||
}
|
||||
|
||||
hud_message(MSGC_GAME_FEEDBACK, "%s %s", JUKEBOX_HUDMSG_PLAYING, hud_msg_buf);
|
||||
jukebox_playing = 1;
|
||||
}
|
||||
|
||||
void jukebox_stop() {
|
||||
if (!jukebox_loaded) return; // since this function is also used for stopping MIDI
|
||||
if (!JukeboxSongs) return; // since this function is also used for stopping MIDI
|
||||
mix_stop_music();
|
||||
if (jukebox_playing)
|
||||
if (jukebox_playing != -1)
|
||||
hud_message(MSGC_GAME_FEEDBACK, JUKEBOX_HUDMSG_STOPPED);
|
||||
jukebox_playing = 0;
|
||||
jukebox_playing = -1;
|
||||
}
|
||||
|
||||
void jukebox_pause_resume() {
|
||||
if (!jukebox_loaded) return;
|
||||
if (!JukeboxSongs) return;
|
||||
|
||||
if (Mix_PausedMusic())
|
||||
{
|
||||
|
@ -165,42 +124,47 @@ void jukebox_pause_resume() {
|
|||
}
|
||||
|
||||
void jukebox_hook_stop() {
|
||||
if (!jukebox_loaded) return;
|
||||
if (!JukeboxSongs) return;
|
||||
}
|
||||
|
||||
void jukebox_hook_next() {
|
||||
if (!jukebox_loaded) return;
|
||||
if (jukebox_playing) jukebox_next();
|
||||
if (!JukeboxSongs) return;
|
||||
if (jukebox_playing != -1) jukebox_next();
|
||||
}
|
||||
|
||||
void jukebox_next() {
|
||||
if (!jukebox_loaded) return;
|
||||
select_next_song(JukeboxSongs);
|
||||
if (jukebox_playing) jukebox_play(1);
|
||||
if (!JukeboxSongs || jukebox_playing == -1) return;
|
||||
|
||||
jukebox_playing++;
|
||||
if (jukebox_playing == jukebox_numsongs)
|
||||
jukebox_playing = 0;
|
||||
jukebox_play(1);
|
||||
}
|
||||
|
||||
void jukebox_prev() {
|
||||
if (!jukebox_loaded) return;
|
||||
select_prev_song(JukeboxSongs);
|
||||
if (jukebox_playing) jukebox_play(1);
|
||||
if (!JukeboxSongs || jukebox_playing == -1) return;
|
||||
|
||||
jukebox_playing--;
|
||||
if (jukebox_playing == -1)
|
||||
jukebox_playing = jukebox_numsongs - 1;
|
||||
jukebox_play(1);
|
||||
}
|
||||
|
||||
char *jukebox_current() {
|
||||
return JukeboxSongs->current->data;
|
||||
return JukeboxSongs[jukebox_playing];
|
||||
}
|
||||
|
||||
int jukebox_is_loaded() { return jukebox_loaded; }
|
||||
int jukebox_is_playing() { return jukebox_playing; }
|
||||
int jukebox_is_loaded() { return (JukeboxSongs != NULL); }
|
||||
int jukebox_is_playing() { return jukebox_playing + 1; }
|
||||
|
||||
void jukebox_list() {
|
||||
dl_item *curr;
|
||||
if (!jukebox_loaded) return;
|
||||
if (dl_is_empty(JukeboxSongs)) {
|
||||
int i;
|
||||
if (!JukeboxSongs) return;
|
||||
if (!(*JukeboxSongs)) {
|
||||
con_printf(CON_DEBUG,"* No songs have been found\n");
|
||||
}
|
||||
else {
|
||||
for (curr = JukeboxSongs->first; curr != NULL; curr = curr->next) {
|
||||
con_printf(CON_DEBUG,"* %s\n", (char *) curr->data);
|
||||
}
|
||||
for (i = 0; i < jukebox_numsongs; i++)
|
||||
con_printf(CON_DEBUG,"* %s\n", JukeboxSongs[i]);
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Reference in a new issue