Валентин Озеров - Советы по Delphi. Версия 1.4.3 от 1.1.2001
- Название:Советы по Delphi. Версия 1.4.3 от 1.1.2001
- Автор:
- Жанр:
- Издательство:неизвестно
- Год:неизвестен
- ISBN:нет данных
- Рейтинг:
- Избранное:Добавить в избранное
-
Отзывы:
-
Ваша оценка:
Валентин Озеров - Советы по Delphi. Версия 1.4.3 от 1.1.2001 краткое содержание
…начиная с 1001. Смотрите другие файлы…
Советы по Delphi. Версия 1.4.3 от 1.1.2001 - читать онлайн бесплатно полную версию (весь текст целиком)
Интервал:
Закладка:
FreeMem(Data, DataSize);
end;
procedureTForm1.Button1Click(Sender: TObject);
begin
CopyWAVToBuffer('1.wav', SecondarySoundBuffer[0]);
CopyWAVToBuffer('flip.wav', SecondarySoundBuffer[1]);
ifSecondarySoundBuffer[0].Play(0, 0, 0) <> DS_OK thenShowMessage('Can''t play the Sound');
ifSecondarySoundBuffer[1].Play(0, 0, 0) <> DS_OK thenShowMessage('Can''t play the Sound');
end;
end.
Представляю вашему вниманию очередной пример работы с DirectSound на Delphi. В этом примере показан принцип работы с 3D буфером. Итак, процедуры AppCreateWritePrimaryBuffer, AppWriteDataToBuffer, CopyWAVToBuffer я оставил без изменения (см. письма с до этого). Процедура AppCreateWriteSecondary3DBuffer является полным аналогом процедуры AppCreateWriteSecondaryBuffer, за исключением флага DSBCAPS_CTRL3D, который указывает на то, что со статическим вторичным буфером будет связан еще один буфер – SecondarySound3DBuffer. Чтобы его инициализировать, а также установить некоторые начальные значения (положение в пространстве, скорость и .т.д.) вызывается процедура AppSetSecondary3DBuffer, в качестве параметров которой передаются сам SecondarySoundBuffer и связанный с ним SecondarySound3DBuffer. В этой процедуре SecondarySound3DBuffer инициализируется с помощью метода QueryInterface c соответствующим флагом. Кроме того, здесь же устанавливается положение источника звука в пространстве: SetPosition(Pos,1{X},1{Y},0{Z}).
Таким образом в начальный момент времени источник находится на высоте 1 м (ось Y направлена вертикально вверх, а ось Z – «в экран»). Если смотреть сверху :
↑ Z
|
А |
|
O----------------> X
Точка O (фактически вы) имеет координаты (0,0), источник звука А(-25,1). Разумеется понятие «метр» весьма условно.
При нажатии на кнопку в буфер SecondarySoundBuffer загружается звук 'xhe4.wav'. Это звук работающего винта вертолета, его длина (звука) ровно 3.99 с (а размер буфера ровно 4 с). Далее происходит микширование из вторичного буфера в первичный с флагом DSBPLAY_LOOPING, что позволяет сделать многократно повторяющийся звук; время в 0.01 с ухом практически не улавливается и получается непрерывный звук летящего вертолета. После этого запускется таймер (поле INTERVAL в Инспекторе Оъектов установлено в 1). Разумеется, Вам совсем необязательно делать именно так, это просто пример. В процедуре Timer1Timer просто меняется координата X с шагом 0.1.
В итоге получаем летящий вертолет слева направо. Заодно можете проверить, правильно ли у вас расположены колонки.
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');
Интервал:
Закладка: