1. step in OGG refactoring: add OGG_PlayTrack(int track), remove others
This commit is contained in:
parent
ed6c9865f0
commit
781e7c7e12
|
@ -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
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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
|
||||
}
|
||||
|
|
|
@ -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
|
||||
{
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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)
|
||||
{
|
||||
if(ogg_ignoretrack0->value == 0)
|
||||
{
|
||||
OGG_PauseCmd();
|
||||
}
|
||||
}
|
||||
else if(track == -1) // randon track
|
||||
{
|
||||
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;
|
||||
// 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}\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",
|
||||
|
|
Loading…
Reference in New Issue