]> de.git.xonotic.org Git - xonotic/darkplaces.git/blobdiff - cd_shared.c
DP_QC_GETTIME_CDTRACK: extension to query the playing time of the current cd track.
[xonotic/darkplaces.git] / cd_shared.c
index 9ab0210a531fdd4ffa692a32e0fadc4e677edc02..8a47f7b72f52827552a28e715c3aae76ee7e923e 100644 (file)
@@ -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();
 
@@ -213,25 +214,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,6 +239,7 @@ 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
@@ -280,6 +281,13 @@ void CDAudio_Play (int track, qboolean looping)
        CDAudio_Play_byName(buf, looping);
 }
 
+float CDAudio_GetPosition ()
+{
+       if(faketrack != -1)
+               return S_GetChannelPosition(faketrack);
+       return -1;
+}
+
 void CDAudio_Stop (void)
 {
        if (!enabled)