کار با 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);
 

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

درس ۲ کار با CD-Rom

در این درس کار با CD-Rom را یاد میگیرید طبعا در همه سیستم عاملها...

رو کاغذ نوشتم باید تایپش کنم!!!

درس 1

 به نام خداوند (تنها جاویدان)

 

 

فایل های استفاده شده

Message

‌BackGround

Source Code

شروع کار با SDL:

اولین کاری که باید انجام بدهیم فراخوانی کردن کتابخانه SDL است که بوسیله دستور  #include (وهمچنین برای این درس)  انجام میشودقبل از هر چیز

 نکته1: در مورد قوانین نحوی  توابع و ساختارهایSDL بگویم که معمولا همه انها با SDL_شروع می شوند مثل ُ SDL_LoadBMP()یا SDL_Surfaceو...

 

نکته2: شما در این درس با توابع

1. SDL_Init()

2. SDL_Quit()

3. SDL_FreeSurface()

4. SDL_LoadBMP()

5. SDL_DisplayFormat()

6. SDL_BlitSurface()

7. SDL_SetVideoMode()

8. SDL_WM_SetCaption()

9. SDL_Delay()

10. SDL_Flip()

11.SDL_GetError()

و با ساختارهای

1. SDL_Surface

2. SDL_Rect

 

اشنا خواهید شد

و نکته که دیگر قبل از ادامه کار باید بگویم این است که SDL

انواع خواص خودش را دارد

Uint8 - the equivalent of an unsigned char 
Uint16 - a 16 bit (2 byte) unsigned integer 
Uint32 - a 32 bit (4 byte) unsigned integer 
Uint64 - a 64 bit (8 byte) unsigned integer 
Sint8 - the equivalent of a signed char 
Sint16 - a 16 bit (2 byte) signed integer 
Sint32 - a 32 bit (4 byte) signed integer 
Sint64 - a 64 bit (8 byte) signed integer 

 

بعداز این نیاز به اماده کردن SDL برای استفاده از توانایی ان در برنامه است این کار بوسیله تابع SDL_Init() انجام می شودکه در صورت نا موفق بودن اجرا مقدار-1را برمیگرداند

SDLمرکب از 8 سیستم است َAudio,Video,Event Handeling,Cd-Rom,File I/o,JoyStick,Timers,Threading که قبل از ایتباده از هرکدام باید اماده شود بوسیله SDL_Init() :

 

int SDL_Init(Uint32 flags);

Flags:

 

SDL_INIT_TIMER

SDL_INIT_AUDIO

SDL_INIT_VIDEO

SDL_INIT_CDROM

SDL_INIT_JOYSTICK

SDL_INIT_EVERYTHING

SDL_INIT_NOPARACHUTE

SDL_INIT_EVENTTHREAD 

 

شما میتوانید با عملگر | دو یا چند مد را اماده کنید

ولی ما معمولا از SDL_INIT_EVERYTHING استفاده می کنیم.

پس کد بعدی برنامه

If (SDL_Init (SDL_INIT_EVERYTHING) == -1)

            Return 1;

در صورت پیش امدن اشکال تابع ()SDL_GetErrorیک مقدار رشته ای از اخرین خطا بر می گرداند

 

حالا وقت اشنایی شما با ساختار SDL_Surface است همه چیز در SDLیک سطح است از مانیتور گرفته تا فایلهای که لود می کنید

 

این ساختار نمایش دهنده قسمتی از حا فظه است که اطلاعات گرافیکی در ان زخیره شده است که اعضای مهم ان عبارت است fotmat که نمایانگر فرمت سطح مثلا 24Bitیا32Bitبودن ان است clip_rectکه از نوع SDL_Rectاست که ساختار مستطیل SDL است حالا ما قصد داریم اشاره گری به صفحه نمایش بدهیم برای این کار باید یک اشاره گر به  سطح تعریف کنید

SDL_Surface *screen = NULL;

و سپس صفحه نمایش را با تابع SDL_SetVideoMode به screenآدرس دهی می کنیم البته در درس 1 ما نیاز به دو سطح دیگر برای نگهداری دو عکس Background.bmp وhelloworld.bmp نیز داریم

SDL_Surface *background = NULL;

SDL_Surface *message = NULL;

حال ما خود تابع load_image(string filename)راتعریف میکنبم

 

SDL_Surface *load_image( std::string filename )

{

    //Temporary storage for the image that's loaded

    SDL_Surface* loadedImage = NULL;

   

    //The optimized image that will be used

    SDL_Surface* optimizedImage = NULL;

  loadedImage = SDL_LoadBMP( filename.c_str() );

      //If nothing went wrong in loading the image

    if( loadedImage != NULL )

    {

        //Create an optimized image

        optimizedImage = SDL_DisplayFormat( loadedImage );

       

        //Free the old image

        SDL_FreeSurface( loadedImage );

    }

    //Return the optimized image

    return optimizedImage;

}

کار این تابع برگرداندن بک اشاره گر به تصویر بهینه شده است

(optimizedImage)پارامتر Filename مسیر فایل BMPاست loadImage یک سطح موقتی برای نگه داری BMP وoptimizedImage سطحی است که از ان استفاده می شود اول از همه تصویر به وسیله تابعSDL_LoadBMP

لود میشود ولی از ان استفاده نمی کنیم زیرا فایل BMP 24 bit می باشد ولی ما می خواهیم صفحه از نوع 32bit باشد ودر صورت استفاده سرعت کار پایین می اید پس ما فرمت عکس را هم فرمت صفحه نمایش میکنیم به وسیله تابع SDL_DisplayFormat و سپس تابع

SDL_FreeSurface استفاده میشود برای ازاد سازی فضای اشغال شده

شکل کلی 3 تابع :

SDL_Surface *SDL_LoadBMP(const char *file);

SDL_Surface *SDL_DisplayFormat(SDL_Surface *surface);

void SDL_FreeSurface(SDL_Surface *surface);

 

سپس تابعی دیگر تعریف میکنیم برای چسباندن عکسها به صفحه نمایش

یا هر سطح به سطح دیگر این کار به وسیله تابع SDL_BlitSurface

انجام می شود ولی ما با استفاده از این تابع خود تابع دیگر مینویسیم.

void apply_surface( int x, int y, SDL_Surface* source, SDL_Surface* destination )

{

    //Make a temporary rectangle to hold the offsets

    SDL_Rect offset;

   

    //Give the offsets to the rectangle

    offset.x = x;

    offset.y = y;

    //Blit the surface

    SDL_BlitSurface( source, NULL, destination, &offset );

}

 

این تابع 4 پارامتر میگیرد مختصات مبدا, سطح مقصد و سطح منبع

در اول کار ما مختصات را به یک مسطتیل SDL تبدیل میکنیم چون Blitsurfaceفقط SDL_Rect را قبول میکند

 

const int SCREEN_WIDTH = 640;

const int SCREEN_HEIGHT = 480;

const int SCREEN_BPP = 32;

 

int main( int argc, char* args[] )

{

    //Initialize all SDL subsystems

    if( SDL_Init( SDL_INIT_EVERYTHING ) == -1 )

    {

        return 1;   

    }

   

    //Set up the screen

    screen = SDL_SetVideoMode( SCREEN_WIDTH, SCREEN_HEIGHT, SCREEN_BPP, SDL_SWSURFACE );

   

    //If there was in error in setting up the screen

    if( screen == NULL )

    {

        return 1;   

    }

   

    //Set the window caption

    SDL_WM_SetCaption( "Hello World", NULL );

   

    //Load the images

    message = load_image( "hello_world.bmp" );

    background = load_image( "background.bmp" );

   

    //Apply the background to the screen

    apply_surface( 0, 0, background, screen );

   

    //Apply the message to the screen

    apply_surface( 180, 140, message, screen );

   

    //Update the screen

    if( SDL_Flip( screen ) == -1 )

    {

        return 1;   

    }

   

    //Wait 2 seconds

    SDL_Delay( 2000 );

   

    //Free the surfaces

    SDL_FreeSurface( message );

    SDL_FreeSurface( background );

   

    //Quit SDL

    SDL_Quit();

   

    return 0;   

}

در ابتدا این را بدانید وقتی از SDL استفاده میکنیم همیشه باید

از int main( int argc, char* args[] ) یا int main( int argc, char** args) استفاده کنید در غیر این صورت اشکال میگیرد

تابع SDL_SetVideoMode برای تنظیم صفحه نمابش است

SDL_Surface *SDL_SetVideoMode(int width, int height, int bpp, Uint32 flags);

دو پارامتر اول که کاملا معلوم اند پارامتر  به معنی Bits PerPixel که من به 32 ست میکنم پارامتر 4م هم مقادیر ثابتی دارد که من همیشه به SDL_SWSURFACEست میکنم که به معنی نگهداری در حافظه سیستم است  

مقادیر دیگر هم مثل SDL_HWSURFACEوجود دارد (به Document ها مراجعه

شود )

تابع دیگر

void SDL_WM_SetCaption(const char *title, const char *icon);

 

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

SDL_WM_SetCaption(“Hello World”,NULL);


 

سپس دو عکس را در حافظه لود می کند و انها را به screen می چسباند

 

سپس با تابع SDL_Flip() صفحه نمایش را نوسازی می کند برای نشان دادن عکس لازم است و سپس SDL_Delay() تاخیر میدهد

Visual C++ .Net



اولین کاری که باید انجام بدین دانلود کردن فایل های اجرایی
و هدر SDL است.
میتوانید از این صفحه دانلود کنید تا پایین صفحه Scroll کنید
This




فایل ZIP را باز کنید سپس پوشه درون ان را باز کنید در این پوشه سه پوشه وجود دارد فایلهای SDL.libوSDLmain.libرا از پوشه
Libبه پوشه LibویژالC++خود کپی کنید مثلا در
C:Program FilesMicrosoft Visual Studio .NET 2003Vc7lib
سپس به پوشهInclude ویژالC++رفته و پوشه جدیدی به اسم SDL بسازید مثلا:
C:Program FilesMicrosoft Visual Studio .NET 2003Vc7Include
و فایلهای SDL,include را درون ان بریزیدسپس فایل SDL.dllاز پوشه
Lib به پوشه windows/system32 کپی کنید حالا یک روژه جدید Win32
بسازید



Okرا بزنید وسپس مطمئن شوید یک Empty project ساخته اید


یک فایل Cpp جدید به پروژه اضافه کنید

و کد زیر را درون ان Paste کنید
#include "SDL/SDL.h"
int main( int argc, char* args[] )
{
//Start SDL
SDL_Init( SDL_INIT_EVERYTHING );
//Quit SDL
SDL_Quit();
return 0;
}
سپس به قسمت تنظیمات پروژه بروید

در پوشه C/C++در قسمت Code generation | Runtime Libraryرا به Multi-threaded DLL تغییر دهید

در پوشه Linker در قسمتInput>Additional Dependencies تایپ کنید
SDL.lib SDLmain.lib


حالا پروژه خود را کمپایل کنید

Visual C++ 6



اولین کاری که باید انجام بدین دانلود کردن فایل های اجرایی
و هدر SDL است.
میتوانید از این صفحه دانلود کنید تا پایین صفحه Scroll کنید
This




فایل ZIP را باز کنید سپس پوشه درون ان را باز کنید در این پوشه سه پوشه وجود دارد فایلهای SDL.libوSDLmain.libرا از پوشه
Libبه پوشه LibویژالC++خود کپی کنید مثلا در
C:Program FilesMicrosoft Visual StudioVC98Lib
سپس به پوشهInclude ویژالC++رفته و پوشه جدیدی به اسم SDL بسازید مثلا : C:Program FilesMicrosoft Visual StudioVC98Include
و فایلهای SDL,include را درون ان بریزیدسپس فایل SDL.dllاز پوشه
Lib به پوشه windows/system32 کپی کنید حالا یک روژه جدید تحت عنوان Win32 ApplicationیاWin32 Console Application بسازید


سپس گزینه An empty project را انتخاب کنید و Finish را بزنید
سپس به قسمت Project>Settings بروید ودر برگه C/C++ در قسمت Category گزینه Code Generation را انتخاب کنید و سپس Used RunTime Library را به Multithreaded DLL تغییر دهید سپس در برگه Link در جعبه Object/library Modules تایپ کنیدُِSDL.lib SDLmain.ib




سپس یک فایل به پروژه خود اضافه کنید و کد زیر را درون ان Paste کنید و برنامه را اجرا کنید


#include "SDL/SDL.h"
int main( int argc, char* args[] )
{
//Start SDL
SDL_Init( SDL_INIT_EVERYTHING );
//Quit SDL
SDL_Quit();
return 0;
}

Eclipse &G++ l


نصب SDLروی Eclipse :

اولین کاری که باید انجام بدین دانلود کردن فایل های اجرایی
و هدر SDL است.
میتوانید از این صفحه دانلود کنید تا پایین صفحه Scroll کنید


حالا RPM را اجرا کنید و بگزارید نصب شود
حالا یک Managed Project بسازید


سپس به Project>Properties بروید

سپس به قسمت C/C++ Build بروید و Libraries را انتخاب کنید
روی ADD کلیک کنید و SDL را تایپ کنید



و کد زیر را تایپ کنید
#include "SDL/SDL.h"
int main( int argc, char* args[] )
{
//Start SDL
SDL_Init( SDL_INIT_EVERYTHING );
//Quit SDL
SDL_Quit();
return 0;
}
برای G++ هم فقط کافیست RPM را نصب کنید و کد بالا را در مثلا Mysource.cpp ذخیره کنید و در Shell این را تایپ کنید
g++ -o myprogram mysource.cpp -lSDL
و با دستور ./myprogram برنامه را اجرا کنید