Olá!
Levando em consideração os moldes criados para paSDLMusicPlayer, criei paSDLChannelPlayer para gerenciar os sfx.
Apesar da maior complexidade, foi muito mais fácil criar essa classe, já que a maioria da programação de dependência com um gerenciador já estava feita entre paSDLSoundEffect e paSDLAudio, bastando apenas colocar as coisas no lugar certo.
Diferente das músicas como todo mundo sabe, sfx podem tocar ao mesmo tempo. Então não foi necessário remover do escopo da paSDLSoundEffect métodos de reprodução da música. Em geral deu tudo rapidamente certo.
As maiores dificuldades foram a alocação de canais, uma vez que tive que fazer uns testes para estabelecer o melhor padrão para o usuário inserir o número de canais desejados para a aplicação; e um método que pausasse todas as músicas e voltasse a reproduzir apenas as que estavam tocando no momento do pause. Além da própria implementação, ainda tive que considerar problemas com relação ao estado do pauseAll. Por exemplo, se todos os sfx estiverem parado, nao faz sentido aplicar pauseAll. E se todas as músicas estiverem reproduzindo novamente, não faz sentido aplicar o resumo para cada uma delas, sendo necessario novamente pausar as musicas ao inves de voltar a reproduzí-las.
Outra grande dificuldade foi estabelecer um padrão entre pauseAll e pauses de escopo. Testando as melhores maneiras, cheguei ao seguinte algoritmo:
1- Musicas pausadas com pauseAll e reiniciadas ou despausadas com os métodos de escopo para tais funcionalidades não são mais gerenciadas pelo pauseAll
2- Se o usuário chamar o método pauseAll e depois mandar tocar mais sfx sem reaplicar o pauseAll para retomar os sfx com pauseAll, somente os sfx pausados com esse metodo voltarão a tocar, sendo os demais sons não atingidos por ele.
É aquela velha história. Uma engine deve ser flexível, mas cobrir todas as burradas do usuário é impossível. Se eu fosse levar em conta novas músicas reproduzidas ou músicas despausadas independente do pauseAll, acabaria desvirtuando o motivo real da criação desse método.
Juro que o próximo post será o último sobre audio! Ainda preciso verificar algumas coisas nas classes antes de fechar uma nova versão.
Até la!
Nenhum comentário:
Postar um comentário