/* This Source Code Form is subject to the terms of the Mozilla Public
 * License, v. 2.0. If a copy of the MPL was not distributed with this
 * file, You can obtain one at http://mozilla.org/MPL/2.0/. */

#include "nsISupports.idl"

[scriptable, builtinclass, uuid(df31c280-1ef1-11e5-867f-0800200c9a66)]
interface nsIAudioManager : nsISupports
{
  /**
   * Microphone muted?
   */
  attribute boolean microphoneMuted;

  /**
   * Are we playing audio from the FM radio?
   */
  attribute boolean fmRadioAudioEnabled;

  /**
   * Set the phone's audio mode.
   */
  const long PHONE_STATE_INVALID          = -2;
  const long PHONE_STATE_CURRENT          = -1;
  const long PHONE_STATE_NORMAL           = 0;
  const long PHONE_STATE_RINGTONE         = 1;
  const long PHONE_STATE_IN_CALL          = 2;
  const long PHONE_STATE_IN_COMMUNICATION = 3;

  attribute long phoneState;

  /**
   * Configure a particular device ("force") to be used for one of the uses
   * (communication, media playback, etc.)
   */
  const long FORCE_NONE            = 0; // the default
  const long FORCE_SPEAKER         = 1;
  const long FORCE_HEADPHONES      = 2;
  const long FORCE_BT_SCO          = 3;
  const long FORCE_BT_A2DP         = 4;
  const long FORCE_WIRED_ACCESSORY = 5;
  const long FORCE_BT_CAR_DOCK     = 6;
  const long FORCE_BT_DESK_DOCK    = 7;
  const long FORCE_ANALOG_DOCK     = 8;
  const long FORCE_DIGITAL_DOCK    = 9;
  const long FORCE_NO_BT_A2DP      = 10;
  const long USE_COMMUNICATION     = 0;
  const long USE_MEDIA             = 1;
  const long USE_RECORD            = 2;
  const long USE_DOCK              = 3;

  void setForceForUse(in long usage, in long force);
  long getForceForUse(in long usage);

  /**
   * These functions would be used when we enable the new volume control API
   * (mozAudioChannelManager). The range of volume index is from 0 to N.
   * More details on : https://gist.github.com/evanxd/41d8e2d91c5201a42bfa
   */
  void setAudioChannelVolume(in unsigned long channel, in unsigned long index);
  unsigned long getAudioChannelVolume(in unsigned long channel);
  unsigned long getMaxAudioChannelVolume(in unsigned long channel);
};
