]> de.git.xonotic.org Git - xonotic/darkplaces.git/blobdiff - cd_shared.c
added indirection cube map for shadowmapping and revised filtering modes
[xonotic/darkplaces.git] / cd_shared.c
index c96f61ae3dbbeca9cfa00f9e593b61437166186d..7706e91c3c05e61eb672d80235621b726e2ed7e8 100644 (file)
@@ -157,8 +157,32 @@ void CDAudio_Play_byName (const char *trackname, qboolean looping)
        {
                track = (unsigned char) atoi(trackname);
                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;
+                                       }
+                               }
+                       }
        }
 
        if(strspn(trackname, "0123456789") == strlen(trackname))
@@ -173,6 +197,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 +256,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 +295,7 @@ success:
        cdPlayTrack = track;
        cdPlaying = true;
 
-       if (cdvolume == 0.0)
+       if (cdvolume == 0.0 || bgmvolume.value == 0)
                CDAudio_Pause ();
 }
 
@@ -281,6 +306,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 +325,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;
@@ -331,9 +369,6 @@ static void CD_f (void)
        int ret;
        int n;
 
-       if (Cmd_Argc() < 2)
-               return;
-
        command = Cmd_Argv (1);
 
        if (strcasecmp(command, "remap") != 0)
@@ -347,8 +382,7 @@ static void CD_f (void)
 
        if (strcasecmp(command, "off") == 0)
        {
-               if (cdPlaying)
-                       CDAudio_Stop();
+               CDAudio_Stop();
                enabled = false;
                return;
        }
@@ -356,14 +390,20 @@ static void CD_f (void)
        if (strcasecmp(command, "reset") == 0)
        {
                enabled = true;
-               if (cdPlaying)
-                       CDAudio_Stop();
+               CDAudio_Stop();
                for (n = 0; n < MAXTRACKS; n++)
                        *remap[n] = 0; // empty string, that is, unremapped
                CDAudio_GetAudioDiskInfo();
                return;
        }
 
+       if (strcasecmp(command, "rescan") == 0)
+       {
+               CDAudio_Shutdown();
+               CDAudio_Startup();
+               return;
+       }
+
        if (strcasecmp(command, "remap") == 0)
        {
                ret = Cmd_Argc() - 2;
@@ -417,7 +457,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 +475,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,8 +528,8 @@ 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();
 }