/*
Ruby/SDL Ruby extension library for SDL
Copyright (C) 2001-2007 Ohbayashi Ippei
This library is free software; you can redistribute it and/or
modify it under the terms of the GNU Lesser General Public
License as published by the Free Software Foundation; either
version 2.1 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
Lesser General Public License for more details.
You should have received a copy of the GNU Lesser General Public
License along with this library; if not, write to the Free Software
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/
#include "rubysdl.h"
static VALUE sdl_cd_numDrive(VALUE class)
{
return INT2FIX(SDL_CDNumDrives());
}
static VALUE sdl_cd_name(VALUE class,VALUE drive)
{
return rb_str_new2(SDL_CDName(NUM2INT(drive)));
}
static VALUE sdl_cd_open(VALUE class,VALUE drive)
{
SDL_CD *cd;
cd=SDL_CDOpen(NUM2INT(drive));
if(cd==NULL)
rb_raise(eSDLError,"Couldn't open drive %d: %s",
NUM2INT(drive),SDL_GetError());
return Data_Wrap_Struct(class,0,SDL_CDClose,cd);
}
static VALUE sdl_cd_status(VALUE obj)
{
SDL_CD *cd;
Data_Get_Struct(obj,SDL_CD,cd);
return INT2FIX(SDL_CDStatus(cd));
}
static VALUE sdl_cd_play(VALUE obj,VALUE start,VALUE length)
{
SDL_CD *cd;
Data_Get_Struct(obj,SDL_CD,cd);
if( SDL_CDPlay(cd,NUM2INT(start),NUM2INT(length))==-1 )
rb_raise(eSDLError,"Couldn't play cd :%s",SDL_GetError() );
return Qnil;
}
static VALUE sdl_cd_playTracks(VALUE obj,VALUE start_track,VALUE start_frame,
VALUE ntracks,VALUE nframes)
{
SDL_CD *cd;
Data_Get_Struct(obj,SDL_CD,cd);
if( SDL_CDPlayTracks(cd,NUM2INT(start_track),NUM2INT(start_frame),
NUM2INT(ntracks),NUM2INT(nframes))==-1 )
rb_raise(eSDLError,"Couldn't play cd :%s",SDL_GetError() );
return Qnil;
}
static VALUE sdl_cd_pause(VALUE obj)
{
SDL_CD *cd;
Data_Get_Struct(obj,SDL_CD,cd);
if( SDL_CDPause(cd)==-1 )
rb_raise(eSDLError,"cd pause failed :%s",SDL_GetError());
return Qnil;
}
static VALUE sdl_cd_resume(VALUE obj)
{
SDL_CD *cd;
Data_Get_Struct(obj,SDL_CD,cd);
if( SDL_CDResume(cd)==-1 )
rb_raise(eSDLError,"cd resume failed :%s",SDL_GetError());
return Qnil;
}
static VALUE sdl_cd_stop(VALUE obj)
{
SDL_CD *cd;
Data_Get_Struct(obj,SDL_CD,cd);
if( SDL_CDStop(cd)==-1 )
rb_raise(eSDLError,"cd pause failed :%s",SDL_GetError());
return Qnil;
}
static VALUE sdl_cd_eject(VALUE obj)
{
SDL_CD *cd;
Data_Get_Struct(obj,SDL_CD,cd);
if( SDL_CDEject(cd)==-1 )
rb_raise(eSDLError,"cd eject failed :%s",SDL_GetError());
return Qnil;
}
static VALUE sdl_cd_numTracks(VALUE obj)
{
SDL_CD *cd;
Data_Get_Struct(obj,SDL_CD,cd);
return INT2NUM(cd->numtracks);
}
static VALUE sdl_cd_currentTrack(VALUE obj)
{
SDL_CD *cd;
Data_Get_Struct(obj,SDL_CD,cd);
return INT2NUM(cd->cur_track);
}
static VALUE sdl_cd_currentFrame(VALUE obj)
{
SDL_CD *cd;
Data_Get_Struct(obj,SDL_CD,cd);
return INT2NUM(cd->cur_frame);
}
static VALUE sdl_cd_trackType(VALUE obj,VALUE track)
{
SDL_CD *cd;
int index=NUM2INT(track);
Data_Get_Struct(obj,SDL_CD,cd);
return INT2FIX(cd->track[index].type);
}
static VALUE sdl_cd_trackLength(VALUE obj,VALUE track)
{
SDL_CD *cd;
int index=NUM2INT(track);
Data_Get_Struct(obj,SDL_CD,cd);
return INT2FIX(cd->track[index].length);
}
static VALUE sdl_cd_framesToMSF(VALUE class, VALUE frames)
{
int m, s, f;
FRAMES_TO_MSF(NUM2INT(frames), &m, &s, &f);
return rb_ary_new3(3, INT2FIX(m), INT2FIX(s), INT2FIX(f));
}
static VALUE sdl_cd_MSFToFrames(VALUE class, VALUE m, VALUE s, VALUE f)
{
return INT2FIX(MSF_TO_FRAMES(NUM2INT(m),NUM2INT(s),NUM2INT(f)));
}
static void defineConstForCDROM()
{
rb_define_const(cCD,"TRAYEMPTY",INT2NUM(CD_TRAYEMPTY));
rb_define_const(cCD,"STOPPED",INT2NUM(CD_STOPPED));
rb_define_const(cCD,"PLAYING",INT2NUM(CD_PLAYING));
rb_define_const(cCD,"PAUSED",INT2NUM(CD_PAUSED));
rb_define_const(cCD,"ERROR",INT2NUM(CD_ERROR));
rb_define_const(cCD,"AUDIO_TRACK",UINT2NUM(SDL_AUDIO_TRACK));
rb_define_const(cCD,"DATA_TRACK",UINT2NUM(SDL_DATA_TRACK));
rb_define_const(cCD,"FPS", UINT2NUM(CD_FPS));
}
void init_cdrom()
{
cCD=rb_define_class_under(mSDL,"CD",rb_cObject);
rb_define_singleton_method(cCD,"numDrive",sdl_cd_numDrive,0);
rb_define_singleton_method(cCD,"indexName",sdl_cd_name,1);
rb_define_singleton_method(cCD,"open",sdl_cd_open,1);
rb_define_singleton_method(cCD,"framesToMSF",sdl_cd_framesToMSF,1);
rb_define_singleton_method(cCD,"MSFToFrames",sdl_cd_MSFToFrames,3);
rb_define_method(cCD,"status",sdl_cd_status,0);
rb_define_method(cCD,"play",sdl_cd_play,2);
rb_define_method(cCD,"playTracks",sdl_cd_playTracks,4);
rb_define_method(cCD,"pause",sdl_cd_pause,0);
rb_define_method(cCD,"resume",sdl_cd_resume,0);
rb_define_method(cCD,"stop",sdl_cd_stop,0);
rb_define_method(cCD,"eject",sdl_cd_eject,0);
rb_define_method(cCD,"numTracks",sdl_cd_numTracks,0);
rb_define_method(cCD,"currentTrack",sdl_cd_currentTrack,0);
rb_define_method(cCD,"currentFrame",sdl_cd_currentFrame,0);
rb_define_method(cCD,"trackType",sdl_cd_trackType,1);
rb_define_method(cCD,"trackLength",sdl_cd_trackLength,1);
defineConstForCDROM();
}
syntax highlighted by Code2HTML, v. 0.9.1