MFC AppDlg.cpp
上传用户:mony888
上传日期:2022-07-26
资源大小:1247k
文件大小:10k
源码类别:

Windows CE

开发平台:

Visual C++

  1. // MFC AppDlg.cpp : implementation file
  2. //
  3. #include "stdafx.h"
  4. #include "MFC App.h"
  5. #include "MFC AppDlg.h"
  6. //#include "Shobjidl.h"
  7. //#include "Aygshell.h"
  8. #include "AMR_Fixed_Codec.h"
  9. #ifdef _DEBUG
  10. #define new DEBUG_NEW
  11. #undef THIS_FILE
  12. static char THIS_FILE[] = __FILE__;
  13. #endif
  14. #define AMR_MAGIC_NUMBER "#!AMRn"
  15. #define AMR_MAGIC_LEN     6
  16. #define ENCMODE           MR122
  17. /////////////////////////////////////////////////////////////////////////////
  18. // CMFCAppDlg dialog
  19. #define MMRETCHECK(ret) 
  20. if ( ret != MMSYSERR_NOERROR ) { goto Error; } 
  21. CMFCAppDlg::CMFCAppDlg(CWnd* pParent /*=NULL*/)
  22. : CDialog(CMFCAppDlg::IDD, pParent)
  23. {
  24. //{{AFX_DATA_INIT(CMFCAppDlg)
  25. //}}AFX_DATA_INIT
  26. // Note that LoadIcon does not require a subsequent DestroyIcon in Win32
  27. m_hIcon = AfxGetApp()->LoadIcon(IDI_ICON1);
  28. }
  29. void CMFCAppDlg::DoDataExchange(CDataExchange* pDX)
  30. {
  31. CDialog::DoDataExchange(pDX);
  32. //{{AFX_DATA_MAP(CMFCAppDlg)
  33. DDX_Control(pDX, IDC_BtVol, m_btVol);
  34. DDX_Control(pDX, IDC_sliderVol, m_slidVol);
  35. DDX_Control(pDX, IDC_staticWave, m_staticWave);
  36. DDX_Control(pDX, IDC_btPlay, m_btPlay);
  37. DDX_Control(pDX, IDC_slidIndex, m_slidIndex);
  38. DDX_Control(pDX, IDC_btPause, m_btPaus);
  39. DDX_Control(pDX, IDC_btClos, m_btClos);
  40. DDX_Control(pDX, IDC_btRec, m_btRec);
  41. //}}AFX_DATA_MAP
  42. }
  43. BEGIN_MESSAGE_MAP(CMFCAppDlg, CDialog)
  44. //{{AFX_MSG_MAP(CMFCAppDlg)
  45. ON_BN_CLICKED(IDC_btRec, OnRec)
  46. ON_BN_CLICKED(IDC_btClos, OnClosRec)
  47. ON_BN_CLICKED(IDC_btPause, OnPaus)
  48. ON_BN_CLICKED(IDC_btPlay, OnbtPlay)
  49. ON_WM_TIMER()
  50. ON_BN_CLICKED(IDC_BtVol, OnBtVol)
  51. ON_WM_CLOSE()
  52. //}}AFX_MSG_MAP
  53. END_MESSAGE_MAP()
  54. /////////////////////////////////////////////////////////////////////////////
  55. // CMFCAppDlg message handlers
  56. BOOL CMFCAppDlg::OnInitDialog()
  57. {
  58. CDialog::OnInitDialog();
  59. // CWnd* w = GetDesktopWindow();
  60. // Set the icon for this dialog.  The framework does this automatically
  61. //  when the application's main window is not a dialog
  62. SetIcon(m_hIcon, TRUE); // Set big icon
  63. SetIcon(m_hIcon, FALSE); // Set small icon
  64. CenterWindow(GetDesktopWindow()); // center to the hpc screen
  65. SetWindowPos(this, 0, 25, 240, 294, TRUE);
  66. UpdateWindow();
  67. // TODO: Add extra initialization here
  68. // m_btRec.SetIcon(AfxGetApp()->LoadIcon(IDI_ICONRec), TRUE);
  69. // m_btClos.SetIcon(AfxGetApp()->LoadIcon(IDI_ICONStop), TRUE);
  70. // m_btPlay.SetIcon(AfxGetApp()->LoadIcon(IDI_ICONPlay), TRUE);
  71. // m_btPaus.SetIcon(AfxGetApp()->LoadIcon(IDI_ICONPause), TRUE);
  72. m_btPaus.EnableWindow(FALSE);
  73. m_btClos.EnableWindow(FALSE);
  74. m_btPlay.EnableWindow(TRUE);
  75. m_slidIndex.SetRange(0, 100, FALSE);
  76.    m_slidVol.SetRange(0, 100, FALSE);
  77. m_bRecFlag = FALSE;
  78. m_bPlayFlag = FALSE;
  79. return TRUE;  // return TRUE  unless you set the focus to a control
  80. }
  81. UINT RecProc( LPVOID pParam )
  82. {
  83. MMRESULT mRet;
  84. BOOL bRet;
  85. CMFCAppDlg* pDlg;
  86. pDlg = (CMFCAppDlg*)pParam;
  87. mRet = Recorder().OpenMic();
  88. MMRETCHECK(mRet);
  89. pDlg->m_nTimer = SetTimer(pDlg->m_hWnd, 1, 200, NULL);
  90. while (pDlg->m_bRecFlag)
  91. {
  92. mRet = Recorder().ToRec();
  93. MMRETCHECK(mRet);
  94. }
  95. mRet = Recorder().ClosMic();
  96. MMRETCHECK(mRet);
  97. mRet = Recorder().ClosRecord();
  98. MMRETCHECK(mRet);
  99. bRet = CloseHandle(Recorder().m_fh);
  100. if (!bRet) 
  101. {
  102. goto Error;
  103. }
  104. //  SetFilePointer(Recorder().m_fh, 0, NULL, FILE_BEGIN);
  105. //  bRet = WriteFile(Recorder().m_fh, (PCHAR)&m_WaveHeader, 44L, &cbBytsDone, NULL);
  106. // if (!bRet || cbBytsDone < AMR_MAGIC_LEN)
  107. // {
  108. // goto Error;
  109. // }
  110. return 1;
  111. Error:
  112. LPVOID lpMsgBuf;
  113. FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER | 
  114. FORMAT_MESSAGE_FROM_SYSTEM | 
  115. FORMAT_MESSAGE_IGNORE_INSERTS,
  116. NULL,
  117. GetLastError(),
  118. 0,
  119. (LPTSTR)&lpMsgBuf,
  120. 0,
  121. NULL);
  122. AfxMessageBox((LPCTSTR)lpMsgBuf, MB_OK | MB_ICONINFORMATION, 0);
  123. LocalFree(lpMsgBuf);
  124. return 0;
  125. }
  126. void CMFCAppDlg::OnRec()
  127. {
  128. // TODO: Add your control notification handler code here
  129. DWORD cbBytsDone;
  130. WAVEFORMATEX wfx;
  131. MMRESULT mRet;
  132. BOOL bRet;
  133. CodecInterfaceType* pAMR_Codec_Interf;
  134. wfx.cbSize = 0;
  135. wfx.wFormatTag = WAVE_FORMAT_PCM;
  136. wfx.nChannels = 1;
  137. wfx.nSamplesPerSec = 8000;
  138. wfx.wBitsPerSample = 16;
  139. wfx.nBlockAlign = wfx.nChannels * wfx.wBitsPerSample / 8;
  140. wfx.nAvgBytesPerSec = wfx.nBlockAlign * wfx.nSamplesPerSec;
  141. m_bRecFlag = TRUE;
  142. mRet = Recorder().InitRecord(wfx);
  143. MMRETCHECK(mRet);
  144. pAMR_Codec_Interf = Get_AMR_EncInterface();
  145. Recorder().SetCodecInterface(*pAMR_Codec_Interf);
  146. Recorder().m_fh = CreateFile(TEXT("sound.amr"), GENERIC_WRITE, FILE_SHARE_READ, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);
  147. if (NULL == Recorder().m_fh)
  148. {
  149. goto Error;
  150. }
  151. bRet = WriteFile(Recorder().m_fh, (PCHAR)AMR_MAGIC_NUMBER, AMR_MAGIC_LEN, &cbBytsDone, NULL);
  152. if (!bRet || cbBytsDone < AMR_MAGIC_LEN)
  153. {
  154. goto Error;
  155. }
  156. //Record start ~~~
  157. m_nRecThreadID = AfxBeginThread(RecProc, this, 0, 0, 0, NULL)->m_nThreadID;
  158. m_nTimer = SetTimer(1, 200, NULL);
  159. m_iPosCount = 0;
  160. m_btRec.EnableWindow(FALSE);
  161. m_btPlay.EnableWindow(FALSE);
  162. m_btClos.EnableWindow(TRUE);
  163. return;
  164. Error:
  165. LPVOID lpMsgBuf;
  166. FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER | 
  167. FORMAT_MESSAGE_FROM_SYSTEM | 
  168. FORMAT_MESSAGE_IGNORE_INSERTS,
  169. NULL,
  170. GetLastError(),
  171. 0,
  172. (LPTSTR)&lpMsgBuf,
  173. 0,
  174. NULL);
  175. AfxMessageBox((LPCTSTR)lpMsgBuf, MB_OK | MB_ICONINFORMATION, 0);
  176. LocalFree(lpMsgBuf);
  177. return;
  178. }
  179. void CMFCAppDlg::OnClosRec()
  180. {
  181. // TODO: Add your control notification handler code here
  182. KillTimer(m_nTimer);
  183. if (m_bRecFlag) 
  184. {
  185. m_bRecFlag = FALSE;
  186. m_slidIndex.SetPos(0);
  187. m_btClos.EnableWindow(FALSE);
  188. m_btRec.EnableWindow(TRUE);
  189. m_btPlay.EnableWindow(TRUE);
  190. }
  191. else
  192. {
  193. /**/
  194. m_xplayer.xplaying_command(CPC_STOP, 0);
  195. /**/
  196. m_bPlayFlag = FALSE;
  197. m_slidIndex.SetPos(0);
  198. m_btClos.EnableWindow(FALSE);
  199. m_btPaus.EnableWindow(FALSE);
  200. m_btRec.EnableWindow(TRUE);
  201. m_btPlay.EnableWindow(TRUE);
  202. }
  203. return;
  204. }
  205. void CMFCAppDlg::OnPaus()
  206. {
  207. // TODO: Add your control notification handler code here
  208. /**/
  209. m_xplayer.xplaying_command(CPC_PAUSE, 0);
  210. KillTimer(m_nTimer);
  211. /**/
  212. m_btPaus.EnableWindow(FALSE);
  213. m_btPlay.EnableWindow(TRUE);
  214. return;
  215. }
  216. void CMFCAppDlg::OnbtPlay()
  217. {
  218. // TODO: Add your control notification handler code here
  219. if (m_bPlayFlag) 
  220. {
  221. /**/
  222. m_xplayer.xplaying_command(CPC_PLAY, 0);
  223. m_nTimer = SetTimer(2, 200, NULL);
  224. /**/
  225. m_btPaus.EnableWindow(TRUE);
  226. m_btClos.EnableWindow(TRUE);
  227. m_btPlay.EnableWindow(FALSE);
  228. m_btRec.EnableWindow(FALSE);
  229. }
  230. else
  231. {
  232. /**/
  233. SYS_FILE_CONTENT_TYPE flTarget;
  234. /**/
  235. m_nTimer = SetTimer(2, 200, NULL);
  236. m_uiTimer2Count = 0;
  237. m_btPlay.EnableWindow(FALSE);
  238. m_btRec.EnableWindow(FALSE);
  239. m_btClos.EnableWindow(TRUE);
  240. m_btPaus.EnableWindow(TRUE);
  241. /**/
  242. memset(&flTarget, 0, sizeof(SYS_FILE_CONTENT_TYPE));
  243. flTarget.ModeInd = SYS_FILE_DISK_FILE_TYPE;
  244. strncpy(flTarget.filename, "sound.amr", sizeof("sound.amr"));
  245. // m_xplayer.xplaying_get_volume(&m_uiVolIndex);
  246. // m_xplayer.xplaying_set_volume(m_uiVolIndex);
  247. m_slidVol.SetPos(50);
  248. m_bPlayFlag = TRUE;
  249. m_xplayer.xplaying_open(&flTarget, NULL);
  250. m_xplayer.xplaying_get_play_Timelen(&m_uiPlayTime);
  251. /**/
  252. }
  253. return;
  254. }
  255. void CMFCAppDlg::OnTimer(UINT nIDEvent) 
  256. {
  257. // TODO: Add your message handler code here and/or call default
  258. if(nIDEvent == 1)
  259. {
  260. // static const int xCon = 13;
  261. // static const int yCon = 13;
  262. // static const int wCon = 240;
  263. // static const int hCon = 80;
  264. // CClientDC dc(this);
  265. // CBitmap Bitmap;
  266. // CBitmap * pbmOld = NULL;
  267. // CDC dcMem;
  268. // dcMem.CreateCompatibleDC(&dc);
  269. // Bitmap.CreateCompatibleBitmap(&dc,wCon,hCon);
  270. // pbmOld = dcMem.SelectObject(&Bitmap);
  271. // dcMem.PatBlt(0,0,wCon,hCon, BLACKNESS);
  272. // dcMem.MoveTo(0,hCon/2);
  273. // //
  274. // // display incomming signal--key idea!
  275. // //
  276. // for(int x =0 ; x < wCon; x++) // display Input
  277. // {
  278. // dcMem.LineTo(x,(hCon >> 1) - (Recorder().InputBuffer[x] >> 7));
  279. // }
  280. // dc.BitBlt(xCon,yCon,wCon,hCon,&dcMem, 0, 0, SRCCOPY);
  281. // dcMem.SelectObject(pbmOld);
  282. // dcMem.DeleteDC();
  283. m_slidIndex.SetPos(m_iPosCount);
  284. m_iPosCount = (m_iPosCount++) % 101;
  285. }
  286. else if (nIDEvent == 2) 
  287. {
  288. /**/
  289. unsigned int uiProg;
  290. m_uiTimer2Count++;
  291. uiProg = m_uiTimer2Count * 20000 / m_uiPlayTime;
  292. if (uiProg < 99) 
  293. {
  294. m_slidIndex.SetPos(uiProg);
  295. }
  296. else
  297. {
  298. KillTimer(m_nTimer);
  299. m_slidIndex.SetPos(0);
  300. m_xplayer.xplaying_command(CPC_STOP, 0);
  301. m_bPlayFlag = FALSE;
  302. m_slidIndex.SetPos(0);
  303. m_btClos.EnableWindow(FALSE);
  304. m_btPaus.EnableWindow(FALSE);
  305. m_btRec.EnableWindow(TRUE);
  306. m_btPlay.EnableWindow(TRUE);
  307. }
  308. /**/
  309. }
  310. else
  311. {
  312. CDialog::OnTimer(nIDEvent);
  313. }
  314. return;
  315. }
  316. void CMFCAppDlg::OnBtVol() 
  317. {
  318. // TODO: Add your control notification handler code here
  319. if (m_slidVol.IsWindowVisible()) 
  320. {
  321. m_slidVol.ShowWindow(FALSE);
  322. }
  323. else
  324. {
  325. m_slidVol.ShowWindow(TRUE);
  326. }
  327. return;
  328. }
  329. BOOL CMFCAppDlg::PreTranslateMessage(MSG* pMsg)
  330. {
  331. // TODO: Add your specialized code here and/or call the base class
  332. if (pMsg->hwnd == m_slidVol.m_hWnd) 
  333. {
  334. switch(pMsg->message) 
  335. {
  336. case WM_LBUTTONUP:
  337. {
  338. m_uiVolIndex = (unsigned int)::SendMessage(m_slidVol.m_hWnd, TBM_GETPOS, 0, 0);
  339. }
  340. break;
  341. default:
  342. break;
  343. }
  344. }
  345. return CDialog::PreTranslateMessage(pMsg);
  346. }
  347. void CMFCAppDlg::OnClose() 
  348. {
  349. // TODO: Add your message handler code here and/or call default
  350. MMRESULT mRet;
  351. BOOL bRet;
  352. if (m_bRecFlag)
  353. {
  354. mRet = Recorder().ClosMic();
  355. MMRETCHECK(mRet);
  356. mRet = Recorder().ClosRecord();
  357. MMRETCHECK(mRet);
  358. bRet = CloseHandle(Recorder().m_fh);
  359. if (!bRet) 
  360. {
  361. goto Error;
  362. }
  363. }
  364. CDialog::OnClose();
  365. return;
  366. Error:
  367. LPVOID lpMsgBuf;
  368. FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER | 
  369. FORMAT_MESSAGE_FROM_SYSTEM | 
  370. FORMAT_MESSAGE_IGNORE_INSERTS,
  371. NULL,
  372. GetLastError(),
  373. 0,
  374. (LPTSTR)&lpMsgBuf,
  375. 0,
  376. NULL);
  377. AfxMessageBox((LPCTSTR)lpMsgBuf, MB_OK | MB_ICONINFORMATION, 0);
  378. LocalFree(lpMsgBuf);
  379. CDialog::OnClose();
  380. return;
  381. }