2. Библиотека mmsystem.dll содержит удобные функции, специально предназначенные для работы с файлами RIFF-формата. Специализированные функции
успешно работают с блоками памяти большого размера (более 64 Кбайт), так как звуковые данные редко помещаются в одном сегменте памяти.
Открытие файла совершается функцией mmioOpen. Эта функция может открыть файл для буферизованного или небуферизованного ввода или для работы с
файлом в оперативной памяти (полностью возможности указанной функции приведены в поставляемой совместно с MS SDK документации). Ниже приведен прототип
функции mmioOpen:
HMMIO
mmioOpen(LPSTR szFilename,
LPMMIOINFO lpmmioinfo,
DWORD dwOpenFlags);
Здесь szFilename - дальний указатель на текстовую строку, содержащую путь к открываемому файлу, lpmmioinfo - указатель на содержащую
дополнительные параметры для операции открытия файла структуру MMIOINFO, dwOpenFlags - определяющие режим открытия файла флаги.
При успехе функция mmioOpen возвращает (нестандартный) идентификатор открытого файла, который можно использовать только в функциях с префиксом
mmio. Код ошибки можно определить, анализируя поле wErrorRet структуры MMIOINFO.
3. Структура MMIOINFO дает возможность задавать многочисленные способы работы с файлами - можно использовать
файлы в памяти, можно определить собственную процедуру для выполнения нестандартного ввода или вывода или
работать с открытыми средствами MS-DOS идентификаторами файлов. В простейших случаях можно указать второй
параметр функции mmioOpen как NULL и не использовать структуру MMIOINFO вообще.
4. Для создания нового фрагмента в RIFF-формате удобно использовать функцию
mmioCreateChunk; новый фрагмент создается в текущей позиции файла, предварительно
открытого с помощью функции mmioOpen
UINT
mmioCreateChunk(HMMIO hmmio, // идентификатор файла
LPMMCKINFO lpck, // указатель на
// структуру MMCKINFO
UINT wFlags); // тип фрагмента
При wFlags=MMIO_CREATERIFF создается фрагмент RIFF, при
wFlags=MMIO_CREATELIST создается фрагмент LIST. При нормальном завершении
работы функция возвращает нулевое значение, в противном случае - код ошибки.
Структура MMCKINFO и указатели на нее определены в файле mmsystem.h
как
typedef struct _MMCKINFO
{
FOURCC ckid;
DWORD cksize;
FOURCC fccType;
DWORD dwDataOffset;
DWORD dwFlags;
} MMCKINFO;
typedef MMCKINFO *PMMCKINFO;
typedef MMCKINFO NEAR *NPMMCKINFO:
typedef MMCKINFO FAR *LPMMCKINFO;
5. Функция mmioDescend
С целью поиска нужного фрагмента внутри RIFF-файла нет необходимости выполнять побайтное чтение файла и анализ его внутренней структуры; найти необходимый фрагмент
и выполнить позиционирование относительно этого фрагмента можно с помощью функций mmioDescend и mmioAscend. Функция mmioDescend ищет заданный фрагмент начиная с текущей
позиции; при нахождении фрагмента текущая позиция будет установлена на область данных.
UINT
mmioDescend(HMMIO hmmio, // идентификатор файла
LPMMCKINFO lpck, // указатель на структуру
// MMCKINFO для
// текущего фрагмента
LPMMCKINFO lpckParent, // указатель на стр-ру
// MMCKINFO для
// внешнего фрагмента
UINT wFlags); // режим поиска
Здесь lpckParent - указатель на структуру MMCKINFO, описывающую внешний фрагмент, внутри которого выполняется поиск. В качестве внешнего фрагмента могут выступать
только фрагменты ‘RIFF’ или ‘LIST’; если внешний фрагмент отсутствует, этот параметр можно указывать как NULL. Если указан wFlags=MMIO_FINDCHUNK, выполняется поиск
фрагмента, заданного своим идентификатором, если wFlags=MMIO_FINDLIST - выполняется поиск фрагмента внутри фрагмента ‘LIST’, при wFlags=MMIO_FINDRIFF - внутри фрагмента
‘RIFF’. При нормальном завершении функция mmioDescend возвращает нулевое значение, в противном случае - код ошибки.