Java Sound 在连接麦克风后刷新线路列表

2023-11-23

我有一个简单的捕获/回放 Swing 应用程序,它必须检测计算机上是否没有合适的麦克风并警告用户。经过大量摆弄后,我找到了唯一可以让我检测新连接或移除的麦克风的解决方案:

     com.sun.media.sound.JDK13Services.setCachingPeriod(0);

     private static boolean isMicrophoneAvailable() {
        try {
            if (!AudioSystem.isLineSupported(Port.Info.MICROPHONE)) {
                log.debug("NO MICROPHONE FOUND");
                return false;
            } else {
                log.debug("MICROPHONE FOUND");
                return true;
            }
        } catch (IllegalArgumentException e) {
            log.debug("INCONSISTENT");
        }
        return false;
    }

在后台线程中调用如下:

   new Thread() {
       public void run() {
            while(!thisFrame.isClosed()){
                if(isMicrophoneAvailable() == true){
                     //OK
                }else{
                     //WARN
                }
                try {
                    Thread.sleep(1000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
      }
    }).start();

问题在于,尽管使用所描述的方法正确检测到设备,但底层线路列表并未刷新。也就是说,当程序启动并稍后连接设备时,尝试录制声音时会引发以下异常:

 java.lang.IllegalArgumentException: No line matching interface TargetDataLine supporting format PCM_SIGNED 44100.0 Hz, 16 bit, stereo, 4 bytes/frame, big-endian is supported.

有什么办法可以刷新 AudioSystem 的线路列表吗?也许类似于JDK13Services一开始使用的解决方法以避免缓存?

UPDATE:抛出异常的代码:

        AudioFormat format = formatControls.getDefaultFormat();
        DataLine.Info info = new DataLine.Info(TargetDataLine.class,format);
        try {
            line = (TargetDataLine) AudioSystem.getLine(info);
            line.open(format, line.getBufferSize());
        } catch (LineUnavailableException ex) {
            shutDown("No audio input device available. Please make sure that a microphone is attached to your computer");
            return;
        } catch (Exception ex) {
            log.error(ex.toString());
            shutDown(ex.toString());
            return;
        }

以及异常本身:

 java.lang.IllegalArgumentException: No line matching interface TargetDataLine supporting format PCM_SIGNED 44100.0 Hz, 16 bit, stereo, 4 bytes/frame, big-endian is supported.

以原始帖子为灵感,我想出了这个方法来检测麦克风何时丢失或获得。它会检测(在我的系统上)USB 麦克风何时插入或拔出。我从后台线程循环调用它。原来的方法对我来说不起作用,因为笔记本电脑上有一个内置麦克风,所以我需要检测第二个麦克风的添加。

...
//call this once somewhere to turn the caching period down for faster detection
    try
    {
        //try to set the caching period, defaults to something like 55 seconds
        com.sun.media.sound.JDK13Services.setCachingPeriod(5);
    }
    catch( Exception e)
    {
        System.err.println("exception attempting to call com.sun.media.sound.JDK13Services.setCachingPeriod->" + e);
    }
...

private int lastNumMics = -1;
private synchronized void micCheck()
{
    Line.Info[] lineInfoArray = AudioSystem.getSourceLineInfo(Port.Info.MICROPHONE);
    int numMics = lineInfoArray == null ? 0 : lineInfoArray.length;
    if( lastNumMics > -1 )
    {
        if( numMics < lastNumMics )
        {
            //MICROPHONE_LOST
        }
        else if( numMics > lastNumMics )
        {
            //MICROPHONE_GAINED
        }
    }
    lastNumMics = numMics;
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Java Sound 在连接麦克风后刷新线路列表 的相关文章

随机推荐

  • 如何将字符串的第一个字母大写

    我有一个像这样的字符串 var sentence string the biggest ocean is the Pacific ocean 我希望能够将第一个字母大写t在输入字符串中 使该字符串变为 The biggest ocean i
  • Paypal 可变金额定期付款

    首先 请注意 我已经阅读了许多有关此主题的帖子 但提供的信息对我来说不够或不准确 我正在使用 AngularJS 和 Ruby on Rails 开发一个提供不同服务的网站 用户可以订阅这些服务 一项或多项 并获得 Paypal 定期付款
  • YYYYMMDD 日期格式正则表达式以验证 C# .net 中的日期

    我需要在 C 中使用正则表达式验证日期格式 格式如下 YYYYMMDD 正则表达式不适合此任务 例如 编写匹配有效日期 20080229 但不匹配无效日期 20100229 的正则表达式是很困难的 相反 你应该使用DateTime TryP
  • RNN:Keras框架中LSTM层的return_sequences有什么用

    我在 RNN 工作 我有来自某个网 站的以下代码行 如果您观察到第二层没有 returnSequence 参数 我假设返回序列是强制性的 因为它应该返回序列 您能告诉我为什么没有定义吗 第一层LSTM regressor add LSTM
  • valgrind 条件跳转或移动取决于未初始化的值,这是否表明内存泄漏?

    我在代码中面临内存泄漏问题 在运行时 堆继续增加到最大值 我需要重新启动服务 我运行 top 命令并看到每当我调用服务中的场景时堆都会增加 我用 valgrind 运行服务 valgrind log file log feb19 txt l
  • DLL 总是有相同的基地址吗?

    我正在研究 Windows 和 DLL 的东西 我对此有一些疑问 我编写了一个简单的程序来加载我自己的 DLL 这个DLL只有简单的函数 加号 减号 这就是问题 如果我加载一些 DLL 例如 text dll 这个DLL总是有相同的基地址吗
  • PHP https 使用 cURL 发布 XML 数据

    我正在尝试使用 PHP 将带有 XML 数据的 HTTPS POST 请求发送到服务器 发送到服务器的任何内容都需要身份验证 因此我将使用 cURL 一些背景信息 XML数据是请求服务器将文件从特定URL上传到其本地存储 使用此 API 的
  • 禁用或启用复选框选中事件上的提交按钮

    我想要这样的东西 但有一点小小的改变 我希望在复选框选中事件上启用或禁用按钮 即当选中复选框时 然后只应启用按钮 否则将被禁用 这应该使用 jQuery 代码而不是 JavaScript 来完成 由于这是 MVC 表单 因此没有表单 ID
  • 使用 javascript 和 regex 验证日期时间

    我正在尝试使用有效的日期时间格式验证文本框 我需要检查 24 小时日期时间格式 所以我将以下文本输入到我的文本框中22 05 2013 11 23 22 但它仍然无法正确验证它 我对正则表达式完全陌生 这是到目前为止我已经尝试过的 test
  • 如何以编程方式将文本添加到位图图像? WPF

    我使用 Kinect 传感器通过将视频源设置为位图源来在图像上显示视频源 如下所示 但我的问题是如何向图像 位图添加文本 例如分数计数器 我在下面添加了一张图片来显示我想要实现的目标 void myKinect ColorFrameRead
  • 将属性与父 ViewModel 绑定

    请参阅如何告诉我的 DataTemplate 绑定到 PARENT ViewModel 中的属性 我有类似的问题 但这个解决方案对我不起作用 我有一个 MainViewModel 它有另一个视图模型 例如 View1 ViewModel1
  • 固定标题 div 和下面的可滚动 div

    我试图将两个 div 一个放在另一个上面 最上面的一个有固定的大小 底部的需要填充页面高度的其余部分 如果内容太大 则不会使页面更高 div div div div some content br br br br br br br br
  • 触摸时旋转视图

    我必须在手指触摸时循环旋转视图 我的意思是像拨打旧电话号码 并且触摸应该只在角落 任何人都可以帮助我 我已经尝试过一次很多 但没有成功 您需要定义UIRotationGestureRecognize在要旋转的视图上添加一个选择器方法并像这样
  • 默认浮点类型是什么?

    如果在变量上指定浮点类型a the abs可以使用函数 以下示例正在运行 fn main let a 1 0f64 println a abs 它打印1正如预期的那样 但如果f64省略时 编译期间会引发错误 如下例所示 fn main le
  • 如何获取自定义元素的内容

    我正在创建一个自定义元素它将能够将其内容从 Markdown 转换为 HTML 但是 我无法获取自定义元素的内容
  • 邮寄地址和格式(粗体、斜体……)

    我想用特定文本打开用户的邮件客户端 文本的某些部分应该是bold italic或 u n d e r l i n e d 我尝试使用mailto 但它使用的是RFC 2368 所以这是根本不可能的 特殊的hname body 表示关联的hv
  • requestAnimationFrame 未定义 Next.js 和 React Native Web(动画模块)

    我正在研究 Next js 和 React Native Web 我设法按照官方 Next js 示例将它们一起运行 但是当我尝试使用反应本机中的动画包时 它失败并出现错误 请求动画帧没有定义 基本上这个功能执行node modules包
  • 将对象字面量提供给 ILGenerator

    Food obj ILGenerator gen GetILGenerator gen Emit obj replace this gen Emit OpCodes Call typeof Person GetMethod Eat 显然不可
  • javascript 导入的顺序重要吗?

    我有一个 aspx 页面并导入 jQuery jTemplate 和 Flexigrid
  • Java Sound 在连接麦克风后刷新线路列表

    我有一个简单的捕获 回放 Swing 应用程序 它必须检测计算机上是否没有合适的麦克风并警告用户 经过大量摆弄后 我找到了唯一可以让我检测新连接或移除的麦克风的解决方案 com sun media sound JDK13Services s