Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "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
4-16791
Simon
2003-12-01 21:56
2004.02.06
Как рлдменить оконную ф-цию окна, зная его хэндл?


14-16618
Sirgey
2004-01-15 02:04
2004.02.06
Защита программки


1-16433
AlexNx
2004-01-22 11:57
2004.02.06
Thread and Exception


14-16712
_none_
2004-01-16 19:37
2004.02.06
кто-нибудь знает, есть ли аналог старой игрушки mine bombers 3 ?


1-16413
k2
2004-01-28 07:01
2004.02.06
InnoSetup





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский