Форум: "Игры";
Текущий архив: 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