USB 键盘 - 缓冲文件

Posted

技术标签:

【中文标题】USB 键盘 - 缓冲文件【英文标题】:USB Keyboard - buffering files 【发布时间】:2015-10-04 09:37:55 【问题描述】:

我的小应用程序还有另一个问题。我使用通过 USB 线连接到 PC 的 N-Audio 库和外部 MIDI 键盘(88 键)。

一切正常,我可以在我的 MIDI 键盘上弹奏,应用程序读取键并从资源中播放特定的 Notes = .wav 文件。

但问题是当我玩的时间超过 2 分钟时。在那之后,声音变得令人毛骨悚然,它们出现了问题 - 它们听起来像是出现了疯狂的压缩质量,最后它们完全消失了,但应用程序仍在接收来自 MIDI 键盘的信号。

我有这样的阅读器(对于 88 个键中的每一个):

// WaveFileReader
private NAudio.Wave.WaveFileReader wave = null;
private NAudio.Wave.WaveFileReader wave0 = null;

直接发出声音:

// DirectSoundOut
private NAudio.Wave.DirectSoundOut output = null;
private NAudio.Wave.DirectSoundOut output0 = null;

然后,所有声音(音符)都以这种方式播放(对于每个波、wave0、wave1 等...以及 output、output1、output2 等...):

if (nutka == "C1" && msg.Velocity != 0)

    wave1 = new NAudio.Wave.WaveFileReader(Properties.Resources.C1);
    output1 = new NAudio.Wave.DirectSoundOut();
    output1.Init(new NAudio.Wave.WaveChannel32(wave1));
    output1.Play();

无法找出真正的主要问题是什么,我该如何解决。

【问题讨论】:

考虑使用 to 字段创建结构:waveoutput。然后您可以创建map,其中note(字符串)是键,提到的结构是值。然后,你可以写:if(msg.Velocity != 0) myMap[nutka].wave = new...; ... myMap[nutka].output.Play(); 而不是可怕的if 链;) 你在哪里清理所有这些对象? 什么是“清理对象”?任何建议如何做到这一点? 【参考方案1】:

您不应打开多个WaveOut 实例。相反,只需打开 1 并将所有输入与 MixingSampleProvider 混合使用

【讨论】:

亲爱的 Mark,请问您如何使用 MixingSampleProvider 混合所有输入?

以上是关于USB 键盘 - 缓冲文件的主要内容,如果未能解决你的问题,请参考以下文章

请问Linux内核里,USB键盘和鼠标的驱动都是哪些文件?

WIN7旗舰版接USB键盘无法识别,显示未找到HID KEYBOARD DEVICE文件,无法启用...怎么弄?

CTF—MISC—USB键盘流量分析

用汇编语言实现从键盘读一行信息,并存入用户定义的缓冲区buffer。如从键盘输入”myfriends”

转Arduino 控制USB设备解析USB键盘的例子

windows下C语言非阻塞方式读取键盘缓冲区