Какой поток использовать для декодирования звука? - PullRequest
5 голосов
/ 09 мая 2011

При работе с воспроизведением аудио я привык к следующему шаблону:

  • один дисковый (или сетевой) поток, который считывает данные с диска (или сети) и заполняет кольцевой буфер
  • один аудиопоток, который читает данные из кольцевого буфера, возможно выполняет DSP и записывает в аудиооборудование (тянуть или толкать API)

Это отлично работает, и нет проблем при работе, скажем, с WAV-файлом.

Теперь, если исходные данные кодируются в сжатом формате, таком как Vorbis или MP3, декодирование занимает некоторое время.

И кажется, что довольно часто можно выполнять декодирование в потоке диска / сети.

Но разве это не неправильный дизайн? При доступе к диску или сети доступное время ЦП доступно для декодирования, но оно теряется, если декодирование происходит в одном потоке.

Мне кажется, что если сеть становится медленной, то риск переполнения буфера выше, если декодирование происходит последовательно.

Итак, разве не следует выполнять декодирование в аудиопотоке?

В моем контексте я бы предпочел не добавлять отдельный поток декодирования. Это для мобильных платформ, а SMP довольно редко встречается сейчас. Но, пожалуйста, скажите, действительно ли для вас имеет смысл отдельный поток декодирования.

Ответы [ 2 ]

2 голосов
/ 09 мая 2011

Если ваше устройство имеет один процессор, все потоки делятся им.Обмен потоками ОС обычно очень эффективен (вы не потеряете сколько-нибудь значительную мощность процессора при замене).Поэтому вам следует создать больше потоков, если это упростит вашу логику.

В вашем случае существует конвейер.Различная резьба для каждой ступени конвейера является хорошей закономерностью.Как вы заметили, альтернатива включает в себя сложную логику, синхронизацию, события, прерывания или что-то еще.Иногда нет хороших альтернатив вообще.

Следовательно, мое предложение - создать специальный поток для декодирования звука.

Если у вас будет более одного процессора, вы дажеповысить эффективность, используя один поток для каждого шага конвейера.

2 голосов
/ 09 мая 2011

Для аудиопотока важнее быть доступным для плавного воспроизведения звука, чем для сетевого потока, чтобы поддерживать буфер идеального размера. Если вы используете только два потока, то декодирование должно выполняться в сетевом потоке. Если вы декодируете в воспроизводящем потоке, возможно, настанет время, когда вам нужно будет передавать больше звука на аппаратное обеспечение, но поток занят декодированием. Лучше, если вы сохраните буфер уже декодированного звука.

В идеале вы должны использовать три темы. Один для чтения в сети, один для декодирования и один для воспроизведения. В нашем приложении, которое обрабатывает захват аудио, видео, запись и потоковую передачу, у нас есть восемь потоков на поток (недавно увеличено с шести потоков, так как мы недавно добавили новые функции). Каждому потоку гораздо проще иметь свою собственную функциональность, а затем он может соответствующим образом измерить свою производительность по сравнению с входящими / исходящими буферами. Это также приносит пользу профилированию и оптимизации.

...