درس ۱۳ : قسمت سوم

Music :

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

و هیچکدام از توابع کار با صدا با ان کار نمی کند ووقتی بخواهیم با موزیک کار کنیم باید با ساختار Mix_Music کار کنیم وهمیشه هم بوسیله اشاره گراز ان استفاده می کنیم.

 

شبیه chunk ها برای استفاده از موزیک باید یک فایل را بارگزاری کنید و وقتی کارتان تمام شد حافظه را ازاد کنید.تنها فرق شان این است که برای کاربا موزیک لازم نیست کانالی را از قبل تخصیص داد.

 

برای بارگذاری یک موزیک می توانید از تابع :

Mix_Music *Mix_LoadMUS(const char *file);

این تابع یک رشته را به عنوان اسم فایل دریافت می کند و یک اشاره گر به شی Mix_Music برمی گرداند. در صورتی که مقدارNULL برگرداند یعنی اشتباهی رخ داده است.فعلا Mixer قادر به پخش فایل های Mp3,VOC,OGG,MOD,MIDI,Wave,IT,XM,S3M,669,AIFF هست.

 و وقتی که کارمان با موزیک تمام شد حافظه را به وسیله تابع Mix_FreeMusic ازاد میکنیم.

void Mix_FreeMusic(Mix_Music *music);

یک اشاره گر به Mix_Music می گیرد و حافظه را خالی می کند.  مثال :

// load the MP3 file "music.mp3" to play as music

Mix_Music *music;

music=Mix_LoadMUS("music.mp3");

if(!music) {

  printf("Mix_LoadMUS("music.mp3"): %s ", Mix_GetError());

  // this might be a critical error...

}

Mix_FreeMusic(music);

music=NULL;

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

int Mix_PlayMusic(Mix_Music *music, int loops);

که یک اشاره گر به شیMix_Music می گیرد و همچنین مقدار تکرار را در پارامتر دوم که در صورت وارد کردن 1- بی نهایت بار و 0 هیچ بار پخش می شود.

 

دو تابع هم برای Fade in کردن :  

int Mix_FadeInMusic(Mix_Music *music, int loops, int ms);

int Mix_FadeInMusicPos(Mix_Music *music, int loops, int ms, double position);

که ms مقدار زمان fade in هست و Position نقطه شروع Fade in است.

 

شبیه کانال ها شما می توانید عملیات pause,play,stopرا بر روی music انجام دهید هم چنین مکان پخش موزیک را تغییر دهید.همچنین می توانید از یک player خارجی برای پخش فایل های مختلف استفاده کنید.

 

ابتدا دو تابع Mix_PauseMusic و Mix_ResumeMusic را مورد بررسی قرار می دهیم.

void Mix_PauseMusic();

void Mix_ResumeMusic();

که کارشان بسیار واضح است.

اگر شما بخواهید یک موزیک را دوباره از ابتدا پخش کنید باید از تابع :

void Mix_RewindMusic();

استفاده کنید.

اگر شما بخواهید مکان فعلی موزیک را تغییر دهید باید از تابع :

int Mix_SetMusicPosition(double position);

استفاده کنید که برای فرمت های مختلف استفاده از ان فرق دارد.

مثلا برای Ogg ثانیه مورد نظر را پخش می کند برای Mp3 تعداد ثانیه های جلو تر از مکان فعلی را پخش میکند ( به عقب بر نمی گردد ) برای MOD شماره pattern مورد نظر را پخش می کند و...

مثال : یک دقیقه اول اهنگ Mp3 را پخش نمی کند.

Mix_RewindMusic();

if(Mix_SetMusicPosition(60.0)==-1) {

        printf("Mix_SetMusicPosition: %s ", Mix_GetError());

}

اگر می خواهید volume را کم زیاد کنید باید از تابع :

int Mix_VolumeMusic(int volume);

استفاده کنید. که در صورت وارد کردن MIX_MAX_VOLUME با بالاترین سطح صدا اهنگ را پخش میکند ودرصورت وارد کردن 1- بدون تغییر صدا مقدار فعلی را بر می گرداند.

 

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

int Mix_SetMusicCMD(const char *command)

برای مثال ما از mpg123 برای پخش استفاده می کنیم توجه داشته باشید Player حتما باید بتواند از خط فرمان پارامتر بگیرد.

Mix_Music *music=NULL;

if(Mix_SetMusicCMD("mpg123 -q")==-1) {

        perror("Mix_SetMusicCMD");

} else {

        // play some mp3 file

        music=Mix_LoadMUS("music.mp3");

        if(music) {

        Mix_PlayMusic(music,1);

        }

}

 

برای متوقف کردن اهنگ دو گزینه مقابل شماست یکی اینکه سریعا قطع شود دومی اینکه با fade out قطع شود.

از دو تابع زیر می توان استفاده کرد.

int Mix_HaltMusic();

int Mix_FadeOutMusic(int ms);

که ms در دومی مدت زمان fade out است.

 

همانند کانال ها در اینجا نیز توابعی برای بدست اوردن اطلاعات از وضع کنونی وجود دارد.

 

مثلا این که موزیک مورد نظر از چه نوع فرمتی است که برای تغییر مکان درست در موزیک مناسب است.

Mix_MusicType Mix_GetMusicType(const Mix_Music *music);

که مثال ان در زیر امده است

 

switch(Mix_GetMusicType(NULL))

{

        case MUS_NONE:

        MUS_CMD:

          printf("Command based music is playing. ");

          break;

        MUS_WAV:

          printf("WAVE/RIFF music is playing. ");

          break;

        MUS_MOD:

          printf("MOD music is playing. ");

          break;

        MUS_MID:

          printf("MIDI music is playing. ");

          break;

        MUS_OGG:

          printf("OGG music is playing. ");

          break;

        MUS_MP3:

          printf("MP3 music is playing. ");

          break;

        default:

          printf("Unknown music is playing. ");

          break;

}

3 تابع دیگر از این دست نیز وجود دارند.

int Mix_PlayingMusic();

int Mix_PausedMusic();

Mix_Fading Mix_FadingMusic();

که کارشان واضح است و مشخص می کنند که یک موزیک در حال pause است یا play و fade شده است یا نشده است.

 

 

نظرات 1 + ارسال نظر
محمد شنبه 28 مرداد‌ماه سال 1385 ساعت 06:43 ق.ظ http://afsr.blogfa.com

سلام.
مطالب وبلاگ شما مفید هستند اما بهتر است اندکی هم به ظاهر وبلاگ برسید چون فونت های آن بسیار ناشایست هستند.
ضمنا من دوست دارم که با هم در ارتباط باشیم تا هم من از شما استفاده کنم و هم شما از من. البته اگه از من بر بیاد.
به هر حال برایتان آرزوی موفقیت می کنم.
خدا حافظت.

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