Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2005.09.18;
Скачать: CL | DM;

Вниз

Direct Sound   Найти похожие ветки 

 
Кирилл ©   (2005-05-21 15:03) [0]

Задача: воспроизвести звук "snd1.wav".
Код:

var

DS: IDirectSound;
Buff1: IDirectSoundBuffer;

procedure TForm1.FormCreate(Sender: TObject);

var

hwav: HMMIO;
parent, child: TMMCKinfo;
wfmtx: TWaveFormatEx;
index: Integer;
snd_buffer, audio_ptr_1, audio_ptr_2: PByte;
audio_length_1, audio_length_2: DWord;
dsbd: TDSBufferDesc;

begin

DirectSoundCreate(nil, DS, nil);
DS.SetCooperativeLevel(handle, DSSCL_EXCLUSIVE);
ZeroMemory(@parent, SizeOf(parent));
Child:=Parent;
hwav:=mmioOpen("snd1.wav", nil, MMIO_READ or MMIO_ALLOCBUF);
parent.fccType:=mmioStringToFOURCC("WAVE", 0);
child.ckid:=mmioStringToFOURCC("fmt", 0);
mmioRead(hwav, PChar(@wfmtx), SizeOf(wfmtx));
mmioAscend(hwav, @child, 0);
child.ckid:=mmioStringToFOURCC("data", 0);
snd_buffer^:=child.cksize;
mmioRead(hwav, pchar(snd_buffer), child.cksize);
mmioClose(hwav, 0);
ZeroMemory(@wfmtx, SizeOf(wfmtx));
wfmtx.wFormatTag:=WAVE_FORMAT_PCM;
wfmtx.nChannels:=1;
wfmtx.nSamplesPerSec:=11025;
wfmtx.nBlockAlign:=1;
wfmtx.nAvgBytesPerSec:=wfmtx.nSamplesPerSec*wfmtx.nBlockAlign;
wfmtx.wBitsPerSample:=8;
wfmtx.cbSize:=0;
ZeroMemory(@dsbd, SizeOf(dsbd));
dsbd.dwSize:=SizeOf(TDSBufferDesc);
dsbd.dwFlags:=DSBCAPS_CTRLPAN or DSBCAPS_CTRLVOLUME or DSBCAPS_CTRLFREQUENCY
             or DSBCAPS_STATIC or DSBCAPS_LOCSOFTWARE;
dsbd.dwBufferBytes:=5*11025;
dsbd.lpwfxFormat:=@wfmtx;
DS.CreateSoundBuffer(dsbd, buff1, nil);
buff1.Lock(0, child.cksize, @audio_ptr_1, @audio_length_1, @audio_ptr_2, @audio_length_2, DSBLOCK_FROMWRITECURSOR);
CopyMemory(audio_ptr_1, snd_buffer, audio_length_1);
CopyMemory(audio_ptr_2, Pointer(snd_buffer^+audio_length_1), audio_length_1);
buff1.Unlock(audio_ptr_1, audio_length_1, audio_ptr_2, audio_length_2);
Dispose(snd_buffer);

end;

procedure TForm1.Button1Click(Sender: TObject);
begin
buff1.Play(0,0,DSBPLAY_LOOPING);
end;



Звук не играется, при выходе из программы возникает ошибка.
ОГРОМНАЯ ПРОСЬБА, скажите, что я делаю не так?


 
XProger ©   (2005-05-21 16:29) [1]

Где выделение памяти под snd_buffer?
snd_buffer^:=child.cksize; а это что такое?


 
Кирилл ©   (2005-05-21 16:39) [2]

Да, точно! Я заменил snd_buffer^:=child.cksize на New(snd_buffer), но лучше не стало. Честно говоря, я сам мало понимаю в этом коде, т. к. не умею работать с wav на низком уровне. Мне просто необходимо воспроизводить звук в своей программе, но в инете информации не нашёл вообще. А данный код я взял из книжки и  перевёл его на паскаль с С++, но он пока не работает. Кстати, в строчке
CopyMemory(audio_ptr_2, Pointer(snd_buffer^+audio_length_1), audio_length_1);
я вообще не уверен...


 
XProger ©   (2005-05-21 16:54) [3]

Не могу понять dsbd.dwBufferBytes:=5*11025; у тебя фиксированный размер буфера?
Размер сэмпла находится так: Seek(F, 40); BlockRead(F, size, 4);

New(snd_buffer) - выделит 1 байт памяти под буфер =)
Так попробуй: GetMem(snd_buffer, size)

А вообще...
sndPlaySound чем не устраивает?


 
Кирилл ©   (2005-05-21 17:16) [4]


> XProger ©   (21.05.05 16:54) [3]


> dsbd.dwBufferBytes:=5*11025

Звук около 5 сукунд, в книжке написано - 11025*(кол-во сек)

> GetMem(snd_buffer, size)

вообще не компилируется

> А вообще...
> sndPlaySound чем не устраивает?

А как громкость менять??


 
XProger ©   (2005-05-21 17:51) [5]

"Звук около 5 сукунд" нужно не считать, а читать из файла :)
"вообще не компилируется", ты size объявил хоть? я тебе показал откуда его брать...
"А как громкость менять??", тут уйма топиков по этому поводу была...


 
Кирилл ©   (2005-05-21 19:41) [6]


> ты size объявил хоть?

size то я объявил. Я просто неправильно выразился, всё компилируется, но возникает динамическая ошибка при выполнении строки
CopyMemory(audio_ptr_2, Pointer(snd_buffer^+audio_length_1),
audio_length_1);



> "А как громкость менять??", тут уйма топиков по этому поводу
> была...

А ссылку не подскажешь? Если я смогу одновременно воспроизводить звуки с разной громкостью, то все мои проблемы решатся!


 
XProger ©   (2005-05-21 20:18) [7]

удаляй второй CopyMemory! Ты задал размер буфера только под 1 канал.

Несколько с разной громкостьюю - без извращений нельзя :)



Страницы: 1 вся ветка

Текущий архив: 2005.09.18;
Скачать: CL | DM;

Наверх




Память: 0.48 MB
Время: 0.045 c
6-1117201198
Asterot
2005-05-27 17:39
2005.09.18
Помогите люди добрые


8-1114973295
MxQ
2005-05-01 22:48
2005.09.18
Векторная карта


2-1123936347
RomanBishkek
2005-08-13 16:32
2005.09.18
Как можно обновить одну запись через Query


9-1116839722
Шухрат
2005-05-23 13:15
2005.09.18
плагины unwrap3d 2.15


6-1117110042
Lex_!
2005-05-26 16:20
2005.09.18
Открытие УРЛ и очистка кэша