ПрограммированиеФорумЗвук

Потоковая запись звука с помощью OpenAL

#0
18:27, 23 апр 2015

Здравствуйте!
Мне требуется сделать что-то типа аудиочата с использованием OpenAl и Lazarusa.
С воспроизведением звука вопросов вроде бы нет - в статье про воспроизведение ogg это описано.
А вот как делать запись понять не могу.
Попробовал сделать такой тестовый примерчик на основе исходника из состава FPC.

константы, типы, переменные

const
  Seconds = 1;                            //- длительность записи 1 сек
  Frequency = 8000;                       //- частота дискретизации 8 КГц
  Format = AL_FORMAT_MONO8;              //- формат записи 16-бит моно
  SampleSize = 1;                        //- размер сэмпла AL_FORMAT_MONO8 в байтах
  BufferSize = Frequency*SampleSize*Seconds; //- размер буфера (частота * 2bytes(16-bit)) * время

type
  TCaptureBuffer = array[0..BufferSize-1] of ALubyte; //- внешний буфер для записи из openAL
  PCaptureBuffer = ^TCaptureBuffer;          

  Str: String;
  Flag: Boolean = True;
  Buffers: TList;
  CaptureBufferPoint: pCaptureBuffer;

  pCaptureDevice: pALCDevice;                  //- устройство записи аудио
  CaptureBuffer: TCaptureBuffer; //- внешний буфер для записи из openAL, размер которого вычислен для записи 1 сек                       
  Samples: ALInt;                //- количество  звуковых сэмплов

процедура записи

//- Setup the input capture device (default device)
  Str:='Setting up alcCaptureOpenDevice to use default device'; Memo1.Lines.Add(Str);
  pcaptureDevice:=alcCaptureOpenDevice(nil, Frequency, Format, BufferSize);
  if pcaptureDevice=nil then begin
    raise exception.create('Capture device is nil!');
    exit;
  end;

  //- Start capturing data
  alcCaptureStart(PCaptureDevice);

  Flag:=true;
  While Flag do begin
    //- Сapturing data samples
    repeat
      alcGetIntegerv(pCaptureDevice, ALC_CAPTURE_SAMPLES, ALsizei(sizeof(ALint)), @samples);
      Str:=IntToStr(samples)+'/'+IntToStr(Seconds*Frequency)+' samples'; form1.Caption:=Str;
    until samples>=seconds*frequency;

    //- Capture the samples into our capture buffer
    alcCaptureSamples(pCaptureDevice, @CaptureBuffer, samples);

    if Buffers.Count>=9 then begin
      Buffers.Delete(0);
    end;
    New(CaptureBufferPoint);
    CaptureBufferPoint^:=CaptureBuffer;
    Buffers.Add(CaptureBufferPoint);

    Application.ProcessMessages;
  end;                                

    //- Capture the samples into our capture buffer
    alcCaptureSamples(pCaptureDevice, @CaptureBuffer, samples);
    form1.Caption:=IntToStr(Samples);
    application.ProcessMessages;
  end;

  //- Done recording
  alcCaptureStop(pCaptureDevice);

  //- Shutdown/Clean up the capture stuff
  alcCaptureCloseDevice( pCaptureDevice );                 

С одной стороны все работает.
Но непонятно из-за чего программа "жрет" память блоками по 8К.
С чем такое может быть связано? Есть ли другие способы реализации?

ПрограммированиеФорумЗвук

Тема в архиве.