BugInTheSYS

Untitled

Feb 19th, 2013
54
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. type
  2.   TRIFFHeader = packed record
  3.     ID : array[0..3] of Char;
  4.     Length: DWORD;
  5.     WaveID: array[0..3] of Char;
  6.   end;
  7.   TFormatHeader = packed record
  8.     ID : array[0..3] of Char;
  9.     Length : DWORD;
  10.     FormatTag : WORD;
  11.     Channels : WORD;
  12.     SamplesPerSec : DWORD;
  13.     AvgBytesPerSec: DWORD;
  14.     BlockAlign : WORD;
  15.     BitsPerSample : WORD;
  16.   end;
  17.   TDataHeader = packed record
  18.     ID : array[0..3] of Char;
  19.     Length: DWORD;
  20.   end;
  21.   TWaveHeader = packed record
  22.     RIFF: TRIFFHeader;
  23.     Format: TFormatHeader;
  24.     Data: TDataHeader;
  25.   end;
  26.   TWaveSample = packed record
  27.     Left: Smallint;
  28.     Right: Smallint;
  29.   end;
  30.   TWaveContent = Array of TWaveSample;
  31.  
  32. procedure SaveWAVEFile(WaveContent: TWaveContent; FileName: String);
  33. var
  34.   WaveHeader: TWaveHeader;
  35.   FStream: TFileStream;
  36.   WaveLength: Integer;
  37. begin
  38.   try
  39.     FStream := TFileStream.Create(FileName, fmCreate);
  40.     WaveLength := length(WaveContent);
  41.  
  42.     with WaveHeader do begin
  43.       with RIFF do begin
  44.         ID := 'RIFF';
  45.         Length := 4 + WaveLength * 4 + SizeOf(TFormatHeader) + SizeOf(TDataHeader);
  46.         WaveID := 'WAVE';
  47.       end;
  48.       with Format do begin
  49.         ID := 'fmt ';
  50.         Length := SizeOf(TFormatHeader)-8;
  51.         FormatTag := $0001;
  52.         Channels := 2;
  53.         SamplesPerSec := 44100;
  54.         AvgBytesPerSec := 176400;
  55.         BlockAlign := 4;
  56.         BitsPerSample := 16;
  57.       end;
  58.       with Data do begin
  59.         ID := 'data';
  60.         Length := WaveLength * 4;
  61.       end;
  62.     end;
  63.  
  64.     FStream.Write(WaveHeader, SizeOf(TWaveHeader));
  65.     FStream.Write(WaveContent, 2048{WaveLength * 4});
  66.   finally
  67.     FStream.Free;
  68.   end;
  69. end;
  70.  
  71. function LoadWAVEFile(FileName: String): TWaveContent;
  72. var
  73.   WaveHeader: TWaveHeader;
  74.   FStream: TFileStream;
  75.   WaveLength: Integer;
  76. begin
  77.   try
  78.     if FileExists(FileName) then begin
  79.       FStream := TFileStream.Create(FileName,fmOpenRead);
  80.       FStream.Read(WaveHeader,SizeOf(TWaveHeader)); // Den kompletten Header auslesen
  81.       WaveLength := WaveHeader.Data.Length * 8 div (WaveHeader.Format.BitsPerSample
  82.                     * WaveHeader.Format.Channels); // Länge des Arrays berechnen...
  83.       SetLength(Result, WaveLength);
  84.       FStream.Read(Result, WaveLength * 4);
  85.       // Die Größe ist 4x so groß wie die Länge, weil 2 Channels * 2 Bytes / Sample
  86.     end;
  87.   finally
  88.     FStream.Free
  89.   end;
  90. end;
Advertisement
Add Comment
Please, Sign In to add comment