Как остановить все звуки в SoundPool?

Я использую SoundPool для воспроизведения звуков sfx в игре на Android. В большинстве случаев это работает отлично, за исключением случаев, когда мне нужно остановить все звуки сразу не ставить на паузу (не имеет значения, установлен ли для них цикл или нет). Я не могу понять, как остановить воспроизведение звука, не зная StreamID этого звука. Что я знаю:

  • _3 _... какой-то звук ..._ 4_ возвращает идентификатор звука
  • soundpool.play( soundID ) воспроизводит звук и возвращает streamID
  • soundpool.stop( streamID ) останавливает звук

У меня вопрос: как остановить звук, не зная streamID? Я пробовал отслеживать все идентификаторы streamID в списке, но иногда одновременно воспроизводится так много коротких потоков, что это не сработает. И я не могу найти в SoundPool никакого метода для получения активных идентификаторов потока. Кто-нибудь знает как заглушить все звуки? Любая подсказка приветствуется! Благодарность


person GameDroids    schedule 13.09.2013    source источник
comment
Разве не прекращаются все виды звонков?   -  person Howard Pautz    schedule 13.09.2013
comment
SoundPool.autoPause () - единственный метод в классе, предназначенный для одновременной остановки всех потоков. Вы говорите, что это не соответствует вашим потребностям?   -  person Prmths    schedule 13.09.2013
comment
Когда я приостанавливаю звуки, они все равно помечаются как приостановленные и, таким образом, возобновляются в autoResume (). Но я не могу возобновить остановленные звуки (я использую метод autoResume () в другом случае) @HowardPautz, к сожалению, нет. autoPause () кажется единственным методом для обработки всех активных звуков.   -  person GameDroids    schedule 13.09.2013
comment
хорошо, я не понимаю, почему просмотр вашего списка идентификаторов не остановит их. Вы зацикливаете некоторые из них?   -  person Howard Pautz    schedule 14.09.2013
comment
Да, и это тоже. Некоторые звуки зациклены, некоторые - нет. Возможно, мне стоит попробовать список еще раз, но так сложно отследить все идентификаторы. Когда звук прекращается, потому что он завершен, идентификатор становится недействительным или просто бесполезным, но я не знаю, когда это произойдет, и недопустимый идентификатор все еще будет в списке. Так что список очень быстро растет. Или у вас есть идея лучше отслеживать активные идентификаторы?   -  person GameDroids    schedule 14.09.2013
comment
Помните, что когда вы устанавливаете размер своего звукового пула, вы определяете, сколько у вас есть, поэтому вы знаете, как изменить размер массива или списка (практически без разницы в производительности), просто отметьте звук включенным или выключенным. Или вы можете сделать то, что я делаю, и использовать элементы массива или списка, такие как «слоты», которые содержат идентификаторы - слот содержит только активные идентификаторы, поэтому вы можете перебирать их в цикле. Может быть, вам стоит опубликовать свой код списка? Вы управляете звуками из другого потока?   -  person Howard Pautz    schedule 14.09.2013
comment
Я подумал о вашей идее слота и, немного более внимательно отслеживая идентификаторы streamID, понял, что streamID увеличивается каждый раз, когда воспроизводится поток. Когда я запускаю свое приложение, первый streamID равен 1, и только через 2 минуты streamID достиг 1000. Итак, я предполагаю, что мне нужно отслеживать только последний streamID, который будет наивысшим, и при остановке звуков просто повторяйте последние идентификаторы потока. Это может быть избыточным, но, как вы сказали, одновременно может воспроизводиться только определенное количество звуков! Так что спасибо за мозговой штурм :)   -  person GameDroids    schedule 14.09.2013


Ответы (2)


Я бы рекомендовал использовать autoPause () и autoResume () для приостановки и перезапуска звуков. Эта функция является частью звукового пула:

http://developer.android.com/reference/android/media/SoundPool.html#autoPause%28%29

person Shygar    schedule 15.06.2014

Как насчет использования .release()? Согласно документации:

Освободите ресурсы SoundPool. Освободите всю память и собственные ресурсы, используемые объектом SoundPool. SoundPool больше не может использоваться, и для ссылки должно быть установлено значение null.

Думаю, это тоже все останавливает. (На самом деле это вызывало ошибку в одном из моих приложений, поэтому я так и говорю)

Однако я считаю, что если вы захотите воспроизвести какие-либо звуки позже, возможно, вам придется загрузить их снова.

person anestv    schedule 15.12.2013
comment
Спасибо за ваш ответ. В каком-то смысле это то, чем я сейчас занимаюсь. Я храню звуки в разных SoundPool, поэтому я могу освободить SoundPool, если звуки должны остановиться. Таким образом, звуки в других пулах все еще могут воспроизводиться. Это действительно работает, и вместе со списком активных звуковых идентификаторов (которые можно остановить индивидуально) этого достаточно для моей проблемы. Тем не менее, я действительно не понимаю, почему нет более прямого способа проверить звуковые идентификаторы и остановить или возобновить их, как я хочу. (Это как если бы я сижу перед своим CD-плеером и извлекаю весь компакт-диск каждый раз, когда хочу остановить один-единственный трек;) - person GameDroids; 17.12.2013