summaryrefslogtreecommitdiff
path: root/engine/audio/private/voice_record_openal.cpp
diff options
context:
space:
mode:
authorFluorescentCIAAfricanAmerican <[email protected]>2020-04-22 12:56:21 -0400
committerFluorescentCIAAfricanAmerican <[email protected]>2020-04-22 12:56:21 -0400
commit3bf9df6b2785fa6d951086978a3e66f49427166a (patch)
tree2c0f1f0c63c4832882bc93814ebd2c2b1c6224e5 /engine/audio/private/voice_record_openal.cpp
downloadarchived-source-engine-2018-hl2-src-master.tar.xz
archived-source-engine-2018-hl2-src-master.zip
Diffstat (limited to 'engine/audio/private/voice_record_openal.cpp')
-rw-r--r--engine/audio/private/voice_record_openal.cpp209
1 files changed, 209 insertions, 0 deletions
diff --git a/engine/audio/private/voice_record_openal.cpp b/engine/audio/private/voice_record_openal.cpp
new file mode 100644
index 0000000..679bf7d
--- /dev/null
+++ b/engine/audio/private/voice_record_openal.cpp
@@ -0,0 +1,209 @@
+//========= Copyright 1996-2009, Valve Corporation, All rights reserved. ============//
+//
+// Purpose:
+//
+// $NoKeywords: $
+//
+//=============================================================================//
+// This module implements the voice record and compression functions
+
+//#include "audio_pch.h"
+//#include "voice.h"
+#include "tier0/platform.h"
+#include "ivoicerecord.h"
+
+#include <assert.h>
+
+#ifndef POSIX
+class VoiceRecord_OpenAL : public IVoiceRecord
+{
+public:
+ VoiceRecord_OpenAL() {}
+ virtual ~VoiceRecord_OpenAL() {}
+ virtual void Release() {}
+ virtual bool RecordStart() { return true; }
+ virtual void RecordStop() {}
+ virtual bool Init(int sampleRate) { return true; }
+ virtual void Idle() {}
+ virtual int GetRecordedData(short *pOut, int nSamplesWanted ) { return 0; }
+};
+IVoiceRecord* CreateVoiceRecord_DSound(int sampleRate) { return new VoiceRecord_OpenAL; }
+
+#else
+
+#define min(a,b) (((a) < (b)) ? (a) : (b))
+#ifdef OSX
+#include <Carbon/Carbon.h>
+#include <OpenAL/al.h>
+#else
+#include <AL/al.h>
+#endif
+#include "openal/alc.h"
+
+// ------------------------------------------------------------------------------
+// VoiceRecord_OpenAL
+// ------------------------------------------------------------------------------
+
+class VoiceRecord_OpenAL : public IVoiceRecord
+{
+protected:
+
+ virtual ~VoiceRecord_OpenAL();
+
+
+ // IVoiceRecord.
+public:
+
+ VoiceRecord_OpenAL();
+ virtual void Release();
+
+ virtual bool RecordStart();
+ virtual void RecordStop();
+
+ // Initialize. The format of the data we expect from the provider is
+ // 8-bit signed mono at the specified sample rate.
+ virtual bool Init(int sampleRate);
+
+ virtual void Idle();
+
+ // Get the most recent N samples.
+ virtual int GetRecordedData(short *pOut, int nSamplesWanted );
+
+private:
+ bool InitalizeInterfaces(); // Initialize the openal capture buffers and other interfaces
+ void ReleaseInterfaces(); // Release openal buffers and other interfaces
+ void ClearInterfaces(); // Clear members.
+
+
+private:
+ ALCdevice *m_Device;
+
+ int m_nSampleRate;
+};
+
+
+
+VoiceRecord_OpenAL::VoiceRecord_OpenAL() :
+m_nSampleRate( 0 ), m_Device( NULL )
+{
+ ClearInterfaces();
+}
+
+VoiceRecord_OpenAL::~VoiceRecord_OpenAL()
+{
+ ReleaseInterfaces();
+}
+
+
+void VoiceRecord_OpenAL::Release()
+{
+ delete this;
+}
+
+bool VoiceRecord_OpenAL::RecordStart()
+{
+
+ // Re-initialize the capture buffer if neccesary (should always be)
+ if ( !m_Device )
+ {
+ InitalizeInterfaces();
+ }
+
+ if ( !m_Device )
+ return false;
+
+ alcGetError(m_Device);
+
+ alcCaptureStart(m_Device);
+
+ const ALenum error = alcGetError(m_Device);
+ return error == AL_NO_ERROR;
+}
+
+
+void VoiceRecord_OpenAL::RecordStop()
+{
+ // Stop capturing.
+ if ( m_Device )
+ {
+ alcCaptureStop( m_Device );
+ }
+
+ // Release the capture buffer interface and any other resources that are no
+ // longer needed
+ ReleaseInterfaces();
+}
+
+bool VoiceRecord_OpenAL::InitalizeInterfaces()
+{
+ m_Device = alcCaptureOpenDevice( NULL, m_nSampleRate, AL_FORMAT_MONO16, m_nSampleRate * 10 * 2);
+ const ALenum error = alcGetError(m_Device);
+ const bool result = error == AL_NO_ERROR;
+ return m_Device != NULL && result;
+}
+
+bool VoiceRecord_OpenAL::Init(int sampleRate)
+{
+ m_nSampleRate = sampleRate;
+
+ ReleaseInterfaces();
+
+ return true;
+}
+
+
+void VoiceRecord_OpenAL::ReleaseInterfaces()
+{
+ alcCaptureCloseDevice(m_Device);
+ ClearInterfaces();
+}
+
+
+void VoiceRecord_OpenAL::ClearInterfaces()
+{
+ m_Device = NULL;
+}
+
+
+void VoiceRecord_OpenAL::Idle()
+{
+}
+
+
+int VoiceRecord_OpenAL::GetRecordedData(short *pOut, int nSamples )
+{
+ int frameCount = 0;
+ alcGetIntegerv( m_Device,ALC_CAPTURE_SAMPLES,1,&frameCount );
+ if ( frameCount > 0 )
+ {
+ frameCount = min( nSamples, frameCount );
+ alcCaptureSamples( m_Device, pOut, frameCount );
+ if ( alcGetError(m_Device) != ALC_NO_ERROR )
+ {
+ return 0;
+ }
+ return frameCount;
+ }
+ return 0;
+}
+
+
+
+IVoiceRecord* CreateVoiceRecord_OpenAL(int sampleRate)
+{
+ VoiceRecord_OpenAL *pRecord = new VoiceRecord_OpenAL;
+ if ( pRecord && pRecord->Init(sampleRate) )
+ {
+ return pRecord;
+ }
+ else
+ {
+ if ( pRecord )
+ {
+ pRecord->Release();
+ }
+
+ return NULL;
+ }
+}
+#endif