Sound: Waves
Jeg sidder med bogen: "The Tomes Of Delphi - Win32 MultiMedia API" og har ihærdigt prøvet at forstå windows MDI. Indtil videre kan jeg afspille en wave-fil (Stort!!!), men det jeg gerne vil er at få sådan en fancy grafisk wave-form (ting) vist på min forms canvas. så jeg kan se lyd-udslaget fra den wave-fil jeg er ved at afspille. Jeg har prøvet at finde forskellige OpenSource komponenter fra nettet men de fleste er kun en MixerOutPut Meter/Peak (der i øvrigt kun virker, hvis dit lyd-kort understøtter MIXERCONTROL_CONTROLTYPE_PEAKMETER!) I stedet tænkte jeg om man ikke bare kunne bruge de data direkte fra wave-filen, som man alligevel bruger når man skal afspille filen! Problemet er så bare at jeg ikke aner hvordan jeg håndtere disse data. Umiddelbart ser det ud som det er en PChar der indeholder alle data. Bogen jeg har købt dækker åbenbart heller ikke dette (desværre). Nogen der kan hjælpe?Her er koden jeg bruger til at hente data fra min wave-file:
function mmioFourCC(A, B, C, D : Char) : DWord;
begin
Result := DWord(A) or DWord(B) shl 8 or DWord(C) shl 16 or DWord(D) shl 24;
end;
var
Amm_IO : HmmIO;
CurrentMMResult : MMResult;
AHandle : HWaveOut;
procedure GetDataFromFile(Handle : HWND; FileName : string);
var
FmtSize, DataSize : LongInt;
ARiffChunk, ASubChunk : MMCKInfo;
CurrentMMIOInfo : PMMIOInfo;
FmtInfo, TempData : PChar;
B : Boolean;
begin
if (Length(FileName) > 0) and FileExists(FileName) then
begin
Amm_IO := mmioOpen(PChar(FileName),nil,(MMIO_Read or MMIO_AllocBuf));
B := Amm_IO <> 0;
if not B then
begin
ShowMessage('Failed to open media file!');
Exit;
end;
CurrentMMResult := mmioSeek(Amm_IO, 0, Seek_Set);
ARiffChunk.fccType := mmioFourCC('W','A','V','E');
CurrentMMResult := mmioDescend(Amm_IO, @ARiffChunk, nil, MMIO_FindRiff);
ASubChunk.ckID := mmioFourCC('f','m','t',' ');
CurrentMMResult := mmioDescend(Amm_IO, @ASubChunk, @ARiffChunk, MMIO_FindChunk);
fmtSize := ASubChunk.ckSize;
GetMem(fmtInfo, fmtSize);
//Read the fmt (format) chunk in file
CurrentMMResult := mmioRead(Amm_IO, fmtInfo, fmtSize);
//Ascend out of fmt chunk back to the main RIFF chunk
CurrentMMResult := mmioAscend(Amm_IO, @ASubChunk, 0);
//Data chunk
ASubChunk.ckID := mmioFourCC('d', 'a', 't', 'a');
CurrentMMResult := mmioDescend(Amm_IO, @ASubChunk, @ARiffChunk, MMIO_FindChunk);
DataSize := ASubChunk.ckSize;
GetMem(TempData, DataSize);
//Read Data in file
CurrentMMResult := mmioRead(Amm_IO, TempData, DataSize);
//Close file
CurrentMMResult := mmioClose(Amm_IO, 0);
//------------------------------------------------------------------------------
// <<<< Her er det at jeg har alle mine data - jeg ved bare ikke hvordan jeg skal aflæse dem!!!!
ShowMessage(TempData);
//------------------------------------------------------------------------------
//Free memory
FreeMem(TempData);
FreeMem(fmtInfo);
end
else
ShowMessage('File doesn''t exists!');
end;
...
ZeroHero
