summaryrefslogtreecommitdiff
path: root/apps/plugins/sdl/progs/quake/cd_sdl.c
diff options
context:
space:
mode:
authorFranklin Wei <git@fwei.tk>2018-02-11 15:34:30 -0500
committerFranklin Wei <git@fwei.tk>2018-02-11 15:34:30 -0500
commit33bfba86222efb6cc5b271b3e12b6cf3f38836c5 (patch)
tree8a7f11e101af6a094b4b86d3c0b9d72793005ed3 /apps/plugins/sdl/progs/quake/cd_sdl.c
parent8dd00a02d49a99997165a4c38a967738e90ba72f (diff)
downloadrockbox-duke3d.zip
rockbox-duke3d.tar.gz
rockbox-duke3d.tar.bz2
rockbox-duke3d.tar.xz
Quake: attempt 2duke3d
Change-Id: I4285036e967d7f0722802d43cf2096c808ca5799
Diffstat (limited to 'apps/plugins/sdl/progs/quake/cd_sdl.c')
-rw-r--r--apps/plugins/sdl/progs/quake/cd_sdl.c223
1 files changed, 223 insertions, 0 deletions
diff --git a/apps/plugins/sdl/progs/quake/cd_sdl.c b/apps/plugins/sdl/progs/quake/cd_sdl.c
new file mode 100644
index 0000000..46b2aa2
--- /dev/null
+++ b/apps/plugins/sdl/progs/quake/cd_sdl.c
@@ -0,0 +1,223 @@
+/*
+ Some of this may not work. I'm not overly familiar with SDL, I just sort
+ of podged this together from the SDL headers, and the other cd-rom code.
+
+ Mark Baker <homer1@together.net>
+*/
+
+#include <SDL.h>
+
+#include "quakedef.h"
+
+static qboolean cdValid = false;
+static qboolean initialized = false;
+static qboolean enabled = true;
+static qboolean playLooping = false;
+static SDL_CD *cd_id;
+static float cdvolume = 1.0;
+
+static void CD_f();
+
+static void CDAudio_Eject()
+{
+ if(!cd_id || !enabled) return;
+
+ if(SDL_CDEject(cd_id))
+ Con_DPrintf("Unable to eject CD-ROM tray.\n");
+}
+
+void CDAudio_Play(byte track, qboolean looping)
+{
+ CDstatus cd_stat;
+ if(!cd_id || !enabled) return;
+
+ if(!cdValid)
+ {
+ if(!CD_INDRIVE(cd_stat=SDL_CDStatus(cd_id)) ||(!cd_id->numtracks)) return;
+ cdValid = true;
+ }
+
+ if((track < 1) || (track >= cd_id->numtracks))
+ {
+ Con_DPrintf("CDAudio: Bad track number: %d\n",track);
+ return;
+ }
+ track--; /* Convert track from person to SDL value */
+ if(cd_stat == CD_PLAYING)
+ {
+ if(cd_id->cur_track == track) return;
+ CDAudio_Stop();
+ }
+
+ if(SDL_CDPlay(cd_id,cd_id->track[track].offset,
+ cd_id->track[track].length))
+ {
+ Con_DPrintf("CDAudio_Play: Unable to play track: %d\n",track+1);
+ return;
+ }
+ playLooping = looping;
+}
+
+
+void CDAudio_Stop()
+{
+ int cdstate;
+ if(!cd_id || !enabled) return;
+ cdstate = SDL_CDStatus(cd_id);
+ if((cdstate != CD_PLAYING) && (cdstate != CD_PAUSED)) return;
+
+ if(SDL_CDStop(cd_id))
+ Con_DPrintf("CDAudio_Stop: Failed to stop track.\n");
+}
+
+void CDAudio_Pause()
+{
+ if(!cd_id || !enabled) return;
+ if(SDL_CDStatus(cd_id) != CD_PLAYING) return;
+
+ if(SDL_CDPause(cd_id))
+ Con_DPrintf("CDAudio_Pause: Failed to pause track.\n");
+}
+
+
+void CDAudio_Resume()
+{
+ if(!cd_id || !enabled) return;
+ if(SDL_CDStatus(cd_id) != CD_PAUSED) return;
+
+ if(SDL_CDResume(cd_id))
+ Con_DPrintf("CDAudio_Resume: Failed tp resume track.\n");
+}
+
+void CDAudio_Update()
+{
+ if(!cd_id || !enabled) return;
+ if(bgmvolume.value != cdvolume)
+ {
+ if(cdvolume)
+ {
+ Cvar_SetValue("bgmvolume",0.0);
+ CDAudio_Pause();
+ }
+ else
+ {
+ Cvar_SetValue("bgmvolume",1.0);
+ CDAudio_Resume();
+ }
+ cdvolume = bgmvolume.value;
+ return;
+ }
+ if(playLooping && (SDL_CDStatus(cd_id) != CD_PLAYING)
+ && (SDL_CDStatus(cd_id) != CD_PAUSED))
+ CDAudio_Play(cd_id->cur_track+1,true);
+}
+
+int CDAudio_Init()
+{
+ if((cls.state == ca_dedicated) || COM_CheckParm("-nocdaudio"))
+ return -1;
+
+ cd_id = SDL_CDOpen(0);
+ if(!cd_id)
+ {
+ Con_Printf("CDAudio_Init: Unable to open default CD-ROM drive: %s\n",
+ SDL_GetError());
+ return -1;
+ }
+
+ initialized = true;
+ enabled = true;
+ cdValid = true;
+
+ if(!CD_INDRIVE(SDL_CDStatus(cd_id)))
+ {
+ Con_Printf("CDAudio_Init: No CD in drive.\n");
+ cdValid = false;
+ }
+ if(!cd_id->numtracks)
+ {
+ Con_Printf("CDAudio_Init: CD contains no audio tracks.\n");
+ cdValid = false;
+ }
+ Cmd_AddCommand("cd",CD_f);
+ Con_Printf("CD Audio Initialized.\n");
+ return 0;
+}
+
+
+void CDAudio_Shutdown()
+{
+ if(!cd_id) return;
+ CDAudio_Stop();
+ SDL_CDClose(cd_id);
+ cd_id = NULL;
+}
+
+static void CD_f()
+{
+ char *command;
+ int cdstate;
+ if(Cmd_Argc() < 2) return;
+
+ command = Cmd_Argv(1);
+ if(!Q_strcasecmp(command,"on"))
+ {
+ enabled = true;
+ }
+ if(!Q_strcasecmp(command,"off"))
+ {
+ if(!cd_id) return;
+ cdstate = SDL_CDStatus(cd_id);
+ if((cdstate == CD_PLAYING) || (cdstate == CD_PAUSED))
+ CDAudio_Stop();
+ enabled = false;
+ return;
+ }
+ if(!Q_strcasecmp(command,"play"))
+ {
+ CDAudio_Play(Q_atoi(Cmd_Argv(2)),false);
+ return;
+ }
+ if(!Q_strcasecmp(command,"loop"))
+ {
+ CDAudio_Play(Q_atoi(Cmd_Argv(2)),true);
+ return;
+ }
+ if(!Q_strcasecmp(command,"stop"))
+ {
+ CDAudio_Stop();
+ return;
+ }
+ if(!Q_strcasecmp(command,"pause"))
+ {
+ CDAudio_Pause();
+ return;
+ }
+ if(!Q_strcasecmp(command,"resume"))
+ {
+ CDAudio_Resume();
+ return;
+ }
+ if(!Q_strcasecmp(command,"eject"))
+ {
+ CDAudio_Eject();
+ return;
+ }
+ if(!Q_strcasecmp(command,"info"))
+ {
+ if(!cd_id) return;
+ cdstate = SDL_CDStatus(cd_id);
+ Con_Printf("%d tracks\n",cd_id->numtracks);
+ if(cdstate == CD_PLAYING)
+ Con_Printf("Currently %s track %d\n",
+ playLooping ? "looping" : "playing",
+ cd_id->cur_track+1);
+ else
+ if(cdstate == CD_PAUSED)
+ Con_Printf("Paused %s track %d\n",
+ playLooping ? "looping" : "playing",
+ cd_id->cur_track+1);
+ return;
+ }
+}
+