Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Игры";
Текущий архив: 2005.09.18;
Скачать: [xml.tar.bz2];

Вниз

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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.47 MB
Время: 0.016 c
14-1124710103
КК
2005-08-22 15:28
2005.09.18
SHS1.EXE - что это


6-1116938459
redlord
2005-05-24 16:40
2005.09.18
как засеч отключение удаленного компа


2-1123825161
syte_ser78
2005-08-12 09:39
2005.09.18
консольное приложение?


3-1122992673
Kuzmich86
2005-08-02 18:24
2005.09.18
FastReport и Halcyon


4-1122363000
Jupiter
2005-07-26 11:30
2005.09.18
Как узнать размер папки





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский