;; /*
;;     SDL - Simple DirectMedia Layer
;;     Copyright (C) 1997, 1998, 1999, 2000, 2001  Sam Lantinga
;; 
;;     This library is free software; you can redistribute it and/or
;;     modify it under the terms of the GNU Library General Public
;;     License as published by the Free Software Foundation; either
;;     version 2 of the License, or (at your option) any later version.
;; 
;;     This library 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
;;     Library General Public License for more details.
;; 
;;     You should have received a copy of the GNU Library General Public
;;     License along with this library; if not, write to the Free
;;     Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
;; 
;;     Sam Lantinga
;;     slouken@devolution.com
;; */
;; 
;; #ifdef SAVE_RCSID
;; static char rcsid =
;;  "@(#) $Id: SDL_cdrom.lsh,v 1.1 2002/08/19 07:04:08 profshadoko Exp $";
;; #endif
;; 
;; /* This is the CD-audio control API for Simple DirectMedia Layer */
;; 
;; #ifndef _SDL_cdrom_h
;; #define _SDL_cdrom_h
;; 
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; dummy function to load the header
;;
(de SDL_cdrom_dummy () (sdlheader "SDL_cdrom.h"))

;; #include "SDL_types.h"
;; 
;; #include "begin_code.h"
;; /* Set up for C function definitions, even when using C++ */
;; #ifdef __cplusplus
;; extern "C" {
;; #endif
;; 
;; /* In order to use these functions, SDL_Init() must have been called
;;    with the SDL_INIT_CDROM flag.  This causes SDL to scan the system
;;    for CD-ROM drives, and load appropriate drivers.
;; */
;; 
;; /* The maximum number of CD-ROM tracks on a disk */
(libload "libc/constants")

(defconstant "SDL_MAX_TRACKS"	99)
;; 
;; /* The types of CD-ROM track possible */
(defconstant "SDL_AUDIO_TRACK"	0x00)
(defconstant "SDL_DATA_TRACK"	0x04)

#? (CD_INDRIVE <status>)
;;.PRE
;; /* The possible states which a CD-ROM drive can be in. */
;; typedef enum {
;; 	CD_TRAYEMPTY,
;; 	CD_STOPPED,
;; 	CD_PLAYING,
;; 	CD_PAUSED,
;; 	CD_ERROR = -1
;; } CDstatus;
;; 
;; /* Given a status, returns true if there's a disk in the drive */
(de CD_INDRIVE(status) ((-int-) status) (when (> status 0)))

;; typedef struct {
;; 	Uint8 id;		/* Track number */
;; 	Uint8 type;		/* Data or audio track */
;; 	Uint16 unused;
;; 	Uint32 length;		/* Length, in frames, of this track */
;; 	Uint32 offset;		/* Offset, in frames, from start of disk */
;; } SDL_CDtrack;
;; 
;; /* This structure is only current as of the last call to SDL_CDStatus() */
;; typedef struct SDL_CD {
;; 	int id;			/* Private drive identifier */
;; 	CDstatus status;	/* Current drive status */
;; 
;; 	/* The rest of this structure is only valid if there's a CD in drive */
;; 	int numtracks;		/* Number of tracks on disk */
;; 	int cur_track;		/* Current track position */
;; 	int cur_frame;		/* Current frame offset within current track */
;; 	SDL_CDtrack track[SDL_MAX_TRACKS+1];
;; } SDL_CD;
;; 
;; /* Conversion functions from frames to Minute/Second/Frames and vice versa */
(setq CD_FPS	75)

;; #define FRAMES_TO_MSF(f, M,S,F)	{					\
;; 	int value = f;							\
;; 	*(F) = value%CD_FPS;						\
;; 	value /= CD_FPS;						\
;; 	*(S) = value%60;						\
;; 	value /= 60;							\
;; 	*(M) = value;							\
;; }
;; #define MSF_TO_FRAMES(M, S, F)	((M)*60*CD_FPS+(S)*CD_FPS+(F))
;; 
;; /* CD-audio API functions: */
;; 

#? (SDL_CDNumDrives)
;;.PRE
;; /* Returns the number of CD-ROM drives on the system, or -1 if
;;    SDL_Init() has not been called with the SDL_INIT_CDROM flag.
;;  */
;; extern DECLSPEC int SDL_CDNumDrives(void);
(de SDL_CDNumDrives()
    (int #{ SDL_CDNumDrives() #}))

#? (SDL_CDName <drive>)
;;.PRE
;; /* Returns a human-readable, system-dependent identifier for the CD-ROM.
;;    Example:
;; 	"/dev/cdrom"
;; 	"E:"
;; 	"/dev/disk/ide/1/master"
;; */
;; extern DECLSPEC const char * SDL_CDName(int drive);
(de SDL_CDName(drive)
    ((-int-) drive)
    (gptr #{ SDL_CDName($drive) #}))

#? (SDL_CDOpen <drive>)
;;.PRE
;; /* Opens a CD-ROM drive for access.  It returns a drive handle on success,
;;    or NULL if the drive was invalid or busy.  This newly opened CD-ROM
;;    becomes the default CD used when other CD functions are passed a NULL
;;    CD-ROM handle.
;;    Drives are numbered starting with 0.  Drive 0 is the system default CD-ROM.
;; */
;; extern DECLSPEC SDL_CD * SDL_CDOpen(int drive); 
(de SDL_CDOpen(drive)
    ((-int-) drive)
    (gptr #{ SDL_CDOpen($drive) #}))

#? (SDL_CDStatus <cdrom>)
;;.PRE
;; /* This function returns the current status of the given drive.
;;    If the drive has a CD in it, the table of contents of the CD and current
;;    play position of the CD will be stored in the SDL_CD structure.
;; */
;; extern DECLSPEC CDstatus SDL_CDStatus(SDL_CD *cdrom);
(de SDL_CDStatus(cdrom)
    ((-gptr- "SDL_CD *") cdrom)
    (int #{ SDL_CDStatus($cdrom) #} ))

#? (SDL_CDPlayTracks <cdrom> <start_track> <start_frame> <ntracks> <nframes>)
;;.PRE
;; /* Play the given CD starting at 'start_track' and 'start_frame' for 'ntracks'
;;    tracks and 'nframes' frames.  If both 'ntrack' and 'nframe' are 0, play 
;;    until the end of the CD.  This function will skip data tracks.
;;    This function should only be called after calling SDL_CDStatus() to 
;;    get track information about the CD.
;;    For example:
;; 	// Play entire CD:
;; 	if ( CD_INDRIVE(SDL_CDStatus(cdrom)) )
;; 		SDL_CDPlayTracks(cdrom, 0, 0, 0, 0);
;; 	// Play last track:
;; 	if ( CD_INDRIVE(SDL_CDStatus(cdrom)) ) {
;; 		SDL_CDPlayTracks(cdrom, cdrom->numtracks-1, 0, 0, 0);
;; 	}
;; 	// Play first and second track and 10 seconds of third track:
;; 	if ( CD_INDRIVE(SDL_CDStatus(cdrom)) )
;; 		SDL_CDPlayTracks(cdrom, 0, 0, 2, 10);
;; 
;;    This function returns 0, or -1 if there was an error.
;; */
;; extern DECLSPEC int SDL_CDPlayTracks(SDL_CD *cdrom,
;; 		int start_track, int start_frame, int ntracks, int nframes);
(de SDL_CDPlayTracks(cdrom start_track start_frame ntracks nframes)
    ((-gptr- "SDL_CD *") cdrom)
    ((-int-)  start_track start_frame ntracks nframes)
    (int #{  SDL_CDPlayTracks($cdrom, $start_track, $start_frame, $ntracks, $nframes) #}))

#? (SDL_CDPlay <cdrom> <start> <length>)
;;.PRE
;; /* Play the given CD starting at 'start' frame for 'length' frames.
;;    It returns 0, or -1 if there was an error.
;; */
;; extern DECLSPEC int SDL_CDPlay(SDL_CD *cdrom, int start, int length);
(de SDL_CDPlay(cdrom start length)
    ((-gptr- "SDL_CD *") cdrom)
    ((-int-)  start length)
    (int #{  SDL_CDPlay($cdrom, $start, $length) #}))

#? (SDL_CDPause <cdrom>)
;;.PRE
;; /* Pause play -- returns 0, or -1 on error */
;; extern DECLSPEC int SDL_CDPause(SDL_CD *cdrom);
(de SDL_CDPause(cdrom)
    ((-gptr- "SDL_CD *") cdrom)
    (int #{  SDL_CDPause($cdrom) #}))

#? (SDL_CDResume <cdrom>)
;;.PRE
;; /* Resume play -- returns 0, or -1 on error */
;; extern DECLSPEC int SDL_CDResume(SDL_CD *cdrom);
(de SDL_CDResume(cdrom)
    ((-gptr- "SDL_CD *") cdrom)
    (int #{  SDL_CDResume($cdrom) #}))

#? (SDL_CDStop <cdrom>)
;;.PRE
;; /* Stop play -- returns 0, or -1 on error */
;; extern DECLSPEC int SDL_CDStop(SDL_CD *cdrom);
(de SDL_CDStop(cdrom)
    ((-gptr- "SDL_CD *") cdrom)
    (int #{  SDL_CDStop($cdrom) #}))

#? (SDL_CDEject <cdrom>)
;;.PRE
;; /* Eject CD-ROM -- returns 0, or -1 on error */
;; extern DECLSPEC int SDL_CDEject(SDL_CD *cdrom);
(de SDL_CDEject(cdrom)
    ((-gptr- "SDL_CD *") cdrom)
    (int #{  SDL_CDEject($cdrom) #}))

#? (SDL_CDClose <cdrom>)
;;.PRE
;; /* Closes the handle for the CD-ROM drive */
;; extern DECLSPEC void SDL_CDClose(SDL_CD *cdrom);
(de SDL_CDClose(cdrom)
    ((-gptr- "SDL_CD *") cdrom)
    #{  SDL_CDClose($cdrom) #} ())

;; /* Ends C function definitions when using C++ */
;; #ifdef __cplusplus
;; }
;; #endif
;; #include "close_code.h"
;; 
;; #endif /* _SDL_video_h */

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; compile 
(sdladdfuncs  SDL_CDNumDrives SDL_CDName SDL_CDOpen SDL_CDStatus
	      SDL_CDPlayTracks SDL_CDPlay SDL_CDPause SDL_CDResume SDL_CDStop
	      SDL_CDEject SDL_CDClose)

