ReadWave.pas
上传用户:wanyu_2000
上传日期:2021-02-21
资源大小:527k
文件大小:6k
源码类别:

DVD

开发平台:

Delphi

  1. {-----------------------------------------------------------------------------
  2.  Unit Name: ReadWave
  3.  Author:    Dancemammal
  4.  Purpose:
  5.  History:
  6. -----------------------------------------------------------------------------}
  7. unit ReadWave;
  8. interface
  9. uses SysUtils, Windows, MMSystem, Dialogs;
  10. type
  11.   PWaveInformation = ^tWaveInformation;
  12.   TWaveInformation = record
  13.     WaveFormat: Word;         { Wave format identifier }
  14.     Channels: Word;         { Mono=1, Stereo=2 }
  15.     SampleRate: Longint;      { Sample rate in Hertz }
  16.     BytesPerSecond : Longint;
  17.     BitsPerSample: Word;         { Resolution, e.g. 8 or 16 Bit }
  18.     SamplesNumber: Longint;      { Number of samples }
  19.     Length: Extended;     { Sample length in seconds }
  20.     SectorCount : Integer;   { Data length }
  21.     ValidWave: bool;         { Specifies if the file could be read }
  22.   end;
  23. const                            { Constants for wave format identifier }
  24.   WAVE_FORMAT_PCM = $0001;   { Windows PCM }
  25.   WAVE_FORMAT_G723_ADPCM = $0014;   { Antex ADPCM }
  26.   WAVE_FORMAT_ANTEX_ADPCME = $0033;   { Antex ADPCME }
  27.   WAVE_FORMAT_G721_ADPCM = $0040;   { Antex ADPCM }
  28.   WAVE_FORMAT_APTX = $0025;   { Audio Processing Technology }
  29.   WAVE_FORMAT_AUDIOFILE_AF36 = $0024;   { Audiofile, Inc. }
  30.   WAVE_FORMAT_AUDIOFILE_AF10 = $0026;   { Audiofile, Inc. }
  31.   WAVE_FORMAT_CONTROL_RES_VQLPC = $0034;   { Control Resources Limited }
  32.   WAVE_FORMAT_CONTROL_RES_CR10 = $0037;   { Control Resources Limited }
  33.   WAVE_FORMAT_CREATIVE_ADPCM = $0200;   { Creative ADPCM }
  34.   WAVE_FORMAT_DOLBY_AC2 = $0030;   { Dolby Laboratories }
  35.   WAVE_FORMAT_DSPGROUP_TRUESPEECH = $0022;   { DSP Group, Inc }
  36.   WAVE_FORMAT_DIGISTD = $0015;   { DSP Solutions, Inc. }
  37.   WAVE_FORMAT_DIGIFIX = $0016;   { DSP Solutions, Inc. }
  38.   WAVE_FORMAT_DIGIREAL = $0035;   { DSP Solutions, Inc. }
  39.   WAVE_FORMAT_DIGIADPCM = $0036;   { DSP Solutions ADPCM }
  40.   WAVE_FORMAT_ECHOSC1 = $0023;   { Echo Speech Corporation }
  41.   WAVE_FORMAT_FM_TOWNS_SND = $0300;   { Fujitsu Corp. }
  42.   WAVE_FORMAT_IBM_CVSD = $0005;   { IBM Corporation }
  43.   WAVE_FORMAT_OLIGSM = $1000;   { Ing C. Olivetti & C., S.p.A. }
  44.   WAVE_FORMAT_OLIADPCM = $1001;   { Ing C. Olivetti & C., S.p.A. }
  45.   WAVE_FORMAT_OLICELP = $1002;   { Ing C. Olivetti & C., S.p.A. }
  46.   WAVE_FORMAT_OLISBC = $1003;   { Ing C. Olivetti & C., S.p.A. }
  47.   WAVE_FORMAT_OLIOPR = $1004;   { Ing C. Olivetti & C., S.p.A. }
  48.   WAVE_FORMAT_IMA_ADPCM = $0011;   { Intel ADPCM }
  49.   WAVE_FORMAT_DVI_ADPCM = $0011;   { Intel ADPCM }
  50.   WAVE_FORMAT_UNKNOWN = $0000;
  51.   WAVE_FORMAT_ADPCM = $0002;   { Microsoft ADPCM }
  52.   WAVE_FORMAT_ALAW = $0006;   { Microsoft Corporation }
  53.   WAVE_FORMAT_MULAW = $0007;   { Microsoft Corporation }
  54.   WAVE_FORMAT_GSM610 = $0031;   { Microsoft Corporation }
  55.   WAVE_FORMAT_MPEG = $0050;   { Microsoft Corporation }
  56.   WAVE_FORMAT_NMS_VBXADPCM = $0038;   { Natural MicroSystems ADPCM }
  57.   WAVE_FORMAT_OKI_ADPCM = $0010;   { OKI ADPCM }
  58.   WAVE_FORMAT_SIERRA_ADPCM = $0013;   { Sierra ADPCM }
  59.   WAVE_FORMAT_SONARC = $0021;   { Speech Compression }
  60.   WAVE_FORMAT_MEDIASPACE_ADPCM = $0012;   { Videologic ADPCM }
  61.   WAVE_FORMAT_YAMAHA_ADPCM = $0020;   { Yamaha ADPCM }
  62. function GetWaveInformationFromFile(FileName: string): pWaveInformation;
  63. implementation
  64. type
  65.   TCommWaveFmtHeader = record
  66.     wFormatTag: Word;                  { Fixed, must be 1 }
  67.     nChannels: Word;                  { Mono=1, Stereo=2 }
  68.     nSamplesPerSec: Longint;               { SampleRate in Hertz }
  69.     nAvgBytesPerSec: Longint;
  70.     nBlockAlign: Word;
  71.     nBitsPerSample: Word;                  { Resolution, e.g. 8 or 16 }
  72.     cbSize: Longint;               { Size of extra information in the extended fmt Header }
  73.   end;
  74. function GetWaveInformationFromFile(FileName: string): pWaveInformation;
  75. var
  76.   hdmmio: HMMIO;
  77.   mmckinfoParent: TMMCKInfo;
  78.   mmckinfoSubchunk: TMMCKInfo;
  79.   Fmt: TCommWaveFmtHeader;
  80.   Samples: Longint;
  81.   Info: pWaveInformation;
  82. begin
  83.   New(Info);
  84.   Result := Info;
  85.   FillChar(Info^, SizeOf(TWaveInformation), #0); { Initialize first }
  86.   hdmmio := mmioOpen(PChar(FileName), nil, MMIO_READ);
  87.   if (hdmmio = 0) then
  88.     Exit;
  89.       {* Locate a 'RIFF' chunk with a 'WAVE' form type
  90.        * to make sure it's a WAVE file.
  91.        *}
  92.   mmckinfoParent.fccType := mmioStringToFOURCC('WAVE', MMIO_TOUPPER);
  93.   if (mmioDescend(hdmmio, PMMCKINFO(@mmckinfoParent), nil, MMIO_FINDRIFF) <> 0) then
  94.     Exit;
  95.       {* Now, find the format chunk (form type 'fmt '). It should be
  96.        * a subchunk of the 'RIFF' parent chunk.
  97.        *}
  98.   mmckinfoSubchunk.ckid := mmioStringToFOURCC('fmt ', 0);
  99.   if (mmioDescend(hdmmio, @mmckinfoSubchunk, @mmckinfoParent, MMIO_FINDCHUNK) <> 0) then
  100.     Exit;
  101.   // Read the format chunk.
  102.   if (mmioRead(hdmmio, PChar(@fmt), Longint(SizeOf(TCommWaveFmtHeader))) <>
  103.     Longint(SizeOf(TCommWaveFmtHeader))) then
  104.     Exit;
  105.   Info^.WaveFormat    := fmt.wFormatTag;
  106.   Info^.Channels      := fmt.nChannels;
  107.   Info^.SampleRate    := fmt.nSamplesPerSec;
  108.   Info^.BitsPerSample := fmt.nBitsPerSample;
  109.   Info^.BytesPerSecond := fmt.nAvgBytesPerSec;
  110.   mmioAscend(hdmmio, @mmckinfoSubchunk, 0); // Ascend out of the format subchunk.
  111.   mmckinfoSubchunk.ckid := mmioStringToFOURCC('data', 0); // Find the data subchunk.
  112.   if (mmioDescend(hdmmio, @mmckinfoSubchunk, @mmckinfoParent, MMIO_FINDCHUNK) <> 0) then
  113.     Exit;
  114.   Info^.SamplesNumber := mmckinfoSubchunk.cksize; // Get the size of the data subchunk.
  115.  if (Info^.SamplesNumber mod 2352) > 0 then
  116.     Info^.SectorCount := (Info^.SamplesNumber div 2352) + 1
  117.   else // bigger so add on a full sector!
  118.     Info^.SectorCount := (Info^.SamplesNumber div 2352);
  119.   Samples      := (Info^.SamplesNumber * 8 * Info^.Channels) div Info^.BitsPerSample;
  120.   Info^.Length := (Samples / Info^.BytesPerSecond) * 75;
  121.   mmioClose(hdmmio, 0); // We're done with the file, close it.
  122.   Info^.ValidWave := True;
  123.   Result          := Info;
  124. end;
  125. end.
  126.