Blocking Audio Capture

View: New views
2 Messages — Rating Filter:   Alert me  

Blocking Audio Capture

by Stefan Kögel :: Rate this Message:

Reply to Author | View Threaded | Show Only this Message

Hello Fellows,

i am using OpenAL to capture Audio from the microphone. This works quite
well, the only thing that bothers me, is that I have to poll the number
of available samples.
This is so cpu intensive. There must be some other way. Isnt there a
blocking call, which returns a previous specified number of samples in a
buffer. Or some kind of callback construction.
So far I have not found something like inside the OpenAL source.

Does anyone know if there exists such a thing? Or has anyone done this
before and can tell me what approach I can use?

Here is what I do:

while (tNumSamplesAvail < tCaptureSamples-1)
        {
            //Get number of captured samples
            alcGetIntegerv(mCaptureDevice, ALC_CAPTURE_SAMPLES,
sizeof(tNumSamplesAvail), &tNumSamplesAvail);
            if (tNumSamplesAvail < tCaptureSamples-1)
                usleep(10);
        }
        alcCaptureSamples(mCaptureDevice, (ALCvoid *)pBuffer,
tNumSamplesAvail);

I hate to use "usleep". Actively waiting is not very sophisticated.

Thanks in advance.

Kind regards,
Stefan
_______________________________________________
Openal mailing list
Openal@...
http://opensource.creative.com/mailman/listinfo/openal

Re: Blocking Audio Capture

by Chris Robinson-5 :: Rate this Message:

Reply to Author | View Threaded | Show Only this Message

On Tuesday 05 May 2009 2:17:05 am Stefan Kögel wrote:
> Hello Fellows,
>
> i am using OpenAL to capture Audio from the microphone. This works quite
> well, the only thing that bothers me, is that I have to poll the number
> of available samples.
> This is so cpu intensive. There must be some other way. Isnt there a
> blocking call, which returns a previous specified number of samples in a
> buffer. Or some kind of callback construction.

OpenAL doesn't have a blocking call, and it doesn't do callbacks.

> So far I have not found something like inside the OpenAL source.
>
> Does anyone know if there exists such a thing? Or has anyone done this
> before and can tell me what approach I can use?
>
> Here is what I do:
>
> while (tNumSamplesAvail < tCaptureSamples-1)
>         {
>             //Get number of captured samples
>             alcGetIntegerv(mCaptureDevice, ALC_CAPTURE_SAMPLES,
> sizeof(tNumSamplesAvail), &tNumSamplesAvail);
>             if (tNumSamplesAvail < tCaptureSamples-1)
>                 usleep(10);
>         }
>         alcCaptureSamples(mCaptureDevice, (ALCvoid *)pBuffer,
> tNumSamplesAvail);
>
> I hate to use "usleep". Actively waiting is not very sophisticated.

You can probably do something like this:

void BlockingCapture(ALCdevice *mCaptureDevice, ALCubyte *pBuffer,
                     ALCint iSamplesToGet)
{
    ALCint capturedSamples = 0;
    while(capturedSamples < iSamplesToGet)
    {
        ALCint avail;
        alcGetIntegerv(mCaptureDevice, ALC_CAPTURE_SAMPLES, 1, &avail);
        if(avail > 0/*or some threshold*/)
        {
            avail = min(avail, iSamplesToGet-capturedSamples);
            alcCaptureSamples(mCaptureDevice, pBuffer, avail);
            capturedSamples += avail;
            pBuffer += avail;
        }
        else
            usleep(10);
    }
}

This shouldn't be unreasonably CPU intensive as it will be resting while
waiting for the data to get captured. It also lets you capture more samples
than the device was opened for.

_______________________________________________
Openal mailing list
Openal@...
http://opensource.creative.com/mailman/listinfo/openal