Конференция "Media" » Проблема при воспроизведении звука с двойной буферизацией
 
  • ocdp (02.12.09 12:04) [0]
    есть код, которым играю звук

    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 кбайт. в чём дело? может сама процедура медленная, а то я хотел ещё пару обработок сигнала при этом навесить, а тогда совсем плохо будет? спасибо за помощь.
  • brother © (02.12.09 12:08) [1]
    в данном случае размер буфера фажен, ибо

    > wBitsPerSample:=16;

    а по буферу в

    > например до 4 кбайт

    в 2 раза меньше идет) вот те и торомз скорости) имхо
  • ocdp (02.12.09 13:31) [2]
    а какая связь между форматом, который я задаю, то есть wavehdr, и размером буфера, из которого идёт воспроизведение? от размера буфера по идее зависит только частота обращений к источнику, то бишь как часто считывать информацию (в данном случае из memorystream) и запихивать её в буфер приходится.
  • brother © (02.12.09 13:54) [3]
    я сказал имхо...
  • Сергей М. © (02.12.09 16:31) [4]
    Чем готовые компоненты-то не угодили ?
  • ocdp (02.12.09 17:01) [5]
    идея такова, чтобы реализовывать смешивание определённого количества звуков в реальном времени, с какой-то обработкой (изменение громкости, реверс, эхо и т.д.); директикс не предлагать, он у меня есть, и он меня бесит.
  • Pavia © (02.12.09 20:16) [6]

    > проблема в том, что при уменьшении размера буфера (blocksize),
    >  например до 4 кбайт резко замедляется скорость воспроизведения,
    >  нормально играет только при размере от 16 кбайт. в чём
    > дело?

    Увеличь число буферов с двух до ...
  • Сергей М. © (03.12.09 08:39) [7]

    > директикс не предлагать, он у меня есть, и он меня бесит


    На DS свет клином не сошелся.
    Существует, к примеру, ASIO.
  • miek (03.12.09 09:48) [8]
    а ты посчитай, сколько раз в секунду опустошается буфер на 4к? прикинь, сколько переключений контекста приходится делать системе.
 
Конференция "Media" » Проблема при воспроизведении звука с двойной буферизацией
Есть новые Нет новых   [120347   +15][b:0][p:0]