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播放)相关推荐
- C++ MFC 学习笔记+小型通讯录系统实现
MFC 最详细入门教程 [MFC常用函数总结](https://www.cnblogs.com/jiu0821/p/4606639.html) [C++ & MFC]https://www.c ...
- MFC 学习笔记(一):MFC单文档程序运行流程梳理与总结
MFC 学习笔记(一):MFC单文档程序运行流程梳理与总结 1.MFC单文档程序运行流程 1.首先利用全局变量对象 theApp 启动应用程序 (这是因为这个全局对象,基类CWinApp中 this ...
- 深入浅出MFC学习笔记
深入浅出MFC学习笔记 ithzhang CSDN博客:http://blog.csdn.net/ithzhang/article/category/1159054 转载于:https://blog. ...
- android 百度网盘 播放器,最好用的安卓播放器,支持云盘播放,看电影必备
原标题:最好用的安卓播放器,支持云盘播放,看电影必备 你最喜欢用什么播放器来看电影? 或许腾讯视频.优酷等主流的点播播放器是数千万人的选择,但有时,我们也需要一款好用.离线.轻量级别的本地播放器来播放 ...
- TSN时间敏感网络|学习笔记-看这一篇就够了
近年来,随着汽车电子电气架构的演进,车载以太网以其高带宽.技术成熟和灵活部署等优势成功占据汽车主干网地位,但是传统以太网具有的时间不确定性,对自动驾驶.智能网联等前沿需求带来巨大挑战.为此,IEEE ...
- 关于Python的一些学习笔记(小白式笔记,持续更新)
关于Python的一些学习笔记 瞎bb: 作为一个计算机专业的学生,Python应该是一门很有必要掌握的语言,但是由于鄙人太懒,一直对Python没有太多了解,但是随着知识的积累以及学业难度的增加,我 ...
- PyTorch学习笔记2:nn.Module、优化器、模型的保存和加载、TensorBoard
文章目录 一.nn.Module 1.1 nn.Module的调用 1.2 线性回归的实现 二.损失函数 三.优化器 3.1.1 SGD优化器 3.1.2 Adagrad优化器 3.2 分层学习率 3 ...
- 数据库-Elasticsearch进阶学习笔记(分片、映射、分词器、即时搜索、全文搜索等)
目录 基础概念 定义 特点 索引(Index) 分片(Shards) 副本(Replicas) 分配(Allocation) 映射(Mapping) 动态映射 显式映射 常见数据类型 文档(docum ...
- Android 音乐播放器,Service后台管理播放
新手笔记: 由于刚学习安卓开发,还没接触Service,所以之前的音乐播放器都是在Activity上完成的,可能功能还不够复杂,所以看不到坏处,不过很多声音说,音乐播放这块最好是放在Service中完 ...
最新文章
- 业务数据全用上也喂不饱AI?试试这个小样本学习工具包
- 川大计算机考研2020招生数,四川大学等大学,2020年研究生招生简章发布,这3个信息很重要!...
- centos7 hive mysql_CentOS7搭建Hive1.2.2+mysql5.7
- 戴尔发布面向制造、生命科学和研究的高性能计算系统
- 从JDK 12删除原始字符串文字
- 神经网络与深度学习——TensorFlow2.0实战(笔记)(三)(python输入和输出)
- OpenShift 4 - DevSecOps (4) - 实现一个 CICD Pipeline,并用 RHACS 发现安全隐患
- VM 与 与 Linux 的安装
- NET常出现的三十三种代码(1)
- matplotlib学习
- c语言程序设计爱心图片,c语言爱心图片表白程序源代码
- PID参数自整定库之一:继电反馈整定算法
- ClientToScreen 和ScreenToClient 用法
- Spring Cloud Stream初窥
- vscode中backspace按键失效
- 《30天自制操作系统》学习笔记--第0天
- 国内交通银行OSA账户被注销后,企业该如何面对这种局面?
- 浅谈Web App前端设计原则
- 牛客网输入输出练习c++ 个人版题解
- Android手机GPS卫星定位与通过WLAN与移动网络定位的区别?