درس 13 : قسمت دوم

Channels :

قبل از اینکه بتوانید صدایی را میکس کنید باید با توابع کانال ها اشنا شوید کانال ها فقط برای میکس و صداهای پس زمینه استفاده می شوند وبر روی موزیک اصلی برنامه تاثیری ندارند.

 

تخصیص کانال ها :

اولین و مهمترین کاری که شما باید بکنید این است که بدانید در برنامه اتان از چند کانال استفاده کنید اگر بخواهید صداهای پس زمینه زیادی را پخش کنید مطمئنن باید کانال های زیادی هم ایجاد کنید.شما می توانید با استفاده از تابع Mix_AllocateChannels تعداد کانال های موجود را بدست بیاورید ویا تنظیم کنید.

int Mix_AllocateChannels(int numchans);

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

 

پخش کانال ها :

تمام کار SDL_Mixer پخش صدا و میکس کردن درست ان است. Mixer 4 تابع برای پخش صداها دارد که اولین ان ها تابع Mix_PlayChannel است.

int Mix_PlayChannel(int channel, Mix_Chunk *chunk, int loops);

این تابع 3 پارامتر می گیرد پارامتر اول شماره کانال است که اگر 1- وارد کنید Mixer می گردد و یک کانال خالی برای شما پیدا می کند پارامتر دوم یک اشاره گر به Mix_Chunk می گیرد که صدای مورد نظر ما است و پارامتر سوم تعداد تکرار را مشخص می کند که در صورت وارد کردن 0 یک بار و 1- بی نهایت بار اجرا می شود.

شما می توانید بوسیله تابع Mix_PlayChannelTimed مقدار خاصی از یک اهنگ را به میلی ثانیه پخش کنید.

int Mix_PlayChannelTimed(int channel, Mix_Chunk *chunk, int loops, int ticks);

پارامترچهارم ticks مقدار زمان به میلی ثانیه است که اگر 1- وارد شود تا اخر اهنگ پخش می شود یک راه دیگر برای پخش کردن صدا استفاده از effect fade in است که به وسیله تابع Mix_FadeInChannel می توان اینکار را انجام داد.

int Mix_FadeInChannel(int channel, Mix_Chunk *chunk, int loops, int ms);

این تابع 4 پارامتر می گیرد که سه تای اولی مثل قبل است و پارامتر اخری هم مقدار زمان به میلی ثانیه است است که چه قدر طول بدهد که از Volume 0 به حداکثر Volume برسد.

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

int Mix_FadeInChannelTimed(int channel, Mix_Chunk *chunk, int loops,

int ms, int ticks);

فقط پارامتر پنجم  اضافه شده است که ان هم تایین کننده مقدار زمان پخش است.

 

Pause و Resume

هر API خوبی که برای پخش صدا وجود دارد باید 2 تابع Pause و Resume داشته باشد

void Mix_Pause(int channel);

void Mix_Resume(int channel);

یک کانال را به عنوان پارامتر می گیرد و Pause  یا Resume میکند در صورت وارد کردن 1- روی تمام کانال ها اثر می گذارد.

 

Stop

Mixer 4 تابع برای stop دارد که اولیش تابع Mix_HaltChannel است

int Mix_HaltChannel(int channel);

این تابع هم شماره کانال را می گیرد و در صورت وارد کردن 1- همه کانال ها را متوقف می کند.

تابع بعدی هم با تاخیر کانال را متوقف میکند

int Mix_ExpireChannel(int channel, int ticks);

که ticks مقدار تاخیر به میلی ثانیه است.

همچنین شما می توانید یک صدا را در کانال Fade out  کنید به وسیله :

int Mix_FadeOutChannel(int which, int ms);

که ms مقدار زمان تاخیر است.

و تابع اخر

void Mix_ChannelFinished(void (*channel_finished)(int channel));

که یک اشاره گر به تابع می گیرد به منظور این که بداند وقتی یک کانال متوقف شد چه تابعی را اجرا کند در مستندات mixer ذکر شده که هیچوقت از تابع های خود mixer و همچنین تابع SDL_LockAudio در این تابع استفاده نکنید.

 

توابعی در Mixer وجود دارد برای یافتن اطلاعاتی در مورد کانال ها وجود دارد.

مثل :

int Mix_Playing(int channel);

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

int Mix_Paused(int channel);

این تابع هم می گوید ایا کانال pause شده است یا نشده است در صورت وارد کردن 1- تعداد کانال های pause شده را بر می گرداند.

 

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

Mix_Fading Mix_FadingChannel(int which);

این تابع شماره کانال را می گیرد و3 مقدار ثابت بر می گرداند MIX_NO_FADING به معنی اینکه کانال fade نشده است 

MIX_FADING_OUT به معنی اینکه کانال fade out شده است

MIX_FADING_IN به معنی اینکه کانال fade in شده است

 

و تابعی دیگری هم برای اینکه بفهمیم چه chunk در حال اجرا است موجود است.

Mix_Chunk* Mix_GetChunk(int channel);

باید کانال مورد نظر در حالت play باشد.

 

Groups :

به نظر هوشمندانه می اید که کانال های صدا را گروه بندی کنید مثلا یک گروه برای effect های انفجار یک گروه برای صداهای بازیکنان و ...

 

برای اینکار اول باید به وسیله تابع

int Mix_ReserveChannels(int num);

به تعداد کل صداهایی را که می خواهیم استفاده کنیم جا رزرو کنیم

سپس با تابع

int Mix_GroupChannel(int which, int tag);

به صورت دستی صدا ها را گروه بندی کنیم which مشخص کننده کانال مورد نظر و tag مشخص کننده گروه مورد نظر است مثل مثال زیر :

Mix_ReserveChannels(8);//reserve eight channels

Mix_GroupChannel(0,1);//group 1 is explosion sounds

Mix_GroupChannel(1,1);

Mix_GroupChannel(2,1);

Mix_GroupChannel(3,1);

Mix_GroupChannel(4,2);//group 2 is players sounds

Mix_GroupChannel(5,2);

Mix_GroupChannel(6,2);

Mix_GroupChannel(7,2);

یا از تابع زیر استفاده کنید :

int Mix_GroupChannels(int from, int to, int tag);

که from مشخص کننده کانال شروع است و to کانال پایانی است و tag هم شماره گروه معادل دستور بالا دستور زیراست.

Mix_ReserveChannels(8);//reserve eight channels

Mix_GroupChannels(0,3,1);// group 1 is explosion sounds Mix_GroupChannels(4,7,2);// group 2 is players sounds

به وسیله تابعMix_GroupCount می توانید تعداد کانال های موجود در یک گروه را بیابید

int Mix_GroupCount(int tag);

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

اگر 1- وارد کنیم تعداد کل کانال ها را بر می گرداند.

تابع :

int Mix_GroupAvailable(int tag);

این تابع تعداد کانال های قابل استفاده در گروه را بر میگرداند.اگر هیچ کدام قابل پخش نبودند مقدار 1- را برمیگرداند.

بالاخره دو تابع بدرد بخور که مسئولیت توقف همه اعضا موجود در گرئه را دارند.

int Mix_FadeOutGroup(int tag, int ms);

شماره گروه را میگیرد و ms هم زمان fade out به میلی ثانیه است

و تابع:

int Mix_HaltGroup(int tag);

که همیشه مقدار صفر را برمی گرداند و کارش متوقف کردن کل کانال های گروه است.

 

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