کار با CD-Rom

به نام خالق نًفًسهام

 

کار با CD-Rom :

 

شما در این درس با ساختارهای :

 

SDL_CDStatus

SDL_CD

SDL_CDtrack

و توابع :

SDL_CDNumDrives

SDL_CDName

SDL_CDOpen

SDL_CDPlay

SDL_CDPlayTracks

SDL_CDPause

SDL_CDResume

SDL_CDStop

اشنا می شوید.

 

SDL حتی توانایی پشتیبانی از سیستم های با 32 درایو CD-Rom را دارد قبل ازفراخوانی باید CD-Rom را به وسیله دستور SDL_Init() برای استفاده اماده کنیم وسپس می توان بوسیله تابع SDL_CDNumDrives() تعداد CD درایو ها را تشخیص دهیم.

 

قبل از ادامه کار ساختارهای SDL_CD و SDL_status را توضیح می دهیم

 

CD_status یک enum هست که اینگونه تعریف می شود

 

typedef enum {

  CD_TRAYEMPTY,

  CD_STOPPED,

  CD_PLAYING,

  CD_PAUSED,

  CD_ERROR = -1

} CDstatus;

که موقعیت CD را می تواند به ما اطلاع بدهد

 

typedef struct {

  int id;

  CDstatus status;

  int numtracks;

  int cur_track;

  int cur_frame;

  SDL_CDtrack track[SDL_MAX_TRACKS+1];

} SDL_CD;

که id مشخص کننده شناسه عددی از CD_Rom است

status هم مشخص کننده وضیعت CD-Rom است

Numtracks تعداد ترک های روی که CD است

cur_track شماره ترک فعلی را نشان می دهد

cur_frame شماره فرم فعلی را مشخص می کند

SDL_CDtrack ساختار ترک از CD را مشخص میکند

 

ساختار SDL_CDtrackساختار نشان دهنده مشخصات ترک است

typedef struct{
  Uint8 id;
  Uint8 type;
  Uint32 length;
  Uint32 offset;
} SDL_CDtrack;

 

id شماره ترک

Type نوع ترک را مشخص میکند داده(SDL_DATA_TRACK) یا صوتی (SDL_AUDIO_TRACK)

 

Length طول ترک را مشخص میکند در فرمت فرم

Offset مبدا ترک در فرمت فرم

 

---------------------------------------------------------

سپس می توان بوسیله تابع

SDL_CD *SDL_CDOpen(int drive);

با دادن شماره درایو هر کدام را به اتخاب اماده کرد.

که این تابع یک ساختار SDL_CD بر میگرداند

 

یک CD از یک ترک یا بیشتر درست شده است و هر ترک تعداد معینی فرم دارد و هر فرم تقریبا kb 2 است ودر سرعت معمولی هر CD-Rom در ثانیه75 فرم را می خواند

SDL با فرم ها کار میکند ولی میتوان به راحتی با ماکروهای FRAMES_TO_MSF و MSF_TO_FRAMES ان را به دقیقه و ثانیه و

فرم تبدیل کرد.

مثال :

فرض کنید متغییرcdrom با SDL_CDOpen تخصیص داده شده باشد //

int min, sec, frame;
int frame_offset;
 
FRAMES_TO_MSF(cdrom->cur_frame, &min, &sec, &frame);
printf(“Current Position: %d minutes, %d seconds, %d frames
”, min, sec, frame);
 
frame_offset=MSF_TO_FRAMES(min, sec, frame);

 

 

 

تابع  SDL_CDName(int number) اسم CD را بر میگرداند

 

const char *SDL_CDName(int drive);

مثال :

·         "/dev/cdrom"

·         "E:"

·         "/dev/disk/ide/1/master"

یک مثال دیگر :

int main(int a, char* b[]){
SDL_CD *cdrom;
int cur_track;
int min, sec, frame;
SDL_Init(SDL_INIT_CDROM);
atexit(SDL_Quit);
 
/* Check for CD drives */
if(!SDL_CDNumDrives()){
  /* None found */
  fprintf(stderr, "No CDROM devices available
");
  exit(-1);
}
 
/* Open the default drive */
cdrom=SDL_CDOpen(0);
 
/* Did if open? Check if cdrom is NULL */
if(!cdrom){
  fprintf(stderr, "Couldn't open drive: %s
", SDL_GetError());
  exit(-1);
}
 
/* Print Volume info */
printf("Name: %s
", SDL_CDName(0));
printf("Tracks: %d
", cdrom->numtracks);
for(cur_track=0;cur_track < cdrom->numtracks; cur_track++){
  FRAMES_TO_MSF(cdrom->track[cur_track].length, &min, &sec, &frame);
  printf("	Track %d: Length %d:%d
", cur_track, min, sec);
}
 
SDL_CDClose(cdrom);
}
تابع SDL_CDPlay :
int SDL_CDPlay(SDL_CD *cdrom, int start, int length);
که cd مورد نظر را از فرم start به مدت length فرم پخش می کند
 
تابع SDL_CDPlayTracks :
int SDL_CDPlayTracks(SDL_CD *cdrom, int start_track, int start_frame, int ntracks, int nframes));
 
start_track شماره ترک برای شروع
start_frame شماره فرم از ترک اول
ntracks تعداد ترک های که باید پخش شود
Nframes شماره فرم از اخرین ترکی که باید پخش شود
 
 
مثال :
/* assuming cdrom is a previously opened device */
/* Play the entire CD */
if(CD_INDRIVE(SDL_CDStatus(cdrom)))
  SDL_CDPlayTracks(cdrom, 0, 0, 0, 0);
 
/* Play the first track */
if(CD_INDRIVE(SDL_CDStatus(cdrom)))
  SDL_CDPlayTracks(cdrom, 0, 0, 1, 0);
 
/* Play first 15 seconds of the 2nd track */
if(CD_INDRIVE(SDL_CDStatus(cdrom)))
  SDL_CDPlayTracks(cdrom, 1, 0, 0, CD_FPS*15);
 

بقیه توابع هم از اسمشان معلوم اند.

نظرات 1 + ارسال نظر
ReZa دوشنبه 2 مرداد‌ماه سال 1385 ساعت 12:13 ق.ظ

هی ایمان یه کم وقت بزار مطالبت این قدر به هم ریخته نوشته نشه. ولی خیلی خوبه!! خسته نباشی

نوکرتم :)

برای نمایش آواتار خود در این وبلاگ در سایت Gravatar.com ثبت نام کنید. (راهنما)
ایمیل شما بعد از ثبت نمایش داده نخواهد شد