C++ 如何使用libusb播放音频文件(从wav文件读取的字节)
如何在连接的USB耳机上使用libusb播放音频文件(从wav文件读取的字节),我已尝试使用ISynchronous transfer来执行,但调用libusb_submit_transfer()时控制传输失败,请告诉我实现此场景所涉及的步骤C++ 如何使用libusb播放音频文件(从wav文件读取的字节),c++,C++,如何在连接的USB耳机上使用libusb播放音频文件(从wav文件读取的字节),我已尝试使用ISynchronous transfer来执行,但调用libusb_submit_transfer()时控制传输失败,请告诉我实现此场景所涉及的步骤 USB头戴式耳机详细信息 端点描述符01 1输出,等时,1毫秒 偏移字段大小值说明 0稠度109h 1 bDescriptorType 1 05h端点 2个Bendpoint地址1 01h 1输出 3个BM1 09h等时自适应数据 1..0:传输类型…
- USB头戴式耳机详细信息 端点描述符01 1输出,等时,1毫秒
仅供参考:函数libusb_fill_control_setup()的值是根据主机和设备之间交换的数据包(在播放音乐文件时使用USB分析器查看原始数据包)给出的,以下行来自USB分析器 安装包 偏移字段大小值说明 0 bmRequestType 1 22h 4..0:收件人…00010终结点 6..5:01型。。。。。阶级 7:方向0。。。。。。。主机到设备 1次酿造1 01h
2 W值2 0100h
4 wIndex 2 0001h
6 W长度2 0003h
#包括
#包括
#包括
#包括
#包括
#包括
使用名称空间std;
libusb_设备_句柄*dev_句柄;
无符号字符*audiobytes=NULL;
int-slen=0;
libusb_transfer_cb_fn cbTest(结构libusb_transfer*transfer);
void submit_write(int endpoint、uint8_t*数据、int len、libusb_transfer_cb_fn回调);
libusb_传输cb_fn cbTest(结构libusb_传输*传输)
{
cout flags |=LIBUSB_TRANSFER_FREE_TRANSFER;
uint8_t*数据=(uint8_t*)(malloc(长度+8));
libusb填充控制设置(数据、请求类型、请求、值、索引,0x0003);
libusb\u fill\u control\u传输(传输、开发句柄、数据、回调、用户数据、0);
int ret;
ret=libusb\u提交\u传输(传输);
if(ret==LIBUSB_SUCCESS)
{
如果你不能给我们看你的密码,我们会告诉你出了什么问题。嗨,凯撒添加了密码,请你检查一下
#include <iostream>
#include <cstdlib>
#include <stdio.h>
#include <malloc.h>
#include <string.h>
#include <libusb.h>
using namespace std;
libusb_device_handle *dev_handle;
unsigned char *audiobytes = NULL;
int slen = 0;
libusb_transfer_cb_fn cbTest(struct libusb_transfer *transfer);
void submit_write(int endpoint, uint8_t* data, int len, libusb_transfer_cb_fn callback);
libusb_transfer_cb_fn cbTest(struct libusb_transfer *transfer)
{
cout << "cbTest" << endl;
}
void send_buf(uint8_t request_type, uint8_t request, uint16_t value, uint16_t index,uint8_t* data_in, uint16_t length,
libusb_transfer_cb_fn callback, void* userdata)
{
libusb_transfer* transfer = libusb_alloc_transfer(0);
transfer->flags |= LIBUSB_TRANSFER_FREE_BUFFER;
transfer->flags |= LIBUSB_TRANSFER_FREE_TRANSFER;
uint8_t* data = (uint8_t*)(malloc(length+8));
libusb_fill_control_setup(data, request_type, request, value, index, 0x0003);
libusb_fill_control_transfer(transfer, dev_handle, data, callback, userdata, 0);
int ret;
ret = libusb_submit_transfer(transfer);
if (ret == LIBUSB_SUCCESS)
{
cout << "send_buf LIBUSB_SUCCESS" << endl;
}
else
{
cout << "send_buf LIBUSB_FAILURE" << endl;
libusb_free_transfer(transfer);
}
}
void readfile()
{
int i;
int result;
FILE *wav;
FILE *outwav;
wav = fopen("./test1.wav", "rb");
outwav = fopen("./out.wav", "wb");
fseek(wav, 0, SEEK_END);
slen = ftell(wav);
cout << "fwrite slen = " << slen << endl;
rewind(wav);
audiobytes = (unsigned char*) malloc (sizeof(char)*slen);
if(audiobytes == NULL)
{
fputs("Memory error", stderr);
exit(1);
}
result = fread(audiobytes, 1, slen, wav);
if(result != slen)
{
fputs("Read error",stderr);
exit(2);
}
fclose(wav);
cout << "fwrite" << endl;
fwrite(audiobytes+44, 1, slen, outwav);
fclose(outwav);
return;
}
int main()
{
libusb_device **devs;
libusb_context *ctx = NULL;
int r;
ssize_t cnt;
r = libusb_init(&ctx);
if(r < 0)
{
cout<<"Init Error "<<r<<endl;
return 1;
}
libusb_set_debug(ctx, 3);
cnt = libusb_get_device_list(ctx, &devs);
if(cnt < 0) {
cout<<"Get Device Error"<<endl;
return 1;
}
cout<<cnt<<" Devices in list."<<endl;
dev_handle = libusb_open_device_with_vid_pid(ctx, 5013, 37);//USB headset
if(dev_handle == NULL)
cout<<"Cannot open device"<<endl;
else
cout<<"Device Opened"<<endl;
libusb_free_device_list(devs, 1);
int byteswritten;
if(libusb_kernel_driver_active(dev_handle, 0) == 1)
{
cout<<"Kernel Driver Active"<<endl;
if(libusb_detach_kernel_driver(dev_handle, 0) == 0)
cout<<"Kernel Driver Detached!"<<endl;
}
r = libusb_claim_interface(dev_handle, 0);
if(r < 0)
{
cout<<"Cannot Claim Interface"<<endl;
return 1;
}
cout<<"Claimed Interface"<<endl;
readfile();
cout<<"Writing Data..."<<endl;
send_buf(0x22, 0x01, 0x0100, 0x0001, audiobytes, slen, NULL, NULL);
r = libusb_release_interface(dev_handle, 0);
if(r!=0)
{
cout<<"Cannot Release Interface"<<endl;
return 1;
}
cout<<"Released Interface"<<endl;
libusb_close(dev_handle);
libusb_exit(ctx);
sleep(40);
return 0;
}