Валентин Озеров - Советы по 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 - читать книгу онлайн бесплатно, автор Валентин Озеров
Тёмная тема
Сбросить

Интервал:

Закладка:

Сделать

return mxc.dwControlID;

}

BOOL SetMasterVolume(DWORD dwVolume) {

MIXERCONTROLDETAILS mxcd;

MIXERCONTROLDETAILS_UNSIGNED mxcd_u;

mxcd.cbStruct = sizeof(mxcd);

mxcd.dwControlID = MasterVolumeControlID;

mxcd.cChannels = 1;

mxcd.cMultipleItems = 0;

mxcd.cbDetails = 4;

mxcd.paDetails = &mxcd_u;

mmr = mixerGetControlDetails((HMIXEROBJ)ghmx, &mxcd, 0L);

if (MMSYSERR_NOERROR != mmr) return FALSE;

mxcd_u.dwValue = dwVolume;

mmr = mixerSetControlDetails((HMIXEROBJ)ghmx, &mxcd, 0L);

if (MMSYSERR_NOERROR != mmr) return FALSE;

return TRUE;

}

Переписывать на Delphi, думаю, ни к чему. Надо лишь не забыть добавить uses MMSystem; Громкость отдельных каналов очень просто устанавливается через auxSetVolume и аналогичные.

Как использовать в своей программе API DirectSound и DirectSound3D?

Nomadicсоветует:

Пример 1

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

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);

private

DirectSound: IDirectSound;

DirectSoundBuffer: IDirectSoundBuffer;

SecondarySoundBuffer: array[0..1] ofIDirectSoundBuffer;

procedureAppCreateWritePrimaryBuffer;

procedureAppCreateWriteSecondaryBuffer( varBuffer: IDirectSoundBuffer; SamplesPerSec: Integer; Bits: Word; isStereo: Boolean; Time: Integer);

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);

begin

ifDirectSoundCreate( nil, DirectSound, nil) <> DS_OK then RaiseException.Create('Failed to create IDirectSound object');

AppCreateWritePrimaryBuffer;

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

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

end;

procedureTForm1.FormDestroy(Sender: TObject);

vari: ShortInt;

begin

ifAssigned(DirectSoundBuffer) thenDirectSoundBuffer.Release;

fori:=0 to1 do ifAssigned(SecondarySoundBuffer[i]) thenSecondarySoundBuffer[i].Release;

ifAssigned(DirectSound) thenDirectSound.Release;

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);

ifAudioPtr2 <> nil then begin

Temp:=@SoundData;

Inc(Integer(Temp), AudioBytes1);

Move(Temp^, AudioPtr2^, AudioBytes2);

end;

ifBuffer.UnLock(AudioPtr1, AudioBytes1, AudioPtr2, AudioBytes2) <> DS_OK then RaiseException.Create('Unable to UnLock Sound Buffer');

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 Coopeative 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 Coopeative Level');

end;

procedureTForm1.AppCreateWriteSecondaryBuffer;

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 thenPCM.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;

dwBufferBytes:=Time*PCM.nAvgBytesPerSec;

lpwfxFormat:=@PCM;

end;

ifDirectSound.CreateSoundBuffer(BufferDesc, Buffer, nil) <> DS_OK then RaiseException.Create('Create Sound Buffer failed');

end;

procedureTForm1.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);

untilChunk = '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);

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

Интервал:

Закладка:

Сделать


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

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




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


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


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

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