درس 14 : آموزش برنامه نویسی Multi-threading در C++ به وسیله SDL

درس 14 : آموزش برنامه نویسی Multi-threading در C++ به وسیله SDL

 (قسمت اول)

احتمالا چیزهایی در مورد برنامه ها Multi-threaded شنیده اید یا اسم فن اوری جدید Intel به اسم Hyper-Threading را شنیده اید که اگر این فناوری بر روی CPU فعال باشد CPU جوری رفتار می کند که سیستم عامل فرض کند به جای یک CPU 4 عدد CPU در سیستم موجود است که در ان موقع اگر سیستم عامل روی این قسمت کار کرده باشد می تواند به خوبی از این خاصیت استفاده کند و مثلا اجرا برنامه ها را بین 4 CPU تقسیم کند که سرعت به طرز قابل توجهی بالا می رود فعلا که دارم این مقاله را می نویسم بین سیستم عامل هایی که برای PC موجود است Linux Fedora Core بین سیستم عامل های دیگر می تواند به بهترین نحو از چند CPU در ان واحد استفاده کند که می تواند تا حدود 60-70 % از این قابلیت استفاده کند.و البته ویندوز هم به مقدار قابل توجهی از این خاصیت پشتیبانی می کند

و در حال حاضر این خاصیت SDL در سیستم عامل MacOS X کار گذاشته نشده است به خاطر این که اساسا PCهای Macintosh تک CPU هستند و نیازی به همچین کاری احساس نمی شد.

 

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

 

Thread در برنامه نویسی به پروسه ای می گویند که بخشی از یک پروسه بزرگتر یا یک برنامه باشد.

 

همانطور که گفتم برنامه نویسی Multi-threading به شما قدرت فوق العاده ای برای اجرای چند کار در یک زمان را می دهد(البته بر روی سیستم های تک CPU این یک بحث تئوری است ولی فوق العاده به درد به خور حتی در ساخت بازی) در استفاده از thread ها باید نهایت دقت را بخرج دهید.

 

یک thread هم زمان با Main برنامه شما اجرا می شود و ازدر تمام منابع  برنامه مثل فایل ها حافظه و... باmain شریک می شود و مشکل وقتی پیش می اید که یک thread در چیزی با main شریک شود که نباید با ان در Main شریک شود مثل حافظه گرافیکی یا استفاده از صدا. و چیزی که باید یادتون باشد این است که یک thread هیچ وقت از حافظه گرافیکی به طور مستقیم استفاده نکند.

 

خوب اول ببینیم چه گونه می توانیم یک thread ایجاد کنیم.

SDL_Thread *SDL_CreateThread(int (*fn)(void *), void *data);

این تابع دو پادامتر دریافت می کند یک اشاره گر به تابع و داده ای که باید تابع بپذیرد و نوع برگشتی ان هم از نوع اشاره گر به SDL_Thread است.

تابع شما شکلی مانند شکل زیر دارد

int ThreadFunction(void* data);

که این تابع یک پارامتر برای پردازش دریافت می کند و یک مقدار int برمیگرداند وقتی thread مرد این مقدار بر گشت داده می شود.

اگر به هر طریقی بخواهید یک Thread را متوقف کنید می توانید از تابع SDL_KillThread استفاده کنید یک مقدار خشن به نظر می رسد ولی تا حالا کسی پیدا نشده که از حقوق thread ها دفاع کند!!!

void SDL_KillThread(SDL_Thread *thread);

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

void SDL_WaitThread(SDL_Thread *thread, int *status);

این تابع یک thread را دریافت کرده و سپس یک اشاره گربه یک عدد صحیح می گیرد و منتظر اتمام کار thread می شود و مقدار برگشتی را در status قرار می دهد اگر به مقدار برگشتی اهمیتی نمی دهید می توانید مقدار NULL را به عنوان پارامتر دوم بفرستید.

 

هر thread یک ID 32 بیتی مخصوص خود است که برای مدیریت thread ها می تونید ازش استفاده کنید و به وسیله فراخوانی تابع SDL_ThreadID درون thread می توانید مقدار ان را بیابید.

Uint32 SDL_ThreadID(void);

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

Uint32 SDL_GetThreadID(SDL_Thread *thread);

 

نکته : برای استفاده از thread ها حتما باید فایل SDL_Thread.h را بارگزاری نمایید و در thread ها نیازی به استفاده از SDL_Init نیز وجود ندارد.

 

MUTEX:

موتکس راه ساده ای برای بر قرار کردن ارتباط بین Thread ها است و یکی از این دو حالت رو به خودش می گیرد Locked و Unlocked . وقتی یک موتکس به وسیله یک thread قفل می شود و thread دیگری خواهان قفل کردن Mutex می شود باید منتظر بماند تا thread قبلی ان را از حالت قفل بیرون بیاورد.

شما به راحتی می توانید بوسیله تابعSDL_CreateMutex  یک Mutex بسازید.

SDL_mutex *SDL_CreateMutex(void);

این تابع هیچ پارامتری نمی گیرد و یک اشاره گر به SDL_mutex بر می گرداند.

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

void SDL_DestroyMutex(SDL_mutex *mutex);

 

شما همچنین می توانید به وسیله تابع SDL_MutexP یا ماکرو SDL_LockMutex یک موتکس را قفل کنید.

int SDL_mutexP(SDL_mutex *mutex);

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

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

int SDL_mutexV(SDL_mutex *mutex);

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

یک نمونه ساده ولی جالب از استفاده از Mutex :

 

g_pMutex=SDL_CreateMutex();

SDL_LockMutex(g_pMutex);

g_pThread=SDL_CreateThread(ThreadFunction,NULL);

SDL_UnlockMutex(g_pMutex);

SDL_WaitThread(g_pThread,NULL);

در اینجا ما در ابتدا یک موتکس می سازیم سپس  ان را قفل می کنیم سپس یک thread می سازیم و بعد از ان mutex را از حالت قفل بیرون می اوریم و منتظر توقف thread می شویم.

تابع thread مان هم به شرح زیر است.

int ThreadFunction(void* data)

{

    fprintf(stdout,”Thread %d: Initialized! ”,SDL_ThreadID());

    fprintf(stdout,”Thread %d: Attempting to lock mutex. ”,SDL_ThreadID());

    SDL_LockMutex(g_pMutex);

    fprintf(stdout,”Thread %d: Mutex is locked. ”,SDL_ThreadID());

    fprintf(stdout,”Thread %d: Unlocking mutex. ”,SDL_ThreadID());

    SDL_UnlockMutex(g_pMutex);

    fprintf(stdout,”Thread %d: Terminating. ”,SDL_ThreadID());

    return(0);

}

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

خسته از زندگی

درس ۱۳ : قسمت چهارم

Effect :

اخرین قسمت این بحث در مورد effect ها است.effect ها در SDL_Mixer به دو قسمت تقسیم می شوند یک قسمت effect های ایست که از قبل موجود است مثل paning(تنظیم صوت بین دو کانال استریو) و دیگر effect های 3 بعدی و قسمت دوم effect هایی هستند که به وسیله خود شما درست می شوند.

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

 

Effect های موجود :

Effect های موجود شامل Panning (تنظیم صوت بین دو کانال استریو)distance یا همان فاصله صدایی است که در حال پخش است.

و تعیین مکانی که صدا از انجا می اید.

و عوض کردن کانال های صدا در حالت stereo است.

 

برای استفاده از panning شما باید از تابع Mix_SetPanning استفاده کنید.

int Mix_SetPanning(int channel, Uint8 left, Uint8 right);

این تابع شماره کانال مورد نظر را می گیرد و همچنین مقدار volume باند های چپ و راست را می توان با left و right تعیین کرد که volume می تواند عددی از بین 0 تا 255 باشد در صورت موفقیت مقدار غیر 0 بر میگرداند.برای Unregister کردن این effect باید هم left و هم right را به 255 تنظیم کرد.

 

برای تنظیم فاصله هم باید از تابع Mix_SetDistance استفاده کرد.

int Mix_SetDistance(int channel, Uint8 distance);

اول شماره کانال را می گیرد و سپس یک عدد بین 0 تا 255 به عنوان فاصله دریافت می کند در صورت وارد کردن 0 effect فاصله Unregister می شود.

در صورت درست اجرا شدن مقدار غیر صفز بر می گرداند.

 

همچنین می توانید به وسیله تابع Mix_SetPosition می توانید یک شبیه سازی سه بعدی انجام دهید.

int Mix_SetPosition(int channel, Sint16 angle, Uint8 distance);

این تابع اول شماره کانال را می گیرد سپس زاویه مورد نظر وسپس فاصله را به عنوان پارامتر سوم می گیرد.angle یک عدد از صفر تا 360 می باشد.

شکل زیر توضیح کاملی بر این تابع می باشد.

 

 aloo

وسر اخر نوبت تابع Mix_SetReverseStereo می شود که کارش معکوس کردن جای باند ها است.

int Mix_SetReverseStereo(int channel, int flip);

در صورت اینکه flip غیر صفر باشد effect فعال می شود.

همچنین شما می توانید با توابعی مثل :

int Mix RegisterEffect(int chan, Mix_EffectFunc_t f, Mix_EffectDone_t d,

void *arg)

خود برای خود effect بسازید چون همین مقدار توضیح برای ساخت بازی کافی است من روی این توابع توضیح خاصی نمی دهم.می توانید به مستندات SDL_Mixer رجوع کنید.

 

پایان درس 13

 

منابع :

SDL_Mixer Documents.1

Focus on SDL.2

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

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 شده است یا نشده است.

 

 

درس 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);

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