mirror of
https://github.com/yquake2/yquake2remaster.git
synced 2025-01-22 09:11:33 +00:00
client: play arbitrary CDTRACK ogg file
Initial implementation of https://github.com/yquake2/yquake2remaster/issues/18
This commit is contained in:
parent
1e935a5879
commit
d4bc315363
5 changed files with 77 additions and 29 deletions
|
@ -1184,9 +1184,7 @@ CL_ParseConfigString(void)
|
|||
{
|
||||
if (cl.refresh_prepped)
|
||||
{
|
||||
int track = (int)strtol(cl.configstrings[CS_CDTRACK], (char **)NULL, 10);
|
||||
|
||||
OGG_PlayTrack(track, true, true);
|
||||
OGG_PlayTrack(cl.configstrings[CS_CDTRACK], true, true);
|
||||
}
|
||||
}
|
||||
else if ((i >= CS_MODELS) && (i < CS_MODELS + MAX_MODELS))
|
||||
|
|
|
@ -439,9 +439,7 @@ CL_PrepRefresh(void)
|
|||
cl.force_refdef = true; /* make sure we have a valid refdef */
|
||||
|
||||
/* start the cd track */
|
||||
int track = (int)strtol(cl.configstrings[CS_CDTRACK], (char **)NULL, 10);
|
||||
|
||||
OGG_PlayTrack(track, true, true);
|
||||
OGG_PlayTrack(cl.configstrings[CS_CDTRACK], true, true);
|
||||
}
|
||||
|
||||
float
|
||||
|
|
|
@ -2274,8 +2274,7 @@ EnableOGGMusic(void *unused)
|
|||
|
||||
if (cls.state == ca_active)
|
||||
{
|
||||
int track = (int)strtol(cl.configstrings[CS_CDTRACK], (char **)NULL, 10);
|
||||
OGG_PlayTrack(track, true, true);
|
||||
OGG_PlayTrack(cl.configstrings[CS_CDTRACK], true, true);
|
||||
}
|
||||
}
|
||||
else
|
||||
|
|
|
@ -37,7 +37,7 @@ typedef enum
|
|||
int OGG_Status(void);
|
||||
void OGG_InitTrackList(void);
|
||||
void OGG_Init(void);
|
||||
void OGG_PlayTrack(int trackNo, qboolean cdtrack, qboolean immediate);
|
||||
void OGG_PlayTrack(const char* track, qboolean cdtrack, qboolean immediate);
|
||||
void OGG_RecoverState(void);
|
||||
void OGG_SaveState(void);
|
||||
void OGG_Shutdown(void);
|
||||
|
|
|
@ -64,7 +64,7 @@ enum GameType {
|
|||
rogue
|
||||
};
|
||||
|
||||
struct {
|
||||
static struct {
|
||||
qboolean saved;
|
||||
int curfile;
|
||||
int numsamples;
|
||||
|
@ -88,15 +88,24 @@ OGG_TogglePlayback(void);
|
|||
static int getMappedGOGtrack(int track, enum GameType gameType)
|
||||
{
|
||||
if(track <= 0)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
if(track == 1)
|
||||
{
|
||||
return 0; // 1 is illegal (=> data track on CD), 0 means "no track"
|
||||
}
|
||||
|
||||
if(gameType == other)
|
||||
{
|
||||
return track;
|
||||
}
|
||||
|
||||
if(gameType == rogue)
|
||||
{
|
||||
return track + 10;
|
||||
}
|
||||
|
||||
// apparently it's xatrix => map the track to the corresponding TrackXX.ogg from GOG
|
||||
switch(track)
|
||||
|
@ -295,7 +304,7 @@ static OGG_Read(void)
|
|||
ogg_numbufs = 0;
|
||||
ogg_numsamples = 0;
|
||||
|
||||
OGG_PlayTrack(ogg_curfile, false, false);
|
||||
OGG_PlayTrack(va("%d", ogg_curfile), false, false);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -385,7 +394,7 @@ OGG_Stream(void)
|
|||
|
||||
// Ogg playback has stopped and shuffle was modified, play the map cdtrack.
|
||||
ogg_shuffle->modified = false;
|
||||
OGG_PlayTrack(ogg_mapcdtrack, true, true);
|
||||
OGG_PlayTrack(va("%d", ogg_mapcdtrack), true, true);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -395,8 +404,11 @@ OGG_Stream(void)
|
|||
* play the ogg file that corresponds to the CD track with the given number
|
||||
*/
|
||||
void
|
||||
OGG_PlayTrack(int trackNo, qboolean cdtrack, qboolean immediate)
|
||||
OGG_PlayTrack(const char *track, qboolean cdtrack, qboolean immediate)
|
||||
{
|
||||
char name[MAX_OSPATH], *path = NULL;
|
||||
int trackNo;
|
||||
|
||||
if (sound_started == SS_NOT)
|
||||
{
|
||||
return; // sound is not initialized
|
||||
|
@ -407,6 +419,53 @@ OGG_PlayTrack(int trackNo, qboolean cdtrack, qboolean immediate)
|
|||
return;
|
||||
}
|
||||
|
||||
while (1)
|
||||
{
|
||||
int res = 0;
|
||||
FILE* f;
|
||||
|
||||
path = FS_NextPath(path);
|
||||
|
||||
if (!path)
|
||||
{
|
||||
break;
|
||||
}
|
||||
|
||||
Com_sprintf(name, sizeof(name), "%s/music/%s", path, track);
|
||||
|
||||
/* Open ogg vorbis file. */
|
||||
f = Q_fopen(name, "rb");
|
||||
if (f == NULL)
|
||||
{
|
||||
continue;
|
||||
}
|
||||
|
||||
/* Check running music. */
|
||||
if (ogg_status == PLAY)
|
||||
{
|
||||
OGG_Stop();
|
||||
}
|
||||
|
||||
// fclose is not required on error with close_on_free=true
|
||||
ogg_file = stb_vorbis_open_file(f, true, &res, NULL);
|
||||
|
||||
if (res != 0)
|
||||
{
|
||||
Com_Printf("%s: '%s' is not a valid Ogg Vorbis file (error %i).\n",
|
||||
__func__, name, res);
|
||||
return;
|
||||
}
|
||||
|
||||
/* Play file. */
|
||||
ogg_curfile = 0;
|
||||
ogg_numsamples = 0;
|
||||
ogg_status = PLAY;
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
trackNo = (int)strtol(track, (char **)NULL, 10);
|
||||
|
||||
// Track 0 means "stop music".
|
||||
if (trackNo == 0)
|
||||
{
|
||||
|
@ -502,7 +561,8 @@ OGG_PlayTrack(int trackNo, qboolean cdtrack, qboolean immediate)
|
|||
|
||||
if (ogg_tracks[trackNo] == NULL)
|
||||
{
|
||||
Com_Printf("%s: Don't have a .ogg file for track %d\n", __func__, trackNo);
|
||||
Com_Printf("%s: Don't have a .ogg file for track %d\n",
|
||||
__func__, trackNo);
|
||||
}
|
||||
|
||||
/* Check running music. */
|
||||
|
@ -520,7 +580,8 @@ OGG_PlayTrack(int trackNo, qboolean cdtrack, qboolean immediate)
|
|||
|
||||
if (ogg_tracks[trackNo] == NULL)
|
||||
{
|
||||
Com_Printf("OGG_PlayTrack: I don't have a file for track %d!\n", trackNo);
|
||||
Com_Printf("%s: I don't have a file for track %d!\n",
|
||||
__func__, trackNo);
|
||||
|
||||
return;
|
||||
}
|
||||
|
@ -530,7 +591,8 @@ OGG_PlayTrack(int trackNo, qboolean cdtrack, qboolean immediate)
|
|||
|
||||
if (f == NULL)
|
||||
{
|
||||
Com_Printf("%s: could not open file %s for track %d: %s.\n", __func__, ogg_tracks[trackNo], trackNo, strerror(errno));
|
||||
Com_Printf("%s: could not open file %s for track %d: %s.\n",
|
||||
__func__, ogg_tracks[trackNo], trackNo, strerror(errno));
|
||||
ogg_tracks[trackNo] = NULL;
|
||||
|
||||
return;
|
||||
|
@ -543,7 +605,8 @@ OGG_PlayTrack(int trackNo, qboolean cdtrack, qboolean immediate)
|
|||
|
||||
if (res != 0)
|
||||
{
|
||||
Com_Printf("%s: '%s' is not a valid Ogg Vorbis file (error %i).\n", __func__, ogg_tracks[trackNo], res);
|
||||
Com_Printf("%s: '%s' is not a valid Ogg Vorbis file (error %i).\n",
|
||||
__func__, ogg_tracks[trackNo], res);
|
||||
|
||||
return;
|
||||
}
|
||||
|
@ -690,17 +753,7 @@ OGG_Cmd(void)
|
|||
return;
|
||||
}
|
||||
|
||||
int track = (int)strtol(Cmd_Argv(2), NULL, 10);
|
||||
|
||||
if (track < 2 || track > ogg_maxfileindex)
|
||||
{
|
||||
Com_Printf("invalid track %s, must be an number between 2 and %d\n", Cmd_Argv(1), ogg_maxfileindex);
|
||||
return;
|
||||
}
|
||||
else
|
||||
{
|
||||
OGG_PlayTrack(track, false, true);
|
||||
}
|
||||
OGG_PlayTrack(Cmd_Argv(2), false, true);
|
||||
}
|
||||
else if (Q_stricmp(Cmd_Argv(1), "stop") == 0)
|
||||
{
|
||||
|
@ -755,7 +808,7 @@ OGG_RecoverState(void)
|
|||
int shuffle_state = ogg_shuffle->value;
|
||||
Cvar_SetValue("ogg_shuffle", 0);
|
||||
|
||||
OGG_PlayTrack(ogg_saved_state.curfile, false, true);
|
||||
OGG_PlayTrack(va("%d", ogg_saved_state.curfile), false, true);
|
||||
stb_vorbis_seek_frame(ogg_file, ogg_saved_state.numsamples);
|
||||
ogg_numsamples = ogg_saved_state.numsamples;
|
||||
|
||||
|
|
Loading…
Reference in a new issue