درس 13 : آموزش پخش و effect گذاری بر روی فایل های Ogg,MIDI,Mp3

درس 13 : آموزش پخش و effect گذاری بر روی فایل های  Ogg,MIDI,Mp3 و ... (قسمت اول)

 

شاید 10-15 سال پیش کار بر روی صدا در بازی ها به اندازه ای که امروز اهمیت دارند اهمیت نداشت. ولی امروزه بیشتر تیم های بزرگ بازی ساز برای صدا گذاری مناسب اهمیت خاصی  قائل هستند تا انجا که مثلا در بازی های First Shooter می گویند: "بازیکن فقط میتواند 30 درصد صحنه را با چشمهای خود چک کند و بقیه صحنه را باید با گوش های خود چک کند ".

SDL هم برای خود زیر سیستمی بزای پخش صدا دارد ولی متاسفانه خیلی ضعیف هست.خوشبختانه یک برنامه نویس خوب به اسم Jonathan Atkins پیدا شد و بعد از اینکه متوجه این ضعف شد شروع به ساخت SDL_Mixer کرد واین ضعف SDL را کاملا بر طرف کرد.

 

قبل از ادامه کار شما باید فایل های SDL_Mixer را از سایت libsdl.org/projects دانلود کرده و طبق درس 3 نصب کنید.

 

SDL_Mixer در یک نگاه :

کار با  SDL_Mixer به 6  قسمت تقسیم می شود.

 

 O shit!!

Initialization :

دو تابع در این قسمت وجود دارد یکی برای باز کردن SDL_Mixer و دیگری یستن ان مطمئنا کار با این توابع سخت نیست !

Chunk :

همه effect های پس زمینه به عنوان chunk شناخته می شوند یک نکته دیگر هم این که ما هیچوقت با اشاره گر به chunk کاری نداریم بر خلاف SDL_Surface و ... .  همچنین chunk ها را می توانیم یا از فایل های روی دیسک یا از روی RAM بار گذاری کنیم و پسوندشان هم می تواند wav یا VOC باشد.

 

channels:

کانال ها به ما کمک می کنند بیشتر از یک chunk دریک زمان در پس زمینه پخش شود چند گزینه برای پخش chunk ها موجود است مثلا چند بار تکرار شود چه مدت وایا fade شود یا نشود.

 

Group:

شما میتوانید کانال ها را دسته بندی کنید مثلا شاید بخواهید effect های انفجار از effect های بازی جدا باشند. Group روشی برای مدیریت کانال های صدا است.

 

Music :

در یک زمان فقط یک music میتواند پخش شود که همان موزیک اصلی برنامه است که می توان از چندین فرمت استفاده کرد مثل Mp3,Ogg,Midi استفاده کرد.

شما می توانید یک اهنگ را پخش کنید یا pause یا stop یا fade in یا fade out کنید و همچنین مکان چخش را در اهنگ تغییر دهید.

 

Effect:

کسانی که می خواهند به طرز حرفه ای از mixer استفاده کنند این قسمت مخصوص انها است که علاوه بر داشتن توایع توکار خود نیز می توانید توابع خود را بسازید که در اخر ان درس توضیحاتی در این مورد خواهم داد.

 

همه توایع mixer با mix_ شروع می شوند و قبل از کار با انها باید زیر سیستم audio در sdl اماده شده باشد که همانطور که گفتم با فرستادن پارمتر SDL_INIT_EVERYTHING به تابع SDL_Init همه زیر سیستم ها نصب می شوند.

 

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

 

Initialization :

مانند همه کتابخانه های الحاقی دیگر برای استفاده از توابع mixer باید SDL_Mixer را اماده کرد ولی بر خلاف بقیه دیگر تابعی به نام Mix_Init وجود ندارد که به راحتی کار ما را اسان کند اولین کاری که باید بکنید فراخوانی تابع Mix_OpenAudio است :

int Mix_OpenAudio(int frequency, Uint16 format, int channels, int

chunksize);

4 پارامتری که می گیرد اولی frequency به عنوان فرکانس با مقیاس HZ است ودومی فرمت است که یکی از مقادیر زیر می تواند باشد

Constant Meaning

AUDIO_U8       Each channel consists of a stream of Uint8s.

AUDIO_S8       Each channel consists of a stream of Sint8s.

AUDIO_U16LSB      Each channel consists of a stream of little endian Uint16s.

AUDIO_U16MSB      Each channel consists of a stream of big endian Uint16s.

AUDIO_U16     This is the same as AUDIO_U16LSB.

AUDIO_U16SYS      Depending on the system, this might be either

AUDIO_U16LSB      or AUDIO_U16MSB.

AUDIO_S16LSB      Each channel consists of a stream of little endian Sint16s.

AUDIO_S16MSB      Each channel consists of a stream of big endian Sint16s.

AUDIO_S16     This is the same as AUDIO_S16LSB.

AUDIO_S16SYS      Depending on the system

پارامتر سوم تعداد کانال هاست 1 برای mono و2 برای صدای stereo است.

و پارامتر اخر هم اندازه chunk هست مستندات SDL_Mixer به ما پیشنهاد می کند که از مقدار 4096 استفاده کنیم. در صورت اینکه درست اجرا شود مقدار 1- وگرنه 0 را بر می گرداند.

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

 

Chunks :

Chunk ها effect های پس زمینه هستند با ساختاری به شرح زیر :

typedef struct {

int allocated;

Uint8 *abuf;

Uint32 alen;

Uint8 volume;

} Mix_Chunk;

که ساختار ساده ایست شامل یک flag به نام allocated که مشخص می کند chunk تخصیص یافته یا نه, یک بافر از نوع Uint8 که نگه دارنده اطلاعات صوتی است.یک متغییر از نوع Uint32 که مشخص کننده اندازه بافر است و یک متغییر از نوع Uint8 که اندازه Volume صدا را تعیین می کند.

شما معمولا به صورت مستقیم از Chunk استفاده نمی کنید بلکه بیشتر با اشاره گر ها با chunk ها سر و کار دارید البته اگر شما بخواهید می توانید به صورت مستقیم با انها کار کنید بیشتر وقتها شما بوسیله تابع Mix_LoadWav یک فایل wav را به عنوان chunk بار گذاری میکنیم .

Mix_Chunk *Mix_LoadWAV(char *file);

این تابع یک رشته به عنوان مسیر می گیرد و یک اشاره گر به Mix_Chunk بر می گرداند.اگر مشکلی پیش اید NULLبر می گرداند.

همچنین می توانید یک فایل Wav که قبلا در حافظه ذخیره شده است را بارگزاری کنید

Mix_Chunk *Mix_QuickLoad_WAV(Uint8 *mem);

Mem یک اشاره گر از نوع Uint8 می باشد که به محلی در حافظه که فایل wav در ان است اشاره می کند تا وقتی که خیلی به خودتان مطمئن نیستید از این تابع استفاده نکنید.

یک تابع حرفه ای دیگر:

Mix_Chunk *Mix_QuickLoad_RAW(Uint8 *mem, Uint32 len);

که mem اشاره گر به داده های Raw در حافظه است و len اندازه ان است ( فقط در صورت این که می دانید دارید چه کار می کنید از اینها استفاده کنید )

 

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

void Mix_FreeChunk(Mix_Chunk *chunk);

برای تنظیم volume یک chunk هم می توانید از تابع

int Mix_VolumeChunk(Mix_Chunk *chunk, int volume);

استفاده کنید که یک اشاره گر به Chunk میگیرد و volume که از 0  است تا

MIX_MAX_VOLUME که برابر 128 است.

 

 

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