www.pudn.com > AudioCodec.rar > AudioCodecDlg.cpp


// AudioCodecDlg.cpp : implementation file 
// 
 
#include "stdafx.h" 
#include "AudioCodec.h" 
#include "AudioCodecDlg.h" 
 
#include "AudioFile.h" 
#include "WaveFile.h" 
 
#ifdef _DEBUG 
#define new DEBUG_NEW 
#undef THIS_FILE 
static char THIS_FILE[] = __FILE__; 
#endif 
 
static TCHAR szDatFilter[] = _T("Data files (*.dat)|*.dat|All data files|*.dat;*.pcm;*.raw|All files (*.*)|*.*||"); 
static TCHAR szTxtFilter[] = _T("Text files (*.txt)|*.txt|All files (*.*)|*.*||"); 
static TCHAR szPcmFilter[] = _T("PCM files (*.pcm)|*.pcm|All data files|*.dat;*.pcm;*.raw|All files (*.*)|*.*||"); 
static TCHAR szWaveFilter[] = _T("Wave files (*.wav)|*.wav|All files (*.*)|*.*||"); 
 
///////////////////////////////////////////////////////////////////////////// 
// CAboutDlg dialog used for App About 
 
class CAboutDlg : public CDialog 
{ 
public: 
	CAboutDlg(); 
 
// Dialog Data 
	//{{AFX_DATA(CAboutDlg) 
	enum { IDD = IDD_ABOUTBOX }; 
	//}}AFX_DATA 
 
	// ClassWizard generated virtual function overrides 
	//{{AFX_VIRTUAL(CAboutDlg) 
	protected: 
	virtual void DoDataExchange(CDataExchange* pDX);    // DDX/DDV support 
	//}}AFX_VIRTUAL 
 
// Implementation 
protected: 
	//{{AFX_MSG(CAboutDlg) 
	//}}AFX_MSG 
	DECLARE_MESSAGE_MAP() 
}; 
 
CAboutDlg::CAboutDlg() : CDialog(CAboutDlg::IDD) 
{ 
	//{{AFX_DATA_INIT(CAboutDlg) 
	//}}AFX_DATA_INIT 
} 
 
void CAboutDlg::DoDataExchange(CDataExchange* pDX) 
{ 
	CDialog::DoDataExchange(pDX); 
	//{{AFX_DATA_MAP(CAboutDlg) 
	//}}AFX_DATA_MAP 
} 
 
BEGIN_MESSAGE_MAP(CAboutDlg, CDialog) 
	//{{AFX_MSG_MAP(CAboutDlg) 
		// No message handlers 
	//}}AFX_MSG_MAP 
END_MESSAGE_MAP() 
 
///////////////////////////////////////////////////////////////////////////// 
// CAudioCodecDlg dialog 
 
CAudioCodecDlg::CAudioCodecDlg(CWnd* pParent /*=NULL*/) 
	: CDialog(CAudioCodecDlg::IDD, pParent) 
{ 
	//{{AFX_DATA_INIT(CAudioCodecDlg) 
	m_bAudioNoAcm = FALSE; 
	m_bUseVAD = FALSE; 
	m_bUseHighRate = FALSE; 
	//}}AFX_DATA_INIT 
	// Note that LoadIcon does not require a subsequent DestroyIcon in Win32 
	m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME); 
} 
 
void CAudioCodecDlg::DoDataExchange(CDataExchange* pDX) 
{ 
	CDialog::DoDataExchange(pDX); 
	//{{AFX_DATA_MAP(CAudioCodecDlg) 
	DDX_Control(pDX, IDC_AUDIO_TYPE, m_ctlAudioType); 
	DDX_Check(pDX, IDC_AUDIO_NO_ACM, m_bAudioNoAcm); 
	DDX_Check(pDX, IDC_USE_VAD, m_bUseVAD); 
	DDX_Check(pDX, IDC_USE_HIGH_RATE, m_bUseHighRate); 
	//}}AFX_DATA_MAP 
} 
 
BEGIN_MESSAGE_MAP(CAudioCodecDlg, CDialog) 
	//{{AFX_MSG_MAP(CAudioCodecDlg) 
	ON_WM_SYSCOMMAND() 
	ON_WM_PAINT() 
	ON_WM_QUERYDRAGICON() 
	ON_BN_CLICKED(IDC_WAVE_CONVERTER, OnWaveConverter) 
	ON_CBN_SELCHANGE(IDC_AUDIO_TYPE, OnSelchangeAudioType) 
	ON_BN_CLICKED(IDC_AUDIO_NO_ACM, OnAudioNoAcm) 
	ON_BN_CLICKED(IDC_ENCODE_FILE, OnEncodeFile) 
	ON_BN_CLICKED(IDC_DECODE_FILE, OnDecodeFile) 
	//}}AFX_MSG_MAP 
END_MESSAGE_MAP() 
 
///////////////////////////////////////////////////////////////////////////// 
// CAudioCodecDlg message handlers 
 
BOOL CAudioCodecDlg::OnInitDialog() 
{ 
	CDialog::OnInitDialog(); 
 
	// Add "About..." menu item to system menu. 
 
	// IDM_ABOUTBOX must be in the system command range. 
	ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX); 
	ASSERT(IDM_ABOUTBOX < 0xF000); 
 
	CMenu* pSysMenu = GetSystemMenu(FALSE); 
	if (pSysMenu != NULL) 
	{ 
		CString strAboutMenu; 
		strAboutMenu.LoadString(IDS_ABOUTBOX); 
		if (!strAboutMenu.IsEmpty()) 
		{ 
			pSysMenu->AppendMenu(MF_SEPARATOR); 
			pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu); 
		} 
	} 
 
	// Set the icon for this dialog.  The framework does this automatically 
	//  when the application's main window is not a dialog 
	SetIcon(m_hIcon, TRUE);			// Set big icon 
	SetIcon(m_hIcon, FALSE);		// Set small icon 
	 
	// TODO: Add extra initialization here 
	m_ctlAudioType.AddString("8k pass through"); 
	m_ctlAudioType.AddString("ITU-T G.711 A Law"); 
	m_ctlAudioType.AddString("ITU-T G.711 MU Law"); 
	m_ctlAudioType.AddString("ITU-T G.721 ADPCM"); 
	m_ctlAudioType.AddString("GSM 6.10"); 
	m_ctlAudioType.AddString("ITU-T G.729 with Annex A&B"); 
	m_ctlAudioType.AddString("ITU-T G.723.1"); 
	m_ctlAudioType.AddString("ILBC 30ms"); 
	m_iAudioType = AfxGetApp()->GetProfileInt("Audio", "CodecType", 0); 
	m_ctlAudioType.SetCurSel(m_iAudioType); 
 
	m_bAudioNoAcm = AfxGetApp()->GetProfileInt("Audio", "AudioNoAcm", 0); 
	m_bUseHighRate = AfxGetApp()->GetProfileInt("Audio", "UseHighRate", 0); 
	m_bUseVAD = AfxGetApp()->GetProfileInt("Audio", "UseVAD", 0); 
	UpdateData(FALSE); 
	OnSelchangeAudioType(); 
	return TRUE;  // return TRUE  unless you set the focus to a control 
} 
 
void CAudioCodecDlg::OnSysCommand(UINT nID, LPARAM lParam) 
{ 
	if ((nID & 0xFFF0) == IDM_ABOUTBOX) 
	{ 
		CAboutDlg dlgAbout; 
		dlgAbout.DoModal(); 
	} 
	else 
	{ 
		CDialog::OnSysCommand(nID, lParam); 
	} 
} 
 
// If you add a minimize button to your dialog, you will need the code below 
//  to draw the icon.  For MFC applications using the document/view model, 
//  this is automatically done for you by the framework. 
 
void CAudioCodecDlg::OnPaint()  
{ 
	if (IsIconic()) 
	{ 
		CPaintDC dc(this); // device context for painting 
 
		SendMessage(WM_ICONERASEBKGND, (WPARAM) dc.GetSafeHdc(), 0); 
 
		// Center icon in client rectangle 
		int cxIcon = GetSystemMetrics(SM_CXICON); 
		int cyIcon = GetSystemMetrics(SM_CYICON); 
		CRect rect; 
		GetClientRect(&rect); 
		int x = (rect.Width() - cxIcon + 1) / 2; 
		int y = (rect.Height() - cyIcon + 1) / 2; 
 
		// Draw the icon 
		dc.DrawIcon(x, y, m_hIcon); 
	} 
	else 
	{ 
		CDialog::OnPaint(); 
	} 
} 
 
// The system calls this to obtain the cursor to display while the user drags 
//  the minimized window. 
HCURSOR CAudioCodecDlg::OnQueryDragIcon() 
{ 
	return (HCURSOR) m_hIcon; 
} 
 
void CAudioCodecDlg::OnWaveConverter()  
{ 
	CString strSrcName = AfxGetApp()->GetProfileString(_T("WAVE2PCM"), _T("SrcName"), _T("demo.wav")); 
	CString strDstName = AfxGetApp()->GetProfileString(_T("WAVE2PCM"), _T("DstName"), _T("demo.pcm")); 
	CFileDialog dlgOpen(TRUE, _T("*.wav"), strSrcName, OFN_FILEMUSTEXIST|OFN_PATHMUSTEXIST, szWaveFilter); 
	CFileDialog dlgSave(FALSE, _T("*.pcm"), strDstName, OFN_PATHMUSTEXIST, szPcmFilter); 
 
	if (dlgOpen.DoModal() != IDOK) 
		return; 
 
	strSrcName = dlgOpen.GetPathName(); 
	AfxGetApp()->WriteProfileString(_T("WAVE2PCM"), _T("SrcName"), strSrcName); 
 
	if (dlgSave.DoModal() != IDOK) 
		return; 
 
	strDstName = dlgSave.GetPathName(); 
	AfxGetApp()->WriteProfileString(_T("WAVE2PCM"), _T("DstName"), strDstName); 
 
	Wave2Pcm(strDstName, strSrcName); 
} 
 
BOOL CAudioCodecDlg::Wave2Pcm(CString strDstName, CString strSrcName) 
{ 
	CWaveFile fileSrc; 
	CFile fileDst; 
	int iLen; 
	char * p; 
 
	if (!fileSrc.Open(strSrcName, MMIO_READ)) 
	{ 
		AfxMessageBox("Can not open source file"); 
		return FALSE; 
	} 
 
	iLen = fileSrc.GetDataLength(); 
	p = (char *)malloc(iLen); 
	if (p == NULL) 
	{ 
		AfxMessageBox("Not enough memory"); 
		fileSrc.Close(); 
		return FALSE; 
	} 
 
	fileSrc.Read((unsigned char *)p, iLen); 
	fileSrc.Close(); 
 
	fileDst.Open(strDstName, CFile::modeCreate|CFile::modeWrite); 
	fileDst.Write(p, iLen); 
	fileDst.Close(); 
	free(p); 
 
	return TRUE; 
} 
 
void CAudioCodecDlg::OnSelchangeAudioType()  
{ 
	UpdateData(); 
	m_iAudioType = m_ctlAudioType.GetCurSel(); 
	GetDlgItem(IDC_USE_VAD)->EnableWindow((m_iAudioType == 5 || m_iAudioType == 6) && m_bAudioNoAcm); 
	GetDlgItem(IDC_USE_HIGH_RATE)->EnableWindow((m_iAudioType == 6) && m_bAudioNoAcm ); 
	UpdateData(FALSE); 
	AfxGetApp()->WriteProfileInt("Audio", "CodecType", m_iAudioType ); 
} 
 
void CAudioCodecDlg::OnAudioNoAcm()  
{ 
	OnSelchangeAudioType(); 
} 
 
void CAudioCodecDlg::OnEncodeFile()  
{ 
	CString strSrcName = AfxGetApp()->GetProfileString(_T("AudioEncode"), _T("SrcName"), _T("udpaudio.pcm")); 
	CFileDialog dlgOpen(TRUE, _T("*.pcm"), strSrcName, OFN_FILEMUSTEXIST|OFN_PATHMUSTEXIST, szPcmFilter); 
 
	if (dlgOpen.DoModal() != IDOK) 
		return; 
 
	strSrcName = dlgOpen.GetPathName(); 
	AfxGetApp()->WriteProfileString(_T("AudioEncode"), _T("SrcName"), strSrcName); 
 
	CString strDstName = AfxGetApp()->GetProfileString(_T("AudioEncode"), _T("DstName"), _T("udpaudio.dat")); 
	CFileDialog dlgSave(FALSE, _T("*.dat"), strDstName, OFN_PATHMUSTEXIST, szDatFilter); 
 
	if (dlgSave.DoModal() != IDOK) 
		return; 
 
	strDstName = dlgSave.GetPathName(); 
	AfxGetApp()->WriteProfileString(_T("AudioEncode"), _T("DstName"), strDstName); 
 
	AudioEncode(strDstName, strSrcName); 
} 
 
void CAudioCodecDlg::OnDecodeFile()  
{ 
	CString strSrcName = AfxGetApp()->GetProfileString(_T("AudioDecode"), _T("SrcName"), _T("udpaudio.dat")); 
	CFileDialog dlgOpen(TRUE, _T("*.dat"), strSrcName, OFN_FILEMUSTEXIST|OFN_PATHMUSTEXIST, szDatFilter); 
 
	if (dlgOpen.DoModal() != IDOK) 
		return; 
 
	strSrcName = dlgOpen.GetPathName(); 
	AfxGetApp()->WriteProfileString(_T("AudioDecode"), _T("SrcName"), strSrcName); 
 
	CString strDstName = AfxGetApp()->GetProfileString(_T("AudioDecode"), _T("DstName"), _T("udpaudio.pcm")); 
	CFileDialog dlgSave(FALSE, _T("*.pcm"), strDstName, OFN_PATHMUSTEXIST, szPcmFilter); 
 
	if (dlgSave.DoModal() != IDOK) 
		return; 
 
	strDstName = dlgSave.GetPathName(); 
	AfxGetApp()->WriteProfileString(_T("AudioDecode"), _T("DstName"), strDstName); 
 
	AudioDecode(strDstName, strSrcName); 
} 
 
BOOL CAudioCodecDlg::AudioDecode(CString strDstName, CString strSrcName) 
{ 
	CAudioFile file; 
	CFile fileWrite; 
	int iSize; 
	char * p; 
 
	BeginWaitCursor(); 
	file.Open(strSrcName, CFile::modeRead); 
	iSize = file.SetOptions(m_iAudioType, (!m_bAudioNoAcm), m_bUseVAD, m_bUseHighRate); 
	p = (char *)malloc(iSize); 
	iSize = file.Read(p, iSize); 
	file.Close(); 
 
	fileWrite.Open(strDstName, CFile::modeCreate|CFile::modeWrite); 
	fileWrite.Write(p, iSize); 
	fileWrite.Close(); 
 
	free(p); 
	EndWaitCursor(); 
 
	return TRUE; 
} 
 
 
 
BOOL CAudioCodecDlg::AudioEncode(CString strDstName, CString strSrcName) 
{ 
	CAudioFile file; 
	CFile fileRead; 
	int iSize; 
	char * p; 
 
	BeginWaitCursor(); 
	fileRead.Open(strSrcName, CFile::modeRead); 
	iSize = fileRead.GetLength(); 
	p = (char *)malloc(iSize); 
	fileRead.Read(p, iSize); 
	fileRead.Close(); 
	 
	if (file.Open(strDstName, CFile::modeCreate|CFile::modeWrite)) 
	{ 
		file.SetOptions(m_iAudioType, (!m_bAudioNoAcm), m_bUseVAD, m_bUseHighRate); 
		file.Write(p, iSize); 
		file.Close(); 
	} 
 
	free(p); 
	EndWaitCursor(); 
 
	return TRUE; 
} 
 
void CAudioCodecDlg::OnCancel()  
{ 
	// TODO: Add extra cleanup here 
	UpdateData( ); 
	 
	AfxGetApp()->WriteProfileInt("Audio", "AudioNoAcm", m_bAudioNoAcm); 
	AfxGetApp()->WriteProfileInt("Audio", "UseHighRate", m_bUseHighRate); 
	AfxGetApp()->WriteProfileInt("Audio", "UseVAD", m_bUseVAD); 
	CDialog::OnCancel(); 
}