Функция f_forward читает данные файла и перенаправляет их в потоковое устройство данных (data streaming device).
FRESULT f_forward (
FIL* FileObject, /* Файловый объект */
UINT (*Func)(const BYTE*,UINT), /* Функция потоковых данных (Data streaming function) */
UINT ByteToFwd, /* Количество байт для перенаправления */
UINT* ByteFwd /* Количество перенаправленных данных */
);
Параметры
- FileObject
- Указатель на открытый файловый объект.
- Func
- Указатель на пользовательскую функцию (её код задает пользователь библиотеки) потоковых данных (data streaming function). Для подробностей см. пример кода.
- ByteToFwd
- Количество байт, которое должно быть перенаправлено, в диапазоне значений UINT.
- ByteFwd
- Указатель на переменную UINT, в которой будет возвращено количество перенаправленных байт.
Возвращаемые значения
FR_OK, FR_DISK_ERR, FR_INT_ERR, FR_NOT_READY, FR_INVALID_OBJECT, FR_TIMEOUT
Описание
Функция f_forward читает данные из файла и перенаправляет их в исходящий поток (outgoing stream), без использования буфера данных. Такое использование чтения подходит для систем с дефицитом памяти, потому что в модуле приложения не нужен буфер для данных. Указатель позиции в файле внутри файлового объекта будет увеличиваться на количество перенаправленных байт. Если *ByteFwd < ByteToFwd, то это не обозначает ошибку, просто запрашиваемое количество байт не было перенаправлено по причине достижения конца файла (end of file, EOF), либо поток был занят во время передачи данных.
Краткая информация (QuickInfo)
Функция доступна, когда _USE_FORWARD == 1 и _FS_TINY == 1.
Пример кода (воспроизведение звука, Audio playback)
/*-------------------------------------------------------------------------*/
/* Пример кода функции передачи данных, которая будет вызвана из f_forward */
/*-------------------------------------------------------------------------*/
UINT out_stream ( /* Возвращает количество отправленных байт или состояние потока */
const BYTE *p, /* Указатель на данные отправляемого блока */
UINT btf /* >0: вызов передачи (количество байт для отправки). 0: вызов
запроса состояния (Sense call) */
)
{
UINT cnt = 0;
if (btf == 0) { /* запрос состояния (Sense call) */
/* Возврат состояния потока (0: занят, 1: готов к работе) */
/* Когда вернулась готовность к опросу состояния, нужно принять по крайней мере 1 байт */
/* при последующих вызовах передачи, либо f_forward вернет ошибку FR_INT_ERR. */
if (FIFO_READY) cnt = 1;
}
else { /* запрос передачи (Transfer call) */
do { /* Повторяем, пока есть данные и поток готов их принять */
FIFO_PORT = *p++;
cnt++;
} while (cnt < btf && FIFO_READY);
}
return cnt;
}
/*------------------------------------------------------------------------*/
/* Пример кода, использующего функцию f_forward */
/*------------------------------------------------------------------------*/
FRESULT play_file (
char *fn /* Указатель на звуковой файл, который должен проигрываться */
)
{
FRESULT rc;
FIL fil;
UINT dmy;
/* Открытие аудиофайла в режиме только для чтения */
rc = f_open(&fil, fn, FA_READ);
if (rc) return rc;
/* Делаем цикл, пока указатель позиции в файле не достигнет конца файла */
while (rc == FR_OK && fil.fptr < fil.fsize) {
/* тут могут работать любые другие процессы... */
/* Заполнение выходного потока периодически, либо по запросу */
rc = f_forward(&fil, out_stream, 1000, &dmy);
}
/* Закрытие файла и возврат */
f_close(&fil);
return rc;
}
См. также
f_open, f_gets, f_write, f_close, FIL
Комментарии
Вроде и по русски написано, и С язык простой, но воспроизведение звука это ШИМ...
microsin: причем тут "заснуть" и "ШИМ"? В этой статье демонстрируется не генерация звука как таковая (ШИМ, кстати, не единственный способ преобразования цифры в аналог), а работа функции f_forward из библиотеки FatFS.
RSS лента комментариев этой записи