910e62b5创建于 1月15日历史提交
// Copyright 2025 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

// Type of stream an audio device provides.
enum StreamType {
  "INPUT",
  "OUTPUT"
};

// Available audio device types.
enum DeviceType {
  "HEADPHONE",
  "MIC",
  "USB",
  "BLUETOOTH",
  "HDMI",
  "INTERNAL_SPEAKER",
  "INTERNAL_MIC",
  "FRONT_MIC",
  "REAR_MIC",
  "KEYBOARD_MIC",
  "HOTWORD",
  "LINEOUT",
  "POST_MIX_LOOPBACK",
  "POST_DSP_LOOPBACK",
  "ALSA_LOOPBACK",
  "OTHER"
};

dictionary AudioDeviceInfo {
  // The unique identifier of the audio device.
  required DOMString id;
  // Stream type associated with this device.
  required StreamType streamType;
  // Type of the device.
  required DeviceType deviceType;
  // The user-friendly name (e.g. "USB Microphone").
  required DOMString displayName;
  // Device name.
  required DOMString deviceName;
  // True if this is the current active device.
  required boolean isActive;
  // The sound level of the device, volume for output, gain for input.
  required long level;
  // The stable/persisted device id string when available.
  DOMString stableDeviceId;
};

dictionary DeviceFilter {
  // If set, only audio devices whose stream type is included in this list
  // will satisfy the filter.
  sequence<StreamType> streamTypes;

  // If set, only audio devices whose active state matches this value will
  // satisfy the filter.
  boolean isActive;
};

dictionary DeviceProperties {
  // <p>
  //   The audio device's desired sound level. Defaults to the device's
  //   current sound level.
  // </p>
  // <p>If used with audio input device, represents audio device gain.</p>
  // <p>If used with audio output device, represents audio device volume.</p>
  long level;
};

dictionary DeviceIdLists {
  // <p>List of input devices specified by their ID.</p>
  // <p>To indicate input devices should be unaffected, leave this property
  //   unset.</p>
  sequence<DOMString> input;

  // <p>List of output devices specified by their ID.</p>
  // <p>To indicate output devices should be unaffected, leave this property
  //   unset.</p>
  sequence<DOMString> output;
};

dictionary MuteChangedEvent {
  // The type of the stream for which the mute value changed. The updated mute
  // value applies to all devices with this stream type.
  required StreamType streamType;

  // Whether or not the stream is now muted.
  required boolean isMuted;
};

dictionary LevelChangedEvent {
  // ID of device whose sound level has changed.
  required DOMString deviceId;

  // The device's new sound level.
  required long level;
};

callback OnLevelChangedListener = undefined(LevelChangedEvent event);

interface OnLevelChangedEvent : ExtensionEvent {
  static undefined addListener(OnLevelChangedListener listener);
  static undefined removeListener(OnLevelChangedListener listener);
  static boolean hasListener(OnLevelChangedListener listener);
};

callback OnMuteChangedListener = undefined(MuteChangedEvent event);

interface OnMuteChangedEvent : ExtensionEvent {
  static undefined addListener(OnMuteChangedListener listener);
  static undefined removeListener(OnMuteChangedListener listener);
  static boolean hasListener(OnMuteChangedListener listener);
};

// |devices|: List of all present audio devices after the change.
callback OnDeviceListChangedListener = undefined(sequence<AudioDeviceInfo> devices);

interface OnDeviceListChangedEvent : ExtensionEvent {
  static undefined addListener(OnDeviceListChangedListener listener);
  static undefined removeListener(OnDeviceListChangedListener listener);
  static boolean hasListener(OnDeviceListChangedListener listener);
};

// The <code>chrome.audio</code> API is provided to allow users to
// get information about and control the audio devices attached to the
// system.
// This API is currently only available in kiosk mode for ChromeOS.
interface Audio {
  // Gets a list of audio devices filtered based on |filter|.
  // |filter|: Device properties by which to filter the list of returned
  //     audio devices. If the filter is not set or set to <code>{}</code>,
  //     returned device list will contain all available audio devices.
  // |Returns|: Reports the requested list of audio devices.
  // |PromiseValue|: devices
  [requiredCallback] static Promise<sequence<AudioDeviceInfo>> getDevices(
      optional DeviceFilter filter);

  // Sets lists of active input and/or output devices.
  // |ids|: <p>Specifies IDs of devices that should be active. If either the
  //     input or output list is not set, devices in that category are
  //     unaffected.
  //     </p>
  //     <p>It is an error to pass in a non-existent device ID.</p>
  [requiredCallback] static Promise<undefined> setActiveDevices(
      DeviceIdLists ids);

  // Sets the properties for the input or output device.
  [requiredCallback] static Promise<undefined> setProperties(
      DOMString id,
      DeviceProperties properties);

  // Gets the system-wide mute state for the specified stream type.
  // |streamType|: Stream type for which mute state should be fetched.
  // |Returns|: Callback reporting whether mute is set or not for specified
  // stream type.
  // |PromiseValue|: value
  [requiredCallback] static Promise<boolean> getMute(StreamType streamType);

  // Sets mute state for a stream type. The mute state will apply to all audio
  // devices with the specified audio stream type.
  // |streamType|: Stream type for which mute state should be set.
  // |isMuted|: New mute value.
  static Promise<undefined> setMute(
      StreamType streamType,
      boolean isMuted);

  // Fired when sound level changes for an active audio device.
  static attribute OnLevelChangedEvent onLevelChanged;

  // Fired when the mute state of the audio input or output changes.
  // Note that mute state is system-wide and the new value applies to every
  // audio device with specified stream type.
  static attribute OnMuteChangedEvent onMuteChanged;

  // Fired when audio devices change, either new devices being added, or
  // existing devices being removed.
  static attribute OnDeviceListChangedEvent onDeviceListChanged;
};

partial interface Browser {
  static attribute Audio audio;
};