【问题标题】:LabView playing more than one sound at the timeLabView 同时播放多个声音
【发布时间】:2015-07-29 22:18:45
【问题描述】:

我正在使用事件结构并想做一些类似 Launchpad 的操作。 数字键盘为每个数字添加了一个声音。 问题是,当我按下示例一时,当音乐停止播放时程序正在等待,接下来我可以按下示例四。

是否可以使用事件结构同时播放 3 个键的声音?

I put the files online here 并在下方添加了屏幕截图。框图:

前面板:

【问题讨论】:

  • 你是如何产生声音的?在事件案例中使用 VI,或者您正在调用一些外部程序?
  • 我正在使用可以加载 wav 文件的结构生成声音。我们可以说它的 Vi。
  • 您能给我们看一张生成按键声音的代码的屏幕截图吗?您是否有不同的事件结构案例处理不同的键(并播放不同的声音)?一般来说,如果您想充分利用您的问题,您需要提供一个重现问题的代码示例,以便我们可以运行它并尝试帮助您。查看help center page on asking a good question 了解更多信息。
  • 我刚刚上传了文件。感谢您显示帮助中心页面,我希望能帮助我在未来创建更多匹配和更好准备的问题。
  • 您可以添加一个屏幕截图吗?您可以在编辑帖子时单击“添加图片”图标添加图片,然后将图片拖放到弹出的框中。我不愿意从未知来源下载文件。

标签: audio labview


【解决方案1】:

工作解决方案

我认为使用Graphics and Sound -> Sound -> Output 调色板下的Play Sound File VI 比我预期的要容易得多。该链接是 2011 年的文档(找不到更新的链接),但看起来并没有改变。工作结果如下所示,事件结构处理了两个不同的事件:

Key Down?事件:

Stop Button事件:

不使用主事件循环右侧的Sound Output Clear VI 可能没问题,但将它放在那里不会有什么坏处。

原来Play Sound File VI 没有阻塞,所以你可以播放多个重叠的声音文件。如果您在计算机上遇到阻塞(播放一个声音文件,然后播放下一个,依此类推),请告诉我,因为我有另一种可行的解决方案。

关于事件的一句话

要理解的重要一点是事件是在队列中处理的。当您按下按键时,这些按键按顺序进入事件队列。每次执行事件处理循环时,它都会从队列中取出 oldest 事件并对其进行处理。 LabVIEW 中的事件结构在事件处理循环的每次迭代中只处理一个事件。在下一次迭代中,如果事件仍在您的结构设置处理的队列中,它将采用下一个最旧的事件进行该迭代并重复。

现在,假设您想做一些超级复杂的处理,每次按下一个键都需要 10 秒,然后您将该处理放入主事件循环中。您的按键仍会与您按下它们一样快地进入事件队列,但 LabVIEW 必须等待整整 10 秒才能将下一个按键出列并处理它,因此您最终会得到一个似乎在它突突时挂起的应用程序通过队列比向队列中添加项目要慢得多。

解决此问题的一种方法是进行复杂的处理并将其放在另一个进程中的队列之外。如果您有资源,您实际上可以在每个按键按下时在其自己的线程中调用处理子 VI 的单独实例。这允许事件处理循环尽可能快地生成进程,就像您可以按键一样快,然后您的进程会花费他们需要的任何时间同时(在资源允许的情况下)执行您想要的任何操作。

基本上这就是Play Sound File VI 正在做的事情。它看到您想要播放文件并生成一个进程以通过扬声器播放该声音,从而允许事件处理循环立即继续,而不是等待声音完成播放。当您按下更多键时,会产生更多进程,这些进程在完成时会自行杀死。您也可以手动执行此操作,如果 Play Sound File 对您的行为与对我的行为不同,这是我为您提供的另一种解决方案。

【讨论】:

  • 在播放声音文件不知道为什么,我有错误“无法识别声音格式。”明天我会尝试解决这个问题,如果这个解决方案是我正在寻找的,给你反馈。
  • 我使用的声音是 wav 文件,即使来自 Windows 媒体库也无法正常工作。
  • 错误 4810: LabVIEW: (Hex 0x12CA) 无法识别声音格式。
  • 已解决。要解决此问题,请安装 32 位版本的 LabView。工作得很好,这就是我想要的。非常感谢!
【解决方案2】:

更新:

感谢@Engineero 指出 Play Sound File vi 实际上并没有阻塞。更新后的代码显示了如何播放重叠的声音。我将把它留给用户在按键上添加停止声音代码。不需要超时,因为事件结构中没有发生任何事情。

另外,请注意,对我来说,播放声音 vi 需要处于一个 while 循环中才能继续播放。不知道为什么需要这样做,但 NI 示例以这种方式设置它(\examples\Graphics and Sound\Sound\Sound Player.vi)。

最后,如果您的声卡如here 所述不堪重负,您可能会导致 vi 崩溃。如果发生这种情况,我会使用更好的声音库来尝试从声卡中榨取更多性能。

原文:

首先,我假设您指的是this Launchpad

我一次最多可以按下 4 个键 - 重要的是将事件超时设置为 1 毫秒。如果您需要更多,则需要更复杂的设计。

我无法轻松实现声音,因为所有基本的 LabVIEW 哔声都被认为是“阻塞 I/O”,这意味着如果您同时调用 2 次哔声,Windows 将一个接一个地播放,而不是同时播放两个。您将需要使用non blocking I/O 实现您的仪器注释,可能使用LabVIEW 以外的语言,例如C++ library

【讨论】:

  • 是的,我正在尝试这样做。感谢您的回答,如果我没有找到任何其他可能性,我将使用 C++ 库来解决这个问题。
  • 在这里将超时设置为 1 毫秒究竟有什么作用?此外,这并没有演示一次播放多个声音,我相信这是 OP 正在寻找的。​​span>
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-01-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-05-20
相关资源
最近更新 更多