-
есть код, которым играю звук
const BlockSize = 1024 * 24; var hEvent: THandle; WaveFormatEx: TWaveFormatEx; WaveHdr: array [0..1] of TWaveHdr; Buf: array [0..1] of array [0..BlockSize-1] of PChar; read, read2: integer; i: Cardinal; begin hEvent:=CreateEvent(nil, False, False, nil); with WaveFormatEx do begin wFormatTag:=WAVE_FORMAT_PCM; nChannels:=2; nSamplesPerSec:=44100; wBitsPerSample:=16; nBlockAlign:=wBitsPerSample div 8 * nChannels; nAvgBytesPerSec:=nSamplesPerSec * nBlockAlign; cbSize:=SizeOf(WaveFormatEx); end; if WaveOutOpen(@WaveOut, Form1.OutputComboBox.ItemIndex , @WaveFormatEx, hEvent, 0, CALLBACK_EVENT) <> MMSYSERR_NOERROR then begin CloseHandle(hEvent); Terminate; Exit; end;
read:=0;
I:=0; while i<2 do begin I:=i xor 1; read:=MemoryStream.Read(buf[i], blocksize); if memorystream.Position = memorystream.size then memorystream.Seek(soFromBeginning, 0); WaveOutPrepareHeader(WaveOut, @WaveHdr[i], SizeOf(TWaveHdr)); WaveHdr[i].lpData := @Buf[i]; WaveHdr[i].dwBufferLength:=Read;
waveOutWrite(waveout, @wavehdr[I], sizeof(WAVEHDR)); WaitForSingleObject(hEvent, INFINITE); end;
проблема в том, что при уменьшении размера буфера (blocksize), например до 4 кбайт резко замедляется скорость воспроизведения, нормально играет только при размере от 16 кбайт. в чём дело? может сама процедура медленная, а то я хотел ещё пару обработок сигнала при этом навесить, а тогда совсем плохо будет? спасибо за помощь.
-
в данном случае размер буфера фажен, ибо
> wBitsPerSample:=16;
а по буферу в
> например до 4 кбайт
в 2 раза меньше идет) вот те и торомз скорости) имхо
-
а какая связь между форматом, который я задаю, то есть wavehdr, и размером буфера, из которого идёт воспроизведение? от размера буфера по идее зависит только частота обращений к источнику, то бишь как часто считывать информацию (в данном случае из memorystream) и запихивать её в буфер приходится.
-
я сказал имхо...
-
Чем готовые компоненты-то не угодили ?
-
идея такова, чтобы реализовывать смешивание определённого количества звуков в реальном времени, с какой-то обработкой (изменение громкости, реверс, эхо и т.д.); директикс не предлагать, он у меня есть, и он меня бесит.
-
> проблема в том, что при уменьшении размера буфера (blocksize), > например до 4 кбайт резко замедляется скорость воспроизведения, > нормально играет только при размере от 16 кбайт. в чём > дело?
Увеличь число буферов с двух до ...
-
> директикс не предлагать, он у меня есть, и он меня бесит
На DS свет клином не сошелся. Существует, к примеру, ASIO.
-
а ты посчитай, сколько раз в секунду опустошается буфер на 4к? прикинь, сколько переключений контекста приходится делать системе.
|