Оригинальный DVD-ROM: eXeL@B DVD !
eXeL@B ВИДЕОКУРС !

ВИДЕОКУРС ВЗЛОМ
выпущен 28 января!


УЗНАТЬ БОЛЬШЕ >>
Домой | Статьи | RAR-cтатьи | FAQ | Форум | Скачать | Видеокурс
Новичку | Ссылки | Программирование | Интервью | Архив | Связь

БОЛЬШОЙ FAQ ПО DELPHI



Получить информацию о WAV файле


 unit W32Waves;
 { Unit for accessing Windows PCM wave file informations
   By Ulli Conrad <uconrad@gmx.net> }
 
 interface
 
 uses 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;
 
 implementation
 
 type
   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.
 




<< ВЕРНУТЬСЯ В ОГЛАВЛЕНИЕ



Материалы находятся на сайте https://exelab.ru/pro/



Оригинальный DVD-ROM: eXeL@B DVD !


Вы находитесь на EXELAB.rU
Проект ReactOS