From e6c3b35ddb52ea648400c19e553fb7e613b7c703 Mon Sep 17 00:00:00 2001 From: black Date: Fri, 16 Jul 2004 15:35:26 +0000 Subject: [PATCH] -Added SDL cd playing support (though not all functions are supported). -Added (in the SDL driver) the console command cddrive to handle multiple cd drives. git-svn-id: svn://svn.icculus.org/twilight/trunk/darkplaces@4273 d7cf8633-e32d-0410-b094-e92efae38249 --- cd_sdl.c | 226 +++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 226 insertions(+) create mode 100644 cd_sdl.c diff --git a/cd_sdl.c b/cd_sdl.c new file mode 100644 index 00000000..4ec4f958 --- /dev/null +++ b/cd_sdl.c @@ -0,0 +1,226 @@ +/* +Copyright (C) 2004 Andreas Kirsch (used cd_null.c as template) +Copyright (C) 1996-1997 Id Software, Inc. + +This program is free software; you can redistribute it and/or +modify it under the terms of the GNU General Public License +as published by the Free Software Foundation; either version 2 +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. + +See the GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software +Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + +*/ + +#include "quakedef.h" +#include + +/*IMPORTANT: +SDL 1.2.7 and older seems to have a strange bug regarding CDPause and CDResume under WIN32. +If CDResume is called, it plays to end of the CD regardless what values for lasttrack and lastframe +were passed to CDPlayTracks. +*/ + +// If one of the functions fails, it returns -1, if not 0 + +// SDL supports multiple cd devices - so we are going to support this, too. +static void CDAudio_SDL_CDDrive_f( void ); + +// we only support playing on CD at a time +static SDL_CD *cd; +static int drive; +static double pauseoffset; +static double endtime; + +static int ValidateDrive( void ) +{ + if( cd && SDL_CDStatus( cd ) > 0 ) + return cdValid = true; + + return cdValid = false; +} + +void CDAudio_SysEject (void) +{ + SDL_CDEject( cd ); +} + + +void CDAudio_SysCloseDoor (void) +{ + //NO SDL FUNCTION +} + + +int CDAudio_SysGetAudioDiskInfo (void) +{ + if( ValidateDrive() ) // everything > 0 is ok, 0 is trayempty and -1 is error + return cd->numtracks; + return -1; +} + + +float CDAudio_SysGetVolume (void) +{ + return -1.0f; +} + + +void CDAudio_SysSetVolume (float volume) +{ + //NO SDL FUNCTION +} + + +int CDAudio_SysPlay (qbyte track) +{ + SDL_CDStop( cd ); + endtime = realtime + (float) cd->track[ track - 1 ].length / CD_FPS; + return SDL_CDPlayTracks( cd, track - 1, 0, track, 1 ); //FIXME: shall we play the whole cd or only the track? +} + + +int CDAudio_SysStop (void) +{ + endtime = -1.0; + return SDL_CDStop( cd ); +} + + +int CDAudio_SysPause (void) +{ + SDL_CDStatus( cd ); + pauseoffset = cd->cur_frame; + return SDL_CDPause( cd ); +} + +int CDAudio_SysResume (void) +{ + SDL_CDResume( cd ); + endtime = realtime + (cd->track[ cdPlayTrack - 1 ].length - pauseoffset) / CD_FPS; + return SDL_CDPlayTracks( cd, cdPlayTrack - 1, pauseoffset, cdPlayTrack, 0 ); +} + +int CDAudio_SysUpdate (void) +{ + if( !cd || cd->status <= 0 ) { + cdValid = false; + return -1; + } + if( endtime > 0.0 && realtime >= endtime ) + if( SDL_CDStatus( cd ) == CD_STOPPED ){ + endtime = -1.0; + if( cdPlayLooping ) + CDAudio_SysPlay( cdPlayTrack ); + else + cdPlaying = false; + } + return 0; +} + + +void CDAudio_SysInit (void) +{ + if( SDL_InitSubSystem( SDL_INIT_CDROM ) == -1 ) + Con_SafePrint( "Failed to init the CDROM SDL subsystem!\n" ); + + Cmd_AddCommand( "cddrive", CDAudio_SDL_CDDrive_f ); +} + +static int IsAudioCD( void ) +{ + int i; + for( i = 0 ; i < cd->numtracks ; i++ ) + if( cd->track[ i ].type == SDL_AUDIO_TRACK ) + return true; + return false; +} + +int CDAudio_SysStartup (void) +{ + int i; + int numdrives; + + numdrives = SDL_CDNumDrives(); + if( numdrives == -1 ) // was the CDROM system initialized correctly? + return -1; + + Con_DPrintf( "Found %i cdrom drives.\n", numdrives ); + + for( i = 0 ; i < numdrives ; i++, cd = NULL ) { + cd = SDL_CDOpen( i ); + if( !cd ) { + Con_DPrintf( "CD drive %i is invalid.\n", i ); + continue; + } + + if( CD_INDRIVE( SDL_CDStatus( cd ) ) ) + if( IsAudioCD() ) + break; + else + Con_DPrintf( "The CD in drive %i is not an audio cd.\n", i ); + else + Con_DPrintf( "No CD in drive %i.\n", i ); + + SDL_CDClose( cd ); + } + + if( i == numdrives && !cd ) + return -1; + + drive = i; + + return 0; +} + +void CDAudio_SysShutdown (void) +{ + if( cd ) + SDL_CDClose( cd ); +} + +void CDAudio_SDL_CDDrive_f( void ) +{ + int i; + int numdrives = SDL_CDNumDrives(); + + if( Cmd_Argc() != 2 ) { + Con_Print( "cddrive \n" ); + return; + } + + i = atoi( Cmd_Argv( 1 ) ); + if( i >= numdrives ) { + Con_Printf("Only %i drives!\n", numdrives ); + return; + } + + if( cd ) + SDL_CDClose( cd ); + + cd = SDL_CDOpen( i ); + if( !cd ) { + Con_Printf( "Couldn't open drive %i.\n", i ); + return; + } + + if( !CD_INDRIVE( SDL_CDStatus( cd ) ) ) + Con_Printf( "No cd in drive %i.\n", i ); + else if( !IsAudioCD() ) + Con_Printf( "The CD in drive %i is not an audio CD.\n", i ); + + drive = i; + ValidateDrive(); +} + + + + + -- 2.39.2