Професионална програма
Loading...
Smeshan avatar Smeshan 89 Точки

SDL_Mixer

Здравейте,

какво е игра без звуци? :)
Та мисля успях да повторя пътя на Image и Text и да направя обект Sound. (положил съм основи и за обект Music)

Ето ми проекта:
https://github.com/Smeshan/SFX

И сега въпросите:
1. Аудио ресурсите имат ли нужда от Flyweight design pattern? Защото доколкото разбрах, ако в същия момент се пусне друг звук, той просто се пуска по-друг канал и толкова? Или?
2. Това ли е начина по-който съм го направил (подобен на Image и Text)?
3. За звуци има ли някакъв друг дизайн или методика? 
4. Дебъгвах около 1-2 часа един проблем и накрая хванах грешката тук в MediaMgr.cpp:

void MediaMgr::addPlaySoundCmd(const int32_t sndId) {
    SoundContainer::playSoundCmd(sndId);   
    //QUESTION
    // why is not working with _soundContainer.playSoundCmd(sndId):
}

Нали мениджъра всъщност притежава контейнера и той го инициализира и т.н.? И ако го достъпя директно след playSoundCmd() фунцкията идва празен контейнер и гърми. :? Нещо не мога да си визуализирам последователността и това малко ме обърква.
5. Правилно ли разсъждавам: Ако имам обект бутон и в него си вкарвам хедъра Sound.h и при инициализацията на този обект, създавам и неговия прилежащ звук. И вече при InputHandle-a на бутона го плейвам, когато си искам? Това ли е идеята?

Толкова от мен. Бих видял и на някой друг кода, ако е писал за звук (или ще пише) :)

Поздрави,
Илиян

 

Тагове:
3
C++ Applications Development 28/10/2021 22:47:47
j.petrov_90 avatar j.petrov_90 372 Точки

Привет, Илиян,

Браво за труда в посока звуци! Железен си!
Точно това е нещото, което трябваше да направиш.
Бих тръгнал в почти същата посока, ако го преподавах. Реших, обаче да го премахна от курса, защото ставаше много като материал.

Отговарям на въпросите:
4) MartinBG ти е отговорил доста ясно. Просто имаш контейнера 2 пъти. Веднъж от наследяването и веднъж като private member.
Изтриий едното от двете.

1) Аудио ресурсите имат ли нужда от Flyweight design pattern?
Не, нямат нужда. Но е добре да го направиш.
Вече имаш целият backbone на твоето приложение, което е имплементирало flyweigh обекти за картинки, анимации и текстове.
Звуците и музиката не са нещо по-различно. "Backend" информация, към която имаш handle (в случая един прост int32_t).


1.1) доколкото разбрах, ако в същия момент се пусне друг звук, той просто се пуска по-друг канал и толкова? Или?
Тук е малко tricky. Правилно си разбрал - да. Можеш да ползваш целият sound backend като просто извикаш playSound и това би се play-нало на друг канал.
Лошото е че не можеш да спираш звуците.
Ако искаш да имаш възможност да ги спираш (прекъсваш) преди да са приключили - имаш не-малко работа.
Вече сам трябва да управляваш каналите, на които се пускат. Да знаеш кой канал е сводбоден и кой не.
От там пък трябва да разбереш кога даден звук е приключил.
Това става като регистрираш свой callback, който SDL_Mixer-а да ти извика.
За жалост на младшия разработчик - SDL_Mixer-а работи в друг thread различен от основния.
Т.е. callback-а, който си подал ще ти се викне от друг thread.
Трябва да си подсигуриш, че ще защитиш своите данни и няма да имаш data race.
Това са multithreading знания, които идват в повече за някой тепърва учещ се човек.
Не, че е rocket-science де...но и то си има своите специфики.


2. Това ли е начина по-който съм го направил (подобен на Image и Text)?
Абсолютно правилно - поздравления. Единствено бих направил малка модификация в хедъра ти Media.h.
Говорихме, че sdl_utils библиотеката ще бъде wrapper на SDL.
По начина по който си include-нал хедъра <SDL_Mixer.h> в Media.h този файл не може да бъде използван извън библиотеката, защото SDL_INCLUDE_DIR са маркирани като PRIVATE include path.
Просто направи forward declaration на Mix_Chunk и Mix_Music и включи хедъра в cpp файла.


3. За звуци има ли някакъв друг дизайн или методика?
Когато говорим за базови функционалности - не.
Звуците си имат свои специфики, в които за жалост нямам много опит.
Например можеш да създадеш  ефекта за 3D аудио като модифицираш panning на някой канал.
Все едно звука да е по-силен на левия speaker спрямо десния, ако обекта ти идва "от ляво".
SDL_Mixer-а обаче е доста отраничен, ако искаш истински 3D sound. Там вече трябва да ползваш някаква по-специализирана библиотека за аудио.


5) Правилно ли разсъждавам: Ако имам обект бутон и в него си вкарвам хедъра Sound.h и при инициализацията на този обект, създавам и неговия прилежащ звук. И вече при InputHandle-a на бутона го плейвам, когато си искам? Това ли е идеята?
Кратко, точно и ясно - да. Браво :)

Поздрави и все така смело напред,
Живко

2