static qboolean initialized = false;
static qboolean enabled = false;
static float cdvolume;
-static unsigned char remap[MAXTRACKS];
+typedef char filename_t[MAX_QPATH];
+static filename_t remap[MAXTRACKS];
static unsigned char maxTrack;
static int faketrack = -1;
qboolean cdPlayLooping = false;
unsigned char cdPlayTrack;
+cl_cdstate_t cd;
static void CDAudio_Eject (void)
{
}
-void CDAudio_Play (unsigned char track, qboolean looping)
+void CDAudio_Play_byName (const char *trackname, qboolean looping)
{
+ unsigned int track;
sfx_t* sfx;
Host_StartVideo();
if (!enabled)
return;
- track = remap[track];
- if (track < 1)
+ if(strspn(trackname, "0123456789") == strlen(trackname))
{
- Con_Printf("CDAudio: Bad track number %u.\n", track);
- return;
+ track = (unsigned char) atoi(trackname);
+ if(track > 0 && track < MAXTRACKS)
+ if(*remap[track])
+ trackname = remap[track];
}
+ if(strspn(trackname, "0123456789") == strlen(trackname))
+ {
+ track = (unsigned char) atoi(trackname);
+ if (track < 1)
+ {
+ Con_Printf("CDAudio: Bad track number %u.\n", track);
+ return;
+ }
+ }
+ else
+ track = 0;
+
if (cdPlaying && cdPlayTrack == track && faketrack == -1)
return;
CDAudio_Stop ();
// Try playing a fake track (sound file) first
- 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(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);
+ }
+ 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)
{
faketrack = S_StartSound (-1, 0, sfx, vec3_origin, cdvolume, 0);
if (looping)
S_SetChannelFlag (faketrack, CHANNELFLAG_FORCELOOP, true);
S_SetChannelFlag (faketrack, CHANNELFLAG_FULLVOLUME, true);
- Con_Printf ("Fake CD track %u playing...\n", track);
+ if(track >= 1)
+ Con_Printf ("Fake CD track %u playing...\n", track);
+ else
+ Con_Printf ("BGM track %s playing...\n", trackname);
}
}
// If we can't play a fake CD track, try the real one
if (faketrack == -1)
{
+ if(track < 1)
+ {
+ Con_Print("Could not load BGM track.\n");
+ return;
+ }
+
if (!cdValid)
{
CDAudio_GetAudioDiskInfo();
CDAudio_Pause ();
}
+void CDAudio_Play (unsigned char track, qboolean looping)
+{
+ char buf[20];
+ dpsnprintf(buf, sizeof(buf), "%d", (int) track);
+ CDAudio_Play_byName(buf, looping);
+}
void CDAudio_Stop (void)
{
- if (!enabled || !cdPlaying)
+ if (!enabled)
return;
if (faketrack != -1)
{
- S_StopChannel (faketrack);
+ S_StopChannel (faketrack, true);
faketrack = -1;
}
- else if (CDAudio_SysStop() == -1)
+ else if (cdPlaying && (CDAudio_SysStop() == -1))
return;
wasPlaying = false;
if (cdPlaying)
CDAudio_Stop();
for (n = 0; n < MAXTRACKS; n++)
- remap[n] = n;
+ *remap[n] = 0; // empty string, that is, unremapped
CDAudio_GetAudioDiskInfo();
return;
}
if (ret <= 0)
{
for (n = 1; n < MAXTRACKS; n++)
- if (remap[n] != n)
- Con_Printf(" %u -> %u\n", n, remap[n]);
+ if (*remap[n])
+ Con_Printf(" %u -> %s\n", n, remap[n]);
return;
}
for (n = 1; n <= ret; n++)
- remap[n] = atoi(Cmd_Argv (n+1));
+ strlcpy(remap[n], Cmd_Argv (n+1), sizeof(*remap));
return;
}
if (strcasecmp(command, "play") == 0)
{
- CDAudio_Play((unsigned char)atoi(Cmd_Argv (2)), false);
+ CDAudio_Play_byName(Cmd_Argv (2), false);
return;
}
if (strcasecmp(command, "loop") == 0)
{
- CDAudio_Play((unsigned char)atoi(Cmd_Argv (2)), true);
+ CDAudio_Play_byName(Cmd_Argv (2), true);
return;
}
return -1;
// COMMANDLINEOPTION: Sound: -nocdaudio disables CD audio support
- if (COM_CheckParm("-nocdaudio") || COM_CheckParm("-safe"))
+ if (COM_CheckParm("-nocdaudio"))
return -1;
CDAudio_SysInit();
for (i = 0; i < MAXTRACKS; i++)
- remap[i] = i;
+ *remap[i] = 0;
Cvar_RegisterVariable(&cdaudioinitialized);
Cvar_SetValueQuick(&cdaudioinitialized, true);
int CDAudio_Startup (void)
{
+ if (COM_CheckParm("-nocdaudio"))
+ return -1;
+
CDAudio_SysStartup ();
if (CDAudio_GetAudioDiskInfo())