Как синхронизировать заполнение кольцевого буфера в фоновом потоке с обратным вызовом remoteio - PullRequest
1 голос
/ 07 сентября 2011

Я ищу реализацию, которая использует кольцевой буфер в remoteio для вывода очень большого аудиофайла.

Я столкнулся с CARingBuffer от Apple, но мне приснился кошмар, пытающийся реализовать его в моем проекте ios.

В качестве альтернативы я наткнулся на этот кольцевой буфер, который я использую (безуспешно).

Кольцевой буфер

Как я пытался реализовать это следующим образом.

  1. Откройте аудиофайл, который идеально вырезан с помощью extaudiofileref.

  2. Полностью заполнить чтение моего кольцевого буфера из файла (номер кадра% inTimeSamples = readpoint)

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

  4. Если сэмплов достаточно, я просто читаю из буфера.

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

Это всегда звучит странно. Я думаю, что это может иметь какое-то отношение к тому факту, что обратный вызов remoteio выполняется намного быстрее, чем фоновый поток, поэтому к моменту завершения фонового потока не только изменилась вычисленная точка чтения, но и заголовок и хвост буфера не являются они должны быть.

Если пример кода слишком велик для публикации, я бы принял псевдокод в качестве ответа. Моя методология для решения этой проблемы отсутствует.

1 Ответ

1 голос
/ 07 сентября 2011

Возможно, это не тот ответ, который вы ищете, но SFBAudioEngine компилируется и работает на iOS и легко справится с этим вариантом использования. По сути, это абстракция более высокого уровня для RemoteIO AU, которая поддерживает гораздо больше форматов, чем Core Audio изначально.

...