Операционные системы. Марапулец Ю.В. - 79 стр.

UptoLike

Составители: 

Для поиска первого фрагмента заполняется только одно поле
информационной структуры: fccType. Поле ckid (идентификатор блока) должно
содержать значение RIFF,
но флаг MMIO_FINDRIFF и так указывает цель этого
поиска. Команда mmioDescend распознает также еще три флага:
MMIO_FINDCHUNK,
MMIO_FINDRIFF и MMIO_FINDLIST. Флаг
MMIO_FINDCHUNK указывает, что поиск необходимо осуществлять по
содержимому поля ckid, а остальные флаги говорят о том, что поле fccType
соответствует блоку RIFF
или LIST.
Функция mmioDescend принимает четыре параметра: дескриптор файла,
описание искомого блока, описание его родительского блока и несколько флагов.
Блоки RIFF
не имеют родительских блоков, поэтому третье поле мы оставляем
пустым (значение NULL).
Блок формата всегда является вложенным в другой
родительский блок. Вложенные блоки могут быть только у блоков RIFF
и LIST.
Для поиска вложенного блока формата мы записываем значение fmt в
информационную структуру искомого блока и значение WAVE
в
информационную структуру родительского блока. По достижении конца
текущего блока WAVE
функция mmioDescend прекратит поиск метки fmt. Это
может случиться только в том случае, если файл поврежден и его нельзя
использовать, поскольку интерпретировать блок WAVE
без спецификаций его
формата невозможно.
Вторая команда mmioDescend оставляет указатель файла в начале
вложенного блока формата. Затем мы загружаем информацию о формате в
память для проверки.
/* чтение вложенного блока формата */
lFmtSize = (LONG)sizeof( pcmWaveFormat );
if( mmioRead( hmmio, (LPSTR)&pcmWaveFormat, lFmtSize ) != lFmtSize )
{
ReportError( hWnd, IDS_CANTREADFORMAT ) ;
mmioClose ( hmmio, 0 );
return( FALSE ) ;
}
/* выход из вложенного блока в родительский блок */
if( mmioAscend( hmmio, SmrnckinfoFrnt, 0 ) != 0 )
{
ReportError( hWnd, IDS_CANTREADFORMAT );
mmioClose ( hmmio, 0 ) ;
return( FALSE ) ;
}
/* проверка того, действительно ли файл представляет собой WAV-файл
в 8-разрядном РСМ-формате (моно) */
if((pcmWaveFormat.wf.wFormatTag!=WAVE_FORMAT_PCM)||
( pcmWaveFormat .wf.nChannels != 1 ) ||
( pcmWaveFormat.wBitsPerSample != 8 ))
79
      Для поиска первого фрагмента заполняется только одно поле
информационной структуры: fccType. Поле ckid (идентификатор блока) должно
содержать значение RIFF, но флаг MMIO_FINDRIFF и так указывает цель этого
поиска. Команда mmioDescend распознает также еще три флага:
MMIO_FINDCHUNK,         MMIO_FINDRIFF        и    MMIO_FINDLIST.        Флаг
MMIO_FINDCHUNK указывает, что поиск необходимо осуществлять по
содержимому поля ckid, а остальные флаги говорят о том, что поле fccType
соответствует блоку RIFF или LIST.
      Функция mmioDescend принимает четыре параметра: дескриптор файла,
описание искомого блока, описание его родительского блока и несколько флагов.
Блоки RIFF не имеют родительских блоков, поэтому третье поле мы оставляем
пустым (значение NULL). Блок формата всегда является вложенным в другой
родительский блок. Вложенные блоки могут быть только у блоков RIFF и LIST.
      Для поиска вложенного блока формата мы записываем значение fmt в
информационную структуру искомого блока и значение WAVE в
информационную структуру родительского блока. По достижении конца
текущего блока WAVE функция mmioDescend прекратит поиск метки fmt. Это
может случиться только в том случае, если файл поврежден и его нельзя
использовать, поскольку интерпретировать блок WAVE без спецификаций его
формата невозможно.
      Вторая команда mmioDescend оставляет указатель файла в начале
вложенного блока формата. Затем мы загружаем информацию о формате в
память для проверки.

         /* чтение вложенного блока формата */
     lFmtSize = (LONG)sizeof( pcmWaveFormat );
     if( mmioRead( hmmio, (LPSTR)&pcmWaveFormat, lFmtSize ) != lFmtSize )
     {
            ReportError( hWnd, IDS_CANTREADFORMAT ) ;
            mmioClose ( hmmio, 0 );
            return( FALSE ) ;
     }
             /* выход из вложенного блока в родительский блок */
     if( mmioAscend( hmmio, SmrnckinfoFrnt, 0 ) != 0 )
     {
             ReportError( hWnd, IDS_CANTREADFORMAT );
             mmioClose ( hmmio, 0 ) ;
             return( FALSE ) ;
     }
     /* проверка того, действительно ли файл представляет собой WAV-файл
                    в 8-разрядном РСМ-формате (моно) */
     if((pcmWaveFormat.wf.wFormatTag!=WAVE_FORMAT_PCM)||
                 ( pcmWaveFormat .wf.nChannels != 1 ) ||
                 ( pcmWaveFormat.wBitsPerSample != 8 ))

                                     79