#android #audio #animation #break #soundpool
#Android #Аудио #Анимация #перерыв #soundpool
Вопрос:
Самая странная вещь. Когда воспроизводится анимация, я слышу, что мой звуковой эффект четкий, но когда у меня нет анимации, звуковой эффект прерывается. Вот код:
private void Feedback(boolean success)
{
Log.d(TAG, "Feedback");
if(success)
{
PlayCreatureSound();
ShowAnimatedCreature();
}
else
{
PlayFailedSound();
}
}
private void PlayCreatureSound()
{
Log.d(TAG, "PlayCreatureSound");
AudioManager audioManager = (AudioManager)getSystemService(Context.AUDIO_SERVICE);
float curVolume = audioManager.getStreamVolume(AudioManager.STREAM_MUSIC);
float maxVolume = audioManager.getStreamMaxVolume(AudioManager.STREAM_MUSIC);
float leftVolume = curVolume/maxVolume;
float rightVolume = curVolume/maxVolume;
spCreatureVoice.play(iCreatureVoicesId[lastCreature.ordinal()], leftVolume, rightVolume, 1, 0, 1);
}
private void PlayFailedSound()
{
Log.d(TAG, "PlayFailedSound");
spCreatureVoice.stop(iCreatureVoicesId[FeedbackCreature.FC_COUNT.ordinal()]);
AudioManager audioManager = (AudioManager)getSystemService(Context.AUDIO_SERVICE);
float curVolume = audioManager.getStreamVolume(AudioManager.STREAM_MUSIC);
float maxVolume = audioManager.getStreamMaxVolume(AudioManager.STREAM_MUSIC);
float leftVolume = curVolume/maxVolume;
float rightVolume = curVolume/maxVolume;
spCreatureVoice.play(iCreatureVoicesId[FeedbackCreature.FC_COUNT.ordinal()], leftVolume, rightVolume, 1, 0, 1);
}
private void ShowAnimatedCreature()
{
Log.d(TAG, "ShowAnimatedCreature");
// show the creature
ibtnShapes[lastTargetLocation].setImageBitmap(bmCreatures[lastCreature.ordinal()]);
// animate
ibtnShapes[lastTargetLocation].startAnimation(rotate[0]);
}
Я уже пробовал:
1. переключение файлов
2. использование MediaPlayer
3. удаление «spCreatureVoice.stop(…»
4. изменение приоритета
Ответ №1:
Это может быть из-за того, как вы обрабатываете структуру FeedbackCreature, или из-за метода остановки. Вы пытаетесь воспроизвести два звуковых эффекта одновременно?
Поскольку эти два метода имеют так много общего кода, я предлагаю вам объединить их следующим образом. Это может помочь вам сузить проблему.
private void Feedback(boolean success)
{
Log.d(TAG, "Feedback");
if(success)
{
int creatureOrdinal = lastCreature.ordinal();
PlaySound(creatureOrdinal );
ShowAnimatedCreature(creatureOrdinal );
}
else
{
int creatureOrdinal = FeedbackCreature.FC_COUNT.ordinal();
spCreatureVoice.stop(iCreatureVoicesId[creatureOrdinal]);
PlaySound(creatureOrdinal);
}
}
private void PlaySound(int creatureOrdinal)
{
Log.d(TAG, "PlayCreatureSound");
AudioManager audioManager = (AudioManager)getSystemService(Context.AUDIO_SERVICE);
float curVolume = audioManager.getStreamVolume(AudioManager.STREAM_MUSIC);
float maxVolume = audioManager.getStreamMaxVolume(AudioManager.STREAM_MUSIC);
float leftVolume = curVolume/maxVolume;
float rightVolume = curVolume/maxVolume;
spCreatureVoice.play(iCreatureVoicesId[creatureOrdinal], leftVolume, rightVolume, 1, 0, 1);
}
private void ShowAnimatedCreature(int creatureOrdinal)
{
Log.d(TAG, "ShowAnimatedCreature");
// show the creature
ibtnShapes[lastTargetLocation].setImageBitmap(bmCreatures[creatureOrdinal]);
// animate
ibtnShapes[lastTargetLocation].startAnimation(rotate[0]);
}
Комментарии:
1. Ваш код немного чище, но моя проблема остается. Я проигрываю только 1 поток за раз, но только когда анимация воспроизводится вместе с ней, звук становится четким. Анимация представляет собой простое вращение.
2. Таким образом, единственное отличие — это метод spCreatureVoice.stop или то, как вызывается этот метод. Пожалуйста, опубликуйте метод stop и часть кода, которая вызывает это в случае сбоя, в обычном случае vrs.
3. Остановка является частью SoundPool api, и я попытался удалить ее без каких-либо улучшений. Обратная связь (true) работает, а обратная связь (false) звучит неработающей. Единственное, о чем я могу думать, это то, что либо это происходит только на эмуляторе, либо Android работает в фоновом режиме, если я не загружаю весь процессор анимацией.
4. Упоминания в пуле звуков: Обратите внимание, что, поскольку потоки могут быть остановлены из-за ограничений ресурсов, StreamID является ссылкой на конкретный экземпляр потока. Если поток остановлен, чтобы разрешить воспроизведение потока с более высоким приоритетом, поток больше не будет действительным. Однако приложению разрешено вызывать методы в StreamID без ошибок. Это может помочь упростить логику программы, поскольку приложению не нужно беспокоиться о жизненном цикле потока. developer.android.com/reference/android/media/SoundPool.html
5. ХОРОШО, поэтому я попытался увеличить количество потоков в конструкторе SoundPool и изменить тип потока без каких-либо улучшений. Из приведенной выше цитаты и здравого смысла можно подумать, что звук будет прерываться при воспроизведении анимации, а не наоборот.
Ответ №2:
Похоже, это проблема эмулятора. Не слышно никаких проблем на самом устройстве.
Комментарии:
1. Довольно хорошо известно, что эмулятор для Android не самый лучший. Это хороший инструмент, но вы должны попытаться выполнить большую часть тестирования на устройстве. (по крайней мере, до тех пор, пока вам не понадобится протестировать устройства, которые вы не можете позволить себе покупать кратно ;))