nglauber / dominando_android2

Repositório com os exemplos da 2ª edição do livro "Dominando o Android"
http://www.novatec.com.br/livros/dominando-android-2ed/
48 stars 56 forks source link

Gerenciador de Som #1

Open luizfp opened 7 years ago

luizfp commented 7 years ago

@nglauber, antes de mais nada, muito obrigado pelo incrível livro e por compartilhar todos os capítulos aqui nesse repositório.

Já faz um tempo que li o seu livro e desde então venho utilizando a classe GerenciadorDeSom em um projeto pessoal, com umas pequenas modificações.

Eu uso ela para tocar apenas um som, um número indeterminado de vezes, dependendo da interação do usuário com certa funcionalidade. A classe sempre funcionou perfeitamente.

Porém, hoje, ao testar em um dispositivo com Android 7 percebi que o som só é tocado uma vez, a primeira. Digamos que depois o usuário clique em um botão e o som que deveria tocar não toca mais. Testei ainda hoje em um dispositivo com Android 5 e funciona normalmente. Não sei dizer se o comportamente se repete no Android 6 também.

Mesmo debuggando não consegui identificar o problema, tudo parece estar acontecendo na ordem correta, o status retornado no método play não é de erro. Também botei sua classe original em meu projeto para ver se alguma modificação que eu havia feito não tinha originado o problema. Mas o erro persistiu.

Pesquisei um pouco e a única coisa mais ou menos relacionado que eu achei foi essa questão no SO: http://stackoverflow.com/questions/41893173/android-soundpool-doesnt-play-same-sound-for-second-time-until-playing-another

Enfim, caso você saiba de algum comportamento que tenha mudado no Android 7 e como podemos resolver esse problema, ficaria grato se compartilhasse. o/

Obg.

nglauber commented 7 years ago

Oi @luizfp, primeiramente obrigado por ter reportado esse problema. Realmente não tinha testado esse exemplo no Android 7. Testei rapidamente aqui no meu Nexus 9 e o exemplo funciona, mais só toca o som algumas vezes, normalmente umas quatro. Infelizmente agora não estou com tempo de fazer mais testes, mas assim que puder dou uma olhada. Se você conseguir achar a solução, por gentileza posta aqui. 4br4ç05, nglauber

luizfp commented 7 years ago

@nglauber Vlw pelo feedback.

Sem problemas, teste quando conseguir. Nesse meio tempo se eu encontrar a solução vou postar aqui sim.

Abç.

luizfp commented 7 years ago

@nglauber Esse bug ainda continua sendo um mistério pra mim. Já desisti de tentar encontrar workarounds pra isso funcionar.

O que eu tentei:

1) Lembro de ter lido em algum lugar (não lembro onde para linkar aqui) que uma possível solução seria após a reprodução de cada áudio reproduzir um arquivo sem som, pra garantir que a reprodução seguinte funcione. Tentei, sem sucesso.

2) Resolvi reproduzir um outro áudio qualquer, porém sem volume, para tentar garantir a reprodução do seguinte, também sem sucesso.

3) O que resolve (porém não é factível ao meu projeto) é após a reprodução de um áudio, reproduzir um outro arquivo (que também tenha áudio) e com som. Isso garante que a reprodução seguinte aconteça.

Consegui observar uns outros pontos interessantes relacionados ao problema:

Isso continua sendo verdade, porém, descobri que se clicarmos rapidamente no botão, a reprodução acontece normalmente. Agora, se os cliques forem espaçados, a cada 1 ou 2 segundos, por exemplo, só a primeira reprodução acontece.

Tentei olhar o código fonte da classe SoundPool, mas logo após a chamada do método play() o fluxo é redirecionado para a chamada de um método nativo aí tudo fica mais complicado de acompanhar.

O SoundPool é perfeito para a demanda do meu projeto, que precisa reproduzir áudios curtos, de até 1 segundo. Porém, devido a esses problemas, eu acabei optando por trocar para a classe MediaPlayer. Com ela, tudo funciona normalmente, em todas as versões que eu testei.