Составители:
области данных. Задавая размер данных, мы предотвращаем ненужные
перемещения по файлу, устраняя лишние обращения к диску.
По умолчанию в глобальной переменной dwSamplesPerSecond
содержится значение 22050 (22,05 кГц), которое изменяется при загрузке
нового файла с помощью функции ReadWaveData. (При выборе команды New
из меню File происходит сброс этого значения.) Поскольку программа
ShowWave ограничивается работой с монозаписями, характеризующимися
разрядностью выборки 8 битов, каждая выборка всегда содержит 1 байт
данных. Поэтому мы можем записать одно и то же значение в поля
nSamplesPerSecond и nAvgBytesPerSecond переменной pcmWaveForm.
Поле nBlockAlign указывает, сколько байтов заполняется одной
выборкой. Размер выборки должен быть округлен к значению ближайшего
байта. Например, 12-разрядные выборки будут записываться в двух байтах.
Четыре бита в каждом блоке окажутся лишними, но при загрузке их в память
заполнение дополнительных разрядов ускоряет доступ к данным. Центральный
процессор всегда читает информацию из памяти не отдельными битами, а
целыми байтами и словами.
У вас может возникнуть вопрос, зачем нужно вызывать функцию
mmioAscend, ведь при выполнении операции записи указатель текущей позиции
уже переместился в конец блока формата. Это делается, опять-таки, для
ускорения доступа к данным. Область данных блока всегда должна содержать
четное число байтов, поэтому данные должны быть размещены по границам слов
(2 байта). Если данные содержат нечетное число байтов, завершающая команда
mmioAscend добавляет недостающий байт. Если количество байтов данных
четное, команда mmioAscend не выполняет никаких действий. После функции
mmioCreateChunk всегда желательно вызывать команду mmioAscend.
Записав блок format, мы должны повторить те же самые операции для
создания блока data:
/* запись размера вложенного блока data */
lDataSize = (LONG)dwWaveDataSize;
/*создание вложенного блока data, содержащего выборки*/
mmckinfoData.ckid = mmioFOURCC( 'd', 'a', 't', 'a' );
mmckinfoFmt.cksize = lDataSize;
if( mmioCreateChunk ( hmmio, &mmckinfoData, 0 ) != 0 )
{
ReportError( hWnd, IDS_CANTWRITEDATA);
mmioClose ( hmmio, 0 ) ;
return( FALSE ) ;
}
/* запись вложенного блока data */
if( mmioWrite( hmmio, lpWaveData, lDataSize ) != lDataSize )
{
ReportError( hWnd, IDS_CANTWRITEDATA );
84
области данных. Задавая размер данных, мы предотвращаем ненужные перемещения по файлу, устраняя лишние обращения к диску. По умолчанию в глобальной переменной dwSamplesPerSecond содержится значение 22050 (22,05 кГц), которое изменяется при загрузке нового файла с помощью функции ReadWaveData. (При выборе команды New из меню File происходит сброс этого значения.) Поскольку программа ShowWave ограничивается работой с монозаписями, характеризующимися разрядностью выборки 8 битов, каждая выборка всегда содержит 1 байт данных. Поэтому мы можем записать одно и то же значение в поля nSamplesPerSecond и nAvgBytesPerSecond переменной pcmWaveForm. Поле nBlockAlign указывает, сколько байтов заполняется одной выборкой. Размер выборки должен быть округлен к значению ближайшего байта. Например, 12-разрядные выборки будут записываться в двух байтах. Четыре бита в каждом блоке окажутся лишними, но при загрузке их в память заполнение дополнительных разрядов ускоряет доступ к данным. Центральный процессор всегда читает информацию из памяти не отдельными битами, а целыми байтами и словами. У вас может возникнуть вопрос, зачем нужно вызывать функцию mmioAscend, ведь при выполнении операции записи указатель текущей позиции уже переместился в конец блока формата. Это делается, опять-таки, для ускорения доступа к данным. Область данных блока всегда должна содержать четное число байтов, поэтому данные должны быть размещены по границам слов (2 байта). Если данные содержат нечетное число байтов, завершающая команда mmioAscend добавляет недостающий байт. Если количество байтов данных четное, команда mmioAscend не выполняет никаких действий. После функции mmioCreateChunk всегда желательно вызывать команду mmioAscend. Записав блок format, мы должны повторить те же самые операции для создания блока data: /* запись размера вложенного блока data */ lDataSize = (LONG)dwWaveDataSize; /*создание вложенного блока data, содержащего выборки*/ mmckinfoData.ckid = mmioFOURCC( 'd', 'a', 't', 'a' ); mmckinfoFmt.cksize = lDataSize; if( mmioCreateChunk ( hmmio, &mmckinfoData, 0 ) != 0 ) { ReportError( hWnd, IDS_CANTWRITEDATA); mmioClose ( hmmio, 0 ) ; return( FALSE ) ; } /* запись вложенного блока data */ if( mmioWrite( hmmio, lpWaveData, lDataSize ) != lDataSize ) { ReportError( hWnd, IDS_CANTWRITEDATA ); 84