Как правило, звуковая карта (рис.1) имеет два сдвоенных (стереофонических) входа и два таких же выхода. Первый (линейный) вход рассчитан на входные сигналы с амплитудой около 1 В, второй — микрофонный, для более слабых сигналов. При использовании звуковой карты в качестве аналого-цифрового преобразователя можно использовать любой из этих входов — в зависимости от уровня обрабатываемого сигнала.
Данные, имеющие отношение к мультимедиа, хранятся в файлах в так называемом RIFF-формате (Resource Interchange File Format — формат файла для обмена ресурсами) [1]. Файл в формате RIFF содержит вложенные фрагменты (chunk's). Внешний фрагмент состоит из заголовка и области данных (рис.2). Первое двойное слово заголовка содержит четырехсимвольный код, который идентифицирует данные, хранящиеся во фрагменте.
Второе двойное слово заголовка — размер области данных в байтах (без учета размера самого заголовка). Область данных имеет переменную длину с условием ее выравнивания на границу слова и дополнения в конце нулевым байтом до целого числа слов в случае необходимости.
Формат RIFF не описывает формат данных. Практически файл в формате RIFF может содержать любые данные для мультимедиа, причем формат данных зависит от типа данных.
Область, обозначенная на рис.2 как "Данные", могут содержать внутри себя другие фрагменты. Для файла, в котором хранятся звуковые данные (wav-файл), эта область содержит идентификатор данных "WAVE", фрагмент формата звуковых данных "fmt" (три символа "fmt" и пробел на конце), а также фрагмент звуковых данных (рис.2). Файл может дополнительно содержать фрагменты других типов, поэтому не следует думать, что заголовок wav-файла имеет фиксируемый формат. Например в файле может присутствовать фрагмент "LIST" или "INFO", содержащий информацию о правах .копирования и другую дополнительную информацию.
Рассмотрим, как происходит запись данных. Вначале требуется открыть устройство ввода, указав ему формат звуковых данных. Затем нужно заказать один или несколько блоков памяти и подготовить их для ввода, вызвав специальную функцию. После этого подготовленные блоки нужно по мере необходимости передавать драйверу устройства ввода, который заполняет их записанными звуковыми данными. Для сохранения записанных данных в wav-файле приложение должно сформировать и записать в файл заяаловок wav-файла и звуковые данные из подготовленных заполненных драйвером устройств ввода блоков памяти.
Ниже представлен фрагмент программы, позволяющий записать блок данных в файл, что необходимо при использовании звуковой карты в качестве аналого-цифрового преобразователя:
uses
SysUtils, MMSystem;
type
TWaveData = array[0..0) of word ;
const
Discret = 22050;
WaveHdr:TWaveHdr=(
lpData : nil; (address of the waveform buffer)
dwBufferLength : 0; (length, in bytes, of the buffer)
dwBytesRecorded : 0; (How much data is in the buffer )
dwUser : 0;
dwFlags : 0;
dwLoops : 0;
IpMext : nil;
reserved : 0
) ;
WaveFormat: TWaveFormatEx=(
wFormatTag : WAVE_FORMAT_PCM;
nChannels : 1;
nSamplesPerSec : Discret;
nAvgBytesPerSec : Discret;
nBllockAlign : 1;
wBitsPerSample : 8;
csSize : 0
) ;
var
WaveDate : ^TWaveDate;
HSoundDevice : HWaveIn;
hfile : HMMIO;
res : MMResult;
begin
with WaveHdr do
begin
dwBufferLehgth : =round(Discret/10);
dwBytesRecorded: =round(Discret/10);
GetMem(WaveData, dwBytesRecorded);
lpData : =PChar(WaveData);
end;
res : =waveInOpen (@HSoundDevice, WAVE_MAPPER, @WaveFormat, 0,0,0);
res : =waveInPrepareHeader (HSoundDevice, @WaveHdr, SizeOf (WaveHdr));
res : =waveInUnprepareHeader (HSoundDevice, @WaveHdr,SizeOf(WaveHdr)) ;
FreeMem (WaveData) ;
res: =waveInStart (HSoundDevice) ;
hfile:=mmio0pen ("d: \work\data_1. txt",nil,
MMIO_CREATE or MMIO_READWRITE);
mmioWrite(hfile,WaveHdr.IpData, WaveHdr,dwBytesRecorded);
mmioClose(hfile,0);
waveInReset(HSoundDevice) ;
waveInClose(HSoundDevice) ;
end.
В отличие от интерфейса МСI, где многие параметры принимаются по умолчанию, интерфейс низкого уровня требует внимательного и тщательного учета всех деталей процесса записи и чтения. В качестве компенсации за дополнительно затраченные усилия вы получаете большую гибкость и возможность работать не только со звуком, но также и с произвольными сигналами в реальном времени.
Литература
1. Фролов А.В., Фролов Г.В. Мультимедиа для Windows. Руководство для программиста. — М,"ДИАЛОГ-МИФИ", 1994, 284 с. (Библиотека системного программиста; Т. 15).
О.БАРАНОВСКИЙ
220116,г.Минск-116,а/я202, БГУ, фак. РФиЭ, 5 курс.
(РЛ 3/98)