]> de.git.xonotic.org Git - xonotic/darkplaces.git/blobdiff - cd_shared.c
don't reject render entities from being added just because of
[xonotic/darkplaces.git] / cd_shared.c
index 8a47f7b72f52827552a28e715c3aae76ee7e923e..33a5dcc627a52bcede4369fc0791fde6f3e3d161 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;
 
@@ -121,7 +121,7 @@ qboolean CDAudio_Play_real (int track, qboolean looping, qboolean complain)
                if (!cdValid)
                {
                        if(complain)
-                               Con_Print ("No CD in player.\n");
+                               Con_DPrint ("No CD in player.\n");
                        return false;
                }
        }
@@ -129,15 +129,15 @@ qboolean CDAudio_Play_real (int track, qboolean looping, qboolean complain)
        if (track > maxTrack)
        {
                if(complain)
-                       Con_Printf("CDAudio: Bad track number %u.\n", track);
+                       Con_DPrintf("CDAudio: Bad track number %u.\n", track);
                return false;
        }
 
        if (CDAudio_SysPlay(track) == -1)
                return false;
 
-       if(cdaudio.integer != 3 || developer.integer)
-               Con_Printf ("CD track %u playing...\n", track);
+       if(cdaudio.integer != 3)
+               Con_DPrintf ("CD track %u playing...\n", track);
 
        return true;
 }
@@ -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))
@@ -166,13 +192,14 @@ void CDAudio_Play_byName (const char *trackname, qboolean looping)
                track = (unsigned char) atoi(trackname);
                if (track < 1)
                {
-                       Con_Printf("CDAudio: Bad track number %u.\n", track);
+                       Con_DPrintf("CDAudio: Bad track number %u.\n", track);
                        return;
                }
        }
        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 ();
@@ -206,7 +233,7 @@ void CDAudio_Play_byName (const char *trackname, qboolean looping)
                }
                else
                {
-                       Con_Print ("No CD in player.\n");
+                       Con_DPrint ("No CD in player.\n");
                }
                return;
        }
@@ -242,8 +269,8 @@ void CDAudio_Play_byName (const char *trackname, qboolean looping)
                        S_SetChannelFlag (faketrack, CHANNELFLAG_LOCALSOUND, true); // not pausable
                        if(track >= 1)
                        {
-                               if(cdaudio.integer != 0 || developer.integer) // we don't need these messages if only fake tracks can be played anyway
-                                       Con_Printf ("Fake CD track %u playing...\n", track);
+                               if(cdaudio.integer != 0) // we don't need these messages if only fake tracks can be played anyway
+                                       Con_DPrintf ("Fake CD track %u playing...\n", track);
                        }
                        else
                                Con_DPrintf ("BGM track %s playing...\n", trackname);
@@ -270,7 +297,7 @@ success:
        cdPlayTrack = track;
        cdPlaying = true;
 
-       if (cdvolume == 0.0)
+       if (cdvolume == 0.0 || bgmvolume.value == 0)
                CDAudio_Pause ();
 }
 
@@ -281,7 +308,7 @@ void CDAudio_Play (int track, qboolean looping)
        CDAudio_Play_byName(buf, looping);
 }
 
-float CDAudio_GetPosition ()
+float CDAudio_GetPosition (void)
 {
        if(faketrack != -1)
                return S_GetChannelPosition(faketrack);
@@ -300,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;
@@ -335,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);
 
@@ -354,8 +386,7 @@ static void CD_f (void)
 
        if (strcasecmp(command, "off") == 0)
        {
-               if (cdPlaying)
-                       CDAudio_Stop();
+               CDAudio_Stop();
                enabled = false;
                return;
        }
@@ -363,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)
                {
@@ -383,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;
        }
 
@@ -424,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;
@@ -442,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");
@@ -491,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;
@@ -509,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);