Delphi에서 DirectSound (8): IDirectSound 8.DuplicateSoundBuffer ()와 IDirectSoundBuffer.GetStatus()

3627 단어 Delphi
IDirectSoundBuffer.GetStatus () 는 재생 중인지, 순환 재생으로 지정되었는지 등 버퍼의 현재 상태를 가져오는 데 사용됩니다.
IDirectSound8.DuplicateSoundBuffer () 는 존재하는 버퍼에 따라 버퍼 복사본을 만드는 것입니다. 이것은 인용과 유사합니다.그것을 통해 같은 소리를 교차해서 재생할 수 있다.
복제 버퍼는 주 버퍼를 복제할 수 없습니다.
예:


unit Unit1;



interface



uses

  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,

  Dialogs, StdCtrls;



type

  TForm1 = class(TForm)

    Button1: TButton;     //   buf

    Button2: TButton;     //   bufs[0]

    Button3: TButton;     //   bufs[1]

    Button4: TButton;     //    

    CheckBox1: TCheckBox; //        

    procedure FormCreate(Sender: TObject);

    procedure FormDestroy(Sender: TObject);

    procedure Button1Click(Sender: TObject);

    procedure Button3Click(Sender: TObject);

    procedure Button2Click(Sender: TObject);

    procedure Button4Click(Sender: TObject);

    procedure CheckBox1Click(Sender: TObject);

  end;



var

  Form1: TForm1;



implementation



{$R *.dfm}



uses DirectSound, MMSystem, ReadWave; //ReadWave    (7)      



var

  myDSound: IDirectSound8;

  buf: IDirectSoundBuffer; //            

  bufs: array[0..1] of IDirectSoundBuffer; //               buf

  loop: DWORD = 0; //      ; 0:   ; 1(DSBPLAY_LOOPING):  



{              }

function IsPlay(b: IDirectSoundBuffer): Boolean;

var

  dStatus: DWORD;

begin

  Result := b <> nil;

  if Succeeded(b.GetStatus(dStatus)) then

    Result := dStatus and DSBSTATUS_PLAYING = DSBSTATUS_PLAYING;

end;



{     }

procedure TForm1.FormCreate(Sender: TObject);

var

  wavFormat: TWaveFormatEx;

  bufDesc: TDSBufferDesc;

  wavPath: string;

  wav: TReadWave;

  p1: Pointer;

  n1: DWORD;

  i: Integer;

begin

  with TOpenDialog.Create(nil) do begin

    Filter := 'Wave File(*.wav)|*.wav';

    if Execute then wavPath := FileName;

    Free;

  end;



  wav := TReadWave.Create;

  if not wav.Open(wavPath) then

  begin

    ShowMessage('    ');

    wav.Free;

    Application.Terminate;

  end;



  DirectSoundCreate8(nil, myDSound, nil);

  myDSound.SetCooperativeLevel(Handle, DSSCL_NORMAL);



  ZeroMemory(@bufDesc, SizeOf(TDSBufferDesc));

  bufDesc.dwSize := SizeOf(TDSBufferDesc);

  bufDesc.dwFlags := DSBCAPS_STATIC;

  bufDesc.dwBufferBytes := wav.Size;

  bufDesc.lpwfxFormat := @wav.Format;



  {   buf      }

  myDSound.CreateSoundBuffer(bufDesc, buf, nil);

  buf.Lock(0, 0, @p1, @n1, nil, nil, DSBLOCK_ENTIREBUFFER);

  wav.Read(p1, n1);

  wav.Free;

  buf.Unlock(p1, n1, nil, 0);



  {   buf        }

  for i := Low(bufs) to High(bufs) do

  begin

    myDSound.DuplicateSoundBuffer(buf, bufs[i]);

  end;

end;



{      buf}

procedure TForm1.Button1Click(Sender: TObject);

begin

  if IsPlay(buf) then buf.Stop else buf.Play(0, 0, loop);

end;



{      buf[0]}

procedure TForm1.Button2Click(Sender: TObject);

begin

  if IsPlay(bufs[0]) then buf.Stop else bufs[0].Play(0, 0, loop);

end;



{      buf[1]}

procedure TForm1.Button3Click(Sender: TObject);

begin

  if IsPlay(bufs[1]) then buf.Stop else bufs[1].Play(0, 0, loop);

end;



{    }

procedure TForm1.Button4Click(Sender: TObject);

var

  i: Integer;

begin

  if buf <> nil then buf.Stop;

  for i := Low(bufs) to High(bufs) do if bufs[i] <> nil then bufs[i].Stop;

end;



{        ,                }

procedure TForm1.CheckBox1Click(Sender: TObject);

begin

  loop := DWORD(CheckBox1.Checked);

end;



procedure TForm1.FormDestroy(Sender: TObject);

var

  i: Integer;

begin

  buf := nil;

  for i := Low(bufs) to High(bufs) do bufs[i] := nil;

  myDSound := nil;

end;



end.

좋은 웹페이지 즐겨찾기