0c3df1d430
Added a raw audio decoder, allowing raw audio to be played if the format and frequency is known. Will also load from .raw files on disk, but will assume the format is 16 bit mono and the frequency is 22050 hz Added a tutorial to show how recording and playback can be done. Added the ability for the user to unregister audio codecs that they will not be using. Also added methods to test for the existance of a decoder and get the decoder factory back. Moved cVector3.h to include instead of Headers to make using it in user projects easier (one less include path) Moved the audio format enum to its own header file. Small fix in the wav decoder to prevent the file header from being played as audio data.
178 lines
4.1 KiB
C++
178 lines
4.1 KiB
C++
#include "../Headers/cAudioCapture.h"
|
|
#include <string.h>
|
|
|
|
namespace cAudio
|
|
{
|
|
cAudioCapture::cAudioCapture() : Frequency(22050), Format(EAF_16BIT_MONO), InternalBufferSize(8192),
|
|
Supported(false), Ready(false), Capturing(false), SampleSize(2), CaptureDevice(NULL)
|
|
{
|
|
|
|
}
|
|
cAudioCapture::~cAudioCapture()
|
|
{
|
|
|
|
}
|
|
|
|
bool cAudioCapture::checkCaptureExtension()
|
|
{
|
|
// Check for Capture Extension support
|
|
ALCdevice* pDevice;
|
|
ALCcontext* pContext;
|
|
pContext = alcGetCurrentContext();
|
|
pDevice = alcGetContextsDevice(pContext);
|
|
Supported = ( alcIsExtensionPresent(pDevice, "ALC_EXT_CAPTURE") == AL_TRUE );
|
|
return Supported;
|
|
}
|
|
|
|
bool cAudioCapture::initOpenALDevice()
|
|
{
|
|
if(Supported)
|
|
{
|
|
if(CaptureDevice)
|
|
shutdownOpenALDevice();
|
|
|
|
CaptureDevice = alcCaptureOpenDevice(NULL, Frequency, Format, InternalBufferSize / SampleSize);
|
|
if(CaptureDevice)
|
|
{
|
|
Ready = true;
|
|
return true;
|
|
}
|
|
}
|
|
return false;
|
|
}
|
|
|
|
void cAudioCapture::shutdownOpenALDevice()
|
|
{
|
|
if(Supported)
|
|
{
|
|
if(Capturing)
|
|
stopCapture();
|
|
|
|
if(CaptureDevice)
|
|
{
|
|
alcCaptureCloseDevice(CaptureDevice);
|
|
CaptureDevice = NULL;
|
|
Ready = false;
|
|
}
|
|
}
|
|
}
|
|
|
|
void cAudioCapture::shutdown()
|
|
{
|
|
shutdownOpenALDevice();
|
|
}
|
|
|
|
void cAudioCapture::updateCaptureBuffer(bool force)
|
|
{
|
|
if(Capturing && CaptureDevice && Ready)
|
|
{
|
|
int AvailableSamples = 0;
|
|
alcGetIntegerv(CaptureDevice, ALC_CAPTURE_SAMPLES, 1, &AvailableSamples);
|
|
const unsigned int availbuffersize = AvailableSamples * SampleSize;
|
|
|
|
//If the samples in the OpenAL buffer are more than half of its max size, grab them
|
|
if(availbuffersize > InternalBufferSize / 2 || force)
|
|
{
|
|
//Fixes a bug with the capture being forced, but no data being available
|
|
if(availbuffersize > 0)
|
|
{
|
|
const int oldBufferSize = CaptureBuffer.size();
|
|
CaptureBuffer.resize(oldBufferSize + availbuffersize, 0);
|
|
alcCaptureSamples(CaptureDevice, &CaptureBuffer[oldBufferSize], AvailableSamples);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
bool cAudioCapture::beginCapture()
|
|
{
|
|
if(!Capturing)
|
|
{
|
|
CaptureBuffer.clear();
|
|
if(CaptureDevice && Ready)
|
|
{
|
|
alcCaptureStart(CaptureDevice);
|
|
Capturing = true;
|
|
}
|
|
return Capturing;
|
|
}
|
|
else
|
|
return false;
|
|
}
|
|
|
|
void cAudioCapture::stopCapture()
|
|
{
|
|
if(CaptureDevice && Ready)
|
|
{
|
|
alcCaptureStop(CaptureDevice);
|
|
updateCaptureBuffer(true);
|
|
}
|
|
Capturing = false;
|
|
}
|
|
|
|
void cAudioCapture::getCapturedAudio(void* outputBuffer, unsigned int outputBufferSize)
|
|
{
|
|
if(outputBuffer && outputBufferSize > 0)
|
|
{
|
|
int sizeToCopy = (outputBufferSize >= CaptureBuffer.size()) ? CaptureBuffer.size() : outputBufferSize;
|
|
memcpy(outputBuffer, &CaptureBuffer[0], sizeToCopy);
|
|
CaptureBuffer.erase(CaptureBuffer.begin(), CaptureBuffer.begin()+sizeToCopy);
|
|
}
|
|
}
|
|
|
|
unsigned int cAudioCapture::getCurrentCapturedAudioSize()
|
|
{
|
|
return CaptureBuffer.size();
|
|
}
|
|
|
|
bool cAudioCapture::setFrequency(unsigned int frequency)
|
|
{
|
|
Frequency = frequency;
|
|
shutdownOpenALDevice();
|
|
return initOpenALDevice();
|
|
}
|
|
|
|
bool cAudioCapture::setFormat(AudioFormats format)
|
|
{
|
|
Format = format;
|
|
if(Format == EAF_8BIT_MONO)
|
|
SampleSize = 1;
|
|
else if(Format == EAF_8BIT_STEREO)
|
|
SampleSize = 2;
|
|
else if(Format == EAF_16BIT_MONO)
|
|
SampleSize = 2;
|
|
else
|
|
SampleSize = 4;
|
|
|
|
shutdownOpenALDevice();
|
|
return initOpenALDevice();
|
|
}
|
|
|
|
bool cAudioCapture::setInternalBufferSize(unsigned int internalBufferSize)
|
|
{
|
|
InternalBufferSize = internalBufferSize;
|
|
|
|
shutdownOpenALDevice();
|
|
return initOpenALDevice();
|
|
}
|
|
|
|
bool cAudioCapture::initialize(unsigned int frequency, AudioFormats format, unsigned int internalBufferSize)
|
|
{
|
|
Frequency = frequency;
|
|
InternalBufferSize = internalBufferSize;
|
|
|
|
Format = format;
|
|
if(Format == EAF_8BIT_MONO)
|
|
SampleSize = 1;
|
|
else if(Format == EAF_8BIT_STEREO)
|
|
SampleSize = 2;
|
|
else if(Format == EAF_16BIT_MONO)
|
|
SampleSize = 2;
|
|
else
|
|
SampleSize = 4;
|
|
|
|
shutdownOpenALDevice();
|
|
return initOpenALDevice();
|
|
}
|
|
};
|