В настоящее время я реализую микширование звуковых эффектов на 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 и примера кода, но там не так много информации о микшировании (только загрузка, которую я уже понял). Любая помощь будет принята с благодарностью.