type { Real structure of WAV file header } WAVRecord = record { RIFF file header } RIFFHeader: array [1..4] of Char; { Must be "RIFF" } FileSize: Integer; { Must be "RealFileSize - 8" } WAVEHeader: array [1..4] of Char; { Must be "WAVE" } { Format information } FormatHeader: array [1..4] of Char; { Must be "fmt " } FormatSize: Integer; { Must be 16 (decimal) } FormatCode: Word; { Must be 1 } ChannelNumber: Word; { Number of channels } SampleRate: Integer; { Sample rate (hz) } BytesPerSecond: Integer; { Bytes per second } BytesPerSample: Word; { Bytes per sample } BitsPerSample: Word; { Bits per sample } { Data area } DataHeader: array [1..4] of Char; { Must be "data" } DataSize: Integer; { Data size } end;
function ReadWAV(const FileName: string; var WAVData: WAVRecord): Boolean; var SourceFile: file; Transferred: Integer; begin try Result := true; { Set read-access and open file } AssignFile(SourceFile, FileName); FileMode := 0; Reset(SourceFile, 1); { Read header } BlockRead(SourceFile, WAVData, 44, Transferred); CloseFile(SourceFile); { if transfer is not complete } if Transferred < 44 then Result := false; except { Error } Result := false; end; end;
function HeaderIsValid(const WAVData: WAVRecord): Boolean; begin Result := true; { Validation } if WAVData.RIFFHeader <> 'RIFF' then Result := false; if WAVData.WAVEHeader <> 'WAVE' then Result := false; if WAVData.FormatHeader <> 'fmt ' then Result := false; if (WAVData.ChannelNumber <> WAV_CM_MONO) and (WAVData.ChannelNumber <> WAV_CM_STEREO) then Result := false; end;
function TWAVfile.FGetDuration: Double; begin if FValid then Result := (FFileSize - 44) * 8 / FSampleRate / FBitsPerSample / FChannelModeID else Result := 0; end;
{ ********************** Public functions & procedures ********************** }
constructor TWAVfile.Create; begin inherited; FResetData; end;
function TWAVfile.ReadFromFile(const FileName: string): Boolean; var WAVData: WAVRecord; begin { Reset and load header data from file to variable } FResetData; Result := ReadWAV(FileName, WAVData); { Process data if loaded and header valid } if (Result) and (HeaderIsValid(WAVData)) then begin FValid := true; { Fill properties with header data } FChannelModeID := WAVData.ChannelNumber; FSampleRate := WAVData.SampleRate; FBitsPerSample := WAVData.BitsPerSample; FFileSize := WAVData.FileSize + 8; end; end;
ok det er helt klart for længe siden jeg sidst har leget med delphi .. håber du gider hjælpe mig en lille smule mere. Jeg har aldrig set den der ShowMessageFmt før, og jeg kan ikke gennemskue hvad ('%.of',[T.Duration]) spytter ud. T.Duration laver en double og den kan jeg heller ikke addere til en integer.
Følgende linie regner intervallet ud for mig: FormMain.Ttimer.Interval := 60000*(StrToInt(FormMain.Einterval.Text));
der skal længden af wave-filen lægges til så det bliver noget i stil med
og vupti så virker det, nu har jeg også kun været i gang siden middag hehe :)
endnu engang mange tak!
/Roth
Synes godt om
Ny brugerNybegynder
Din løsning...
Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.