Здравствуйте!
Мне требуется сделать что-то типа аудиочата с использованием 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К.
С чем такое может быть связано? Есть ли другие способы реализации?
Тема в архиве.