Разные самоделки


АНАЛОГО-ЦИФРОВОЙ ПРЕОБРАЗОВАТЕЛЬ ИЗ ЗВУКОВОЙ КАРТЫ - часть 2


Практически файл в формате 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)




- Начало -  - Назад -  - Вперед -



Книжный магазин