diff --git a/src/client/cl_parse.c b/src/client/cl_parse.c index aacb1cc3..7a168125 100644 --- a/src/client/cl_parse.c +++ b/src/client/cl_parse.c @@ -1083,24 +1083,14 @@ CL_ParseConfigString(void) { if (cl.refresh_prepped) { + int track = (int)strtol(cl.configstrings[CS_CDTRACK], (char **)NULL, 10); #ifdef CDA - CDAudio_Play((int)strtol(cl.configstrings[CS_CDTRACK], - (char **)NULL, 10), true); + CDAudio_Play(track, true); #endif #ifdef OGG - /* OGG/Vorbis */ - if ((int)strtol(cl.configstrings[CS_CDTRACK], (char **)NULL, 10) < 10) - { - char tmp[3] = "0"; - OGG_ParseCmd(strcat(tmp, cl.configstrings[CS_CDTRACK])); - } - else - { - OGG_ParseCmd(cl.configstrings[CS_CDTRACK]); - } - + OGG_PlayTrack(track); #endif } } diff --git a/src/client/cl_view.c b/src/client/cl_view.c index 2ff53a39..8a73e692 100644 --- a/src/client/cl_view.c +++ b/src/client/cl_view.c @@ -372,22 +372,14 @@ CL_PrepRefresh(void) } else { + int track = (int)strtol(cl.configstrings[CS_CDTRACK], (char **)NULL, 10); #ifdef CDA - CDAudio_Play((int)strtol(cl.configstrings[CS_CDTRACK], (char **)NULL, 10), true); + CDAudio_Play(track, (char **)NULL, 10), true); #endif #ifdef OGG - /* OGG/Vorbis */ - if ((int)strtol(cl.configstrings[CS_CDTRACK], (char **)NULL, 10) < 10) - { - char tmp[3] = "0"; - OGG_ParseCmd(strcat(tmp, cl.configstrings[CS_CDTRACK])); - } - else - { - OGG_ParseCmd(cl.configstrings[CS_CDTRACK]); - } + OGG_PlayTrack(track); #endif } diff --git a/src/client/menu/menu.c b/src/client/menu/menu.c index 5d6cc2aa..509e8c28 100644 --- a/src/client/menu/menu.c +++ b/src/client/menu/menu.c @@ -1208,7 +1208,7 @@ CDShuffleFunc(void *unused) if (ogg->value) { - OGG_ParseCmd("?"); + OGG_PlayTrack(-1); } } else @@ -1217,15 +1217,8 @@ CDShuffleFunc(void *unused) if (ogg->value) { - if ((int)strtol(cl.configstrings[CS_CDTRACK], (char **)NULL, 10) < 10) - { - char tmp[3] = {'0', cl.configstrings[CS_CDTRACK][0], '\0'}; - OGG_ParseCmd(tmp); - } - else - { - OGG_ParseCmd(cl.configstrings[CS_CDTRACK]); - } + int track = (int)strtol(cl.configstrings[CS_CDTRACK], (char **)NULL, 10); + OGG_PlayTrack(track); } } @@ -1258,15 +1251,8 @@ EnableOGGMusic(void *unused) OGG_Init(); OGG_Stop(); - if ((int)strtol(cl.configstrings[CS_CDTRACK], (char **)NULL, 10) < 10) - { - char tmp[3] = "0"; - OGG_ParseCmd(strcat(tmp, cl.configstrings[CS_CDTRACK])); - } - else - { - OGG_ParseCmd(cl.configstrings[CS_CDTRACK]); - } + int track = (int)strtol(cl.configstrings[CS_CDTRACK], (char **)NULL, 10); + OGG_PlayTrack(track); } else { diff --git a/src/client/sound/header/vorbis.h b/src/client/sound/header/vorbis.h index 9b1fd070..808c35b8 100644 --- a/src/client/sound/header/vorbis.h +++ b/src/client/sound/header/vorbis.h @@ -48,15 +48,11 @@ typedef enum void OGG_Init(void); void OGG_Shutdown(void); -void OGG_Reinit(void); qboolean OGG_Check(char *name); -void OGG_Seek(ogg_seek_t type, double offset); void OGG_LoadFileList(void); -void OGG_LoadPlaylist(char *name); qboolean OGG_Open(ogg_seek_t type, int offset); qboolean OGG_OpenName(char *filename); int OGG_Read(void); -void OGG_Sequence(void); void OGG_Stop(void); void OGG_Stream(void); void S_RawSamplesVol(int samples, int rate, int width, @@ -64,9 +60,9 @@ void S_RawSamplesVol(int samples, int rate, int width, /* Console commands. */ void OGG_ListCmd(void); -void OGG_ParseCmd(char *arg); void OGG_PauseCmd(void); void OGG_PlayCmd(void); +void OGG_PlayTrack(int track); void OGG_ResumeCmd(void); void OGG_SeekCmd(void); void OGG_StatusCmd(void); diff --git a/src/client/sound/ogg.c b/src/client/sound/ogg.c index 12427353..48ebc438 100644 --- a/src/client/sound/ogg.c +++ b/src/client/sound/ogg.c @@ -51,9 +51,7 @@ int ogg_curfile; /* Index of currently played file. */ int ogg_numfiles; /* Number of Ogg Vorbis files. */ int ovSection; /* Position in Ogg Vorbis file. */ ogg_status_t ogg_status; /* Status indicator. */ -cvar_t *ogg_autoplay; /* Play this song when started. */ cvar_t *ogg_check; /* Check Ogg files or not. */ -cvar_t *ogg_playlist; /* Playlist. */ cvar_t *ogg_sequence; /* Sequence play indicator. */ cvar_t *ogg_volume; /* Music volume. */ cvar_t *ogg_ignoretrack0; /* Toggle track 0 playing */ @@ -91,9 +89,7 @@ OGG_Init(void) } /* Cvars. */ - ogg_autoplay = Cvar_Get("ogg_autoplay", "?", CVAR_ARCHIVE); ogg_check = Cvar_Get("ogg_check", "0", CVAR_ARCHIVE); - ogg_playlist = Cvar_Get("ogg_playlist", "playlist", CVAR_ARCHIVE); ogg_sequence = Cvar_Get("ogg_sequence", "loop", CVAR_ARCHIVE); ogg_volume = Cvar_Get("ogg_volume", "0.7", CVAR_ARCHIVE); ogg_ignoretrack0 = Cvar_Get("ogg_ignoretrack0", "0", CVAR_ARCHIVE); @@ -102,24 +98,14 @@ OGG_Init(void) Cmd_AddCommand("ogg_list", OGG_ListCmd); Cmd_AddCommand("ogg_pause", OGG_PauseCmd); Cmd_AddCommand("ogg_play", OGG_PlayCmd); - Cmd_AddCommand("ogg_reinit", OGG_Reinit); Cmd_AddCommand("ogg_resume", OGG_ResumeCmd); - Cmd_AddCommand("ogg_seek", OGG_SeekCmd); Cmd_AddCommand("ogg_status", OGG_StatusCmd); Cmd_AddCommand("ogg_stop", OGG_Stop); /* Build list of files. */ ogg_numfiles = 0; - if (ogg_playlist->string[0] != '\0') - { - OGG_LoadPlaylist(ogg_playlist->string); - } - - if (ogg_numfiles == 0) - { - OGG_LoadFileList(); - } + OGG_LoadFileList(); // FIXME: call whenever $game changes /* Check if we have Ogg Vorbis files. */ if (ogg_numfiles <= 0) @@ -143,12 +129,6 @@ OGG_Init(void) ogg_started = true; Com_Printf("%d Ogg Vorbis files found.\n", ogg_numfiles); - - /* Autoplay support. */ - if (ogg_autoplay->string[0] != '\0') - { - OGG_ParseCmd(ogg_autoplay->string); - } } /* @@ -173,25 +153,13 @@ OGG_Shutdown(void) Cmd_RemoveCommand("ogg_list"); Cmd_RemoveCommand("ogg_pause"); Cmd_RemoveCommand("ogg_play"); - Cmd_RemoveCommand("ogg_reinit"); Cmd_RemoveCommand("ogg_resume"); - Cmd_RemoveCommand("ogg_seek"); Cmd_RemoveCommand("ogg_status"); Cmd_RemoveCommand("ogg_stop"); ogg_started = false; } -/* - * Reinitialize the Ogg Vorbis subsystem. - */ -void -OGG_Reinit(void) -{ - OGG_Shutdown(); - OGG_Init(); -} - /* * Check if the file is a valid Ogg Vorbis file. */ @@ -224,77 +192,11 @@ OGG_Check(char *name) return res; } -/* - * Change position in the file. - */ -void -OGG_Seek(ogg_seek_t type, double offset) -{ - double pos; /* Position in file (in seconds). */ - double total; /* Length of file (in seconds). */ - - /* Check if the file is seekable. */ - if (ov_seekable(&ovFile) == 0) - { - Com_Printf("OGG_Seek: file is not seekable.\n"); - return; - } - - /* Get file information. */ - pos = ov_time_tell(&ovFile); - total = ov_time_total(&ovFile, -1); - - switch (type) - { - case ABS: - - if ((offset >= 0) && (offset <= total)) - { - if (ov_time_seek(&ovFile, offset) != 0) - { - Com_Printf("OGG_Seek: could not seek.\n"); - } - - else - { - Com_Printf("%0.2f -> %0.2f of %0.2f.\n", pos, offset, total); - } - } - else - { - Com_Printf("OGG_Seek: invalid offset.\n"); - } - - break; - case REL: - - if ((pos + offset >= 0) && (pos + offset <= total)) - { - if (ov_time_seek(&ovFile, pos + offset) != 0) - { - Com_Printf("OGG_Seek: could not seek.\n"); - } - - else - { - Com_Printf("%0.2f -> %0.2f of %0.2f.\n", - pos, pos + offset, total); - } - } - else - { - Com_Printf("OGG_Seek: invalid offset.\n"); - } - - break; - } -} - /* * Load list of Ogg Vorbis files in "music". */ void -OGG_LoadFileList(void) +OGG_LoadFileList(void) // FIXME: call whenever $game changes, rename: OGG_InitTrackList() or sth { char **list; /* List of .ogg files. */ int i; /* Loop counter. */ @@ -335,61 +237,6 @@ OGG_LoadFileList(void) ogg_filelist = realloc(ogg_filelist, sizeof(char *) * ogg_numfiles); } -/* - * Load playlist. - */ -void -OGG_LoadPlaylist(char *playlist) -{ - byte *buffer; /* Buffer to read the file. */ - char *ptr; /* Pointer for parsing the file. */ - int i; /* Loop counter. */ - int size; /* Length of buffer and strings. */ - - /* Open playlist. */ - if ((size = FS_LoadFile(va("%s/%s.lst", OGG_DIR, - ogg_playlist->string), (void **)&buffer)) < 0) - { - Com_Printf("OGG_LoadPlaylist: could not open playlist: %s.\n", - strerror(errno)); - return; - } - - /* Count the files in playlist. */ - for (ptr = strtok((char *)buffer, "\n"); - ptr != NULL; - ptr = strtok(NULL, "\n")) - { - if ((byte *)ptr != buffer) - { - ptr[-1] = '\n'; - } - - if (OGG_Check(va("%s/%s", OGG_DIR, ptr))) - { - ogg_numfiles++; - } - } - - /* Allocate file list. */ - ogg_filelist = malloc(sizeof(char *) * ogg_numfiles); - - i = 0; - - for (ptr = strtok((char *)buffer, "\n"); - ptr != NULL; - ptr = strtok(NULL, "\n")) - { - if (OGG_Check(va("%s/%s", OGG_DIR, ptr))) - { - ogg_filelist[i++] = strdup(va("%s/%s", OGG_DIR, ptr)); - } - } - - /* Free file buffer. */ - FS_FreeFile(buffer); -} - /* * Play Ogg Vorbis file (with absolute or relative index). */ @@ -547,43 +394,11 @@ OGG_Read(void) if (res == 0) { OGG_Stop(); - OGG_Sequence(); - } - - return res; -} - -/* - * Play files in sequence. - */ -void -OGG_Sequence(void) -{ - if (strcmp(ogg_sequence->string, "next") == 0) - { - OGG_Open(REL, 1); - } - - else if (strcmp(ogg_sequence->string, "prev") == 0) - { - OGG_Open(REL, -1); - } - - else if (strcmp(ogg_sequence->string, "random") == 0) - { - OGG_Open(ABS, randk() % ogg_numfiles); - } - - else if (strcmp(ogg_sequence->string, "loop") == 0) - { + //OGG_Sequence(); OGG_Open(REL, 0); } - else if (strcmp(ogg_sequence->string, "none") != 0) - { - Com_Printf("Invalid value of ogg_sequence: %s\n", ogg_sequence->string); - Cvar_Set("ogg_sequence", "none"); - } + return res; } /* @@ -684,60 +499,26 @@ OGG_ListCmd(void) Com_Printf("%d Ogg Vorbis files.\n", ogg_numfiles); } -/* - * Parse play controls. - */ +// TODO: document void -OGG_ParseCmd(char *arg) +OGG_PlayTrack(int track) { - int n; - cvar_t *ogg_enable; - - ogg_enable = Cvar_Get("ogg_enable", "1", CVAR_ARCHIVE); - - switch (arg[0]) + if(track == 0) { - case '#': - n = (int)strtol(arg + 1, (char **)NULL, 10) - 1; - OGG_Open(ABS, n); - break; - case '?': - OGG_Open(ABS, randk() % ogg_numfiles); - break; - case '>': - - if (strlen(arg) > 1) - { - OGG_Open(REL, (int)strtol(arg + 1, (char **)NULL, 10)); - } - - else - { - OGG_Open(REL, 1); - } - - break; - case '<': - - if (strlen(arg) > 1) - { - OGG_Open(REL, -(int)strtol(arg + 1, (char **)NULL, 10)); - } - - else - { - OGG_Open(REL, -1); - } - - break; - default: - - if (ogg_enable->value != 0) - { - OGG_OpenName(arg); - } - - break; + if(ogg_ignoretrack0->value == 0) + { + OGG_PauseCmd(); + } + } + else if(track == -1) // randon track + { + OGG_Open(ABS, randk() % ogg_numfiles); + } + else + { + // TODO: support other naming schemes etc + char name[3] = { '0' + track / 10, '0' + track % 10, '\0' }; + OGG_OpenName(name); } } @@ -773,14 +554,15 @@ OGG_PlayCmd(void) return; } - OGG_ParseCmd(Cmd_Argv(1)); + //OGG_ParseCmd(Cmd_Argv(1)); + // TODO: selber parsen, nur noch track nummer oder garnix anbieten } /* * Resume current song. */ void -OGG_ResumeCmd(void) +OGG_ResumeCmd(void) // TODO: OGG_TogglePlay? { if (ogg_status == PAUSE) { @@ -788,37 +570,6 @@ OGG_ResumeCmd(void) } } -/* - * Change position in the file being played. - */ -void -OGG_SeekCmd(void) -{ - if (ogg_status != STOP) - { - return; - } - - if (Cmd_Argc() < 2) - { - Com_Printf("Usage: ogg_seek {n | n}\n"); - return; - } - - switch (Cmd_Argv(1)[0]) - { - case '>': - OGG_Seek(REL, strtod(Cmd_Argv(1) + 1, (char **)NULL)); - break; - case '<': - OGG_Seek(REL, -strtod(Cmd_Argv(1) + 1, (char **)NULL)); - break; - default: - OGG_Seek(ABS, strtod(Cmd_Argv(1), (char **)NULL)); - break; - } -} - /* * Display status. */ @@ -832,18 +583,18 @@ OGG_StatusCmd(void) ogg_curfile + 1, ogg_filelist[ogg_curfile], ov_time_tell(&ovFile)); break; + case PAUSE: Com_Printf("Paused file %d (%s) at %0.2f seconds.\n", ogg_curfile + 1, ogg_filelist[ogg_curfile], ov_time_tell(&ovFile)); break; - case STOP: + case STOP: if (ogg_curfile == -1) { Com_Printf("Stopped.\n"); } - else { Com_Printf("Stopped file %d (%s).\n",