如何处理 gnome 扩展中的麦克风音量更新事件?

How to handle microphone sound level update event in gnome extensions?

我有一些全局快捷方式来更新麦克风声音输入电平。因此,我正在创建一个 gnome 扩展,在顶部栏中添加一个标签,显示当前麦克风音量百分比。

extension.js中的代码是这样的:

const Microphone = new Lang.Class({
  Name: 'Microphone',

  _init: function() {
    this.active = null;
    this.stream = null;
    this.muted_changed_id = 0;
    this.mixer_control = new Gvc.MixerControl({name: 'Some random name'});
    this.mixer_control.open();
    this.mixer_control.connect('default-source-changed', Lang.bind(this, this.refresh));
    this.mixer_control.connect('stream-added', Lang.bind(this, this.refresh));
    this.mixer_control.connect('stream-removed', Lang.bind(this, this.refresh));
    this.stream = this.mixer_control.get_default_source();
  },

  // ...

  get level() {
    return 100 * this.stream.get_volume() / this.mixer_control.get_vol_max_norm();
  }
});

function enable() {
  // ...
  microphone = new Microphone();
  let panel_button_label = new St.Label({
    y_expand: true,
    y_align: Clutter.ActorAlign.CENTER
  });
  panel_button_label.text = microphone.level + '%';
  Main.panel._rightBox.insert_child_at_index(panel_button_label, 0);
}

function disable() {
  // ...
  Main.panel._rightBox.remove_child(panel_button_label);
  panel_button_label.destroy();
  panel_button_label = null;
}

但是,我不知道如何在每次通过全局快捷方式更新麦克风级别时更新microphone.label标签文本。截至目前,它始终显示 0%。我检查了 journalctl 中的日志,没有警告或错误。

我在 上找到了 Whosebug link,但是,我不希望它被 link 编辑到特定的键盘事件。相反,即使通过其他方式更改了麦克风级别,标签也应该更新。

我想我需要将其连接到信号或使用类似的东西,但是,我不知道如何操作。我是 gnome 扩展的新手,所以详细的解释可能会有所帮助。

您可能想连接到 notify signal of Gvc.MixerStream for the volume 属性:

stream.connect('notify::volume', (stream) => {
  log(`New volume is ${stream.volume}`);
});

如果需要,您可以将其添加到包装器 class 中,也许可以将其设为 GObject subclass