Мне потребовалось организовать потовую (непрерывную?) запись (и последующее воспроизведение) звука с использованием OpenAL.
Если по воспроизведением есть справочные материалы как это сделать, то как организовать запись я понять не могу.
Может кто-нибудь подсказать как это сделать?
Добавлено спустя 53 минуты 52 секунды:
Попробовал сделать такой тестовый примерчик на основе исходника из состава 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К.
С чем такое может быть связано? Есть ли другие способы реализации?