Some general cleanup to the vorbis backend.

* Remove unneccessary global variables.
* Simplify initialization.
* Reorder functions.
This commit is contained in:
Yamagi Burmeister 2018-06-10 09:51:37 +02:00
parent c2525a1e53
commit 750b37f288
2 changed files with 90 additions and 118 deletions

View file

@ -48,7 +48,7 @@ typedef enum
void OGG_Init(void); void OGG_Init(void);
void OGG_Shutdown(void); void OGG_Shutdown(void);
int OGG_Read(void); void OGG_Read(void);
void OGG_Stop(void); void OGG_Stop(void);
void OGG_Stream(void); void OGG_Stream(void);
void S_RawSamplesVol(int samples, int rate, int width, void S_RawSamplesVol(int samples, int rate, int width,

View file

@ -29,32 +29,28 @@
#ifdef OGG #ifdef OGG
#define OV_EXCLUDE_STATIC_CALLBACKS
#ifndef _WIN32 #ifndef _WIN32
#include <sys/time.h> #include <sys/time.h>
#endif #endif
#include <errno.h> #include <errno.h>
#include <vorbis/vorbisfile.h> #include <vorbis/vorbisfile.h>
#include "../header/client.h" #include "../header/client.h"
#include "header/local.h" #include "header/local.h"
#include "header/vorbis.h" #include "header/vorbis.h"
static qboolean ogg_first_init = true; /* First initialization flag. */
static qboolean ogg_started = false; /* Initialization flag. */
static int ogg_bigendian = 0;
static char ovBuf[4096]; /* Buffer for sound. */ static char ovBuf[4096]; /* Buffer for sound. */
static cvar_t *ogg_ignoretrack0; /* Toggle track 0 playing */
static cvar_t *ogg_volume; /* Music volume. */
static int ogg_curfile; /* Index of currently played file. */ static int ogg_curfile; /* Index of currently played file. */
static int ogg_numbufs; /* Number of buffers for OpenAL */
static int ovSection; /* Position in Ogg Vorbis file. */ static int ovSection; /* Position in Ogg Vorbis file. */
static ogg_status_t ogg_status; /* Status indicator. */ static ogg_status_t ogg_status; /* Status indicator. */
static cvar_t *ogg_check; /* Check Ogg files or not. */
static cvar_t *ogg_sequence; /* Sequence play indicator. */
static cvar_t *ogg_volume; /* Music volume. */
static cvar_t *ogg_ignoretrack0; /* Toggle track 0 playing */
static OggVorbis_File ovFile; /* Ogg Vorbis file. */ static OggVorbis_File ovFile; /* Ogg Vorbis file. */
static qboolean ogg_started = false; /* Initialization flag. */
static vorbis_info *ogg_info; /* Ogg Vorbis file information */ static vorbis_info *ogg_info; /* Ogg Vorbis file information */
static int ogg_numbufs; /* Number of buffers for OpenAL */
enum { MAX_NUM_OGGTRACKS = 32 }; enum { MAX_NUM_OGGTRACKS = 32 };
static char* oggTracks[MAX_NUM_OGGTRACKS]; static char* oggTracks[MAX_NUM_OGGTRACKS];
@ -66,42 +62,26 @@ enum GameType {
rogue rogue
}; };
// --------
/* /*
* Initialize the Ogg Vorbis subsystem. * Initialize the Ogg Vorbis subsystem.
*/ */
void void
OGG_Init(void) OGG_Init(void)
{ {
cvar_t *cv; /* Cvar pointer. */ cvar_t *ogg_enabled = Cvar_Get("ogg_enable", "1", CVAR_ARCHIVE);
if (ogg_started) if (ogg_enabled->value != 1)
{ {
return; return;
} }
Com_Printf("Starting Ogg Vorbis.\n"); // Cvars
/* Skip initialization if disabled. */
cv = Cvar_Get("ogg_enable", "1", CVAR_ARCHIVE);
if (cv->value != 1)
{
Com_Printf("Ogg Vorbis not initializing.\n");
return;
}
if (bigendien == true)
{
ogg_bigendian = 1;
}
/* Cvars. */
ogg_check = Cvar_Get("ogg_check", "0", CVAR_ARCHIVE);
ogg_sequence = Cvar_Get("ogg_sequence", "loop", CVAR_ARCHIVE);
ogg_volume = Cvar_Get("ogg_volume", "0.7", CVAR_ARCHIVE); ogg_volume = Cvar_Get("ogg_volume", "0.7", CVAR_ARCHIVE);
ogg_ignoretrack0 = Cvar_Get("ogg_ignoretrack0", "0", CVAR_ARCHIVE); ogg_ignoretrack0 = Cvar_Get("ogg_ignoretrack0", "0", CVAR_ARCHIVE);
/* Console commands. */ // Commands
Cmd_AddCommand("ogg_list", OGG_ListCmd); Cmd_AddCommand("ogg_list", OGG_ListCmd);
Cmd_AddCommand("ogg_pause", OGG_PauseCmd); Cmd_AddCommand("ogg_pause", OGG_PauseCmd);
Cmd_AddCommand("ogg_play", OGG_PlayCmd); Cmd_AddCommand("ogg_play", OGG_PlayCmd);
@ -109,14 +89,10 @@ OGG_Init(void)
Cmd_AddCommand("ogg_status", OGG_StatusCmd); Cmd_AddCommand("ogg_status", OGG_StatusCmd);
Cmd_AddCommand("ogg_stop", OGG_Stop); Cmd_AddCommand("ogg_stop", OGG_Stop);
/* Initialize variables. */ // Global bariables
if (ogg_first_init)
{
ogg_curfile = -1; ogg_curfile = -1;
ogg_info = NULL; ogg_info = NULL;
ogg_status = STOP; ogg_status = STOP;
ogg_first_init = false;
}
ogg_started = true; ogg_started = true;
} }
@ -132,11 +108,10 @@ OGG_Shutdown(void)
return; return;
} }
Com_Printf("Shutting down Ogg Vorbis.\n"); // Music must be stopped.
OGG_Stop(); OGG_Stop();
/* Free the list of files. */ // Free file lsit.
for(int i=0; i<MAX_NUM_OGGTRACKS; ++i) for(int i=0; i<MAX_NUM_OGGTRACKS; ++i)
{ {
if(oggTracks[i] != NULL) if(oggTracks[i] != NULL)
@ -147,7 +122,7 @@ OGG_Shutdown(void)
} }
oggMaxFileIndex = 0; oggMaxFileIndex = 0;
/* Remove console commands. */ // Remove console commands
Cmd_RemoveCommand("ogg_list"); Cmd_RemoveCommand("ogg_list");
Cmd_RemoveCommand("ogg_pause"); Cmd_RemoveCommand("ogg_pause");
Cmd_RemoveCommand("ogg_play"); Cmd_RemoveCommand("ogg_play");
@ -158,6 +133,8 @@ OGG_Shutdown(void)
ogg_started = false; ogg_started = false;
} }
// --------
/* /*
* The GOG version of Quake2 has the music tracks in music/TrackXX.ogg * The GOG version of Quake2 has the music tracks in music/TrackXX.ogg
* That music/ dir is next to baseq/ (not in it) and contains Track02.ogg to Track21.ogg * That music/ dir is next to baseq/ (not in it) and contains Track02.ogg to Track21.ogg
@ -296,61 +273,28 @@ OGG_InitTrackList(void)
// if tracks have been found above, we would've returned there // if tracks have been found above, we would've returned there
Com_Printf("No Ogg Vorbis music tracks have been found, so there will be no music.\n"); Com_Printf("No Ogg Vorbis music tracks have been found, so there will be no music.\n");
// TODO: maybe shutdown ogg if nothing was found?
// => need to reinit it if game changes and sth is found then
} }
// --------
/* /*
* Play a portion of the currently opened file. * Play a portion of the currently opened file.
*/ */
int void
OGG_Read(void) OGG_Read(void)
{ {
int res; /* Number of bytes read. */ long read_bytes = ov_read(&ovFile, ovBuf, sizeof(ovBuf), bigendien, OGG_SAMPLEWIDTH, 1, &ovSection);
/* Read and resample. */ if (read_bytes > 0)
res = ov_read(&ovFile, ovBuf, sizeof(ovBuf), {
ogg_bigendian, OGG_SAMPLEWIDTH, 1, S_RawSamples(read_bytes / (OGG_SAMPLEWIDTH * ogg_info->channels), ogg_info->rate, OGG_SAMPLEWIDTH,
&ovSection); ogg_info->channels, (byte *) ovBuf, ogg_volume->value);
S_RawSamples(res / (OGG_SAMPLEWIDTH * ogg_info->channels), }
ogg_info->rate, OGG_SAMPLEWIDTH, ogg_info->channels, else
(byte *)ovBuf, ogg_volume->value);
/* Check for end of file. */
if (res == 0)
{ {
OGG_Stop(); OGG_Stop();
OGG_PlayTrack(ogg_curfile); OGG_PlayTrack(ogg_curfile);
} }
return res;
}
/*
* Stop playing the current file.
*/
void
OGG_Stop(void)
{
if (ogg_status == STOP)
{
return;
}
#ifdef USE_OPENAL
if (sound_started == SS_OAL)
{
AL_UnqueueRawSamples();
}
#endif
ov_clear(&ovFile);
ogg_status = STOP;
ogg_info = NULL;
ogg_numbufs = 0;
} }
/* /*
@ -401,33 +345,11 @@ OGG_Stream(void)
OGG_Read(); OGG_Read();
} }
} }
} /* using SDL */ }
} /* ogg_status == PLAY */ }
} }
/* // --------
* List Ogg Vorbis files.
*/
void
OGG_ListCmd(void)
{
int numFiles = 0;
for (int i = 2; i <= oggMaxFileIndex; i++)
{
if(oggTracks[i])
{
Com_Printf("%d %s\n", i, oggTracks[i]);
++numFiles;
}
else
{
Com_Printf("%d <none>\n", i);
}
}
Com_Printf("%d Ogg Vorbis files.\n", oggMaxFileIndex+1);
}
/* /*
* play the ogg file that corresponds to the CD track with the given number * play the ogg file that corresponds to the CD track with the given number
@ -524,6 +446,56 @@ OGG_PlayTrack(int trackNo)
ogg_status = PLAY; ogg_status = PLAY;
} }
// ----
/*
* Stop playing the current file.
*/
void
OGG_Stop(void)
{
if (ogg_status == STOP)
{
return;
}
#ifdef USE_OPENAL
if (sound_started == SS_OAL)
{
AL_UnqueueRawSamples();
}
#endif
ov_clear(&ovFile);
ogg_status = STOP;
ogg_info = NULL;
ogg_numbufs = 0;
}
/*
* List Ogg Vorbis files.
*/
void
OGG_ListCmd(void)
{
int numFiles = 0;
for (int i = 2; i <= oggMaxFileIndex; i++)
{
if(oggTracks[i])
{
Com_Printf("%d %s\n", i, oggTracks[i]);
++numFiles;
}
else
{
Com_Printf("%d <none>\n", i);
}
}
Com_Printf("%d Ogg Vorbis files.\n", oggMaxFileIndex+1);
}
/* /*
* Pause current song. * Pause current song.
*/ */