Валентин Озеров - Советы по Delphi. Версия 1.4.3 от 1.1.2001

Тут можно читать онлайн Валентин Озеров - Советы по Delphi. Версия 1.4.3 от 1.1.2001 - бесплатно полную версию книги (целиком) без сокращений. Жанр: comp-programming. Здесь Вы можете читать полную версию (весь текст) онлайн без регистрации и SMS на сайте лучшей интернет библиотеки ЛибКинг или прочесть краткое содержание (суть), предисловие и аннотацию. Так же сможете купить и скачать торрент в электронном формате fb2, найти и слушать аудиокнигу на русском языке или узнать сколько частей в серии и всего страниц в публикации. Читателям доступно смотреть обложку, картинки, описание и отзывы (комментарии) о произведении.
  • Название:
    Советы по Delphi. Версия 1.4.3 от 1.1.2001
  • Автор:
  • Жанр:
  • Издательство:
    неизвестно
  • Год:
    неизвестен
  • ISBN:
    нет данных
  • Рейтинг:
    4/5. Голосов: 101
  • Избранное:
    Добавить в избранное
  • Отзывы:
  • Ваша оценка:
    • 80
    • 1
    • 2
    • 3
    • 4
    • 5

Валентин Озеров - Советы по Delphi. Версия 1.4.3 от 1.1.2001 краткое содержание

Советы по Delphi. Версия 1.4.3 от 1.1.2001 - описание и краткое содержание, автор Валентин Озеров, читайте бесплатно онлайн на сайте электронной библиотеки LibKing.Ru

…начиная с 1001. Смотрите другие файлы…

Советы по Delphi. Версия 1.4.3 от 1.1.2001 - читать онлайн бесплатно полную версию (весь текст целиком)

Советы по 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.

Пример 2

Представляю вашему вниманию очередной пример работы с 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');

Читать дальше
Тёмная тема
Сбросить

Интервал:

Закладка:

Сделать


Валентин Озеров читать все книги автора по порядку

Валентин Озеров - все книги автора в одном месте читать по порядку полные версии на сайте онлайн библиотеки LibKing.




Советы по Delphi. Версия 1.4.3 от 1.1.2001 отзывы


Отзывы читателей о книге Советы по Delphi. Версия 1.4.3 от 1.1.2001, автор: Валентин Озеров. Читайте комментарии и мнения людей о произведении.


Понравилась книга? Поделитесь впечатлениями - оставьте Ваш отзыв или расскажите друзьям

Напишите свой комментарий
x