Java Clip 类中的 Drain 方法

2023-12-25

我正在创建一个短片,然后播放它,调用start()方法。然后我打电话给drain()方法阻止执行,直到剪辑播放完成。然而,当多次运行下面的代码时,有时有效,有时无效,并且声音在结束前随机停止。

Mixer mixer = AudioSystem.getMixer(null);
AudioFormat format = new AudioFormat(44100, 8, 1, true, false);
DataLine.Info info = new DataLine.Info(Clip.class, format);
try {
    // Create a sound of 1 second
    Clip clip = (Clip)mixer.getLine(info);
    byte[] b = new byte[44100];
    for(int i=0; i<b.length; i++)
        b[i] = (byte) (50*Math.sin(i/10.0));

    clip.open(format, b, 0, b.length);
    clip.setFramePosition(0);
    clip.start();
    clip.drain();
} catch(LineUnavailableException lue) { lue.printStackTrace(); }

所以我的问题是:这是一个错误吗?还是我误解了drain() method?


看来clip.start()有时会在Start事件发生之前立即返回,这是由于错误(?)造成的,在这种情况下,drain没有效果。通过解决方法,我们可以使用 Listener 来捕获 START 事件:

解决办法:

Mixer mixer = AudioSystem.getMixer(null);
AudioFormat format = new AudioFormat(44100, 8, 1, true, false);
DataLine.Info info = new DataLine.Info(Clip.class, format);
try {
    // Create a sound of 1 second
    Clip clip = (Clip)mixer.getLine(info);

    //Workaround part 1
    clip.addLineListener(new LineListener() {
        @Override
        public void update(LineEvent event) {
            if (event.getType() == Type.START)
                synchronized (clip) {
                    clip.notify();
                }
        }
    });

    byte[] b = new byte[44100];
    for(int i=0; i<b.length; i++)
        b[i] = (byte) (50*Math.sin(i/10.0));

    clip.open(format, b, 0, b.length);
    clip.setFramePosition(0);

    //Workaround part 2
    synchronized (clip) {
        clip.start();
        clip.wait();
        System.out.println("Started");
    }
    clip.drain();
    System.out.println("Drained");
} catch(LineUnavailableException | InterruptedException lue) { lue.printStackTrace(); }
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Java Clip 类中的 Drain 方法 的相关文章

随机推荐

  • UIPrintInteractionController - 限制打印份数/获取打印份数

    我正在开发一个 iPad 应用程序 其中包含打印文档的功能 一些文档需要权限管理 其中可以打印有限数量的份数并且必须记录打印的份数 我已经搜遍了UI打印交互控制器 http developer apple com library ios d
  • 不同类型骰子的骰子总概率

    我目前正在开发一个java应用程序 我需要计算滚动各种骰子的每个总和的概率 我支持的骰子类型有 d4 4 面骰子 d6 6 面骰子 d8 8 面骰子 d10 d12 和 d20 用户将能够输入他们想要在计算中使用的每种骰子的数量 例如 用户
  • MacOS 上的 Tensorflow:您的 CPU 支持此 TensorFlow 二进制文件未编译为使用的指令:AVX2 FMA

    我尝试使用这些说明验证我的 mac 的张量流https www tensorflow org install install mac ValidateYourInstallation https www tensorflow org ins
  • 通过 JNI 接口共享输出流

    我正在编写一个通过 JNI 接口使用 C 库的 Java 应用程序 C 库创建类型的对象Foo 它们通过 JNI 适当地传递到 Java 假设库有一个输出函数 void Foo print std ostream os 我有一个JavaOu
  • 在 MSSQL 2000 中如何确定某列是否为标识列?

    我想在代码中执行此操作 而不是使用 ALT F1 您也可以这样做 select columnproperty object id mytable mycolumn IsIdentity 如果是恒等则返回 1 否则返回 0
  • 如何在随后打印的质因数之间添加“x”,而不在最后打印的质因数之后有额外的“x”?

    我正在编写质因数分解代码 并且尝试在用户输入的数字的每个显示的质因数之间打印 x 但是 我似乎不知道如何做到这一点 以便在最后显示的素因数之后不会出现额外的 x 我尝试过在 print 语句中的 x 之后连接 mod 并且尝试考虑使用 If
  • 内容提供程序错误:绑定或列索引超出范围:句柄 0x234590

    我已经实现了一个内容提供程序 它导致以下错误 04 25 00 25 16 856 E AndroidRuntime 520 引起 android database sqlite SQLiteException 绑定或列索引超出范围 句柄0
  • 在 mysql db 和 PHP 中 x 分钟后删除整行

    我正在尝试设置一个 sql 数据库 用户必须在其中确认他们的电子邮件地址 我想知道是否有一种方法可以自动删除 sql 数据库中尝试注册 提交其信息 但在 x 分钟后未确认其电子邮件地址的用户 我编写的脚本将其信息直接插入数据库 然后在用户确
  • 以实体的形式显示不相关记录的网格

    我有 3 个 CRM 实体 A B 和 C A 和 B 之间存在 1 N 关系 我有一个自定义活动 D B 和 D 之间存在 1 N 关系 在创建 D 实例时 它的 Regarding 字段设置为 C 实例 C 与 A 或 B 没有任何直接
  • 混淆 Xamarin 应用程序

    是否可以提取 Xamarin Android 应用程序的代码并进行检查 我正处于一个应用程序的最后阶段 该应用程序很快就会在 Play 商店上发布 但是 我担心代码是否可以被其他人提取并查看 请告知如何保护我的应用程序不被其他人查看其代码
  • jqGrid 与 AngularJS

    我一直在寻找如何将 jqGrid 与 AngularJS 结合使用的好例子 我知道 ngGrid 和其他 AngularJS 支持的网格控件 但不幸的是我有一个基于 jqGrid 的整体主题 我最近开始使用 Angular 所以请原谅我的新
  • 自定义 Inno Setup 卸载页面(不是 MsgBox)

    我需要在安装过程中询问用户密码 然后将其用作安装后运行的命令的一部分 我正在使用自定义页面来执行此操作 并且效果很好 我还需要在卸载过程中问同样的问题 该问题用作卸载后运行的命令的一部分 我检查了帮助 似乎没有用于卸载的 PageID 我可
  • 如何在服务器发送的 js 文件到达浏览器之前对其进行编辑?

    在正常的浏览会话期间 我想在浏览器接收之前编辑特定的 JavaScript 文件 因为一旦到达那里就无法编辑 有没有这方面的工具 对于我需要的东西 我不能只是将其保存并在磁盘上进行编辑 我准备好学习如何自己编程 但如果有人能或多或少地指出我
  • 在 PHP 中使用 AES 加密时,应该在哪里存储密钥?

    我正在我的网络应用程序中实现 AES 256 位加密 http www utoxin name 2009 07 automatic db field encryption in cakephp http www utoxin name 20
  • 从 MVC3 升级到 MVC4 后出现“元素未关闭”错误

    Razor 2 随 MVC4 一起提供 似乎并不完全向后兼容 Razor 1 来自 MVC3 自从升级后 我发现一个错误 The 电子邮件受保护 cdn cgi l email protection count 元素未关闭 所有元素必须是自
  • 如何设置 url 帮助器方法参数的默认值?

    我使用语言代码作为前缀 例如www mydomain com en posts 1 这就是我在routes rb中所做的 scope lang do resources posts end 现在我可以轻松使用 url 助手 例如 post
  • Twitter API 和 Rest 调用的身份验证

    我一直在使用 FB api 进行一些简单的演示 并且身份验证一切都非常简单 现在我必须对 twitter v1 1 做类似的事情 但有一些东西我真的不明白 例子 我想做这个请求 https api twitter com 1 1 searc
  • Specflow 如何处理多个参数?

    正如标题所说 specflow如何处理this https stackoverflow com questions 1996426 pass multiple optional parameters to a c sharp functio
  • GCC 汇编优化 - 为什么它们是等价的?

    我正在尝试在初级水平上学习汇编是如何工作的 所以我一直在玩 Sgcc 编译的输出 我编写了一个简单的程序 它定义两个字节并返回它们的总和 整个程序如下 int main void char A 5 char B 10 return A B
  • Java Clip 类中的 Drain 方法

    我正在创建一个短片 然后播放它 调用start 方法 然后我打电话给drain 方法阻止执行 直到剪辑播放完成 然而 当多次运行下面的代码时 有时有效 有时无效 并且声音在结束前随机停止 Mixer mixer AudioSystem ge