В настоящее время я реализую микширование звуковых эффектов на Android через OpenSL. У меня начальная реализация, но я столкнулся с некоторыми проблемами.
Моя реализация выглядит следующим образом:
1) Для каждого звукового эффекта я создаю несколько объектов AudioPlayer (по одному на каждый одновременный звук), который использует источник данных SLDataLocator_AndroidFD, который, в свою очередь, ссылается на файл OGG. Например, если у меня есть звук стрельбы из пистолета (назовем его gun.ogg), который воспроизводится в быстрой последовательности, я использую около 5 объектов AudioPlayer, которые ссылаются на один и тот же источник звука gun.ogg, а также на тот же объект outputmix.
2) Когда мне нужно воспроизвести этот звуковой эффект, я просматриваю все созданные мной объекты AudioPlayer и нахожу объект, который в данный момент не находится в состоянии SL_PLAYSTATE_PLAYING, и использую его для воспроизведения эффекта.
3) Перед воспроизведением клипа я пытаюсь начать его с помощью SLPlayItf :: SetPosition.
Пока это работает нормально, но при воспроизведении звуков в быстрой последовательности возникает некоторый потрескивающий шум. Я читал в группе новостей Android NDK, что у OpenSL на Android есть проблемы с переключением источников данных. Кто-нибудь сталкивался с этой проблемой?
Мне также интересно, видел ли кто-либо еще подход с микшированием звука для OpenSL на Android. Если так, ваш подход отличается от моего? Какой-нибудь совет относительно потрескивающего шума?
Я искал в интернете документацию OpenSL и пример кода, но там не так много в отношении микширования (только загрузка, которую я уже понял). Любая помощь будет принята с благодарностью.