Теперь я вижу, что библиотека SDL_mixer не даст вам того, что вы хотите.Его поддержка «музыки» (MP3) воспроизводит файл извне из микшера, поэтому, кроме средств управления громкостью и положением, которые предоставляет API, вы не сможете вставить себя в его аудиопоток.
Если вы использовалиВместо Mix_Chunk
объектов, чтобы воспользоваться преимуществами микшера каналов, вы сможете добавить себя в качестве эффекта для канала, транслирующего музыку, используя Mix_RegisterEffect
.Еще одно место, куда вы можете вставить себя, - это после микса, используя Mix_SetPostMix
, если вы хотите визуализировать окончательный микс чанков вместо отдельного канала или каналов.Однако эти блоки лучше всего подходят для коротких звуков, поскольку они загружаются полностью в память, а не в потоковом режиме - и в настоящее время они не поддерживают MP3.
Если вы намерены использовать SDL, рассмотрите возможность использования SDL_sound дляэта задача.Это еще одно расширение для SDL, которое обрабатывает только декодирование файлов.Он передает вам данные во время использования Sound_Decode
.Затем вы можете взять декодированные данные и передать их в микшер, используя Mix_HookMusic
, чтобы сохранить потоковый подход.Или вы можете даже загрузить весь файл с помощью Sound_DecodeAll
и напрямую ввести Mix_Chunk
, если хотите воспользоваться функциями микшера и эффектов, за счет потоковой передачи.
следите за:
- Убедитесь, что аудио декодируется в выходном формате, который ожидает микшер.
- Обращайте внимание на любой случай, когда декодер не поспевает за микшеромв некоторых случаях - в этом случае вам потребуется отдельный процесс для декодирования, чтобы вы могли выполнять потоковую передачу впереди того места, где находится микшер, и обрабатывать случайные скачки при чтении без сбоев.
- Может бытьслучаи, когда размер блока, который вы получаете от декодера, не равен размеру блока, который вы хотите проанализировать.Вы можете использовать
Sound_SetBufferSize
для упрощения этой проблемы.