mirror of
https://github.com/openmoh/openmohaa.git
synced 2025-04-28 21:57:57 +03:00
236 lines
6.5 KiB
C++
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();
|
|
}
|