音频超时后自动关闭蓝牙耳机吗?

音频超时后自动关闭蓝牙耳机吗?

我有索尼蓝牙耳机已连接到 Ubuntu 20.04。它们运行良好,蓝牙可以重新连接,我甚至可以(mpris)从中控制玩家。

我的问题是,如果我在连接时忘记关闭,耳机会在一夜之间耗尽电池。我检查了一下,耳机方面没有办法在没有声音时自动关闭它。

但是,当没有蓝牙连接时,耳机会自动关闭。因此,我认为我唯一的好选择是让 Ubuntu 在一段时间的静默后断开蓝牙连接。

当没有声音时,是否有这样的选项可以自动断开蓝牙音频设备?

除了在“设置”窗口中的配置外,我找不到蓝牙设备的太多配置:

窗口

答案1

经过一番搜索,我找到了以下解决方案这个答案,运行时有效脉冲音频

使用命令pacmd list-sink-inputs可以查看所有音频接收器。输出如下所示: “pacmd list-sink-inputs”的示例输出

这里的解决方案很重要state: RUNNINGsink: 31 <bluez_sink.[hardware address].a2dp_sink>因为有了这些信息,我们就可以检查音频当前是否通过蓝牙进行流式传输。蓝Z是运行 Linux 蓝牙服务的技术。连接但没有播放音乐的接收器将具有以下状态state: CORKED

基于此信息,现在可以使用该包更改蓝牙适配器的状态bluez-tools. 更具体地说,该命令bt-adapter --set Powered false用于在需要时关闭适配器。这里是所有选项和命令的链接。

我编写了一个 bash 脚本,它会不定期地检查 PC 是否正在通过蓝牙传输音频,如果没有,则会在给定的超时时间后关闭蓝牙适配器。请原谅我的脚本,这只是我用 bash 编写的第二个脚本。

#!/bin/bash
deviceName="WH-1000XM3" # Name of the BT-Device
timeout=120              # Delay in seconds after which Device is disconnected
halfTimeout=$((timeout / 2))

# Checks if Sound is played via BT.
# Returns true if sound is play and false if not.
checkBTSound() {
  sinks=$(pacmd list-sink-inputs)  # Gets all sinks
  # Check if "bluez_sink" is in the list of sinks and if it also has
  # "state: RUNNING".
  [[ ("$sinks" == *"bluez_sink"*) &&\
   ("$sinks" == *"state: RUNNING"*) ]] && true || false
}

# Checks if specified BT-Device is connected
# Returns "true" if connected, "false" else.
deviceIsConnected() {
  response=$(bt-device -i $deviceName)
  [[ "$response" == *"Connected: 1"* ]] && true || false
}

# Endless Loop
while :
do
  counting=false
  inital=true
  notification=false
  start=1
  # Only take action, if device is connected and no sound is streaming.
  while
    (! checkBTSound && deviceIsConnected) && true || false 
  do
    # Sound has stopped playing. Start counting.
    counting=true

    # Only on first loop mark the time to calc the duration later.
    if $inital; then
      inital=false
      start=$SECONDS
    fi
 
    # Calculate time passed since first loop.
    timePassed=$(($SECONDS - $start))

    # Check if half of timeout time has passed and send notification if that is
    # the case and the notification has not already been sent.
    if [ $timePassed -ge $halfTimeout ] && ! $notification; then
      notify-send "Headphone Timeout"\
        "Headphone will be disconnected in $halfTimeout seconds."
      notification=true

    # Check if timout time has been surpassed and take corresponding actions if
    # that is the case.
    elif [ $timePassed -ge $timeout ]; then
      # Sending notification
      notify-send "Headphone Timeout"\
       "Disconnecting headphones \"$deviceName\"."
      # Disconnecting specified device
      bt-device -d $deviceName
      # Go back to outer loop waiting for device to connect again
      break
    fi
    sleep 1
  done
  sleep 5
done

编辑: 您还可以使用以下方式断开设备连接

bt-device --disconnect=<Name of your Device>

这样您就不必关闭适配器。名称是人性化的设备名称,您也可以在蓝牙设置中将其更改为您喜欢的任何名称。

答案2

这是我的“蓝牙设备断开脚本”版本 https://github.com/pymen/bt_auto_disconnect

它使用 cron 进行定期检查,如果最后 N 次检查都没有声音,它会断开蓝牙设备

相关内容