MFC学习笔记 — 看小白如何实现音乐播放器(USB-HID 声卡 wav播放)
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
XX ?作 ? ? ? 者:文化人
XX ?聯系方式:(或進群:471144274)
XX ?版權聲明:原創文章,歡迎評論和轉載~轉載時能告訴我一聲就最好了
XX ?要說的話:作者水平有限,難免有不足之處,懇請指正!
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
1、USB設備的枚舉和讀寫:
參考鏈接1:USB_HID通信上位機程序VC6.0(真正類似呀呀USB工具的源代碼).rar-C++代碼類資源-CSDN下載
參考鏈接2:《圈圈教你玩USB》HID上位機和下位機實例源碼_圈圈教你玩usb光盤-嵌入式文檔類資源-CSDN下載
我把代碼中PVN改為了usagepage,因為PVN會有多個設備,而usagepage可以確保只有一個;
獲得usagepage需要添加如下代碼:
hDevHandle=CreateFile(MyDevPathName, NULL, FILE_SHARE_READ|FILE_SHARE_WRITE, NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,NULL);//獲取設備的屬性并保存在DevAttributes結構體中 Result=HidD_GetAttributes(hDevHandle, &DevAttributes); //關閉剛剛打開的設備 CloseHandle(hDevHandle); //如果獲取成功,則將屬性中的VID、PID以及設備版本號與我們需要的 //進行比較,如果都一致的話,則說明它就是我們要找的設備。 if(MyVid == DevAttributes.VendorID) {if(MyPid == DevAttributes.ProductID){//這里進行讀寫訪問打開設備if(!HidD_GetPreparsedData(hWriteHandle, &PreparsedData)){CloseHandle(hWriteHandle);return FALSE;}if(!HidP_GetCaps(PreparsedData, &Capabilities)){CloseHandle(hWriteHandle);return FALSE;}if(Capabilities.UsagePage == 0xffa0){MyDevFound = TRUE;}} }如果以上的鏈接中,寫數據失敗的話,建議改用下面的寫接口:
BOOL CUsbDlg::OnBUTTONSend(UCHAR send_buf[64]) {CString DevicePath;BOOL Result;UINT LastError;unsigned long numBytesReturned;DevicePath=temp;HANDLE hCom = CreateFile (DevicePath,GENERIC_READ | GENERIC_WRITE,FILE_SHARE_READ | FILE_SHARE_WRITE,NULL,OPEN_EXISTING, 0,NULL);if (hCom == INVALID_HANDLE_VALUE){}DataInSending=TRUE;Result = WriteFile(hCom, send_buf, 19, &numBytesReturned, NULL);//如果函數返回失敗,則可能是真的失敗,也可能是IO掛起了if(Result==FALSE){//獲取最后錯誤代碼LastError=GetLastError();//看是否是真的IO掛起if((LastError==ERROR_IO_PENDING)||(LastError==ERROR_SUCCESS)){return TRUE;}//否則,是函數調用時發生錯誤,顯示錯誤代碼else{DataInSending=FALSE;AddToInfOut("發送失敗,錯誤代碼:"+itos(LastError));//如果最后錯誤為1,說明該設備不支持該函數。if(LastError==1){AddToInfOut("該設備不支持WriteFile函數。", FALSE);}return FALSE;}}//否則,函數返回成功else{DataInSending=FALSE;return TRUE;}return TRUE; }2、聲卡選擇:windows代碼設置默認音頻輸出設備_kevin的博客-CSDN博客
作者的代碼是排除了默認聲卡,選擇新的聲卡,但若是有兩個新的聲卡呢?
我去掉了判斷默認音頻設備的代碼,把紅色框內的代碼修改為如下:
setlocale(LC_ALL,"");//此句必須要加上 char mbBuffer[256] = {0}; size_t count; count = wcstombs(mbBuffer, friendlyName.pwszVal, 256);// 轉換并返回多字節字符串的長度 if(strstr(mbBuffer, "Usb Dongle"))SetDefaultAudioPlaybackDevice(wstrID);3、播放音樂:
參考鏈接1:C++ 播放音頻文件_weixinhum-CSDN博客_c++ 播放mp3
參考鏈接2:VC程序播放音樂必備---mciSendString用法_IT民工-CSDN博客
添加如下代碼,界面上加一個編輯框,實現動態選擇wav文件:
char buf[256]; sprintf(buf, _T("open %s.wav alias wave"), get_wav_filename_from_edit); mciSendString(buf, NULL, 0, NULL);//alias后面為設備名稱 mciSendString(_T("play wave wait"), NULL, 0, NULL);//wait表示播放完畢之后才返回,最好加上去 mciSendString(_T("close wave"), NULL, 0, NULL);注意:只有使用生成的.exe才能播放音樂,VS里調試時是播放不成功的;
4、編譯可能會遇到一些錯誤,其中一類錯誤的原因:
? ? ? ?“error LNK2019: 無法解析的外部符號”的幾種可能原因_沈春旭的博客-CSDN博客_lnk2019無法解析的外部符號
5、HID使用的庫文件在這里,用到的頭文件如下,:
extern "C" { #include "hidsdi.h" #include "setupapi.h" } #include <afxwin.h> #include "Common.h" #include <wchar.h> #include <locale.h> #include "Mmdeviceapi.h" #include "PolicyConfig.h" #include "Propidl.h" #include "Functiondiscoverykeys_devpkey.h"總結
以上是生活随笔為你收集整理的MFC学习笔记 — 看小白如何实现音乐播放器(USB-HID 声卡 wav播放)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 把文件放在服务器上以供用户下载
- 下一篇: 解决百度云主机(BCH)wordpres