openmohaa/code/gamespy/Voice2/Voice2BuddyMFC/SetupDlg.cpp
2023-02-04 21:00:01 +01:00

236 lines
6.5 KiB
C++

// SetupDlg.cpp : implementation file
//
#include "stdafx.h"
#include "Voice2BuddyMFC.h"
#include "SetupDlg.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
#define VOICE_THINK_TIMER_ID 101
#define VOICE_THINK_TIMER_DELAY 10
enum SetupMessage
{
V2B_STARTDEVICES = 0
};
/////////////////////////////////////////////////////////////////////////////
// CSetupDlg dialog
CSetupDlg::CSetupDlg(CWnd* pParent /*=NULL*/)
: CDialog(CSetupDlg::IDD, pParent)
{
//{{AFX_DATA_INIT(CSetupDlg)
// NOTE: the ClassWizard will add member initialization here
//}}AFX_DATA_INIT
}
void CSetupDlg::DoDataExchange(CDataExchange* pDX)
{
CDialog::DoDataExchange(pDX);
//{{AFX_DATA_MAP(CSetupDlg)
DDX_Control(pDX, IDC_ACTIVATELEVEL, m_ActivateLevel);
DDX_Control(pDX, IDC_VOICELEVEL, m_VoiceLevelCtrl);
DDX_Control(pDX, IDC_ISSPEAKING, m_IsSpeakingCtrl);
DDX_Control(pDX, IDC_PLAYBACKCOMBO, m_PlaybackCombo);
DDX_Control(pDX, IDC_CAPTURECOMBO, m_CaptureCombo);
//}}AFX_DATA_MAP
}
BEGIN_MESSAGE_MAP(CSetupDlg, CDialog)
//{{AFX_MSG_MAP(CSetupDlg)
ON_CBN_SELCHANGE(IDC_CAPTURECOMBO, OnSelChangeCaptureCombo)
ON_CBN_SELCHANGE(IDC_PLAYBACKCOMBO, OnSelChangePlaybackCombo)
ON_WM_TIMER()
ON_WM_HSCROLL()
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CSetupDlg message handlers
BOOL CSetupDlg::OnInitDialog()
{
CDialog::OnInitDialog();
// Begin Enumerate devices
int aNumDevices = gvListDevices(m_SetupInfo->m_DeviceInfoArray, MAX_DEVICES, GV_CAPTURE_AND_PLAYBACK);
// Populate the combo boxes
for (int aDeviceNum = 0; aDeviceNum < aNumDevices; aDeviceNum++)
{
// Add capture devices to display list
if (GV_CAPTURE & m_SetupInfo->m_DeviceInfoArray[aDeviceNum].m_deviceType)
{
// Set the item data to the device number (this may differ from the row due to sorting)
m_CaptureCombo.InsertString(0, m_SetupInfo->m_DeviceInfoArray[aDeviceNum].m_name);
m_CaptureCombo.SetItemData(0, aDeviceNum);
if (GV_CAPTURE & m_SetupInfo->m_DeviceInfoArray[aDeviceNum].m_defaultDevice)
m_CaptureCombo.SetCurSel(0);
}
// Add playback devices to display list
if (GV_PLAYBACK & m_SetupInfo->m_DeviceInfoArray[aDeviceNum].m_deviceType)
{
// Set the item data to the device number (this may differ from the row due to sorting)
m_PlaybackCombo.InsertString(0, m_SetupInfo->m_DeviceInfoArray[aDeviceNum].m_name);
m_PlaybackCombo.SetItemData(0, aDeviceNum);
if (GV_PLAYBACK & m_SetupInfo->m_DeviceInfoArray[aDeviceNum].m_defaultDevice)
m_PlaybackCombo.SetCurSel(0);
}
}
// If no device has been set, try setting to the first one
if (m_CaptureCombo.GetCurSel() == -1)
m_CaptureCombo.SetCurSel(0);
if (m_PlaybackCombo.GetCurSel() == -1)
m_PlaybackCombo.SetCurSel(0);
// Try to start the capture and playback device
StartSelCaptureDevice();
StartSelPlaybackDevice();
UpdateData(FALSE);
SetTimer(VOICE_THINK_TIMER_ID, VOICE_THINK_TIMER_DELAY, NULL);
return TRUE; // return TRUE unless you set the focus to a control
// EXCEPTION: OCX Property Pages should return FALSE
}
// Switch the active device
void CSetupDlg::OnSelChangeCaptureCombo()
{
StartSelCaptureDevice();
}
// Switch the active device
void CSetupDlg::OnSelChangePlaybackCombo()
{
StartSelPlaybackDevice();
}
///////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////
void CSetupDlg::StartSelCaptureDevice()
{
// Stop the previous device
if (m_SetupInfo->m_CaptureDevice != NULL)
{
gvStopDevice(m_SetupInfo->m_CaptureDevice, GV_CAPTURE);
gvFreeDevice(m_SetupInfo->m_CaptureDevice);
}
// Get the selected device id
int aSelDevice = m_CaptureCombo.GetCurSel();
if (aSelDevice == -1)
return;
int aDeviceNum = m_CaptureCombo.GetItemData(aSelDevice);
if (aDeviceNum == CB_ERR)
return;
// Create and start the new device
m_SetupInfo->m_CaptureDevice = gvNewDevice(m_SetupInfo->m_DeviceInfoArray[aDeviceNum].m_id, GV_CAPTURE);
if (m_SetupInfo->m_CaptureDevice != NULL)
gvStartDevice(m_SetupInfo->m_CaptureDevice, GV_CAPTURE);
}
///////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////
void CSetupDlg::StartSelPlaybackDevice()
{
// Stop the previous device
if (m_SetupInfo->m_PlaybackDevice != NULL)
{
gvStopDevice(m_SetupInfo->m_PlaybackDevice, GV_PLAYBACK);
gvFreeDevice(m_SetupInfo->m_PlaybackDevice);
}
// Get the selected device id
int aSelDevice = m_PlaybackCombo.GetCurSel();
if (aSelDevice == -1)
return;
int aDeviceNum = m_PlaybackCombo.GetItemData(aSelDevice);
if (aDeviceNum == CB_ERR)
return;
// Create and start the new device
m_SetupInfo->m_PlaybackDevice = gvNewDevice(m_SetupInfo->m_DeviceInfoArray[aDeviceNum].m_id, GV_PLAYBACK);
if (m_SetupInfo->m_PlaybackDevice != NULL)
gvStartDevice(m_SetupInfo->m_PlaybackDevice, GV_PLAYBACK);
}
static GVBool gMute = GVFalse;
void CSetupDlg::OnTimer(UINT nIDEvent)
{
gvThink();
// Check for voice data, play as local echo
int aBytesAvailable = gvGetAvailableCaptureBytes(m_SetupInfo->m_CaptureDevice);
if (aBytesAvailable > 0)
{
GVByte aBuffer[1024];
int aLength = 1024;
GVFrameStamp aFrameStamp;
GVScalar aVolume = 0;
GVBool gotPacket = gvCapturePacket(m_SetupInfo->m_CaptureDevice, aBuffer, &aLength, &aFrameStamp, &aVolume);
if (gotPacket == GVTrue)
{
gvPlayPacket(m_SetupInfo->m_PlaybackDevice, aBuffer, aLength, 0, aFrameStamp, gMute);
m_IsSpeakingCtrl.ShowWindow(SW_SHOW);
}
else
{
m_IsSpeakingCtrl.ShowWindow(SW_HIDE);
}
// Display the volume level
m_VoiceLevelCtrl.SetPos( (int)(aVolume*100) );
}
CDialog::OnTimer(nIDEvent);
}
void CSetupDlg::OnHScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar)
{
if (pScrollBar == (CScrollBar*)&m_ActivateLevel)
{
double aThreshold = (float)m_ActivateLevel.GetPos()/100;
if (m_SetupInfo->m_CaptureDevice != NULL)
gvSetCaptureThreshold(m_SetupInfo->m_CaptureDevice, aThreshold);
}
CDialog::OnHScroll(nSBCode, nPos, pScrollBar);
}
BOOL CSetupDlg::DestroyWindow()
{
// Stop the devices
if (m_SetupInfo->m_CaptureDevice != NULL)
gvStopDevice(m_SetupInfo->m_CaptureDevice, GV_CAPTURE);
if (m_SetupInfo->m_PlaybackDevice != NULL)
gvStopDevice(m_SetupInfo->m_PlaybackDevice, GV_PLAYBACK);
// Kill the think timer
KillTimer(VOICE_THINK_TIMER_ID);
return CDialog::DestroyWindow();
}