В итоге получаем летящий вертолет слева направо. Заодно можете проверить, правильно ли у вас расположены колонки.
PS. Если есть вопросы, постараюсь на них ответить.
unitUnit1;
interface
usesWindows, Messages, SysUtils, Classes, Graphics, Controls,Forms, Dialogs, DSound, MMSystem, StdCtrls, ExtCtrls;
typeTForm1 = class(TForm)
Button1: TButton;
Timer1: TTimer;
procedureFormCreate(Sender: TObject);
procedureFormDestroy(Sender: TObject);
procedureButton1Click(Sender: TObject);
procedureTimer1Timer(Sender: TObject);
private
DirectSound: IDirectSound;
DirectSoundBuffer: IDirectSoundBuffer;
SecondarySoundBuffer: IDirectSoundBuffer;
SecondarySound3DBuffer: IDirectSound3DBuffer;
procedureAppCreateWritePrimaryBuffer;
procedureAppCreateWriteSecondary3DBuffer( varBuffer: IDirectSoundBuffer; SamplesPerSec: Integer; Bits: Word; isStereo: Boolean; Time: Integer);
procedureAppSetSecondary3DBuffer( varBuffer: IDirectSoundBuffer; var_3DBuffer: IDirectSound3DBuffer);
procedureAppWriteDataToBuffer(Buffer: IDirectSoundBuffer; OffSet: DWord; varSoundData; SoundBytes: DWord);
procedureCopyWAVToBuffer(Name: PChar; varBuffer: IDirectSoundBuffer);
{ Private declarations }
public
{ Public declarations }
end;
varForm1: TForm1;
implementation
{$R *.DFM}
procedureTForm1.FormCreate(Sender: TObject);
varResult : HResult;
begin
ifDirectSoundCreate( nil, DirectSound, nil) <> DS_OK then RaiseException.Create('Failed to create IDirectSound object');
AppCreateWritePrimaryBuffer;
AppCreateWriteSecondary3DBuffer(SecondarySoundBuffer, 22050, 8, False, 4);
AppSetSecondary3DBuffer(SecondarySoundBuffer, SecondarySound3DBuffer);Timer1.Enabled:=False;
end;
procedureTForm1.FormDestroy(Sender: TObject);
vari: ShortInt;
begin
ifAssigned(DirectSoundBuffer) thenDirectSoundBuffer.Release;
ifAssigned(SecondarySound3DBuffer) thenSecondarySound3DBuffer.Release;
ifAssigned(SecondarySoundBuffer) thenSecondarySoundBuffer.Release;
ifAssigned(DirectSound) thenDirectSound.Release;
end;
procedureTForm1.AppCreateWritePrimaryBuffer;
var
BufferDesc : DSBUFFERDESC;
Caps : DSBCaps;
PCM : TWaveFormatEx;
begin
FillChar(BufferDesc, SizeOf(DSBUFFERDESC),0);
FillChar(PCM, SizeOf(TWaveFormatEx), 0);
withBufferDesc do begin
PCM.wFormatTag:=WAVE_FORMAT_PCM;
PCM.nChannels:=2;
PCM.nSamplesPerSec:=22050;
PCM.nBlockAlign:=4;
PCM.nAvgBytesPerSec:=PCM.nSamplesPerSec * PCM.nBlockAlign;
PCM.wBitsPerSample:=16;
PCM.cbSize:=0;
dwSize:=SizeOf(DSBUFFERDESC);
dwFlags:=DSBCAPS_PRIMARYBUFFER;
dwBufferBytes:=0;
lpwfxFormat:= nil;
end;
ifDirectSound.SetCooperativeLevel(Handle, DSSCL_WRITEPRIMARY) <> DS_OK then RaiseException.Create('Unable to set Cooperative Level');
ifDirectSound.CreateSoundBuffer(BufferDesc, DirectSoundBuffer, nil) <> DS_OK then RaiseException.Create('Create Sound Buffer failed');
ifDirectSoundBuffer.SetFormat(PCM) <> DS_OK then RaiseException.Create('Unable to Set Format ');
ifDirectSound.SetCooperativeLevel(Handle, DSSCL_NORMAL) <> DS_OK then RaiseException.Create('Unable to set Cooperative Level');
end;
procedureTForm1.AppCreateWriteSecondary3DBuffer;
var
BufferDesc : DSBUFFERDESC;
Caps : DSBCaps;
PCM : TWaveFormatEx;
begin
FillChar(BufferDesc, SizeOf(DSBUFFERDESC), 0);
FillChar(PCM, SizeOf(TWaveFormatEx), 0);
withBufferDesc do begin
PCM.wFormatTag:=WAVE_FORMAT_PCM;
ifisStereo then PCM.nChannels:=2
elsePCM.nChannels:=1;
PCM.nSamplesPerSec:=SamplesPerSec;
PCM.nBlockAlign:=(Bits div8)*PCM.nChannels;
PCM.nAvgBytesPerSec:=PCM.nSamplesPerSec * PCM.nBlockAlign;
PCM.wBitsPerSample:=Bits;
PCM.cbSize:=0;
dwSize:=SizeOf(DSBUFFERDESC);
dwFlags:=DSBCAPS_STATIC orDSBCAPS_CTRL3D;
dwBufferBytes:=Time*PCM.nAvgBytesPerSec;
lpwfxFormat:=@PCM;
end;
ifDirectSound.CreateSoundBuffer(BufferDesc, Buffer, nil) <> DS_OK then RaiseException.Create('Create Sound Buffer failed');
end;
procedureTForm1.AppWriteDataToBuffer;
var
AudioPtr1, AudioPtr2: Pointer;
AudioBytes1, AudioBytes2: DWord;
h: HResult;
Temp: Pointer;
begin
H:=Buffer.Lock(OffSet, SoundBytes, AudioPtr1, AudioBytes1, AudioPtr2, AudioBytes2, 0);
ifH = DSERR_BUFFERLOST then begin
Buffer.Restore;
ifBuffer.Lock(OffSet, SoundBytes, AudioPtr1, AudioBytes1, AudioPtr2, AudioBytes2, 0) <> DS_OK then RaiseException.Create('Unable to Lock Sound Buffer');
end
else ifH <> DS_OK then RaiseException.Create('Unable to Lock Sound Buffer');
Temp:=@SoundData;
Move(Temp^, AudioPtr1^, AudioBytes1);
Читать дальше