Refactoring of cd player code WIP

This commit is contained in:
Eric Wasylishen 2011-01-18 13:32:12 -07:00
parent 1273c59c1e
commit 0f8f8381d0
3 changed files with 134 additions and 270 deletions

View file

@ -24,7 +24,6 @@
Boston, MA 02110-1301 USA
*/
#if 0
#include "SDL.h"
#ifndef SDL_INIT_CDROM
@ -41,9 +40,7 @@
static qboolean cdValid = false;
static qboolean playing = false;
static qboolean wasPlaying = false;
static qboolean enabled = true;
static qboolean playLooping = false;
static byte remap[100];
static byte playTrack;
static double endOfTrack = -1.0, pausetime = -1.0;
static SDL_CD *cd_handle;
@ -52,16 +49,16 @@ static float old_cdvolume;
static qboolean hw_vol_works = true;
static void CDAudio_Eject(void)
void CDAudioBackend_Eject(void)
{
if (!cd_handle || !enabled)
if (!cd_handle)
return;
if (SDL_CDEject(cd_handle) == -1)
Con_Printf ("Unable to eject CD-ROM: %s\n", SDL_GetError ());
}
static int CDAudio_GetAudioDiskInfo(void)
static int CDAudioBackend_GetAudioDiskInfo(void)
{
cdValid = false;
@ -76,7 +73,7 @@ static int CDAudio_GetAudioDiskInfo(void)
return 0;
}
void CDAudio_Play(byte track, qboolean looping)
void CDAudioBackend_Play(byte track, qboolean looping)
{
int len_m, len_s, len_f;
@ -85,7 +82,7 @@ void CDAudio_Play(byte track, qboolean looping)
if (!cdValid)
{
CDAudio_GetAudioDiskInfo();
CDAudioBackend_GetAudioDiskInfo();
if (!cdValid)
return;
}
@ -108,7 +105,7 @@ void CDAudio_Play(byte track, qboolean looping)
{
if (playTrack == track)
return;
CDAudio_Stop ();
CDAudioBackend_Stop ();
}
if (SDL_CDPlay(cd_handle, cd_handle->track[track-1].offset, cd_handle->track[track-1].length) == -1)
@ -141,7 +138,7 @@ void CDAudio_Play(byte track, qboolean looping)
CDAudio_Pause ();
}
void CDAudio_Stop(void)
void CDAudioBackend_Stop(void)
{
if (!cd_handle || !enabled)
return;
@ -158,7 +155,7 @@ void CDAudio_Stop(void)
endOfTrack = -1.0;
}
static void CDAudio_Next(void)
void CDAudioBackend_Next(void)
{
byte track;
@ -175,7 +172,7 @@ static void CDAudio_Next(void)
CDAudio_Play (track, playLooping);
}
static void CDAudio_Prev(void)
void CDAudioBackend_Prev(void)
{
byte track;
@ -192,7 +189,7 @@ static void CDAudio_Prev(void)
CDAudio_Play (track, playLooping);
}
void CDAudio_Pause(void)
void CDAudioBackend_Pause(void)
{
if (!cd_handle || !enabled)
return;
@ -208,7 +205,7 @@ void CDAudio_Pause(void)
pausetime = realtime;
}
void CDAudio_Resume(void)
void CDAudioBackend_Resume(void)
{
if (!cd_handle || !enabled)
return;
@ -217,7 +214,7 @@ void CDAudio_Resume(void)
return;
if (!wasPlaying)
return;
return;
if (SDL_CDResume(cd_handle) == -1)
Con_Printf ("Unable to resume CD-ROM: %s\n", SDL_GetError());
@ -226,133 +223,8 @@ void CDAudio_Resume(void)
pausetime = -1.0;
}
static void CD_f (void)
void CDAudioBackend_Info()
{
const char *command,*arg2;
int ret, n;
if (Cmd_Argc() < 2)
{
Con_Printf("commands:\n");
Con_Printf(" on, off, reset, remap, \n");
Con_Printf(" play, stop, next, prev, loop,\n");
Con_Printf(" pause, resume, eject, info\n");
return;
}
command = Cmd_Argv (1);
if (Q_strcasecmp(command, "on") == 0)
{
enabled = true;
return;
}
if (Q_strcasecmp(command, "off") == 0)
{
if (playing)
CDAudio_Stop();
enabled = false;
return;
}
if (Q_strcasecmp(command, "reset") == 0)
{
enabled = true;
if (playing)
CDAudio_Stop();
for (n = 0; n < 100; n++)
remap[n] = n;
CDAudio_GetAudioDiskInfo();
return;
}
if (Q_strcasecmp(command, "remap") == 0)
{
ret = Cmd_Argc () - 2;
if (ret <= 0)
{
for (n = 1; n < 100; n++)
if (remap[n] != n)
Con_Printf (" %u -> %u\n", n, remap[n]);
return;
}
for (n = 1; n <= ret; n++)
remap[n] = atoi(Cmd_Argv (n + 1));
return;
}
if (!cdValid)
{
CDAudio_GetAudioDiskInfo ();
if (!cdValid)
{
Con_Printf("No CD in player.\n");
return;
}
}
if (Q_strcasecmp(command, "play") == 0)
{
arg2 = Cmd_Argv (2);
if (*arg2)
CDAudio_Play((byte)atoi(Cmd_Argv (2)), false);
else
CDAudio_Play((byte)1, false);
return;
}
if (Q_strcasecmp(command, "loop") == 0)
{
arg2 = Cmd_Argv (2);
if (*arg2)
CDAudio_Play((byte)atoi(Cmd_Argv (2)), true);
else
CDAudio_Play((byte)1, true);
return;
}
if (Q_strcasecmp(command, "stop") == 0)
{
CDAudio_Stop();
return;
}
if (Q_strcasecmp(command, "pause") == 0)
{
CDAudio_Pause();
return;
}
if (Q_strcasecmp(command, "resume") == 0)
{
CDAudio_Resume();
return;
}
if (Q_strcasecmp(command, "next") == 0)
{
CDAudio_Next();
return;
}
if (Q_strcasecmp(command, "prev") == 0)
{
CDAudio_Prev();
return;
}
if (Q_strcasecmp(command, "eject") == 0)
{
if (playing)
CDAudio_Stop();
CDAudio_Eject();
cdValid = false;
return;
}
if (Q_strcasecmp(command, "info") == 0)
{
int current_min, current_sec, current_frame;
int length_min, length_sec, length_frame;
@ -394,7 +266,7 @@ static qboolean CD_SetVolume (void *unused)
return false;
}
static qboolean CDAudio_SetVolume (cvar_t *var)
static qboolean CDAudioBackend_SetVolume (cvar_t *var)
{
if (!cd_handle || !enabled)
return false;
@ -420,7 +292,7 @@ static qboolean CDAudio_SetVolume (cvar_t *var)
}
}
void CDAudio_Update(void)
void CDAudioBackend_Update(void)
{
CDstatus curstat;
@ -508,7 +380,7 @@ static void export_cddev_arg (void)
#endif
}
int CDAudio_Init(void)
int CDAudioBackend_Init(void)
{
int i, sdl_num_drives;
@ -587,11 +459,11 @@ int CDAudio_Init(void)
return 0;
}
void CDAudio_Shutdown(void)
void CDAudioBackend_Shutdown(void)
{
if (!cd_handle)
return;
CDAudio_Stop();
CDAudioBackend_Stop();
// cd hardware volume: no SDL support at present.
// if (hw_vol_works)
// CD_SetVolume (NULL);
@ -602,5 +474,3 @@ void CDAudio_Shutdown(void)
}
#endif /* SDL_INIT_CDROM */
#endif

View file

@ -22,25 +22,16 @@
Boston, MA 02110-1301 USA
*/
#include "quakedef.h"
static qboolean playing = false;
static qboolean wasPlaying = false;
static qboolean enabled = true;
static qboolean playLooping = false;
static qboolean enabled = false;
static qboolean usingBackend = false;
static byte remap[100];
static char playTrackName[MAX_QPATH];
static double old_cdvolume;
static void CDAudio_Next(void);
static void CDAudio_Eject(void)
{
// FIXME: call backend
;
}
static qboolean CDAudio_IsNumberedTrack(const char *trackName)
{
int len = strlen(trackName);
@ -57,11 +48,21 @@ static qboolean CDAudio_IsNumberedTrack(const char *trackName)
static void CDAudio_FinishedCallback(void *userdata)
{
// Hack to go to next track
Con_Printf("Advancing because we hit the end of a track...\n");
CDAudio_Next();
}
static qboolean CDAudio_TryPlayNamed(const char *name, qboolean looping)
{
qboolean success = S_Base_StartBackgroundTrack(name, looping, CDAudio_FinishedCallback, NULL);
if (success)
{
playLooping = looping;
playing = true;
sprintf(playTrackName, "%s", name);
}
return success;
}
void CDAudio_PlayNamed(const char *name, qboolean looping)
{
if (!enabled)
@ -89,7 +90,7 @@ void CDAudio_PlayNamed(const char *name, qboolean looping)
{
return;
}
strcpy(playTrackName, name);
sprintf(playTrackName, "%s", name);
}
if (playing)
@ -97,17 +98,17 @@ void CDAudio_PlayNamed(const char *name, qboolean looping)
CDAudio_Stop();
}
// FIXME: check for backend error
playLooping = looping;
playing = true;
// FIXME: make backend play
qboolean success = S_Base_StartBackgroundTrack(playTrackName, playLooping, CDAudio_FinishedCallback, NULL);
char fullTrackName[MAX_QPATH];
sprintf(fullTrackName, "music/%s", playTrackName);
qboolean success = S_Base_StartBackgroundTrack(fullTrackName, playLooping, CDAudio_FinishedCallback, NULL);
if (!success)
{
Con_Printf("WARNING: Couldn't open music file %s\n", playTrackName);
Con_Printf("WARNING: Couldn't open music file %s\n", fullTrackName);
}
CDAudio_TryPlayNamed
}
void CDAudio_Play(byte track, qboolean looping)
@ -122,14 +123,15 @@ void CDAudio_Stop(void)
if (!enabled)
return;
if (!playing)
return;
// FIXME: stop backend
S_Base_StopBackgroundTrack();
wasPlaying = false;
playing = false;
if (usingBackend)
{
CDAudioBackend_Stop();
usingBackend = false;
}
else
{
S_Base_StopBackgroundTrack();
}
}
static void CDAudio_Next(void)
@ -138,19 +140,23 @@ static void CDAudio_Next(void)
if (!enabled)
return;
if (!playing)
return;
if (!CDAudio_IsNumberedTrack(playTrackName))
if (usingBackend)
{
playing = false;
return;
CDAudio_BackendNext();
}
else
{
if (!CDAudio_IsNumberedTrack(playTrackName))
{
CDAudio_Stop();
return;
}
track = atoi(playTrackName) + 1;
CDAudio_Play (track, S_BackgroundTrackIsLooping());
}
track = atoi(playTrackName) + 1;
CDAudio_Play (track, playLooping);
}
static void CDAudio_Prev(void)
@ -160,17 +166,24 @@ static void CDAudio_Prev(void)
if (!enabled)
return;
if (!playing)
return;
if (usingBackend)
{
CDAudio_BackendPrev();
}
else
{
if (!CDAudio_IsNumberedTrack(playTrackName))
{
CDAudio_Stop();
return;
}
if (!CDAudio_IsNumberedTrack(playTrackName))
return;
track = atoi(playTrackName) - 1;
if (track < 1)
track = 1;
track = atoi(playTrackName) - 1;
if (track < 1)
track = 1;
CDAudio_Play (track, playLooping);
CDAudio_Play(track, S_BackgroundTrackIsLooping());
}
}
void CDAudio_Pause(void)
@ -178,14 +191,14 @@ void CDAudio_Pause(void)
if (!enabled)
return;
if (!playing)
return;
// FIXME: pause in backend
S_PauseBackgroundTrack();
wasPlaying = playing;
playing = false;
if (usingBackend)
{
CDAudioBackend_Pause();
}
else
{
S_PauseBackgroundTrack();
}
}
void CDAudio_Resume(void)
@ -193,13 +206,14 @@ void CDAudio_Resume(void)
if (!enabled)
return;
if (!wasPlaying)
return;
// FIXME: resume in backend
S_ResumeBackgroundTrack();
playing = true;
if (usingBackend)
{
CDAudioBackend_Resume();
}
else
{
S_ResumeBackgroundTrack();
}
}
static void CD_f (void)
@ -226,21 +240,19 @@ static void CD_f (void)
if (Q_strcasecmp(command, "off") == 0)
{
if (playing)
CDAudio_Stop();
CDAudio_Stop();
enabled = false;
return;
}
if (Q_strcasecmp(command, "reset") == 0)
{
enabled = true;
if (playing)
CDAudio_Stop();
CDAudio_Stop();
for (n = 0; n < 100; n++)
remap[n] = n;
// FIXME: backend get disc info
// FIXME: backend get disc info?
return;
}
@ -320,81 +332,49 @@ static void CD_f (void)
if (Q_strcasecmp(command, "eject") == 0)
{
if (playing)
CDAudio_Stop();
CDAudio_Eject();
CDAudioBackend_Eject();
return;
}
if (Q_strcasecmp(command, "info") == 0)
{
if (playing)
Con_Printf ("Currently %s track %s\n", playLooping ? "looping" : "playing", playTrackName);
else if (wasPlaying)
Con_Printf ("Paused %s track %s\n", playLooping ? "looping" : "playing", playTrackName);
Con_Printf ("Volume is %f\n", bgmvolume.value);
if (usingBackend)
{
CDAudioBackend_Info();
}
else
{
if (S_BackgroundTrackIsPlaying())
Con_Printf ("Currently %s track %s\n", S_BackgroundTrackIsLooping() ? "looping" : "playing", playTrackName);
else if (S_BackgroundTrackIsPaused())
Con_Printf ("Paused %s track %s\n", S_BackgroundTrackIsLooping() ? "looping" : "playing", playTrackName);
Con_Printf ("Volume is %f\n", bgmvolume.value);
}
return;
}
Con_Printf ("cd: no such command. Use \"cd\" for help.\n");
}
static qboolean CD_GetVolume (void *unused)
{
/* FIXME: write proper code in here when SDL
supports cdrom volume control some day. */
return false;
}
static qboolean CD_SetVolume (void *unused)
{
/* FIXME: write proper code in here when SDL
supports cdrom volume control some day. */
return false;
}
static qboolean CDAudio_SetVolume (cvar_t *var)
{
if (!enabled)
return false;
if (var->value < 0.0)
Cvar_SetValue (var->name, 0.0);
else if (var->value > 1.0)
Cvar_SetValue (var->name, 1.0);
old_cdvolume = var->value;
//FIXME:
return true;
}
void CDAudio_Update(void)
{
if (!enabled)
return;
if (old_cdvolume != bgmvolume.value)
CDAudio_SetVolume (&bgmvolume);
// FIXME: update backend
CDAudioBackend_Update();
}
int CDAudio_Init(void)
{
int i;
// FIXME: try to init backend
enabled = true;
CDAudioBackend_Init();
for (i = 0; i < 100; i++)
remap[i] = i;
enabled = true;
// FIXME: check if cd in drive
Cmd_AddCommand ("cd", CD_f);
return 0;
@ -403,6 +383,6 @@ int CDAudio_Init(void)
void CDAudio_Shutdown(void)
{
CDAudio_Stop();
// FIXME: shutdown backend
CDAudioBackend_Shutdown();
}

View file

@ -31,5 +31,19 @@ void CDAudio_Resume(void);
void CDAudio_Shutdown(void);
void CDAudio_Update(void);
// Private
void CDAudioBackend_Eject(void);
void CDAudioBackend_Play(byte track, qboolean looping);
void CDAudioBackend_Stop(void);
void CDAudioBackend_Next(void);
void CDAudioBackend_Prev(void);
void CDAudioBackend_Pause(void);
void CDAudioBackend_Resume(void);
void CDAudioBackend_Info(void);
void CDAudioBackend_Update(void);
int CDAudioBackend_Init(void);
void CDAudioBackend_Shutdown(void);
#endif /* __CDAUDIO_H */