我被问到(如果可能的话)在一台计算机上编写监控至少20个麦克风输入的程序.
目前我在使用Alsa的Ubuntu系统上使用python(2.6)进行原型设计.到目前为止,我的尝试已经产生了不少问题......
Ubuntu是一个要求,Alsa不是,而python是理想的.
对于硬件,一个建议是多个声卡.另一个是一系列usb集线器和麦克风适配器(就像这些)(在这种情况下,设备将是相同的并且在同一USB总线上)
问题:
如何从单个声卡同时录制多个麦克风?(例如,对于任何知道如何使用超过两个输入的人来说,使用线路输入和麦克风,奖励!)
在USB设置中,如何识别声卡(usb适配器)插入USB集线器(或USB集线器链)的位置.
如果解决方案是通过USB对麦克风进行原始访问,那么USB总线上的设备位置是仅取决于它们插入USB集线器上的哪个端口,还是可以在打开和关闭计算机电源之间进行更改?
>声音 - 最后,如果使用原始的访问,我该如何获得最佳的数据(与pyUSB目前没有经验),什么转换(如果有的话)从原料要求?
编辑:
由监视器,我已经要求记录输入到磁盘(理想地高于设定的阈值,其Speex编解码器看起来非常适合),监视器的音量水平,提供图形反馈和建立至少一个输出通过所有有源麦克风周期.
Python是不是一个长期的需求,只是到目前为止,我已经找到摆脱声卡PCM数据(仅麦克风不过)最简单的方法
我打算在独立线程的声卡和数据处理地点进行投票,我没有得到与太多的经验的区域.
我在哪里可以找到有关实现USB音频类驱动程序的更多信息?
我正在使用libusb为usb设备编写设备驱动程序.当我尝试声明设备时,我得到错误代码LIBUSB_ERROR_BUSY(-6).根据文档,这意味着该设备已被声明(链接).
我如何找出哪个驱动程序/程序声明了该设备,更重要的是,我自己如何在声明设备后声明该设备.
代码段:
r = libusb_claim_interface(handle[0], 0);
if (r < 0) {
fprintf(stderr, "libusb_claim_interface error %d\n", r);
goto out_release;
}
printf("claimed interface\n");
Run Code Online (Sandbox Code Playgroud)
输出:
libusb_claim_interface error -6
Run Code Online (Sandbox Code Playgroud) 所以我已经实现了Android USB Accessory API,这样我就可以将手机插入运行linux的笔记本电脑,并将手机置于USB附件模式.然后我可以访问附件,打开它,然后开始阅读它.我的代码看起来几乎与文档中的示例相同.主要区别在于我使用单独的读写方法并通过本机代码通过JNI访问它们.
这是有趣的地方.成功读取/写入一两秒后,我的笔记本电脑的批量传输写入开始发出超时错误,然后对Android中的USB附件的读取调用会引发带有ENODEV错误代码的IOException.这是在电缆仍然连接的情况下,UsbManager仍在列表中列出附件,我仍然有权使用它.
为了增加它的奇特性,我发现如果我在读取循环中放置一个100ms的睡眠,问题基本上消失了(虽然它偶尔会发生).在那里睡觉不仅仅是一个可怕的kludge,但它在我的应用程序中引入了无法忍受的延迟.睡眠时间越短,黑客的有效性越低,在10ms的睡眠时间内无效.
我使用批量传输传输大约20-30kbps的实时数据(但不是实时的,批量传输是不够的),传输大小范围从50到800字节,大约20-30Hz.这可能是USB的限制吗?我没有太多的经验,所以我基本上把它当作网络套接字处理它.我是否应该将较小的消息排队并以较低频率但较大的传输将它们一起发送出去?小型,高频率的批量转移是否存在问题?我会调查一下,但我基本上都在抓稻草.
硬件:
如何在Linux中正确获取USB设备文件路径.我使用命令:find/-iname"usb"并获得如下结果:
/dev/bus/usb
/sys/bus/usb
/sys/bus/usb/drivers/usb
/sys/kernel/debug/usb
Run Code Online (Sandbox Code Playgroud)
在/ dev/bus/usb下我看到:
001 002 003 004 005 006
Run Code Online (Sandbox Code Playgroud)
但我认为它们不是我需要的文件.
在/ sys/bus/usb/devices /下:
sh-3.2# ls /sys/bus/usb/devices/
1-0:1.0 1-1:1.0 3-0:1.0 5-0:1.0 usb1 usb3 usb5
1-1 2-0:1.0 4-0:1.0 6-0:1.0 usb2 usb4 usb6
Run Code Online (Sandbox Code Playgroud)
在/ sys/bus/scsi/devices /下我插入USB时看到:
2:0:0:0 host0 host2 target2:0:0
Run Code Online (Sandbox Code Playgroud)
当我删除USB时,我看到:
sh-3.2# ls
host0
Run Code Online (Sandbox Code Playgroud)
那么哪个设备文件用于USB?我怎么辨认呢?我需要用USB设备文件制作一个C程序...
还有,你能解释一下我的数字是1-1:1.0吗?这是什么意思?
谢谢.
我正在尝试为具有5个接口的USB HUB设备设置备用设置.以下是每个接口的配置.
1. Ifs= 5 Cfg#= 1 Atr=c0 MxPwr= 2mA A: FirstIf#= 0 IfCount= 1
Cls=08(stor.) Sub=06 Prot=50 A: FirstIf#= 1 IfCount= 1 Cls=03(HID
) Sub=00 Prot=00 A: FirstIf#= 2 IfCount= 2 Cls=01(audio) Sub=00
Prot=00 A: FirstIf#= 4 IfCount= 1 Cls=fe(app. ) Sub=01 Prot=01
2. I:* If#= 0 Alt= 0 #EPs= 2 Cls=08(stor.) Sub=06 Prot=50
Driver=usb-storage E: Ad=81(I) Atr=02(Bulk) MxPS= 512 Ivl=0ms E:
Ad=01(O) Atr=02(Bulk) MxPS= 512 Ivl=0ms
3. I:* If#= 1 Alt= 0 #EPs= 2 Cls=03(HID ) Sub=00 Prot=00 …Run Code Online (Sandbox Code Playgroud) 我正在尝试在我的操作系统上设置libusb API.我在libusb.org上下载了libusb api.我遵循标准安装程序:
cd into directory
./configure
make
make check //without errors
make install
Run Code Online (Sandbox Code Playgroud)
然后我启动了Eclipse C/C++并从互联网上的教程中复制了一些代码.但是在尝试构建它时,我得到了以下输出:
main.cpp:(.text+0x19): undefined reference to `libusb_init'
main.cpp:(.text+0x76): undefined reference to `libusb_set_debug'
main.cpp:(.text+0x8a): undefined reference to `libusb_get_device_list'
main.cpp:(.text+0x136): undefined reference to `libusb_free_device_list'
main.cpp:(.text+0x142): undefined reference to `libusb_exit'
/tmp/ccOWJGwe.o: In function `printdev(libusb_device*)':
main.cpp:(.text+0x162): undefined reference to `libusb_get_device_descriptor'
main.cpp:(.text+0x28a): undefined reference to `libusb_get_config_descriptor'
main.cpp:(.text+0x4d4): undefined reference to `libusb_free_config_descriptor'
collect2: ld returned 1 exit status
Run Code Online (Sandbox Code Playgroud)
我在/ lib中有libusb.so,我在/ usr/local/include中有usb.h,在/ usr/local/lib中有.so和libusb.a的链接.
代码中的#include也是正确的.
我知道问题出现在链接器中但是我有点不能使它工作:)
我正在使用Fedora 15操作系统和gcc 4.6.0 20110603(Red Hat 4.6.0-10)版本编译器.
那么我该怎么办才能解决这些未定义的引用呢?非常感谢你的帮助:)
我正在尝试使用libusb,但是我收到以下错误消息:
usbfs:process 24665(myprogram)在使用前没有声明接口0
我真的不明白为什么,因为据我所知,我是根据图书馆的描述来做的.这是我的代码:
#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <libusb.h>
int main(void)
{
int result;
struct libusb_device_descriptor desc;
libusb_device **list;
libusb_device *my_device = NULL;
result = libusb_init(NULL);
libusb_set_debug(NULL, 3);
ssize_t count = libusb_get_device_list(NULL, &list);
for (int i = 0; i < count; i++) {
libusb_device *device = list[i];
result = libusb_get_device_descriptor(device, &desc);
if((desc.idVendor == 0x03f0) && (desc.idProduct == 0x241d)) {
my_device = device;
break;
}
}
if(my_device != NULL) {
libusb_device_handle *handle;
result = libusb_open(my_device, &handle); …Run Code Online (Sandbox Code Playgroud) 我使用libusb来枚举一些usb设备.现在我想获得"设备路径".我认为这不是usb device-path,因为我没有成功使用谷歌.
如果我用linux连接usb设备,我会收到一条消息dmesg,这里有一些带有usb温度传感器的"设备路径"的例子(如下所示):
直接到usb端口:
[68448.099682] generic-usb 0003:0C45:7401.0056: input,hidraw1: USB HID v1.10 Keyboard [RDing TEMPer1V1.2] on usb-0000:00:12.0-1/input0=> 12.0-1
直接到另一个端口:
[68560.853108] generic-usb 0003:0C45:7401.0058: input,hidraw1: USB HID v1.10 Keyboard [RDing TEMPer1V1.2] on usb-0000:00:13.0-1/input0=> 13.0-1
到第一个使用端口的USB集线器:
[68600.245809] generic-usb 0003:0C45:7401.005A: input,hidraw1: USB HID v1.10 Keyboard [RDing TEMPer1V1.2] on usb-0000:00:12.2-1.4/input0=> 12.2-1.4
到同一个USB集线器上的另一个端口:
[68647.925092] generic-usb 0003:0C45:7401.005C: input,hidraw1: USB HID v1.10 Keyboard [RDing TEMPer1V1.2] on usb-0000:00:12.2-1.3/input0=> 12.2-1.3
现在用于以前使用的usb集线器上的usb集线器:
[68740.715518] generic-usb 0003:0C45:7401.005E: input,hidraw1: USB HID v1.10 Keyboard [RDing TEMPer1V1.2] on usb-0000:00:12.2-1.4.4/input0 …
我一直在Linux上使用LibUSB开发USB驱动程序,但现在我想为Windows编译我的一个驱动程序(这是我第一次这样做).
我正在使用MinGW编译器(也使用Dev-cpp IDE)在Windows 7上工作,我正在使用从此链接下载的预编译的libusb库.
我的设备:这是一款HID触控设备.因此Windows不需要驱动程序.我有一个额外的端点来获取某些调试数据.
我已编译代码列出连接到我的机器的所有设备和USB设备,代码可以工作.现在我添加代码来打开设备,以便获得设备句柄并开始通信.但是函数返回-12即LIBUSB_ERROR_NOT_SUPPORTED.
我该如何解决这个问题?
我在互联网上搜索并没有找到解决这个问题的明确方法.虽然它的代码在Linux上运行得很好.
PS:我在下面添加了整个代码.该DoList();函数工作正常,但GetTRSDevice();函数失败 libusb_open(dev, &handle);.
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <libusb.h>
libusb_device_handle* deviceHandle = NULL;
int DoList();
libusb_device_handle* GetTRSDevice(void);
int main()
{
int ret = libusb_init(NULL);
if (ret < 0) {
printf("Failed to init libusb");
return ret;
}
DoList();
deviceHandle = GetTRSDevice();
if(!deviceHandle) {
printf("Failed to locate device");
goto fail_dev_open;
}
printf("Device opened");
libusb_close(deviceHandle);
fail_dev_open:
libusb_exit(NULL);
return(ret); …Run Code Online (Sandbox Code Playgroud)