Я записываю аудиофайл на карту памяти SD / MMC в режиме реального времени, в формате WAVE , работая на плате ARM.Упомянутая карта (и должна оставаться) в формате FAT32.Я могу написать правильный файл WAVE просто отлично, при условии, что я знаю, сколько я собираюсь написать заранее .
Я хочу иметь возможность помещать данные заполнителя в блокВ поле «Размер данных» RIFF и блоков данных запишите мои аудиоданные, а затем вернитесь и обновите поле «Размер данных блока» в этих двух фрагментах, чтобы они имели правильные значения, но ...
У меня есть рабочая файловая система и некоторые функции stdio, с некоторыми оговорками:
- fwrite () поддерживает
r
, w
и a
, но не любые режимы +
. - fseek () не работает в режиме записи.
Я не писал реализации вышеуказанных функций (я использую RL-FLashFS от ARM), и я не уверен, чтоОбоснование ограничений / частичной реализации есть.Добавление недостающей функциональности лично, вероятно, является вариантом, но я хотел бы избежать его, если это возможно (мне больше не нужны эти функции, я не предвижу их и не могу позволить себе тратить на это слишком много времени).Переключение на другую реализацию также здесь не вариант.
У меня очень ограниченная доступная память, и я не знаю, сколько аудиоданных будет получено, за исключением того, что это почти наверняка будет больше, чем я могу сохранитьв любой момент в памяти.
I может записать файл с необработанными чередованными аудиоданными в нем, отслеживая, сколько байтов я записываю, закройте его, затем снова откройте его длячтение, откройте второй файл для записи, запишите заголовок во второй файл и скопируйте аудиоданные.То есть, я мог бы постобработать его в правильно отформатированный допустимый файл WAVE.Я сделал это, и он отлично работает. Но Я хочу избежать пост-обработки больших объемов данных, если это вообще возможно.
Возможно, я мог бы каким-то образом объединить два файла на месте?(Т.е. запишите данные, затем запишите чанки в отдельный файл, затем соедините их в файловой системе, избегая значительной части времени, затрачиваемого на копирование потенциально огромных объемов данных.) Я понимаю, что, если возможно, это все равно будет включатьнекоторое копирование из-за блочной ориентации хранилища.
Предложения?
РЕДАКТИРОВАТЬ: Я действительно должен был упомянуть об этом, но здесь не работает ОС.У меня есть некоторые функции stdio, работающие поверх уровня аппаратной абстракции, и это все.