summaryrefslogtreecommitdiff
path: root/engine/audio/private/voice_mixer_controls_openal.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'engine/audio/private/voice_mixer_controls_openal.cpp')
-rw-r--r--engine/audio/private/voice_mixer_controls_openal.cpp286
1 files changed, 286 insertions, 0 deletions
diff --git a/engine/audio/private/voice_mixer_controls_openal.cpp b/engine/audio/private/voice_mixer_controls_openal.cpp
new file mode 100644
index 0000000..832815c
--- /dev/null
+++ b/engine/audio/private/voice_mixer_controls_openal.cpp
@@ -0,0 +1,286 @@
+//========= Copyright Valve Corporation, All rights reserved. ============//
+//
+// Purpose:
+//
+// $NoKeywords: $
+//=============================================================================//
+
+
+#ifdef OSX
+#include <Carbon/Carbon.h>
+#include <CoreAudio/CoreAudio.h>
+#endif
+
+#include "tier0/platform.h"
+#include "ivoicerecord.h"
+#include "voice_mixer_controls.h"
+
+// memdbgon must be the last include file in a .cpp file!!!
+#include "tier0/memdbgon.h"
+
+
+
+#ifndef OSX
+
+
+class CMixerControls : public IMixerControls
+{
+public:
+ CMixerControls() {}
+ virtual ~CMixerControls() {}
+
+ virtual void Release() {}
+ virtual bool GetValue_Float(Control iControl, float &value ) {return false;}
+ virtual bool SetValue_Float(Control iControl, float value) {return false;}
+ virtual bool SelectMicrophoneForWaveInput() {return false;}
+ virtual const char *GetMixerName() {return "Linux"; }
+
+private:
+};
+
+IMixerControls* g_pMixerControls = NULL;
+void InitMixerControls()
+{
+ if ( !g_pMixerControls )
+ {
+ g_pMixerControls = new CMixerControls;
+ }
+}
+
+void ShutdownMixerControls()
+{
+ delete g_pMixerControls;
+ g_pMixerControls = NULL;
+}
+
+#elif defined(OSX)
+
+class CMixerControls : public IMixerControls
+{
+public:
+ CMixerControls();
+ virtual ~CMixerControls();
+
+ virtual void Release();
+ virtual bool GetValue_Float(Control iControl, float &value);
+ virtual bool SetValue_Float(Control iControl, float value);
+ virtual bool SelectMicrophoneForWaveInput();
+ virtual const char *GetMixerName();
+
+private:
+ AudioObjectID GetDefaultInputDevice();
+ char *m_szMixerName;
+ AudioObjectID m_theDefaultDeviceID;
+};
+
+
+CMixerControls::CMixerControls()
+{
+ m_szMixerName = NULL;
+
+ m_theDefaultDeviceID = GetDefaultInputDevice();
+
+ OSStatus theStatus;
+ UInt32 outSize = sizeof(UInt32);
+ theStatus = AudioDeviceGetPropertyInfo( m_theDefaultDeviceID,
+ 0,
+ TRUE,
+ kAudioDevicePropertyDeviceName,
+ &outSize,
+ NULL);
+ if ( theStatus == noErr )
+ {
+ m_szMixerName = (char *)malloc( outSize*sizeof(char));
+
+ theStatus = AudioDeviceGetProperty( m_theDefaultDeviceID,
+ 0,
+ TRUE,
+ kAudioDevicePropertyDeviceName,
+ &outSize,
+ m_szMixerName);
+
+ if ( theStatus != noErr )
+ {
+ free( m_szMixerName );
+ m_szMixerName = NULL;
+ }
+ }
+}
+
+CMixerControls::~CMixerControls()
+{
+ if ( m_szMixerName )
+ free( m_szMixerName );
+}
+
+void CMixerControls::Release()
+{
+}
+
+bool CMixerControls::SelectMicrophoneForWaveInput()
+{
+ return true; // not needed
+}
+
+
+const char *CMixerControls::GetMixerName()
+{
+ return m_szMixerName;
+}
+
+
+bool CMixerControls::GetValue_Float(Control iControl, float &value)
+{
+ switch( iControl)
+ {
+ case MicBoost:
+ {
+ value = 0.0f;
+ return true;
+ }
+ case MicVolume:
+ {
+ OSStatus theError = noErr;
+ for ( int iChannel = 0; iChannel < 3; iChannel++ )
+ {
+ // scan the channel list until you find a channel set to non-zero, then use that
+ Float32 theVolume = 0;
+ UInt32 theSize = sizeof(Float32);
+ AudioObjectPropertyAddress theAddress = { kAudioDevicePropertyVolumeScalar, kAudioDevicePropertyScopeInput, iChannel };
+
+ theError = AudioObjectGetPropertyData(m_theDefaultDeviceID,
+ &theAddress,
+ 0,
+ NULL,
+ &theSize,
+ &theVolume);
+ value = theVolume;
+ if ( theError == noErr && theVolume != 0.0f )
+ break;
+ }
+
+ return theError == noErr;
+ }
+
+ case MicMute:
+ // Mic playback muting. You usually want this set to false, otherwise the sound card echoes whatever you say into the mic.
+ {
+ Float32 theMute = 0;
+ UInt32 theSize = sizeof(Float32);
+ AudioObjectPropertyAddress theAddress = { kAudioDevicePropertyMute, kAudioDevicePropertyScopeInput, 1 };
+
+ OSStatus theError = AudioObjectGetPropertyData(m_theDefaultDeviceID,
+ &theAddress,
+ 0,
+ NULL,
+ &theSize,
+ &theMute);
+ value = theMute;
+ return theError == noErr;
+ }
+ default:
+ assert( !"Invalid Control type" );
+ value = 0.0f;
+ return false;
+ };
+}
+
+
+bool CMixerControls::SetValue_Float(Control iControl, float value)
+{
+ switch( iControl)
+ {
+ case MicBoost:
+ {
+ return false;
+ }
+ case MicVolume:
+ {
+ if ( value <= 0.0 )
+ return false; // don't let the volume be set to zero
+
+ Float32 theVolume = value;
+ UInt32 size = sizeof(Float32);
+ Boolean canset = false;
+ AudioObjectID defaultInputDevice = m_theDefaultDeviceID;
+
+ size = sizeof(canset);
+ OSStatus err = AudioDeviceGetPropertyInfo( defaultInputDevice, 0, true, kAudioDevicePropertyVolumeScalar, &size, &canset);
+ if(err==noErr && canset==true)
+ {
+ size = sizeof(theVolume);
+ err = AudioDeviceSetProperty( defaultInputDevice, NULL, 0, true, kAudioDevicePropertyVolumeScalar, size, &theVolume);
+ return err==noErr;
+ }
+
+ // try seperate channels
+ // get channels
+ UInt32 channels[2];
+ size = sizeof(channels);
+ err = AudioDeviceGetProperty(defaultInputDevice, 0, true, kAudioDevicePropertyPreferredChannelsForStereo, &size,&channels);
+ if(err!=noErr)
+ return false;
+
+ // set volume
+ size = sizeof(float);
+ err = AudioDeviceSetProperty(defaultInputDevice, 0, channels[0], true, kAudioDevicePropertyVolumeScalar, size, &theVolume);
+ //AssertMsg1( noErr==err, "error setting volume of channel %d\n",(int)channels[0]);
+ err = AudioDeviceSetProperty(defaultInputDevice, 0, channels[1], true, kAudioDevicePropertyVolumeScalar, size, &theVolume);
+ //AssertMsg1( noErr==err, "error setting volume of channel %d\n",(int)channels[1]);
+
+ return err == noErr;
+
+ }
+ case MicMute:
+ // Mic playback muting. You usually want this set to false, otherwise the sound card echoes whatever you say into the mic.
+ {
+ Float32 theMute = value;
+ UInt32 theMuteSize = sizeof(Float32);
+ OSStatus theError = paramErr;
+ theError = AudioDeviceSetProperty( m_theDefaultDeviceID,
+ NULL,
+ 0,
+ TRUE,
+ kAudioDevicePropertyMute,
+ theMuteSize,
+ &theMute);
+ return theError == noErr;
+ }
+ default:
+ assert( !"Invalid Control type" );
+ return false;
+ };
+}
+
+
+AudioObjectID CMixerControls::GetDefaultInputDevice()
+{
+ AudioObjectID theDefaultDeviceID = kAudioObjectUnknown;
+ AudioObjectPropertyAddress theDefaultDeviceAddress = { kAudioHardwarePropertyDefaultInputDevice, kAudioObjectPropertyScopeGlobal, kAudioObjectPropertyElementMaster };
+ UInt32 theDefaultDeviceSize = sizeof(AudioObjectID);
+ OSStatus theError = AudioObjectGetPropertyData (kAudioObjectSystemObject, &theDefaultDeviceAddress, 0, NULL, &theDefaultDeviceSize, &theDefaultDeviceID);
+ return theDefaultDeviceID;
+}
+
+
+IMixerControls* g_pMixerControls = NULL;
+void InitMixerControls()
+{
+ if ( !g_pMixerControls )
+ {
+ g_pMixerControls = new CMixerControls;
+ }
+}
+
+void ShutdownMixerControls()
+{
+ delete g_pMixerControls;
+ g_pMixerControls = NULL;
+}
+
+
+
+#else
+#error
+#endif
+