⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 new.cpp

📁 蓝牙耳机音频测试的源码,FFT库是网上下的,该源码业内人士很有用处.
💻 CPP
📖 第 1 页 / 共 3 页
字号:
		//hAudioThread=(HANDLE)_beginthreadex(NULL,0,&HardWareVideoThread,NULL, 0, &HardWareAudioThreadID);
		_beginthread(HardWareVideoThread,NULL,0);
		bolAudioStart=TRUE;
		time(&lngTimeBegin);
	}

	if (iMax==0  && bolFreqResponseFileOpen==FALSE && bolTxChecked==TRUE && bolRxChecked==FALSE)
	{
		MaxWaveLog.open("MaxWaveLog.dat");
		bolFreqResponseFileOpen=TRUE;
		//hAudioThread=(HANDLE)_beginthreadex(NULL,0,&BlueToothVideoThread,NULL, 0, &HardWareAudioThreadID);
		_beginthread(BlueToothVideoThread,NULL,0);
		bolAudioStart=TRUE;
		time(&lngTimeBegin);
	}
	
	if (bolAudioStart==TRUE)
	{
		
		bolFreqResponseRecording=TRUE;
		MaxWaveLog<<"Frequency: "<<(int)(iMax*FREQSCALE)<<"      "
					<<"Wave: "<<CurrentFreqWaveArray[iMax].Wave<<'\n';
	}
	
	time(&lngCurrentTime);

	if (lngCurrentTime-lngTimeBegin>TESTTIME && bolFreqResponseRecording==TRUE)
	{
		MaxWaveLog.close();
		bolFreqResponseFileOpen=FALSE;
		bolFreqResponseRecording=FALSE;

		WaitForSingleObject(hAudioThread,INFINITE);
		CloseHandle(hAudioThread);
		bolAudioStart=FALSE;

		if (bolTxChecked==TRUE)
		{
			bolRxChecked=TRUE;

			//lngRxWaveSum=0;
			//iRxSum=0;
		}
		else
		{
			bolTxChecked=TRUE;
			waveInit(hGlobalWnd,0,WAVE_FORMAT_PCM,1,44100,8);  //声卡输入
			
			//lngTxWaveSum=0;
			//iTxSum=0;
		}

		SendDlgItemMessage(hGlobalWnd, IDL_FREQLIST, LB_ADDSTRING, 0, LPARAM("Frequency   Wave") );
		SendDlgItemMessage(hGlobalWnd,IDL_FREQLIST,LB_ADDSTRING,0,LPARAM("============"));

		MaxWaveLogInput.open("MaxWaveLog.dat");
		while (MaxWaveLogInput>>ListItem1>>ListItem2>>ListItem3 >>ListItem4 )
		{
			if(bolTxChecked==TRUE && bolRxChecked==FALSE)
			{
				if (atol(ListItem2)!=0)
				{
					iTxSum++;
					lngTxWaveSum=lngTxWaveSum+atol(ListItem4);
				}
			}
			if(bolTxChecked ==TRUE && bolRxChecked==TRUE)
			{
				if (atol(ListItem2)!=0)
				{
					iRxSum++;
					lngRxWaveSum=lngRxWaveSum+atol(ListItem4);
				}
			}

			sprintf(ListItem,"%s%s%s",ListItem2,"         ",ListItem4);
			SendDlgItemMessage(hGlobalWnd, IDL_FREQLIST, LB_ADDSTRING, 0, LPARAM(ListItem) );
		}
		MaxWaveLogInput.close();
		
		if (iTxSum>0)
		
			if ((bolTxChecked==TRUE) &&( bolRxChecked==FALSE) && ((int)(lngTxWaveSum/iTxSum)>iTxMin) && ((int)(lngTxWaveSum/iTxSum)<iTxMax))
				DisplayTxPass(hdc);
			else
				InvalidDisplayTxPass(hdc);

		if (iTxSum>0)

			if (bolRxChecked==TRUE && ((lngRxWaveSum/iRxSum)>iRxMin) && ((lngRxWaveSum/iRxSum)<iRxMax))
				DisplayRxPass(hdc);
			else
				InvalidDisplayRxPass(hdc);


		if(lngCurrentTime-lngTestBegin>TESTTIME*3)
			DisplayTestFail(hdc);



	
	}
	
	//========================================	
	memcpy(prevFreqR,currFreqR,BUFSIZE*sizeof(double));
	memcpy(prevFreqI,currFreqI,BUFSIZE*sizeof(double));
}


int APIENTRY WinMain(HINSTANCE hInstance,
                     HINSTANCE hPrevInstance,
                     LPSTR     lpCmdLine,
                     int       nCmdShow)
{
 	// TODO: Place code here.
	MSG msg;
	HACCEL hAccelTable;

	// Initialize global strings
	LoadString(hInstance, IDS_APP_TITLE, szTitle, MAX_LOADSTRING);
	LoadString(hInstance, IDC_NEW, szWindowClass, MAX_LOADSTRING);
	MyRegisterClass(hInstance);

	// Perform application initialization:
	if (!InitInstance (hInstance, nCmdShow)) 
	{
		return FALSE;
	}

	hAccelTable = LoadAccelerators(hInstance, (LPCTSTR)IDC_NEW);

	// Main message loop:
	while (GetMessage(&msg, NULL, 0, 0)) 
	{
		if (!TranslateAccelerator(msg.hwnd, hAccelTable, &msg)) 
		{
			TranslateMessage(&msg);
			DispatchMessage(&msg);
		}
	}

	return msg.wParam;
}

//
//  FUNCTION: MyRegisterClass()
//
//  PURPOSE: Registers the window class.
//
//  COMMENTS:
//
//    This function and its usage is only necessary if you want this code
//    to be compatible with Win32 systems prior to the 'RegisterClassEx'
//    function that was added to Windows 95. It is important to call this function
//    so that the application will get 'well formed' small icons associated
//    with it.
//
ATOM MyRegisterClass(HINSTANCE hInstance)
{
	WNDCLASSEX wcex;

	wcex.cbSize = sizeof(WNDCLASSEX); 

	wcex.style			= CS_HREDRAW | CS_VREDRAW;
	wcex.lpfnWndProc	= (WNDPROC)WndProc;
	wcex.cbClsExtra		= 0;
	wcex.cbWndExtra		= 0;
	wcex.hInstance		= hInstance;
	wcex.hIcon			= LoadIcon(hInstance, (LPCTSTR)IDI_NEW);
	wcex.hCursor		= LoadCursor(NULL, IDC_ARROW);
	wcex.hbrBackground	= CreateSolidBrush(BACKGROUND);
//	wcex.hbrBackground = (HBRUSH)(16);
	wcex.lpszMenuName	= "";//	(LPCSTR)IDC_NEW; //	remove menu
	wcex.lpszClassName	= szWindowClass;
	wcex.hIconSm		= LoadIcon(wcex.hInstance, (LPCTSTR)IDI_NEW);

	return RegisterClassEx(&wcex);
}

//
//   FUNCTION: InitInstance(HANDLE, int)
//
//   PURPOSE: Saves instance handle and creates main window
//
//   COMMENTS:
//
//        In this function, we save the instance handle in a global variable and
//        create and display the main program window.
//
BOOL InitInstance(HINSTANCE hInstance, int nCmdShow)
{
   HWND hWnd;

   hInst = hInstance; // Store instance handle in our global variable

   hWnd = CreateWindow(szWindowClass, 
	   szTitle, 
	   WS_VISIBLE|WS_CLIPSIBLINGS|WS_CLIPCHILDREN|WS_CAPTION|WS_BORDER|WS_SYSMENU,
	   60,20,780,660,
	   NULL, NULL, hInstance, NULL);

   if (!hWnd)
   {
      return FALSE;
   }

   ShowWindow(hWnd, nCmdShow);
   UpdateWindow(hWnd);

   return TRUE;
}

//
//  FUNCTION: WndProc(HWND, unsigned, WORD, LONG)
//
//  PURPOSE:  Processes messages for the main window.
//
//  WM_COMMAND	- process the application menu
//  WM_PAINT	- Paint the main window
//  WM_DESTROY	- post a quit message and return
//
//


LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
	int i, wmId, wmEvent;
	PAINTSTRUCT ps;
	HDC hdc;
	TCHAR szHello[MAX_LOADSTRING];
	LoadString(hInst, IDC_CAPTION, szHello, MAX_LOADSTRING);
	hGlobalWnd=hWnd;
	


	hdc=GetDC(hWnd);

	switch (message) 
	{
		case WM_COMMAND:
			wmId    = LOWORD(wParam); 
			wmEvent = HIWORD(wParam);
			// Parse the menu selections:
			switch (wmId)
			{
				case IDM_ABOUT:
				   DialogBox(hInst, (LPCTSTR)IDD_ABOUTBOX, hWnd, (DLGPROC)About);
				   break;
				case IDM_EXIT:
				   DestroyWindow(hWnd);
				   break;
				case IDB_START:

					bolTestState=TRUE;
					
					bolTxChecked=FALSE;
					bolRxChecked=FALSE;
					bolFreqResponseFileOpen=FALSE;
					bolFreqResponseRecording=FALSE;
					bolFreqResponseRecorded=FALSE;

					CloseHandle(hAudioThread);

					EnableWindow(hwndControl[IDB_START],FALSE);

					waveInit(hWnd,2,WAVE_FORMAT_PCM,1,44100,8);	//蓝牙输入
					//waveInit(hWnd,0,WAVE_FORMAT_PCM,1,44100,8);	//for debug 声卡输入

					GetWindowPara();

					time(&lngTestBegin);

					InvalidDisplayTxPass(hdc);
					InvalidDisplayRxPass(hdc);
					InvalidTestFail(hdc);

					SendDlgItemMessage(hGlobalWnd, IDL_FREQLIST, LB_RESETCONTENT, 0, NULL );
					
					break;
				case IDB_STOP:
					bolTestState=FALSE;
					MaxWaveLog.close();
					bolTxChecked=TRUE;
					bolRxChecked=TRUE;
					CloseHandle(hAudioThread);
					break;
				case IDB_EXIT:
					DestroyWindow(hWnd);
					break;

				default:
				   return DefWindowProc(hWnd, message, wParam, lParam);
			}
			break;

		case WM_SETFOCUS : 
			SetFocus (hwndControl[idFocus]) ; 
			return 0 ; 

		case WM_CREATE:
			hpenB = CreatePen(PS_SOLID, 0, BACKGROUND);  //use the backgroud color to cover the latest line
			hpenW = CreatePen(PS_SOLID, 0, RGB(153,102,51));//use hpenW to Draw axis
			hpenG = CreatePen(PS_SOLID, 0, RGB(255,0,0));	//use the hpenG to Draw the Wave,Frequency chart			
			hpenG2= CreatePen(PS_SOLID, 0, RGB(0,0,255));	//use the hpenG2 to Draw Frequency-response

			ParaInit(FREQCHECK,FREQCHECKTIME,WAVEVOLUME,TESTTIME);

			SetSystemWaveVolume();

			
			/*
			hMod=LoadLibrary("fft");
			if(!hMod)
			{
				MessageBox(hWnd,"LoadLibrary() failed.","Warning",MB_OK|MB_ICONWARNING);				
			}
			else
			{
				pfnFft=(PFNFFT)GetProcAddress(hMod,"fft_double");
				if(!pfnFft)
					MessageBox(hWnd,"GetProcAddress() failed.","Warning",MB_OK|MB_ICONWARNING);					
			}
			*/

			pfnFft=(PFNFFT)fft_double;
  

			//-----------

			CreateWindow("STATIC","Frequency Checked:",WS_CHILD | WS_VISIBLE ,
				530,30,140,25,hWnd,(HMENU)IDS_FREQ,hInst,NULL,);

			CreateWindow("STATIC","Frequency Duration:",WS_CHILD | WS_VISIBLE ,
				530,60,140,25,hWnd,(HMENU)IDS_FREQDURA,hInst,NULL,);

			CreateWindow("STATIC","Wave Volume:",WS_CHILD | WS_VISIBLE,
				530,90,140,25,hWnd,(HMENU)IDS_FREQDURA,hInst,NULL,);

			CreateWindow("STATIC","Test Time  :",WS_CHILD | WS_VISIBLE,
				530,120,140,25,hWnd,(HMENU)IDS_TESTTIME,hInst,NULL,);

			//-----------

			hwndControl[IDE_FREQ]=CreateWindow("EDIT","",WS_CHILD| WS_BORDER | WS_VISIBLE |BS_PUSHBUTTON|WS_TABSTOP,
				670,30,60,25,hWnd,(HMENU)IDE_FREQ,hInst,NULL,);
			GlobalProc[IDE_FREQ]=(WNDPROC)SetWindowLong(hwndControl[IDE_FREQ],GWL_WNDPROC, (LONG) ControlProc) ;

			hwndControl[IDE_FREQDURA]=CreateWindow("EDIT","",WS_CHILD | WS_BORDER | WS_VISIBLE |BS_PUSHBUTTON |WS_TABSTOP,
				670,60,60,25,hWnd,(HMENU)IDE_FREQDURA,hInst,NULL,);
			GlobalProc[IDE_FREQDURA]=(WNDPROC)SetWindowLong(hwndControl[IDE_FREQDURA],GWL_WNDPROC, (LONG) ControlProc) ;

			hwndControl[IDE_WAVEVOLUME]=CreateWindow("EDIT","",WS_CHILD | WS_BORDER | WS_VISIBLE |BS_PUSHBUTTON |WS_TABSTOP,
				670,90,60,25,hWnd,(HMENU)IDE_WAVEVOLUME,hInst,NULL,);
			GlobalProc[IDE_WAVEVOLUME]=(WNDPROC)SetWindowLong(hwndControl[IDE_WAVEVOLUME],GWL_WNDPROC, (LONG) ControlProc) ;

			hwndControl[IDE_TESTTIME]=CreateWindow("EDIT","",WS_CHILD | WS_BORDER | WS_VISIBLE |BS_PUSHBUTTON |WS_TABSTOP,
				670,120,60,25,hWnd,(HMENU)IDE_TESTTIME,hInst,NULL,);
			GlobalProc[IDE_TESTTIME]=(WNDPROC)SetWindowLong(hwndControl[IDE_TESTTIME],GWL_WNDPROC, (LONG) ControlProc) ;


			//-----------

			hwndControl[IDL_FREQLIST]=CreateWindow("LISTBOX","",WS_BORDER | WS_CHILD | WS_VISIBLE |
				LBS_NOINTEGRALHEIGHT |WS_TABSTOP| LBS_HASSTRINGS | LBS_WANTKEYBOARDINPUT |
				LBS_DISABLENOSCROLL | WS_HSCROLL | WS_VSCROLL ,
				530,245,200,220,hWnd,(HMENU)IDL_FREQLIST,hInst,NULL,);
			GlobalProc[IDL_FREQLIST]=(WNDPROC)SetWindowLong(hwndControl[IDL_FREQLIST],GWL_WNDPROC, (LONG) ControlProc) ;

			hwndControl[IDL_DEVLIST]=CreateWindow("LISTBOX","",WS_BORDER | WS_CHILD | WS_VISIBLE |
				LBS_NOINTEGRALHEIGHT |WS_TABSTOP| LBS_HASSTRINGS | LBS_WANTKEYBOARDINPUT |
				LBS_DISABLENOSCROLL | WS_HSCROLL | WS_VSCROLL ,
				530,155,200,80,hWnd,(HMENU)IDL_DEVLIST,hInst,NULL,);

			//-----------

			hwndControl[IDB_START]=CreateWindow("button","&Start Test",WS_CHILD | WS_VISIBLE |BS_PUSHBUTTON |WS_TABSTOP|WS_TABSTOP |BS_DEFPUSHBUTTON,
				530,480,80,35,hWnd,(HMENU)IDB_START,hInst,NULL,);
			GlobalProc[IDB_START]=(WNDPROC)SetWindowLong(hwndControl[IDB_START],GWL_WNDPROC, (LONG) ControlProc) ;
			
			hwndControl[IDB_STOP]=CreateWindow("button","Stop Test",WS_CHILD | WS_VISIBLE |BS_PUSHBUTTON|WS_TABSTOP |BS_DEFPUSHBUTTON,
				615,480,80,35,hWnd,(HMENU)IDB_STOP,hInst,NULL,);
			GlobalProc[IDB_STOP]=(WNDPROC)SetWindowLong(hwndControl[IDB_STOP],GWL_WNDPROC, (LONG) ControlProc) ;

			hwndControl[IDB_EXIT]=CreateWindow("button","&Exit",WS_CHILD | WS_VISIBLE |BS_PUSHBUTTON|WS_TABSTOP |BS_DEFPUSHBUTTON,
				700,480,70,35,hWnd,(HMENU)IDB_EXIT,hInst,NULL,);
			GlobalProc[IDB_EXIT]=(WNDPROC)SetWindowLong(hwndControl[IDB_EXIT],GWL_WNDPROC, (LONG) ControlProc) ;

			RrectIni();
			rectDisplayFreq.left=10;
			rectDisplayFreq.top=390;
			rectDisplayFreq.right=rectDisplayFreq.left+1000;
			rectDisplayFreq.bottom=rectDisplayFreq.top+20;

			bolTestState=FALSE;

			FillDevices();

			SetWindowPara();

			break;

		case WM_PAINT:
			hdc = BeginPaint(hWnd, &ps);
			// TODO: Add any drawing code here...	
			
			//horizon for Wave

			hdc=GetDC(hWnd);
			SelectObject(hdc, hpenW);
			MoveToEx(hdc,10,WAVEHORIZON,NULL);

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -