]> git.xonotic.org Git - xonotic/darkplaces.git/blobdiff - cd_shared.c
migrated a large number of #define MAX values to quakedef.h and added a
[xonotic/darkplaces.git] / cd_shared.c
index c96f61ae3dbbeca9cfa00f9e593b61437166186d..f00f66123aae8d245015acc4a5ee2ac87751b3af 100644 (file)
@@ -24,8 +24,6 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
 #include "cdaudio.h"
 #include "sound.h"
 
-#define MAXTRACKS      256
-
 // Prototypes of the system dependent functions
 extern void CDAudio_SysEject (void);
 extern void CDAudio_SysCloseDoor (void);
@@ -50,7 +48,9 @@ static qboolean initialized = false;
 static qboolean enabled = false;
 static float cdvolume;
 typedef char filename_t[MAX_QPATH];
+#ifdef MAXTRACKS
 static filename_t remap[MAXTRACKS];
+#endif
 static unsigned char maxTrack;
 static int faketrack = -1;
 
@@ -156,9 +156,35 @@ void CDAudio_Play_byName (const char *trackname, qboolean looping)
        if(strspn(trackname, "0123456789") == strlen(trackname))
        {
                track = (unsigned char) atoi(trackname);
+#ifdef MAXTRACKS
                if(track > 0 && track < MAXTRACKS)
-                               if(*remap[track])
+                       if(*remap[track])
+                       {
+                               if(strspn(remap[track], "0123456789") == strlen(remap[track]))
+                               {
                                        trackname = remap[track];
+                               }
+                               else
+                               {
+                                       // ignore remappings to fake tracks if we're going to play a real track
+                                       switch(cdaudio.integer)
+                                       {
+                                               case 0: // we never access CD
+                                               case 1: // we have a replacement
+                                                       trackname = remap[track];
+                                                       break;
+                                               case 2: // we only use fake track replacement if CD track is invalid
+                                                       CDAudio_GetAudioDiskInfo();
+                                                       if(!cdValid || track > maxTrack)
+                                                               trackname = remap[track];
+                                                       break;
+                                               case 3: // we always play from CD - ignore this remapping then
+                                               case 4: // we randomize anyway
+                                                       break;
+                                       }
+                               }
+                       }
+#endif
        }
 
        if(strspn(trackname, "0123456789") == strlen(trackname))
@@ -173,6 +199,7 @@ void CDAudio_Play_byName (const char *trackname, qboolean looping)
        else
                track = 0;
 
+       // div0: I assume this code was intentionally there. Maybe turn it into a cvar?
        if (cdPlaying && cdPlayTrack == track && faketrack == -1)
                return;
        CDAudio_Stop ();
@@ -231,7 +258,7 @@ void CDAudio_Play_byName (const char *trackname, qboolean looping)
                if (!FS_FileExists(filename)) dpsnprintf(filename, sizeof(filename), "sound/cdtracks/%s.wav", trackname);
                if (!FS_FileExists(filename)) dpsnprintf(filename, sizeof(filename), "sound/cdtracks/%s.ogg", trackname);
        }
-       if (FS_FileExists(filename) && (sfx = S_PrecacheSound (filename, false, false)))
+       if (FS_FileExists(filename) && (sfx = S_PrecacheSound (filename, false, true)))
        {
                faketrack = S_StartSound (-1, 0, sfx, vec3_origin, cdvolume, 0);
                if (faketrack != -1)
@@ -270,7 +297,7 @@ success:
        cdPlayTrack = track;
        cdPlaying = true;
 
-       if (cdvolume == 0.0)
+       if (cdvolume == 0.0 || bgmvolume.value == 0)
                CDAudio_Pause ();
 }
 
@@ -281,6 +308,13 @@ void CDAudio_Play (int track, qboolean looping)
        CDAudio_Play_byName(buf, looping);
 }
 
+float CDAudio_GetPosition (void)
+{
+       if(faketrack != -1)
+               return S_GetChannelPosition(faketrack);
+       return -1;
+}
+
 void CDAudio_Stop (void)
 {
        if (!enabled)
@@ -293,6 +327,12 @@ void CDAudio_Stop (void)
        }
        else if (cdPlaying && (CDAudio_SysStop() == -1))
                return;
+       else if(wasPlaying)
+       {
+               CDAudio_Resume(); // needed by SDL - can't stop while paused there (causing pause/stop to fail after play, pause, stop, play otherwise)
+               if (cdPlaying && (CDAudio_SysStop() == -1))
+                       return;
+       }
 
        wasPlaying = false;
        cdPlaying = false;
@@ -328,11 +368,10 @@ void CDAudio_Resume (void)
 static void CD_f (void)
 {
        const char *command;
+#ifdef MAXTRACKS
        int ret;
        int n;
-
-       if (Cmd_Argc() < 2)
-               return;
+#endif
 
        command = Cmd_Argv (1);
 
@@ -347,8 +386,7 @@ static void CD_f (void)
 
        if (strcasecmp(command, "off") == 0)
        {
-               if (cdPlaying)
-                       CDAudio_Stop();
+               CDAudio_Stop();
                enabled = false;
                return;
        }
@@ -356,16 +394,25 @@ static void CD_f (void)
        if (strcasecmp(command, "reset") == 0)
        {
                enabled = true;
-               if (cdPlaying)
-                       CDAudio_Stop();
+               CDAudio_Stop();
+#ifdef MAXTRACKS
                for (n = 0; n < MAXTRACKS; n++)
                        *remap[n] = 0; // empty string, that is, unremapped
+#endif
                CDAudio_GetAudioDiskInfo();
                return;
        }
 
+       if (strcasecmp(command, "rescan") == 0)
+       {
+               CDAudio_Shutdown();
+               CDAudio_Startup();
+               return;
+       }
+
        if (strcasecmp(command, "remap") == 0)
        {
+#ifdef MAXTRACKS
                ret = Cmd_Argc() - 2;
                if (ret <= 0)
                {
@@ -376,6 +423,7 @@ static void CD_f (void)
                }
                for (n = 1; n <= ret; n++)
                        strlcpy(remap[n], Cmd_Argv (n+1), sizeof(*remap));
+#endif
                return;
        }
 
@@ -417,7 +465,7 @@ static void CD_f (void)
 
        if (strcasecmp(command, "eject") == 0)
        {
-               if (cdPlaying && faketrack == -1)
+               if (faketrack == -1)
                        CDAudio_Stop();
                CDAudio_Eject();
                cdValid = false;
@@ -435,14 +483,18 @@ static void CD_f (void)
                        Con_Printf("Currently %s track %u\n", cdPlayLooping ? "looping" : "playing", cdPlayTrack);
                else if (wasPlaying)
                        Con_Printf("Paused %s track %u\n", cdPlayLooping ? "looping" : "playing", cdPlayTrack);
-               Con_Printf("Volume is %f\n", cdvolume);
+               if (cdvolume >= 0)
+                       Con_Printf("Volume is %f\n", cdvolume);
+               else
+                       Con_Printf("Can't get CD volume\n");
                return;
        }
 
        Con_Printf("CD commands:\n");
        Con_Printf("cd on - enables CD audio system\n");
        Con_Printf("cd off - stops and disables CD audio system\n");
-       Con_Printf("cd reset - resets CD audio system (clears track remapping and re-reads disc information)");
+       Con_Printf("cd reset - resets CD audio system (clears track remapping and re-reads disc information)\n");
+       Con_Printf("cd rescan - rescans disks in drives (to use another disc)\n");
        Con_Printf("cd remap <remap1> [remap2] [remap3] [...] - chooses (possibly emulated) CD tracks to play when a map asks for a particular track, this has many uses\n");
        Con_Printf("cd close - closes CD tray\n");
        Con_Printf("cd eject - stops playing music and opens CD tray to allow you to change disc\n");
@@ -484,14 +536,16 @@ void CDAudio_Update (void)
                return;
 
        CDAudio_SetVolume (bgmvolume.value);
-
-       if (faketrack == -1 && cdaudio.integer != 0)
+       
+       if (faketrack == -1 && cdaudio.integer != 0 && bgmvolume.value != 0)
                CDAudio_SysUpdate();
 }
 
 int CDAudio_Init (void)
 {
+#ifdef MAXTRACKS
        int i;
+#endif
 
        if (cls.state == ca_dedicated)
                return -1;
@@ -502,8 +556,10 @@ int CDAudio_Init (void)
 
        CDAudio_SysInit();
 
+#ifdef MAXTRACKS
        for (i = 0; i < MAXTRACKS; i++)
                *remap[i] = 0;
+#endif
 
        Cvar_RegisterVariable(&cdaudio);
        Cvar_RegisterVariable(&cdaudioinitialized);