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播放)相关推荐

  1. C++ MFC 学习笔记+小型通讯录系统实现

    MFC 最详细入门教程 [MFC常用函数总结](https://www.cnblogs.com/jiu0821/p/4606639.html) [C++ & MFC]https://www.c ...

  2. MFC 学习笔记(一):MFC单文档程序运行流程梳理与总结

    MFC 学习笔记(一):MFC单文档程序运行流程梳理与总结 1.MFC单文档程序运行流程 1.首先利用全局变量对象 theApp 启动应用程序 (这是因为这个全局对象,基类CWinApp中 this ...

  3. 深入浅出MFC学习笔记

    深入浅出MFC学习笔记 ithzhang CSDN博客:http://blog.csdn.net/ithzhang/article/category/1159054 转载于:https://blog. ...

  4. android 百度网盘 播放器,最好用的安卓播放器,支持云盘播放,看电影必备

    原标题:最好用的安卓播放器,支持云盘播放,看电影必备 你最喜欢用什么播放器来看电影? 或许腾讯视频.优酷等主流的点播播放器是数千万人的选择,但有时,我们也需要一款好用.离线.轻量级别的本地播放器来播放 ...

  5. TSN时间敏感网络|学习笔记-看这一篇就够了

    近年来,随着汽车电子电气架构的演进,车载以太网以其高带宽.技术成熟和灵活部署等优势成功占据汽车主干网地位,但是传统以太网具有的时间不确定性,对自动驾驶.智能网联等前沿需求带来巨大挑战.为此,IEEE ...

  6. 关于Python的一些学习笔记(小白式笔记,持续更新)

    关于Python的一些学习笔记 瞎bb: 作为一个计算机专业的学生,Python应该是一门很有必要掌握的语言,但是由于鄙人太懒,一直对Python没有太多了解,但是随着知识的积累以及学业难度的增加,我 ...

  7. PyTorch学习笔记2:nn.Module、优化器、模型的保存和加载、TensorBoard

    文章目录 一.nn.Module 1.1 nn.Module的调用 1.2 线性回归的实现 二.损失函数 三.优化器 3.1.1 SGD优化器 3.1.2 Adagrad优化器 3.2 分层学习率 3 ...

  8. 数据库-Elasticsearch进阶学习笔记(分片、映射、分词器、即时搜索、全文搜索等)

    目录 基础概念 定义 特点 索引(Index) 分片(Shards) 副本(Replicas) 分配(Allocation) 映射(Mapping) 动态映射 显式映射 常见数据类型 文档(docum ...

  9. Android 音乐播放器,Service后台管理播放

    新手笔记: 由于刚学习安卓开发,还没接触Service,所以之前的音乐播放器都是在Activity上完成的,可能功能还不够复杂,所以看不到坏处,不过很多声音说,音乐播放这块最好是放在Service中完 ...

最新文章

  1. 业务数据全用上也喂不饱AI?试试这个小样本学习工具包
  2. 川大计算机考研2020招生数,四川大学等大学,2020年研究生招生简章发布,这3个信息很重要!...
  3. centos7 hive mysql_CentOS7搭建Hive1.2.2+mysql5.7
  4. 戴尔发布面向制造、生命科学和研究的高性能计算系统
  5. 从JDK 12删除原始字符串文字
  6. 神经网络与深度学习——TensorFlow2.0实战(笔记)(三)(python输入和输出)
  7. OpenShift 4 - DevSecOps (4) - 实现一个 CICD Pipeline,并用 RHACS 发现安全隐患
  8. VM 与 与 Linux 的安装
  9. NET常出现的三十三种代码(1)
  10. matplotlib学习
  11. c语言程序设计爱心图片,c语言爱心图片表白程序源代码
  12. PID参数自整定库之一:继电反馈整定算法
  13. ClientToScreen 和ScreenToClient 用法
  14. Spring Cloud Stream初窥
  15. vscode中backspace按键失效
  16. 《30天自制操作系统》学习笔记--第0天
  17. 国内交通银行OSA账户被注销后,企业该如何面对这种局面?
  18. 浅谈Web App前端设计原则
  19. 牛客网输入输出练习c++ 个人版题解
  20. Android手机GPS卫星定位与通过WLAN与移动网络定位的区别?

热门文章

  1. 电脑中石英晶振的应用
  2. 问题分析报告--简单SQL启动MR
  3. 51单片机两只老虎c语言程序,51单片机两只老虎仿真加代码
  4. 云和恩墨亮相CNCC 2020,zCloud打造国产时代数据库管理中台
  5. 深入浅出SQL读书笔记
  6. 概率,递推,找规律,高精度(FXTZ II,hdu 4043)
  7. 服务器与普通电脑之间的区别是什么?
  8. SitePoint播客#38:猫的大脑
  9. ubuntu下进行流量监控软件nethogs安装
  10. 计算机配置64位,win10 64位系统最低配置要求_win10系统 64位最低电脑配置要求多少...