一个Java运行时内的多个回放音量

时间:2011-07-14 15:03:45

标签: java windows audio volume

我正在寻找以下问题的解决方案:

  • 我的java运行时有多个包可能产生音频输出。
  • 用户应该只能通过一个滑块来控制所有包的音量(直到这一点,我可以使用AudioSystem.getMixer()来获取Windows主音量控制)
  • 有一个捆绑包可以创建重要的音频输出,不应受上面滑块的影响。

如上所述,目标环境是Windows(XP或更高版本)。

不幸的是,所有音频输出包都共享相同的进程ID,因为它们属于同一个java运行时。因此,windows只会创建一个特定于应用程序的混音器。你有什么想法吗?

1 个答案:

答案 0 :(得分:0)

你是通过剪辑玩的吗? SourceDataLines?很可能,每个都暴露出一个可用于改变音量的控件。使用基本的生产者/消费者设计模式,您可以选择是否受JSlider影响的声音。

换句话说,您可以在Clip / SDL级别而不是在混音器级别执行操作。

如果一个Control for volume不起作用,那么创建一个浮点“volume”变量并不困难,你可以“订阅”或暴露给JSlider,它保存0到1.0f之间的值并乘以在SourceDataLine播放之前,内部缓冲区循环中的每个帧值。它可能需要将字节放在一起(对于16位声音),进行乘法,然后再将它们分开。这里还有其他线程显示小端或大端声音数据处理的编码。

我看了一下提供的OSGi链接并跑了。我主要是直接做javax.sound.sampled。

如果第三方为声音提供的“捆绑”没有暴露音量控制,我会感到非常惊讶。这似乎是一件基本的事情!