日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

MFC学习笔记 — 看小白如何实现音乐播放器(USB-HID 声卡 wav播放)

發布時間:2023/12/14 编程问答 30 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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播放)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。