X-Git-Url: http://de.git.xonotic.org/?p=xonotic%2Fdarkplaces.git;a=blobdiff_plain;f=cd_linux.c;h=bc07b849f9febd274d719cdf36a2d3e7ca7699a5;hp=bdfea6068879c8c2956f0ca3297ed26c8c15cbde;hb=eb155f171d675b2c36f09f0bdf348776d2ec2fab;hpb=b47b74389ee3f609d12f738f6038842fbd0d409a diff --git a/cd_linux.c b/cd_linux.c index bdfea606..bc07b849 100644 --- a/cd_linux.c +++ b/cd_linux.c @@ -8,7 +8,7 @@ of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. @@ -20,400 +20,237 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. // Quake is a trademark of Id Software, Inc., (c) 1996 Id Software, Inc. All // rights reserved. -#include -#include -#include +// suggested by Zero_Dogg to fix a compile problem on Mandriva Linux +#include "quakedef.h" + +#include #include -#include -#include + +#include #include -#include #include -#include - -#include +#include -#include "quakedef.h" +#include "cdaudio.h" -// used by menu to ghost CD audio slider -qboolean cdaudioinitialized = false; -static qboolean cdValid = false; -static qboolean playing = false; -static qboolean wasPlaying = false; -static qboolean initialized = false; -static qboolean enabled = true; -static qboolean playLooping = false; -static float cdvolume; -static byte remap[100]; -static byte playTrack; -static byte maxTrack; static int cdfile = -1; static char cd_dev[64] = "/dev/cdrom"; -static void CDAudio_Eject(void) + +void CDAudio_SysEject (void) { - if (cdfile == -1 || !enabled) - return; // no cd init'd + if (cdfile == -1) + return; - if ( ioctl(cdfile, CDROMEJECT) == -1 ) - Con_DPrintf("ioctl cdromeject failed\n"); + if (ioctl(cdfile, CDROMEJECT) == -1) + Con_Print("ioctl CDROMEJECT failed\n"); } -static void CDAudio_CloseDoor(void) +void CDAudio_SysCloseDoor (void) { - if (cdfile == -1 || !enabled) - return; // no cd init'd + if (cdfile == -1) + return; - if ( ioctl(cdfile, CDROMCLOSETRAY) == -1 ) - Con_DPrintf("ioctl cdromclosetray failed\n"); + if (ioctl(cdfile, CDROMCLOSETRAY) == -1) + Con_Print("ioctl CDROMCLOSETRAY failed\n"); } -static int CDAudio_GetAudioDiskInfo(void) +int CDAudio_SysGetAudioDiskInfo (void) { struct cdrom_tochdr tochdr; - cdValid = false; + if (cdfile == -1) + return -1; - if ( ioctl(cdfile, CDROMREADTOCHDR, &tochdr) == -1 ) - { - Con_DPrintf("ioctl cdromreadtochdr failed\n"); - return -1; - } + if (ioctl(cdfile, CDROMREADTOCHDR, &tochdr) == -1) + { + Con_Print("ioctl CDROMREADTOCHDR failed\n"); + return -1; + } if (tochdr.cdth_trk0 < 1) { - Con_DPrintf("CDAudio: no music tracks\n"); + Con_Print("CDAudio: no music tracks\n"); return -1; } - cdValid = true; - maxTrack = tochdr.cdth_trk1; - - return 0; + return tochdr.cdth_trk1; } -void CDAudio_Play(byte track, qboolean looping) +float CDAudio_SysGetVolume (void) { - struct cdrom_tocentry entry; - struct cdrom_ti ti; + struct cdrom_volctrl vol; - if (cdfile == -1 || !enabled) - return; - - if (!cdValid) + if (cdfile == -1) + return -1.0f; + + if (ioctl (cdfile, CDROMVOLREAD, &vol) == -1) { - CDAudio_GetAudioDiskInfo(); - if (!cdValid) - return; + Con_Print("ioctl CDROMVOLREAD failed\n"); + return -1.0f; } - track = remap[track]; + return (vol.channel0 + vol.channel1) / 2.0f / 255.0f; +} - if (track < 1 || track > maxTrack) - { - Con_DPrintf("CDAudio: Bad track number %u.\n", track); + +void CDAudio_SysSetVolume (float volume) +{ + struct cdrom_volctrl vol; + + if (cdfile == -1) return; - } + + vol.channel0 = vol.channel1 = (__u8)(volume * 255); + vol.channel2 = vol.channel3 = 0; + + if (ioctl (cdfile, CDROMVOLCTRL, &vol) == -1) + Con_Print("ioctl CDROMVOLCTRL failed\n"); +} + + +int CDAudio_SysPlay (int track) +{ + struct cdrom_tocentry entry; + struct cdrom_ti ti; + + if (cdfile == -1) + return -1; // don't try to play a non-audio track entry.cdte_track = track; entry.cdte_format = CDROM_MSF; - if ( ioctl(cdfile, CDROMREADTOCENTRY, &entry) == -1 ) + if (ioctl(cdfile, CDROMREADTOCENTRY, &entry) == -1) { - Con_DPrintf("ioctl cdromreadtocentry failed\n"); - return; + Con_Print("ioctl CDROMREADTOCENTRY failed\n"); + return -1; } if (entry.cdte_ctrl == CDROM_DATA_TRACK) { Con_Printf("CDAudio: track %i is not audio\n", track); - return; + return -1; } - if (playing) - { - if (playTrack == track) - return; + if (cdPlaying) CDAudio_Stop(); - } ti.cdti_trk0 = track; ti.cdti_trk1 = track; ti.cdti_ind0 = 1; ti.cdti_ind1 = 99; - if ( ioctl(cdfile, CDROMPLAYTRKIND, &ti) == -1 ) - { - Con_DPrintf("ioctl cdromplaytrkind failed\n"); - return; - } - - if ( ioctl(cdfile, CDROMRESUME) == -1 ) - Con_DPrintf("ioctl cdromresume failed\n"); - - playLooping = looping; - playTrack = track; - playing = true; - - if (cdvolume == 0.0) - CDAudio_Pause (); -} - - -void CDAudio_Stop(void) -{ - if (cdfile == -1 || !enabled) - return; - - if (!playing) - return; - - if ( ioctl(cdfile, CDROMSTOP) == -1 ) - Con_DPrintf("ioctl cdromstop failed (%d)\n", errno); - - wasPlaying = false; - playing = false; -} - -void CDAudio_Pause(void) -{ - if (cdfile == -1 || !enabled) - return; - - if (!playing) - return; - - if ( ioctl(cdfile, CDROMPAUSE) == -1 ) - Con_DPrintf("ioctl cdrompause failed\n"); - - wasPlaying = playing; - playing = false; -} - - -void CDAudio_Resume(void) -{ - if (cdfile == -1 || !enabled) - return; - - if (!cdValid) - return; - - if (!wasPlaying) - return; - - if ( ioctl(cdfile, CDROMRESUME) == -1 ) - Con_DPrintf("ioctl cdromresume failed\n"); - playing = true; -} - -static void CD_f (void) -{ - char *command; - int ret; - int n; - - if (Cmd_Argc() < 2) - return; - - command = Cmd_Argv (1); - - if (Q_strcasecmp(command, "on") == 0) + if (ioctl(cdfile, CDROMPLAYTRKIND, &ti) == -1) { - enabled = true; - return; + Con_Print("ioctl CDROMPLAYTRKIND failed\n"); + return -1; } - if (Q_strcasecmp(command, "off") == 0) + if (ioctl(cdfile, CDROMRESUME) == -1) { - if (playing) - CDAudio_Stop(); - enabled = false; - return; + Con_Print("ioctl CDROMRESUME failed\n"); + return -1; } - if (Q_strcasecmp(command, "reset") == 0) - { - enabled = true; - if (playing) - CDAudio_Stop(); - for (n = 0; n < 100; n++) - remap[n] = n; - CDAudio_GetAudioDiskInfo(); - return; - } + return 0; +} - if (Q_strcasecmp(command, "remap") == 0) - { - ret = Cmd_Argc() - 2; - if (ret <= 0) - { - for (n = 1; n < 100; n++) - if (remap[n] != n) - Con_Printf(" %u -> %u\n", n, remap[n]); - return; - } - for (n = 1; n <= ret; n++) - remap[n] = atoi(Cmd_Argv (n+1)); - return; - } - if (Q_strcasecmp(command, "close") == 0) - { - CDAudio_CloseDoor(); - return; - } +int CDAudio_SysStop (void) +{ + if (cdfile == -1) + return -1; - if (!cdValid) + if (ioctl(cdfile, CDROMSTOP) == -1) { - CDAudio_GetAudioDiskInfo(); - if (!cdValid) - { - Con_Printf("No CD in player.\n"); - return; - } + Con_Printf("ioctl CDROMSTOP failed (%d)\n", errno); + return -1; } - if (Q_strcasecmp(command, "play") == 0) - { - CDAudio_Play((byte)atoi(Cmd_Argv (2)), false); - return; - } + return 0; +} - if (Q_strcasecmp(command, "loop") == 0) - { - CDAudio_Play((byte)atoi(Cmd_Argv (2)), true); - return; - } +int CDAudio_SysPause (void) +{ + if (cdfile == -1) + return -1; - if (Q_strcasecmp(command, "stop") == 0) + if (ioctl(cdfile, CDROMPAUSE) == -1) { - CDAudio_Stop(); - return; + Con_Print("ioctl CDROMPAUSE failed\n"); + return -1; } - if (Q_strcasecmp(command, "pause") == 0) - { - CDAudio_Pause(); - return; - } + return 0; +} - if (Q_strcasecmp(command, "resume") == 0) - { - CDAudio_Resume(); - return; - } - if (Q_strcasecmp(command, "eject") == 0) - { - if (playing) - CDAudio_Stop(); - CDAudio_Eject(); - cdValid = false; - return; - } +int CDAudio_SysResume (void) +{ + if (cdfile == -1) + return -1; - if (Q_strcasecmp(command, "info") == 0) - { - Con_Printf("%u tracks\n", maxTrack); - if (playing) - Con_Printf("Currently %s track %u\n", playLooping ? "looping" : "playing", playTrack); - else if (wasPlaying) - Con_Printf("Paused %s track %u\n", playLooping ? "looping" : "playing", playTrack); - Con_Printf("Volume is %f\n", cdvolume); - return; - } + if (ioctl(cdfile, CDROMRESUME) == -1) + Con_Print("ioctl CDROMRESUME failed\n"); + + return 0; } -void CDAudio_Update(void) +int CDAudio_SysUpdate (void) { struct cdrom_subchnl subchnl; - static time_t lastchk; + static time_t lastchk = 0; - if (!enabled) - return; - - if (bgmvolume.value != cdvolume) + if (cdPlaying && lastchk < time(NULL) && cdfile != -1) { - if (cdvolume) - { - Cvar_SetValueQuick (&bgmvolume, 0.0); - cdvolume = bgmvolume.value; - CDAudio_Pause (); - } - else - { - Cvar_SetValueQuick (&bgmvolume, 1.0); - cdvolume = bgmvolume.value; - CDAudio_Resume (); - } - } - - if (playing && lastchk < time(NULL)) { lastchk = time(NULL) + 2; //two seconds between chks subchnl.cdsc_format = CDROM_MSF; - if (ioctl(cdfile, CDROMSUBCHNL, &subchnl) == -1 ) { - Con_DPrintf("ioctl cdromsubchnl failed\n"); - playing = false; - return; + if (ioctl(cdfile, CDROMSUBCHNL, &subchnl) == -1) + { + Con_Print("ioctl CDROMSUBCHNL failed\n"); + cdPlaying = false; + return -1; } if (subchnl.cdsc_audiostatus != CDROM_AUDIO_PLAY && - subchnl.cdsc_audiostatus != CDROM_AUDIO_PAUSED) { - playing = false; - if (playLooping) - CDAudio_Play(playTrack, true); + subchnl.cdsc_audiostatus != CDROM_AUDIO_PAUSED) + { + cdPlaying = false; + if (cdPlayLooping) + CDAudio_Play(cdPlayTrack, true); } + else + cdPlayTrack = subchnl.cdsc_trk; } + + return 0; } -int CDAudio_Init(void) +void CDAudio_SysInit (void) { int i; - if (cls.state == ca_dedicated) - return -1; - - if (COM_CheckParm("-nocdaudio")) - return -1; - - if ((i = COM_CheckParm("-cddev")) != 0 && i < com_argc - 1) { - strncpy(cd_dev, com_argv[i + 1], sizeof(cd_dev)); - cd_dev[sizeof(cd_dev) - 1] = 0; - } +// COMMANDLINEOPTION: Linux Sound: -cddev chooses which CD drive to use + if ((i = COM_CheckParm("-cddev")) != 0 && i < com_argc - 1) + strlcpy(cd_dev, com_argv[i + 1], sizeof(cd_dev)); +} - if ((cdfile = open(cd_dev, O_RDONLY)) == -1) { - Con_Printf("CDAudio_Init: open of \"%s\" failed (%i)\n", cd_dev, errno); +int CDAudio_SysStartup (void) +{ + if ((cdfile = open(cd_dev, O_RDONLY | O_NONBLOCK)) == -1) + { + Con_Printf("CDAudio_SysStartup: open of \"%s\" failed (%i)\n", + cd_dev, errno); cdfile = -1; return -1; } - for (i = 0; i < 100; i++) - remap[i] = i; - cdaudioinitialized = true; - initialized = true; - enabled = true; - - if (CDAudio_GetAudioDiskInfo()) - { - Con_Printf("CDAudio_Init: No CD in player.\n"); - cdValid = false; - } - - Cmd_AddCommand ("cd", CD_f); - - Con_Printf("CD Audio Initialized\n"); - return 0; } - -void CDAudio_Shutdown(void) +void CDAudio_SysShutdown (void) { - if (!initialized) - return; - CDAudio_Stop(); close(cdfile); cdfile = -1; }