Главная страница
    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.035 c
1-16463
Bimer
2004-01-28 00:32
2004.02.06
Incompatible types: Array and String


1-16278
ruslan_as
2004-01-26 10:13
2004.02.06
Как к дате добавить N дней


1-16264
MakNik
2004-01-26 09:58
2004.02.06
TEDIT


4-16801
Sergey SP
2003-11-28 15:17
2004.02.06
Выбрать пункт меню


3-16165
Sfera
2004-01-14 07:09
2004.02.06
Интерполяция в тоаблице





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский