unit W32Waves;
{ Unit for accessing Windows PCM wave file informations
By Ulli Conrad <uconrad@gmx.net> }interfaceuses SysUtils, Windows, MMSystem, Dialogs;
type
PWaveInformation = ^tWaveInformation;
TWaveInformation = record
WaveFormat: Word; { Wave format identifier }
Channels: Word; { Mono=1, Stereo=2 }
SampleRate: Longint; { Sample rate in Hertz }
BitsPerSample: Word; { Resolution, e.g. 8 or 16 Bit }
SamplesNumber: Longint; { Number of samples }
Length: Extended; { Sample length in seconds }
ValidWave: bool; { Specifies if the file could be read }end;
const{ Constants for wave format identifier }
WAVE_FORMAT_PCM = $0001; { Windows PCM }
WAVE_FORMAT_G723_ADPCM = $0014; { Antex ADPCM }
WAVE_FORMAT_ANTEX_ADPCME = $0033; { Antex ADPCME }
WAVE_FORMAT_G721_ADPCM = $0040; { Antex ADPCM }
WAVE_FORMAT_APTX = $0025; { Audio Processing Technology }
WAVE_FORMAT_AUDIOFILE_AF36 = $0024; { Audiofile, Inc. }
WAVE_FORMAT_AUDIOFILE_AF10 = $0026; { Audiofile, Inc. }
WAVE_FORMAT_CONTROL_RES_VQLPC = $0034; { Control Resources Limited }
WAVE_FORMAT_CONTROL_RES_CR10 = $0037; { Control Resources Limited }
WAVE_FORMAT_CREATIVE_ADPCM = $0200; { Creative ADPCM }
WAVE_FORMAT_DOLBY_AC2 = $0030; { Dolby Laboratories }
WAVE_FORMAT_DSPGROUP_TRUESPEECH = $0022; { DSP Group, Inc }
WAVE_FORMAT_DIGISTD = $0015; { DSP Solutions, Inc. }
WAVE_FORMAT_DIGIFIX = $0016; { DSP Solutions, Inc. }
WAVE_FORMAT_DIGIREAL = $0035; { DSP Solutions, Inc. }
WAVE_FORMAT_DIGIADPCM = $0036; { DSP Solutions ADPCM }
WAVE_FORMAT_ECHOSC1 = $0023; { Echo Speech Corporation }
WAVE_FORMAT_FM_TOWNS_SND = $0300; { Fujitsu Corp. }
WAVE_FORMAT_IBM_CVSD = $0005; { IBM Corporation }
WAVE_FORMAT_OLIGSM = $1000; { Ing C. Olivetti & C., S.p.A. }
WAVE_FORMAT_OLIADPCM = $1001; { Ing C. Olivetti & C., S.p.A. }
WAVE_FORMAT_OLICELP = $1002; { Ing C. Olivetti & C., S.p.A. }
WAVE_FORMAT_OLISBC = $1003; { Ing C. Olivetti & C., S.p.A. }
WAVE_FORMAT_OLIOPR = $1004; { Ing C. Olivetti & C., S.p.A. }
WAVE_FORMAT_IMA_ADPCM = $0011; { Intel ADPCM }
WAVE_FORMAT_DVI_ADPCM = $0011; { Intel ADPCM }
WAVE_FORMAT_UNKNOWN = $0000;
WAVE_FORMAT_ADPCM = $0002; { Microsoft ADPCM }
WAVE_FORMAT_ALAW = $0006; { Microsoft Corporation }
WAVE_FORMAT_MULAW = $0007; { Microsoft Corporation }
WAVE_FORMAT_GSM610 = $0031; { Microsoft Corporation }
WAVE_FORMAT_MPEG = $0050; { Microsoft Corporation }
WAVE_FORMAT_NMS_VBXADPCM = $0038; { Natural MicroSystems ADPCM }
WAVE_FORMAT_OKI_ADPCM = $0010; { OKI ADPCM }
WAVE_FORMAT_SIERRA_ADPCM = $0013; { Sierra ADPCM }
WAVE_FORMAT_SONARC = $0021; { Speech Compression }
WAVE_FORMAT_MEDIASPACE_ADPCM = $0012; { Videologic ADPCM }
WAVE_FORMAT_YAMAHA_ADPCM = $0020; { Yamaha ADPCM }function GetWaveInformationFromFile(FileName: string; Info: pWaveInformation): bool;
implementationtype
TCommWaveFmtHeader = record
wFormatTag: Word; { Fixed, must be 1 }
nChannels: Word; { Mono=1, Stereo=2 }
nSamplesPerSec: Longint; { SampleRate in Hertz }
nAvgBytesPerSec: Longint;
nBlockAlign: Word;
nBitsPerSample: Word; { Resolution, e.g. 8 or 16 }
cbSize: Longint; { Size of extra information in the extended fmt Header }end;
function GetWaveInformationFromFile(FileName: string; Info: pWaveInformation): bool;
var
hdmmio: HMMIO;
mmckinfoParent: TMMCKInfo;
mmckinfoSubchunk: TMMCKInfo;
Fmt: TCommWaveFmtHeader;
Samples: Longint;
begin
Result := False;
FillChar(Info^, SizeOf(TWaveInformation), #0); { Initialize first }
hdmmio := mmioOpen(PChar(FileName), nil, MMIO_READ);
if (hdmmio = 0) then
Exit;
{* Locate a 'RIFF' chunk with a 'WAVE' form type
* to make sure it's a WAVE file.
*}
mmckinfoParent.fccType := mmioStringToFOURCC('WAVE', MMIO_TOUPPER);
if (mmioDescend(hdmmio, PMMCKINFO(@mmckinfoParent), nil, MMIO_FINDRIFF) <> 0) then
Exit;
{* Now, find the format chunk (form type 'fmt '). It should be
* a subchunk of the 'RIFF' parent chunk.
*}
mmckinfoSubchunk.ckid := mmioStringToFOURCC('fmt ', 0);
if (mmioDescend(hdmmio, @mmckinfoSubchunk, @mmckinfoParent, MMIO_FINDCHUNK) <> 0) then
Exit;
// Read the format chunk. if (mmioRead(hdmmio, PChar(@fmt), Longint(SizeOf(TCommWaveFmtHeader))) <>
Longint(SizeOf(TCommWaveFmtHeader))) then
Exit;
Info^.WaveFormat := fmt.wFormatTag;
Info^.Channels := fmt.nChannels;
Info^.SampleRate := fmt.nSamplesPerSec;
Info^.BitsPerSample := fmt.nBitsPerSample;
mmioAscend(hdmmio, @mmckinfoSubchunk, 0); // Ascend out of the format subchunk.
mmckinfoSubchunk.ckid := mmioStringToFOURCC('data', 0); // Find the data subchunk. if (mmioDescend(hdmmio, @mmckinfoSubchunk, @mmckinfoParent, MMIO_FINDCHUNK) <> 0) then
Exit;
Info^.SamplesNumber := mmckinfoSubchunk.cksize; // Get the size of the data subchunk.
Samples := (Info^.SamplesNumber * 8 * Info^.Channels) div Info^.BitsPerSample;
Info^.Length := Samples / Info^.Samplerate;
mmioClose(hdmmio, 0); // We're done with the file, close it.
Info^.ValidWave := True;
Result := True;
end;
end.
Программный модуль Delphi под именем W32Waves предназначен для доступа к информации о файле Windows PCM-волны (WAV). В этом разделе кода:
Модуль определяет тип записи TWaveInformation, который содержит различные свойства файла WAV, такие как:
WaveFormat: целочисленное значение, указывающее идентификатор формата волны
Channels: целочисленное значение, указывающее количество каналов (моно/стерео)
SampleRate: длинное целочисленное значение, представляющее частоту дискретизации в герцах
BitsPerSample: целочисленное значение, представляющее разрешение (например, 8 или 16 бит)
SamplesNumber: длинное целочисленное значение, представляющее количество образцов
Length: расширенное значение, представляющее длину образца в секундах
ValidWave: булевое значение, указывающее, была ли успешно прочитана файл
Модуль определяет несколько констант для идентификаторов форматов волны, включая PCM, ADPCM и другие.
Функция GetWaveInformationFromFile принимает два параметра:
FileName: строка, представляющая путь к файлу WAV
Info: указатель на запись TWaveInformation, которая будет заполнена информацией о файле WAV
Функция инициализирует пустую запись TWaveInformation с помощью процедуры FillChar.
Затем она открывает указанный файл WAV с помощью функции mmioOpen и проверяет, является ли файл валидным.
Если файл валиден, она находит чанк 'RIFF' с формой типа 'WAVE' для подтверждения, что это файл WAV.
Далее она находит чанк формата ('fmt ') внутри чанка 'RIFF' с помощью функции mmioDescend.
Она читает данные чанка формата в запись TCommWaveFmtHeader с помощью функции mmioRead.
Функция заполняет запись TWaveInformation значениями из чанка формата:
WaveFormat: идентификатор формата волны
Channels: количество каналов (моно/стерео)
SampleRate: частота дискретизации в герцах
BitsPerSample: разрешение (например, 8 или 16 бит)
Функция находит и читает подчанк данных внутри чанка 'RIFF' с помощью функции mmioDescend.
Она рассчитывает количество образцов на основе частоты дискретизации, количества каналов и разрешения.
Наконец, она закрывает файл с помощью функции mmioClose и устанавливает ValidWave в True.
Функция возвращает булевое значение, указывающее, был ли успешно прочитан файл WAV.
В целом, этот модуль обеспечивает доступ к информации о файлах WAV в программах Delphi.
Получение информации о формате WAV-файла.
Комментарии и вопросы
Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS
Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.