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

UptoLike

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

/* сохранение размера вложенного блока format */
lFmtSize = (LONG)sizeoft pcmWaveFormat );
// Создание вложенного блока format.
// Поскольку размер этого блока нам известен,
// указываем его в структуре MMCKINFO,
// чтобы функции не пришлось снова определять
// размер блока при выходе из него.
mmckinfoFmt.ckid = mmioFOURCC( 'f', 'm', 't', ' ' );
mmckinfoFmt.cksize = lFmtSize;
if (mmioCreateChunk( hmmio, &mmckinfoFmt, 0 ) != 0)
{
ReportError( hWnd, IDS_CANTWRITEFORMAT ) ;
mmioClose( hmmio, 0 ) ;
return ( FALSE ) ;
}
/* инициализация структуры PCMWAVEFORMAT */ .
pcmWaveFormat.wf.wFormatTag = WAVE_FORMAT_PCM;
pcmWaveFormat.wf.nChannels = 1;
pcmWaveFormat.wf.nSamplesPerSec = dwSamplesPerSec;
pcmWaveFormat.wf.nAvgBytesPerSec = dwSamplesPerSec;
pcmWaveFormat.wf.nBlockAlign =1;
pcmWaveFormat.wBitsPerSample = 8;
/* запись вложенного блока format */
if( mmioWrite( hmmio, (LPSTR)&pcmWaveFormat, lFmtSize ) != lFmtSize
)
{
ReportError( hWnd, IDS_CANTWRITEFORMAT );
mmioClose( hmmio, 0 );
return ( FALSE ) ;
}
/* выход из вложенного
блока format */
if( mmioAscend( hmmio, smmckinfoFmt, 0 ) != 0 )
{
ReportError( hWnd, IDS_CANTWRITEFORMAT );
mmioClose ( hmmio, 0 ) ;
return( FALSE );
}
He забывайте, что каждый блок содержит метку, размер и некоторые
данные. Функция mmioCreateChunk оставляет место для записи размера, но
если значение поля cksize равно 0, это место остается пустым до тех пор, пока
следующая команда mmioAscend не закроет новый блок. Обычно функция
mmioAscend должна рассчитывать объем данных, возвращаться в поле размера
и заполнять его вычисленным значением, а затем снова перемещаться к концу
83
           /* сохранение размера вложенного блока format */
     lFmtSize = (LONG)sizeoft pcmWaveFormat );
           // Создание вложенного блока format.
           // Поскольку размер этого блока нам известен,
           // указываем его в структуре MMCKINFO,
           // чтобы функции не пришлось снова определять
           // размер блока при выходе из него.
     mmckinfoFmt.ckid = mmioFOURCC( 'f', 'm', 't', ' ' );
     mmckinfoFmt.cksize = lFmtSize;
     if (mmioCreateChunk( hmmio, &mmckinfoFmt, 0 ) != 0)
     {
           ReportError( hWnd, IDS_CANTWRITEFORMAT ) ;
           mmioClose( hmmio, 0 ) ;
           return ( FALSE ) ;
     }
           /* инициализация структуры PCMWAVEFORMAT */ .
     pcmWaveFormat.wf.wFormatTag = WAVE_FORMAT_PCM;
     pcmWaveFormat.wf.nChannels = 1;
     pcmWaveFormat.wf.nSamplesPerSec = dwSamplesPerSec;
     pcmWaveFormat.wf.nAvgBytesPerSec = dwSamplesPerSec;
     pcmWaveFormat.wf.nBlockAlign =1;
     pcmWaveFormat.wBitsPerSample = 8;
           /* запись вложенного блока format */
     if( mmioWrite( hmmio, (LPSTR)&pcmWaveFormat, lFmtSize ) != lFmtSize
)
     {
           ReportError( hWnd, IDS_CANTWRITEFORMAT );
           mmioClose( hmmio, 0 );
           return ( FALSE ) ;
     }
           /* выход из вложенного блока format */
     if( mmioAscend( hmmio, smmckinfoFmt, 0 ) != 0 )
     {
           ReportError( hWnd, IDS_CANTWRITEFORMAT );
           mmioClose ( hmmio, 0 ) ;
           return( FALSE );
     }

      He забывайте, что каждый блок содержит метку, размер и некоторые
данные. Функция mmioCreateChunk оставляет место для записи размера, но
если значение поля cksize равно 0, это место остается пустым до тех пор, пока
следующая команда mmioAscend не закроет новый блок. Обычно функция
mmioAscend должна рассчитывать объем данных, возвращаться в поле размера
и заполнять его вычисленным значением, а затем снова перемещаться к концу

                                     83