Core Audio: Как сохранить буферы в оперативной памяти перед записью на диск или удалением?

#ios #xcode #core-audio

#iOS #xcode #core-audio

Вопрос:

Мое приложение использует Core Audio для анализа аудиобуферов, записывая в течение длительных периодов времени, но предоставляя пользователю только несколько образцов этого звука. На сегодняшний день я записывал все на диск, прежде чем выборочно удалять файлы. Однако, похоже, что операция записи довольно требовательна к оборудованию и может иногда вызывать сбои, если используется слишком часто.

Я хотел бы иметь способ избежать операции записи, если это не необходимо, что можно было бы сделать, сохранив звуковые буферы (скажем, на 1 минуту) в ОЗУ перед записью на диск или освобождением их из памяти, если они не нужны.

Кто-нибудь, пожалуйста, может посоветовать наиболее эффективный способ, которым это можно сделать?

 renderErr = AudioUnitRender(rioUnit, ioActionFlags,
                                    inTimeStamp, bus1, inNumberFrames, THIS->bufferList);

Analysis of buffer....

OSStatus s;

s = ExtAudioFileWriteAsync(THIS->mAudioFileRef, inNumberFrames, THIS->bufferList);
  

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

Комментарии:

1. Запись на диск не должна требовать от оборудования, а тем более вызывать сбои. ExtAudioFileWriteAsyc() очень эффективен. Ваш код вызывает сбой. Можете ли вы поделиться большей частью своего кода? например, вызываете ли вы ExtAudioFileDispose () для удаления любых ожидающих записей на диск?

2. Сбои происходили после нескольких часов непрерывной записи, и в основном на более старом оборудовании с более ограниченными ресурсами. Я протестировал несколько способов (и получил некоторую помощь от службы поддержки Apple). Это вызывало «панику ядра», что очень необычно и связано не с конкретным кодом, а с тем, что оборудование через некоторое время не справлялось. Да, я использую ExtAudioFileDispose. Мне удалось значительно снизить частоту сбоев за счет сокращения времени, затрачиваемого на запись (с паузами), а при запуске без записи сбоев не было, и поэтому я пришел к выводу, что проблема заключалась в записи.

Ответ №1:

Циклическая очередь без блокировки или fifo, использующая массив выборок размером 2646000 1 или больше, может хранить в ОЗУ 1 минуту монофонического звука со скоростью 44,1 к / с. У большинства устройств iOS не возникнет проблем с выделением 6 МБ или более памяти для очереди или fifo. Отображение, анализ или запись этих данных на диск могут быть выполнены в другом потоке с помощью периодического опроса или таймера displaylink (очистка из конца циклической очереди или fifo). Память, используемая для этого массива, может быть освобождена после остановки аудиоустройства.

Комментарии:

1. Спасибо за советы, это было намного проще, чем я думал.