Core Audio - CARingBuffer для чтения аудиофайла для обратного вызова - PullRequest
2 голосов
/ 24 марта 2011

У кого-нибудь есть хороший пример использования CARingBuffer для буферизации большого аудиофайла и как прочитать его в обратном вызове?

Должно ли это быть чтение аудиофайла во вторичном потоке? Как приостановить загрузку аудиофайла до тех пор, пока загруженные буферы не будут воспроизведены (как предварительно поставить аудиофайл в очередь)? CAPlayThrough кажется близким, но транслирует аудио только с микрофона.

Спасибо!

Ответы [ 2 ]

2 голосов
/ 31 октября 2012

Вы можете найти пример, который использует этот кольцевой буфер, если вы загрузите пример кода книги Learning Core Audio здесь (под загрузка вкладка).Перейти к примеру из главы 8 в папке с именем CH08_AUGraphInput.

Однако, если вы просто читаете аудио из файла, то использование (дополнительного) кольцевого буфера кажется излишним. Кольцевой буфер пригодитсякогда у вас есть вход и выход в реальном времени (или почти в реальном времени) (см. главу 8 в упомянутой книге для более подробного объяснения, когда необходим кольцевой буфер). Обратите внимание, что пример в главе 8 о воспроизведении аудио сразу послезапись на микрофон, а это не то, что вы хотите делать).

Причина, по которой я сказал дополнительный кольцевой буфер, заключается в том, что в ядре Audio уже есть аудио-очередь (которую можно рассматривать как кольцевой буфер ... или, по крайней мере, в вашем случае она заменяет необходимостькольцевой буфер: вы заполняете его данными, он воспроизводит данные, а затем запускает обратный вызов, который сообщает вам, что введенные вами данные были воспроизведены).Apple документация предлагает хорошее объяснение этого.

В вашем случае, если вы просто читаете аудио из файла, вы можете легко контролировать пропускную способность аудио из файла.,Вы можете приостановить его, например, заблокировав поток, который читает данные из аудиофайла.

Простой пример того, о чем я говорю, см. В этом примере , который я создал на github.Более подробный пример см. В знаменитом примере Мэтта Галлахера .

.
1 голос
/ 29 марта 2011

Обычно для воспроизведения аудио все, что может блокировать или занимать неограниченное количество времени (в частности, файловый или дисковый ввод-вывод), должно выполняться во вторичном потоке. Таким образом, вы хотите прочитать данные аудиофайла в потоке производителя и использовать данные в обратном вызове IOProc или RemoteIO.

Синхронизация становится проблемой с несколькими потоками, но если у вас есть только один читатель и один писатель, как правило, это не слишком сложно. Фактически, CARingBuffer для этого случая является поточно-ориентированным.

Общий поток должен выглядеть следующим образом:

Из основного потока:

  1. Создать ветку производителя
  2. Скажите, какой файл обрабатывать

От ветки производителя:

  1. Открыть указанный файл
  2. Заполнить пустое пространство в кольцевом буфере аудиоданными
  3. Подождите, пока не появится сигнал или не истечет время ожидания, и вернитесь к # 2

В вашем IOProc / обратном вызове:

  1. Считывание данных из кольцевого буфера
  2. Уведомить производителя о необходимости дополнительных данных

Размещение кода для этого здесь будет слишком длинным для чтения, но вот несколько советов, с которых можно начать. Ни один из них не для iPhone, но принципы те же.

...