Форум: "Media";
Текущий архив: 2004.02.06;
Скачать: [xml.tar.bz2];
ВнизРабота с waveOut Найти похожие ветки
← →
Il'ya (2003-09-28 13:47) [0]Люди, подскажите как правильно работать с waveOut, желательно на примере (допустим как проиграть wav-файлик через waveOut).
← →
Mihey (2003-09-28 20:08) [1]Пробуй ссылку (открывается, но медленно):
http://delphiworld.narod.ru/base/audio_example.html
← →
misterix (2003-10-07 12:00) [2]
unit WaveLoaderUnit;
interface
uses
Windows, Messages, SysUtils, Classes, MMSystem;
function LoadWaveFile( AFileName: String;
var Format: PWaveFormatEx;
var Size: DWORD;
var Data: Pointer): Boolean;
implementation
function LoadWaveFile( AFileName: String;
var Format: PWaveFormatEx;
var Size: DWORD;
var Data: Pointer): Boolean;
var
mmioHandle: HMMIO;
mmRIFFInfo: TMMCKINFO;
mmChunkInfo: TMMCKINFO;
mmRes: MMRESULT;
BytesRead: DWORD;
begin
Result := False;
mmioHandle := mmioOpen(PChar(AFileName),nil,MMIO_READ or MMIO_ALLOCBUF);
if not Boolean(mmioHandle) then exit;
mmRIFFInfo.fccType := $45564157; // "WAVE"
mmRes := mmioDescEnd(mmioHandle,@mmRIFFInfo,nil,MMIO_FINDRIFF);
if mmRes <> MMSYSERR_NOERROR then exit;
mmChunkInfo.ckid := $20746D66; // "fmt "
mmRes := mmioDescEnd(mmioHandle,@mmChunkInfo,@mmRIFFInfo,MMIO_FINDCHUNK);
if mmRes <> MMSYSERR_NOERROR then exit;
BytesRead := mmioRead(mmioHandle,PChar(Format),SizeOf(Format^));
if BytesRead = - 1 then exit;
mmRes := mmioAscEnd(mmioHandle,@mmChunkInfo,0);
if mmRes <> MMSYSERR_NOERROR then exit;
mmChunkInfo.ckid := $61746164; // "data"
mmRes := mmioDescEnd(mmioHandle,@mmChunkInfo,@mmRIFFInfo,MMIO_FINDCHUNK);
if mmRes <> MMSYSERR_NOERROR then exit;
Size := mmChunkInfo.cksize;
try
GetMem(Data,Size);
except
on EOutOfMemory do
Exit;
end;
BytesRead := mmioRead(mmioHandle,PChar(Data),Size);
if BytesRead = - 1 then exit;
mmioClose(mmioHandle,0);
Result := True;
end;
end.
//////////////////////////////////////////////////////////////
unit Main;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
StdCtrls, WaveLoaderUnit, MMSystem;
type
TWaveFile = class
private
FFormat: PWaveFormatEx;
FSize: Integer;
FData: Pointer;
FFileName: String;
procedure SetFileName(Value: String);
public
constructor Create;
destructor Destroy; override;
property FileName: String read FFileName write SetFileName;
property Format: PWaveFormatEx read FFormat;
property Size: Integer read FSize;
property Data: Pointer read FData;
end;
TMainFrm = class(TForm)
Open: TButton;
OpenDialog1: TOpenDialog;
procedure OpenClick(Sender: TObject);
procedure FormCreate(Sender: TObject);
procedure FormDestroy(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
procedure WaveOutMess(var msg: TMessage); message MM_WOM_DONE;
end;
var
MainFrm: TMainFrm;
WaveFile: TWaveFile;
WaveHdr: PWaveHdr;
WaveOut: HWAVEOUT;
implementation
{$R *.DFM}
procedure TWaveFile.SetFileName(Value: String);
begin
if Assigned(FData) then begin
FreeMem(FData);
FData := nil;
end;
if LoadWaveFile(Value,FFormat,FSize,FData) then
FFileName := Value
else
FFileName := "";
end;
constructor TWaveFile.Create;
begin
Inherited;
New(FFormat);
end;
destructor TWaveFile.Destroy;
begin
if Assigned(FData) then begin
FreeMem(FData);
FData := nil;
end;
Dispose(FFormat);
Inherited;
end;
procedure TMainFrm.FormCreate(Sender: TObject);
begin
WaveFile := TWaveFile.Create;
end;
procedure TMainFrm.FormDestroy(Sender: TObject);
begin
WaveFile.Free;
end;
procedure TMainFrm.WaveOutMess(var msg: TMessage);
begin
waveoutUnPrepareHeader(msg.WParam,Pointer(msg.LParam),SizeOf(TWaveHdr));
Dispose(Pointer(msg.LParam));
waveoutClose(msg.WParam);
Open.Enabled := True;
end;
procedure TMainFrm.OpenClick(Sender: TObject);
var
mmRes: MMRESULT;
begin
if OpenDialog1.Execute then begin
WaveFile.FileName := OpenDialog1.FileName;
if Boolean(WaveFile.Data) then begin
mmRes := waveoutOpen(@WaveOut,0,WaveFile.Format,
Handle,0,CALLBACK_WINDOW);
if mmRes <> MMSYSERR_NOERROR then begin
ShowMessage("
Страницы: 1 вся ветка
Форум: "Media";
Текущий архив: 2004.02.06;
Скачать: [xml.tar.bz2];
Память: 0.47 MB
Время: 0.052 c