Отправляет email-рассылки с помощью сервиса Sendsay
  Все выпуски  

СообЧА. Программирование на Delphi


Служба Рассылок Subscribe.Ru проекта Citycat.Ru
Subscribe.Ru : СообЧА. Программирование на Delphi
Служба Рассылок Subscribe.Ru проекта Citycat.Ru
Технологии карьеры и личностного развития.
Разнообразные материалы по технологиям, методам, способам построения успешной карьеры и личностного (интеллектуального, духовного, физического ...) развития.
Подписаться.   Рассылки Subscribe.Ru


 

Мир Delphi

PixelSoftware

 

Подписчиков: 3720

 
     

.::::: СообЧа - Программирование на Delphi :::::.

На правах помощи

 

ї 2000 - 2001COOLer

 

Дизайн: Yoghurt

 
     

 

Оглавление

 

В выпуске

 

Рассылка СообЧА

 
     
 
Рассылки Subscribe.Ru
СообЧа (СООБщество ЧАйников). Обмен опытом, вопросы, ответы.

  Назад к оглавлению    
   
 

Конкурс и новости рассылки

 
 
   
  • Участвуйте в конкурсе "Статья месяца" и вы выиграете книгу по Delphi от магазина ОЗОН. В конце каждого месяца Вами будет выбран лучший автор, который и получит книгу. Присылайте ваши статьи на  pixel@novgorod.net . Авторов просим строго придерживаться тематики рассылки.

  • Хотите поучаствовать в нашем проекте, вы умеете работать с OpenGL или DX? Присоединяйтесь вместе мы напишем классную RPG ... подробности по адресу  pixel@novgorod.net или http://pixelsoft.narod.ru/ раздел Проект... Желательны(Хотя не обязательны , по ходу сами все поймете) знания Borland C++ Builder или Delphi в сфере графики(или просто кодеры).Все абсолютно свободно freewareно и бесплатно. ПОЛНЫЙ ДОСТУП К НАШИМ ИСХОДНИКАМ.

 
  • Я настаиваю на том чтобы все оценили труд перенесения статей на мой сайт (эта еще не загружена)
  • COOLer вернулся.... 

 

 


  • Нравится ли вам наша рассылка?

  • Да

    Нет

    Не успел оценить

      Назад к оглавлению    
       
     

    Выбор лучшего

     
     
       
    ув. Подписчики. пожалуйста оцените труд данных авторов отдав свой голос за того, кого вы считаете достойным. В конце месяца(блин хоть бы кто сказал!) по итогам голосования лучшему автору будет подарена книга от магазина "ОЗОН". Если вы хотите увидить своё имя среди авторов - то прочитайте условия конкурса Выбери лучшего
    Pixel
    PILOT
    Art
      Назад к оглавлению    
       
     

    Винты и... Колеса

     
     
       
    Не знаю, зачем вам может понадобиться это, но все же:
    Вот эта процедура снимает с винчестера Всевозможные Данные.
     

    procedure TForm1.Button1Click(Sender: TObject);
    var
    VolumeName,
    FileSystemName : array [0..MAX_PATH-1] of Char;
    VolumeSerialNo : DWord;
    MaxComponentLength,
    FileSystemFlags : Integer;
    begin
    GetVolumeInformation('C:\',VolumeName,MAX_PATH,@VolumeSerialNo,
    MaxComponentLength,FileSystemFlags,
    FileSystemName,MAX_PATH);
    Memo1.Lines.Add('VName = '+VolumeName);
    Memo1.Lines.Add('SerialNo = $'+IntToHex(VolumeSerialNo,8));
    Memo1.Lines.Add('CompLen = '+IntToStr(MaxComponentLength));
    Memo1.Lines.Add('Flags = $'+IntToHex(FileSystemFlags,4));
    Memo1.Lines.Add('FSName = '+FileSystemName);
    end;

     

     

    mailto:Автор:Pixel(pixel@novgorod.net http://pixelsoft.narod.ru/ )
    ї COOLer 
      Назад к оглавлению    
       
     

    Звон вечерний 1 шт

     
     
       

    Вы даже не представляете, сколько можно интересного найти в сети(на свои деньги, а вы даже не знаете о том во сколько статья мне обходиться). Вот например функция набора номера модемом. Кстати тут человек мучался с ком-портами , надеюсь он это прочтет.

     

    var
    hCommFile : THandle;

    procedure TForm1.Button1Click(Sender: TObject);
    var
    PhoneNumber : string;
    CommPort : string;
    NumberWritten : LongInt;
    begin
    PhoneNumber := 'ATDT 1-555-555-1212' + #13 + #10;
    CommPort := 'COM2';
    {Open the comm port}
    hCommFile := CreateFile(PChar(CommPort),
    GENERIC_WRITE,
    0,
    nil,
    OPEN_EXISTING,
    FILE_ATTRIBUTE_NORMAL,
    0);
    if hCommFile=INVALID_HANDLE_VALUE then
    begin

    ShowMessage('Unable to open '+ CommPort);
    exit;
    end;

    {Dial the phone}
    NumberWritten:=0;
    if WriteFile(hCommFile,
    PChar(PhoneNumber)^,
    Length(PhoneNumber),
    NumberWritten,
    nil) = false then begin
    ShowMessage('Unable to write to ' + CommPort);
    end;
    end;

    procedure TForm1.Button2Click(Sender: TObject);
    begin
    {Close the port}
    CloseHandle(hCommFile);
    end;

    У кого с головой хорошо я добавлю вам эту информацию.

    AT-команды модема
    Команда
    Описание
    A Команда ответа (Answer Command)
    Bn Настройка связи (Communications Options)
    D Команда набора (Dial Command)
    En Команда выбора символа эха (Select Command Character Echo Option)
    Hn Управление Switchhook - эмуляция нажатия телефонного рычага (Control The Switchhook)
    I0 Идентификация кода продукта (Identify The Product Code)
    I2 Выполнение теста контрольной суммы ROM ( Perform ROM Checksum Test)
    I7 Номер версии (Version Number)
    Ln Выбор уровня громкости динамика (Select Speaker Volume Level)
    Mn Функция выбора опций динамика (Select Speaker Function Option)
    Nn Выбор опций для установления связи (Select Negotiate Handshake Option)
    On Переход к онлайновым командам (Go Online Command)
    P Выбор метода пульсового набора (Select Pulse Dialing Method)
    Qn Выбор опции результирующего кода (Select Result Code Option)
    Sn= Запись в S-регистр (Write To An S-Register)
    Sn? Чтение S-регистра (Read An S-Register)
    T Выбор метода тонового набора (Select Tone Dialing Method)
    Vn Выбор опции формата ответа (Select Response Format Option)
    Wn Выбор расширенного результирующего кода (Select Extended Result Code)
    Xn Выбор опции модемного вызова (Select Call Progress Option)
    Yn Выбор опции бездействия для разъединения (Select Long Space Disconnect Option)
    Zn Выполнение мягкого сброса (Perform Soft Reset)
    &An Выбор роли автоответчика (Select Originate/Answer Role For Autoanswer)
    &Cn Выбор опции определения передаваемых данных (Select Data Carrier Detect Option)
    &Dn Выбор опции готовности терминала данных (Select Data Terminal Ready Option)
    &F Загрузка заводских установок (Load Factory Default Profile)
    &Gn Выбор опции защиты тонового набора (Select Guard Tone Option)
    &Kn Выбор опций потока ConTDol (Select Flow ConTDol Option)
    &Pn Выбор параметров пульсового набора (Select Pulse Dialing Parameters)
    &Qn Выбор опций режима связи (Select Communications Mode Option)
    &Rn Выбор опций RTS/CTS (Select RTS/CTS Option)
    &Sn Выбор опций готовности передачи данных (Select Data Set Ready Option)
    &T0 Тест завершения в процессе (Terminate Test In Process)
    &T1 Инициирование локального аналога сетевой петли (Initiate Local Analog Loopback)
    &T3 Выполнение локальной цифровой сетевой петли (Perform Local Digital Loopback)
    &T4 Включение предоставления RDL-запросов (Enable Granting Of RDL Requests)
    &T5 Запрет предоставления RDL-запросов (Deny Granting Of RDL Requests)
    &T6 Инициирование удаленной цифровой сетевой петли (Initiate Remote Digital Loopback)
    &T7 Иниицирование внутреннего теста RDL (Initiate RDL With Self Test)
    &T8 Внутренний тест локальной сетевой петли (Local Loopback With Self Test)
    &T19 Выполнение теста RTS/CTS кабеля (Perform RTS/CTS Cable Test)
    &Un Отмена TDellis кодирования (Disable TDellis Coding)
    &V Просмотр профилей конфигурации (View Configuration Profiles)
    &Wn Сохранение активного профиля (Store Active Profile)
    &Xn Выбор источника синхронизации времени TDansmit (Store Active Profile)
    &Yn Выбор сохранения профиля для аппаратного перезапуска (Select Stored Profile For Hard Reset)
    &Zn= Сохранение телефонного номера (Store Telephone Number)
    , Пауза (Perform Pause)
    = Запись в S-регистр (Write To An S-Register)
    ? Чтение S-регистра (Read An S-Register)
    P Выбор пульсового набора (Select Pulse Dialing)
    Т Тоновый набор (Tone)
    S-регистры модема
    Регистр
    Описание
    S0 Звонок, на который необходимо ответить (Ring After Which To Answer)
    S1 Количество звонков (Ring Count)
    S2 Символ отмены (Hayes Escape Character)
    S3 Символ перевода строки (Carriage Return Character)
    S4 Символ пропуска строки (Line Feed Character)
    S5 Символ пробела (Backspace Character)
    S6 Ожидание перед вызывом (Wait Before Blind Dialing)
    S7 Ожидание ответа (Wait For Carrier)
    S8 Время паузы для запятой (Pause Time For Comma)
    S9 Время восстановления (Carrier Recovery Time)
    S10 Время задержки для поднятия трубки после потери соединения (Lost Carrier Hang Up Delay)
    S11 Время DTMF соединения (DTMF Dialing Speed)
    S12 Время защиты отмены (Hayes Escape Guard Time)
    S16 Выполнение теста (Test in Progress)
    S18 Тест таймера модема (Modem Test Timer)
    S19 Настройки автосинхронизации (AutoSync Options)
    S25 Обнаружено изменение DTD (Detect DTD Change)
    S26 Интервал задержки RTS для CTS (RTS To CTS Delay Interval)
    S30 Неактивное время ожидания (Inactivity Timeout)
    S31 Символ XON (XON Character)
    S32 Символ XOFF (XON Character)
    S36 Ошибка согласования TDeatment (Negotiation Failure TDeatment)
    S37 Ускорение DCE линии (Desired DCE Line Speed)
    S38 Время ожидания снятия трубки (Hang-up Timeout)
    S43 Текущая скорость линии (Current Line Speed)
    S44 Техническая конструкция (Framing Technique)
    S46 Выбор протокола/компрессии (Protocol/Compression Selection)
    S48 Действие характеристики согласования (Feature Negotiation Action)
    S49 Низкий предел буфера (Buffer Low Limit)
    S50 Высокий предел буфера (Buffer High Limit)
    S70 Максимальное число ReTDansmissions (Maximum Number of ReTDansmissions)
    S73 Неактивное время ожидания (No Activity Timeout)
    S82 Выбор прерывания (Break Selection)
    S86 Код причины неудачной связи (Connection Failure Cause Code)
    S91 Выбор уровня TDansmit коммутируемой линии (Select Dial-up Line TDansmit Level)
    S95 Расширенный результат кода битовой карты (Extended Result Code Bit Map)
    S97 Позднее время соединения - снятия трубки (V.32 Late Connecting Handshake Timing)
    S105 Размер кадра (Frame Size)
    S108 Селектор качества сигнала (Signal Quality Selector)
    S109 Селектор скорости соединения (Carrier Speed Selector)
    S110 Селектор V.32/V.32 bis (V.32/V.32 bis Selector)
    S113 Тональный вызов ConTDol (Calling Tone ConTDol)
    S121 Использование DTD (Use of DTD)
    S141 Таймер фазы обнаружения (Detection Phase Timer)
    S142 Онлайновый формат символов (Online Character Format)
    S144 Выбор скорости автобода (Autobaud Speed Group Selection)

     

    mailto:Автор:Pixel(pixel@novgorod.net http://pixelsoft.narod.ru/ )
    ї COOLer 

     
      Назад к оглавлению    
       
     

    Direct Sound

     
     
       

    Представляю вашему вниманию рабочий пример использования DirectSound на Delphi + несколько полезных процедур. В этом примере создается один первичный SoundBuffer и 2 статических, вторичных; в них загружаются 2 WAV файла. Первичный буфер создается процедурой AppCreateWritePrimaryBuffer, а любой вторичный - AppCreateWritePrimaryBuffer. Так как вторичный буфер связан с WAV файлом, то при создании буфера нужно определить его параметры в соответствии со звуковым файлом, эти характеристики (Samples, Bits, IsStereo) задаются в виде параметров процедуры. Time - время WAV'файла в секундах (округление в сторону увеличения). При нажатии на кнопку происходит микширование из вторичных буферов в первичный. AppWriteDataToBuffer позволяет записать в буфер PCM сигнал. Процедура CopyWAVToBuffer открывает WAV файл, отделяет заголовок, читает чанк 'data' и копирует его в буфер (при этом сначала считывается размер данных, так как в некоторых WAV файлах существует текстовый довесок, и если его не убрать, в динамиках возможен треск).

     

    unit Unit1;

    interface

    uses

    Windows, Messages, SysUtils, Classes, Graphics, Controls,

    Forms, Dialogs, DSound, MMSystem, StdCtrls, ExtCtrls;


    type

    TForm1 = class(TForm)

    Button1: TButton;

    Timer1: TTimer;

    procedure FormCreate(Sender: TObject);

    procedure FormDestroy(Sender: TObject);

    procedure Button1Click(Sender: TObject);

    private

    DirectSound          : IDirectSound;

    DirectSoundBuffer    : IDirectSoundBuffer;

    SecondarySoundBuffer : array[0..1] of IDirectSoundBuffer;

    procedure AppCreateWritePrimaryBuffer;

    procedure AppCreateWriteSecondaryBuffer(var Buffer: IDirectSoundBuffer;

    SamplesPerSec: Integer;

    Bits: Word;

    isStereo:Boolean;

    Time: Integer);

    procedure AppWriteDataToBuffer(Buffer: IDirectSoundBuffer;

    OffSet: DWord; var SoundData;

    SoundBytes: DWord);

    procedure CopyWAVToBuffer(Name: PChar; var Buffer: IDirectSoundBuffer);

    { Private declarations }

    public

    { Public declarations }

    end;


    var

    Form1: TForm1;


    implementation

    {$R *.DFM}

    procedure TForm1.FormCreate(Sender: TObject);
    begin

    if DirectSoundCreate(nil, DirectSound, nil) <> DS_OK then

    Raise Exception.Create('Failed to create IDirectSound object');

    AppCreateWritePrimaryBuffer;

    AppCreateWriteSecondaryBuffer(SecondarySoundBuffer[0],22050,8,False,10);

    AppCreateWriteSecondaryBuffer(SecondarySoundBuffer[1],22050,16,True,1);

    end;

    procedure TForm1.FormDestroy(Sender: TObject);
    var i: ShortInt;
    begin

    if Assigned(DirectSoundBuffer) then DirectSoundBuffer.Release;

    for i:=0 to 1 do

    if Assigned(SecondarySoundBuffer[i]) then SecondarySoundBuffer[i].Release;

    if Assigned(DirectSound) then DirectSound.Release;

    end;

    procedure TForm1.AppWriteDataToBuffer;
    var

    AudioPtr1,AudioPtr2     : Pointer;

    AudioBytes1,AudioBytes2 : DWord;

    h : HResult;

    Temp : Pointer;

    begin

    H:=Buffer.Lock(OffSet, SoundBytes, AudioPtr1, AudioBytes1,

    AudioPtr2, AudioBytes2, 0);

    if H = DSERR_BUFFERLOST  then

    begin

    Buffer.Restore;

    if Buffer.Lock(OffSet, SoundBytes, AudioPtr1, AudioBytes1,

    AudioPtr2, AudioBytes2, 0) <> DS_OK then

    Raise Exception.Create('Unable to Lock Sound Buffer');

    end else

    if H <> DS_OK then Raise Exception.Create('Unable to Lock Sound Buffer');

    Temp:=@SoundData;

    Move(Temp^, AudioPtr1^, AudioBytes1);

    if AudioPtr2 <> nil then

    begin

    Temp:=@SoundData; Inc(Integer(Temp), AudioBytes1);

    Move(Temp^, AudioPtr2^, AudioBytes2);

    end;

    if Buffer.UnLock(AudioPtr1, AudioBytes1,AudioPtr2, AudioBytes2) <> DS_OK

    then Raise Exception.Create('Unable to UnLock Sound Buffer');

    end;

    procedure TForm1.AppCreateWritePrimaryBuffer;
    var BufferDesc  : DSBUFFERDESC;

    Caps        : DSBCaps;

    PCM         : TWaveFormatEx;

    begin

    FillChar(BufferDesc, SizeOf(DSBUFFERDESC),0);

    FillChar(PCM, SizeOf(TWaveFormatEx),0);

    with BufferDesc 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;

    if DirectSound.SetCooperativeLevel(Handle,DSSCL_WRITEPRIMARY) <> DS_OK

    then Raise Exception.Create('Unable to set Coopeative Level');

    if DirectSound.CreateSoundBuffer(BufferDesc,DirectSoundBuffer,nil) <> DS_OK

    then Raise Exception.Create('Create Sound Buffer failed');

    if DirectSoundBuffer.SetFormat(PCM) <> DS_OK

    then Raise Exception.Create('Unable to Set Format ');

    if DirectSound.SetCooperativeLevel(Handle,DSSCL_NORMAL) <> DS_OK

    then Raise Exception.Create('Unable to set Coopeative Level');

    end;


    procedure TForm1.AppCreateWriteSecondaryBuffer;
    var BufferDesc  : DSBUFFERDESC;

    Caps        : DSBCaps;

    PCM         : TWaveFormatEx;

    begin

    FillChar(BufferDesc, SizeOf(DSBUFFERDESC),0);

    FillChar(PCM, SizeOf(TWaveFormatEx),0);

    with BufferDesc do

    begin

    PCM.wFormatTag:=WAVE_FORMAT_PCM;

    if isStereo then PCM.nChannels:=2 else PCM.nChannels:=1;

    PCM.nSamplesPerSec:=SamplesPerSec;

    PCM.nBlockAlign:=(Bits div 8)*PCM.nChannels;

    PCM.nAvgBytesPerSec:=PCM.nSamplesPerSec * PCM.nBlockAlign;

    PCM.wBitsPerSample:=Bits;

    PCM.cbSize:=0;

    dwSize:=SizeOf(DSBUFFERDESC);

    dwFlags:=DSBCAPS_STATIC;

    dwBufferBytes:=Time*PCM.nAvgBytesPerSec;

    lpwfxFormat:=@PCM;

    end;

    if DirectSound.CreateSoundBuffer(BufferDesc,Buffer,nil) <> DS_OK

    then Raise Exception.Create('Create Sound Buffer failed');

    end;

    procedure TForm1.CopyWAVToBuffer;
    var Data  : PChar;

    FName    : TFileStream;

    DataSize : DWord;

    Chunk    : String[4];

    Pos      : Integer;

    begin

    FName:=TFileStream.Create(Name,fmOpenRead);

    Pos:=24;

    SetLength(Chunk,4);

    repeat

    FName.Seek(Pos, soFromBeginning);

    FName.Read(Chunk[1],4);

    Inc(Pos);

    until Chunk = 'data';

    FName.Seek(Pos+3, soFromBeginning);

    FName.Read(DataSize, SizeOf(DWord));

    GetMem(Data,DataSize);

    FName.Read(Data^, DataSize);

    FName.Free;

    AppWriteDataToBuffer(Buffer,0,Data^,DataSize);

    FreeMem(Data,DataSize);

    end;

    procedure TForm1.Button1Click(Sender: TObject);
    begin

    CopyWAVToBuffer('1.wav',SecondarySoundBuffer[0]);

    CopyWAVToBuffer('flip.wav',SecondarySoundBuffer[1]);


    if SecondarySoundBuffer[0].Play(0,0,0) <> DS_OK

    then ShowMessage('Can''t play the Sound');


    if SecondarySoundBuffer[1].Play(0,0,0) <> DS_OK

    then ShowMessage('Can''t play the Sound');

    end;

    end.

    В этом примере показан принцип работы с 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.

    В итоге получаем летящий вертолет слева направо. Заодно можете проверить, правильно ли у вас расположены колонки

     

     

    unit Unit1;

    interface

    uses

    Windows, Messages, SysUtils, Classes, Graphics, Controls,

    Forms, Dialogs, DSound, MMSystem, StdCtrls, ExtCtrls;


    type

    TForm1 = class(TForm)

    Button1: TButton;

    Timer1: TTimer;

    procedure FormCreate(Sender: TObject);

    procedure FormDestroy(Sender: TObject);

    procedure Button1Click(Sender: TObject);

    procedure Timer1Timer(Sender: TObject);

    private

    DirectSound            : IDirectSound;

    DirectSoundBuffer      : IDirectSoundBuffer;

    SecondarySoundBuffer   : IDirectSoundBuffer;

    SecondarySound3DBuffer : IDirectSound3DBuffer;

    procedure AppCreateWritePrimaryBuffer;

    procedure AppCreateWriteSecondary3DBuffer(var Buffer: IDirectSoundBuffer;

    SamplesPerSec: Integer;

    Bits: Word;

    isStereo:Boolean;

    Time: Integer);

    procedure AppSetSecondary3DBuffer(var Buffer: IDirectSoundBuffer;

    var _3DBuffer: IDirectSound3DBuffer);

    procedure AppWriteDataToBuffer(Buffer: IDirectSoundBuffer;

    OffSet: DWord; var SoundData;

    SoundBytes: DWord);

    procedure CopyWAVToBuffer(Name: PChar; var Buffer: IDirectSoundBuffer);

    { Private declarations }

    public

    { Public declarations }

    end;


    var

    Form1: TForm1;


    implementation

    {$R *.DFM}

    procedure TForm1.FormCreate(Sender: TObject);
    var Result : HResult;
    begin

    if DirectSoundCreate(nil, DirectSound, nil) <> DS_OK then

    Raise Exception.Create('Failed to create IDirectSound object');

    AppCreateWritePrimaryBuffer;

    AppCreateWriteSecondary3DBuffer(SecondarySoundBuffer,22050,8,False,4);

    AppSetSecondary3DBuffer(SecondarySoundBuffer,SecondarySound3DBuffer);

    Timer1.Enabled:=False;

    end;

    procedure TForm1.FormDestroy(Sender: TObject);
    var i: ShortInt;
    begin

    if Assigned(DirectSoundBuffer) then DirectSoundBuffer.Release;

    if Assigned(SecondarySound3DBuffer) then SecondarySound3DBuffer.Release;

    if Assigned(SecondarySoundBuffer) then SecondarySoundBuffer.Release;

    if Assigned(DirectSound) then DirectSound.Release;

    end;

    procedure TForm1.AppCreateWritePrimaryBuffer;
    var BufferDesc  : DSBUFFERDESC;

    Caps        : DSBCaps;

    PCM         : TWaveFormatEx;

    begin

    FillChar(BufferDesc, SizeOf(DSBUFFERDESC),0);

    FillChar(PCM, SizeOf(TWaveFormatEx),0);

    with BufferDesc 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;

    if DirectSound.SetCooperativeLevel(Handle,DSSCL_WRITEPRIMARY) <> DS_OK

    then Raise Exception.Create('Unable to set Cooperative Level');

    if DirectSound.CreateSoundBuffer(BufferDesc,DirectSoundBuffer,nil) <> DS_OK

    then Raise Exception.Create('Create Sound Buffer failed');

    if DirectSoundBuffer.SetFormat(PCM) <> DS_OK

    then Raise Exception.Create('Unable to Set Format ');

    if DirectSound.SetCooperativeLevel(Handle,DSSCL_NORMAL) <> DS_OK

    then Raise Exception.Create('Unable to set Cooperative Level');

    end;

    procedure TForm1.AppCreateWriteSecondary3DBuffer;
    var BufferDesc  : DSBUFFERDESC;

    Caps        : DSBCaps;

    PCM         : TWaveFormatEx;

    begin

    FillChar(BufferDesc, SizeOf(DSBUFFERDESC),0);

    FillChar(PCM, SizeOf(TWaveFormatEx),0);

    with BufferDesc do

    begin

    PCM.wFormatTag:=WAVE_FORMAT_PCM;

    if isStereo then PCM.nChannels:=2 else PCM.nChannels:=1;

    PCM.nSamplesPerSec:=SamplesPerSec;

    PCM.nBlockAlign:=(Bits div 8)*PCM.nChannels;

    PCM.nAvgBytesPerSec:=PCM.nSamplesPerSec * PCM.nBlockAlign;

    PCM.wBitsPerSample:=Bits;

    PCM.cbSize:=0;

    dwSize:=SizeOf(DSBUFFERDESC);

    dwFlags:=DSBCAPS_STATIC or DSBCAPS_CTRL3D;

    dwBufferBytes:=Time*PCM.nAvgBytesPerSec;

    lpwfxFormat:=@PCM;

    end;

    if DirectSound.CreateSoundBuffer(BufferDesc,Buffer,nil) <> DS_OK

    then Raise Exception.Create('Create Sound Buffer failed');

    end;

    procedure TForm1.AppWriteDataToBuffer;
    var AudioPtr1,AudioPtr2     : Pointer;

    AudioBytes1,AudioBytes2 : DWord;

    h : HResult;

    Temp : Pointer;

    begin

    H:=Buffer.Lock(OffSet, SoundBytes, AudioPtr1, AudioBytes1,

    AudioPtr2, AudioBytes2, 0);

    if H = DSERR_BUFFERLOST  then

    begin

    Buffer.Restore;

    if Buffer.Lock(OffSet, SoundBytes, AudioPtr1, AudioBytes1,

    AudioPtr2, AudioBytes2, 0) <> DS_OK then

    Raise Exception.Create('Unable to Lock Sound Buffer');

    end else

    if H <> DS_OK then Raise Exception.Create('Unable to Lock Sound Buffer');

    Temp:=@SoundData;

    Move(Temp^, AudioPtr1^, AudioBytes1);

    if AudioPtr2 <> nil then

    begin

    Temp:=@SoundData; Inc(Integer(Temp), AudioBytes1);

    Move(Temp^, AudioPtr2^, AudioBytes2);

    end;

    if Buffer.UnLock(AudioPtr1, AudioBytes1, AudioPtr2, AudioBytes2) <> DS_OK

    then Raise Exception.Create('Unable to UnLock Sound Buffer');

    end;

    procedure TForm1.CopyWAVToBuffer;
    var Data     : PChar;

    FName    : TFileStream;

    DataSize : DWord;

    Chunk    : String[4];

    Pos      : Integer;

    begin

    FName:=TFileStream.Create(Name,fmOpenRead);

    Pos:=24;

    SetLength(Chunk,4);

    repeat

    FName.Seek(Pos, soFromBeginning);

    FName.Read(Chunk[1],4);

    Inc(Pos);

    until Chunk = 'data';

    FName.Seek(Pos+3, soFromBeginning);

    FName.Read(DataSize, SizeOf(DWord));

    GetMem(Data,DataSize);

    FName.Read(Data^, DataSize);

    FName.Free;

    AppWriteDataToBuffer(Buffer,0,Data^,DataSize);

    FreeMem(Data,DataSize);

    end;

    var Pos : Single = -25;

    procedure TForm1.AppSetSecondary3DBuffer;
    begin

    if Buffer.QueryInterface(IID_IDirectSound3DBuffer, _3DBuffer) <> DS_OK then

    Raise Exception.Create('Failed to create IDirectSound3D object');

    if _3DBuffer.SetPosition(Pos,1,1,0) <> DS_OK then

    Raise Exception.Create('Failed to set IDirectSound3D Position');

    end;

    procedure TForm1.Button1Click(Sender: TObject);
    begin

    CopyWAVToBuffer('xhe4.wav',SecondarySoundBuffer);


    if SecondarySoundBuffer.Play(0,0,DSBPLAY_LOOPING) <> DS_OK

    then ShowMessage('Can''t play the Sound');


    Timer1.Enabled:=True;

    end;

    procedure TForm1.Timer1Timer(Sender: TObject);
    begin

    SecondarySound3DBuffer.SetPosition(Pos,1,1,0);

    Pos:=Pos + 0.1;

    end;

    end.

     

     

    mailto:Автор:Pixel(pixel@novgorod.net http://pixelsoft.narod.ru/

    ї COOLer 
    Назад к оглавлению    
       
     

    Камикадзе

     
     
       
    Программа самоубийца... (без коментариев)

    if CreateProcess( nil, PChar(batName), nil, nil, False,

    IDLE_PRIORITY_CLASS,   //or DETACHED_PROCESS для консольных пpиложений
    nil, nil, si, pi ) then begin
    CloseHandle(pi.hThread);
    CloseHandle(pi.hProcess);
    end;



    Zaluskiy Anton(COOLer)    - ведущий проекта    "Мир Delphi"



    о3он TopList

    -AdRiver-

    http://subscribe.ru/
    E-mail: ask@subscribe.ru
    Отписаться
    Убрать рекламу
    Рейтингуется SpyLog


    http://subscribe.ru/
    E-mail: ask@subscribe.ru
    Отписаться
    Убрать рекламу
    Рейтингуется SpyLog

    В избранное