]> de.git.xonotic.org Git - xonotic/darkplaces.git/blobdiff - cd_shared.c
changed several Con_Printf calls to Con_DPrintf
[xonotic/darkplaces.git] / cd_shared.c
index 36bae1272e17fd35cc3c27e1c29eaa747d045494..33a5dcc627a52bcede4369fc0791fde6f3e3d161 100644 (file)
@@ -24,15 +24,13 @@ 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);
 extern int CDAudio_SysGetAudioDiskInfo (void);
 extern float CDAudio_SysGetVolume (void);
 extern void CDAudio_SysSetVolume (float volume);
-extern int CDAudio_SysPlay (unsigned char track);
+extern int CDAudio_SysPlay (int track);
 extern int CDAudio_SysStop (void);
 extern int CDAudio_SysPause (void);
 extern int CDAudio_SysResume (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;
 }
@@ -146,6 +146,7 @@ void CDAudio_Play_byName (const char *trackname, qboolean looping)
 {
        unsigned int track;
        sfx_t* sfx;
+       char filename[MAX_QPATH];
 
        Host_StartVideo();
 
@@ -155,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))
@@ -165,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 ();
@@ -205,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;
        }
@@ -213,25 +241,24 @@ void CDAudio_Play_byName (const char *trackname, qboolean looping)
        // Try playing a fake track (sound file) first
        if(track >= 1)
        {
-               sfx = S_PrecacheSound (va ("cdtracks/track%02u.wav", track), false, false);
-               if (sfx == NULL || !S_IsSoundPrecached (sfx))
-                       sfx = S_PrecacheSound (va ("cdtracks/track%03u.wav", track), false, false);
-               if (sfx == NULL || !S_IsSoundPrecached (sfx))
-                       sfx = S_PrecacheSound (va ("cdtracks/track%02u", track), false, false);
-               if (sfx == NULL || !S_IsSoundPrecached (sfx))
-                       sfx = S_PrecacheSound (va ("cdtracks/track%03u", track), false, false);
+                                             dpsnprintf(filename, sizeof(filename), "sound/cdtracks/track%03u.wav", track);
+               if (!FS_FileExists(filename)) dpsnprintf(filename, sizeof(filename), "sound/cdtracks/track%03u.ogg", track);
+               if (!FS_FileExists(filename)) dpsnprintf(filename, sizeof(filename), "sound/cdtracks/track%02u.wav", track);
+               if (!FS_FileExists(filename)) dpsnprintf(filename, sizeof(filename), "sound/cdtracks/track%02u.ogg", track);
        }
        else
        {
-               sfx = S_PrecacheSound (va("cdtracks/%s.wav", trackname), false, false);
-               if (sfx == NULL || !S_IsSoundPrecached (sfx))
-                       sfx = S_PrecacheSound (va("cdtracks/%s", trackname), false, false);
-               if (sfx == NULL || !S_IsSoundPrecached (sfx))
-                       sfx = S_PrecacheSound (va("%s.wav", trackname), false, false);
-               if (sfx == NULL || !S_IsSoundPrecached (sfx))
-                       sfx = S_PrecacheSound (va("%s", trackname), false, false);
+                                             dpsnprintf(filename, sizeof(filename), "%s", trackname);
+               if (!FS_FileExists(filename)) dpsnprintf(filename, sizeof(filename), "%s.wav", trackname);
+               if (!FS_FileExists(filename)) dpsnprintf(filename, sizeof(filename), "%s.ogg", trackname);
+               if (!FS_FileExists(filename)) dpsnprintf(filename, sizeof(filename), "sound/%s", trackname);
+               if (!FS_FileExists(filename)) dpsnprintf(filename, sizeof(filename), "sound/%s.wav", trackname);
+               if (!FS_FileExists(filename)) dpsnprintf(filename, sizeof(filename), "sound/%s.ogg", trackname);
+               if (!FS_FileExists(filename)) dpsnprintf(filename, sizeof(filename), "sound/cdtracks/%s", trackname);
+               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 (sfx != NULL)
+       if (FS_FileExists(filename) && (sfx = S_PrecacheSound (filename, false, true)))
        {
                faketrack = S_StartSound (-1, 0, sfx, vec3_origin, cdvolume, 0);
                if (faketrack != -1)
@@ -239,10 +266,11 @@ void CDAudio_Play_byName (const char *trackname, qboolean looping)
                        if (looping)
                                S_SetChannelFlag (faketrack, CHANNELFLAG_FORCELOOP, true);
                        S_SetChannelFlag (faketrack, CHANNELFLAG_FULLVOLUME, true);
+                       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);
@@ -269,17 +297,24 @@ success:
        cdPlayTrack = track;
        cdPlaying = true;
 
-       if (cdvolume == 0.0)
+       if (cdvolume == 0.0 || bgmvolume.value == 0)
                CDAudio_Pause ();
 }
 
-void CDAudio_Play (unsigned char track, qboolean looping)
+void CDAudio_Play (int track, qboolean looping)
 {
        char buf[20];
        dpsnprintf(buf, sizeof(buf), "%d", (int) track);
        CDAudio_Play_byName(buf, looping);
 }
 
+float CDAudio_GetPosition (void)
+{
+       if(faketrack != -1)
+               return S_GetChannelPosition(faketrack);
+       return -1;
+}
+
 void CDAudio_Stop (void)
 {
        if (!enabled)
@@ -292,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;
@@ -327,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);
 
@@ -346,8 +386,7 @@ static void CD_f (void)
 
        if (strcasecmp(command, "off") == 0)
        {
-               if (cdPlaying)
-                       CDAudio_Stop();
+               CDAudio_Stop();
                enabled = false;
                return;
        }
@@ -355,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)
                {
@@ -375,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;
        }
 
@@ -416,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;
@@ -434,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");
@@ -483,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;
@@ -501,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);