При работе с воспроизведением аудио я привык к следующему шаблону:
- один дисковый (или сетевой) поток, который считывает данные с диска (или сети) и заполняет кольцевой буфер
- один аудиопоток, который считывает данные из кольцевого буфера, возможно, выполняет DSP и записывает в аудиооборудование (pull или push API)
Это работает нормально, и нет проблем при работе, скажем, с файлом WAV.
Теперь, если исходные данные закодированы в сжатом формате, таком как Vorbis или MP3, декодирование занимает некоторое время.
И кажется, что декодирование в дисковом/сетевом потоке выполняется довольно часто.
Но разве это не неправильный дизайн? Когда доступ к диску или сети блокируется, некоторое время ЦП доступно для декодирования, но тратится впустую, если декодирование происходит в том же потоке.
Мне кажется, что если сети становятся медленными, то риски опустошения буфера выше, если декодирование происходит последовательно.
Итак, разве декодирование не должно выполняться в аудиопотоке?
В моем контексте я бы предпочел не добавлять выделенный поток декодирования. Это для мобильных платформ, а SMP сейчас встречается довольно редко. Но, пожалуйста, скажите, действительно ли для вас имеет смысл отдельная ветка декодирования.