CRAS dbus methods and signals.
==============================

Service		org.chromium.cras
Interface	org.chromium.cras.Control
Object Path	/org/chromium/cras

Methods		void SetOutputVolume(int32 volume)

			Sets the volume of the system.  Volume ranges from
			0 to 100, and will be translated to dB based on the
			output-specific volume curve.

		void SetOutputNodeVolume(uint64 node_id, int32 volume)

			Sets the volume of the given node.  Volume ranges from
			0 to 100, and will be translated to dB based on the
			output-specific volume curve.

		void SwapLeftRight(uint64 node_id, boolean swap)

			Swap the left and right channel of the given node.
			Message will be dropped if this feature is not supported.

		void SetOutputMute(boolean mute_on)

			Sets the system output mute.

		void SetOutputUserMute(boolean mute_on)

			Sets the system output mute from user action.

		void SetInputNodeGain(uint64 node_id, int32 gain)

			Sets the capture gain of the node. gain is a 0-100
			integer which linearly maps [0, 50] to range [-40dB, 0dB]
			and [50, 100] to [0dB, 20dB],
			Default gain value is 50, which is 0dB.

		void SetInputMute(boolean mute_on)

			Sets the capture mute state of the system.  Recordings
			will be muted when this is set.

		void GetVolumeState()

			Returns the volume and capture gain as follows:
				int32 output_volume (0-100)
				boolean output_mute
				int32 input_gain (in dBFS * 100)
				boolean input_mute
				boolean output_user_mute

		void GetDefaultOutputBufferSize()

			Returns the default output buffer size in frames.

		{dict},{dict},... GetNodes()

			Returns information about nodes. A node can be either
			output or input but not both. An output node is
			something like a speaker or a headphone, and an input
			node is like a microphone.  The return value is a
			sequence of dicts mapping from strings to variants
			(e.g. signature "a{sv}a{sv}" for two nodes).  Each dict
			contains information about a node.

			Each dict contains the following properties:
				boolean IsInput
					false for output nodes, true for input
					nodes.
				uint64 Id
					The id of this node. It is unique among
					all nodes including both output and
					input nodes.
				string Type
				        The type of this node. It can be one of
				        following values:
					/* for output nodes. */
					"INTERNAL_SPEAKER","HEADPHONE", "HDMI",
					/* for input nodes. */
					"INTERNAL_MIC", "MIC",
					/* for both output and input nodes. */
					"USB", "BLUETOOTH", "UNKNOWN",
				string Name
					The name of this node. For example,
					"Speaker" or "Internal Mic".
				string DeviceName
					The name of the device that this node
					belongs to. For example,
					"HDA Intel PCH: CA0132 Analog:0,0" or
					"Creative SB Arena Headset".
				uint64 StableDeviceId
					The stable ID does not change due to
					device plug/unplug or reboot.
				uint64 StableDeviceIdNew
					The new stable ID. Keeping both stable
					ID and stable ID new is for backward
					compatibility.
				boolean Active
					Whether this node is currently used
					for output/input. There is one active
					node for output and one active node for
					input.
				uint64 PluggedTime
					The time that this device was plugged
					in. This value is in microseconds.
				unit64 NodeVolume
					The node volume indexed from 0 to 100.
				unit64 NodeCaptureGain
					The capture gain of node in dBFS * 100.
				string HotwordModels
					A string of comma-separated hotword
					language model locales supported by this
					node. e.g. "en_au,en_gb,en_us"
					The string is empty if the node type is
					not HOTWORD.

		void GetSystemAecSupported();

			Returns 1 if system echo cancellation is supported,
			otherwise return 0.

		void SetActiveOutputNode(uint64 node_id);

			Requests the specified node to be used for
			output. If node_id is 0 (which is not a valid
			node id), cras will choose the active node
			automatically.

		void SetActiveInputNode(uint64 node_id);

			Requests the specified node to be used for
			input. If node_id is 0 (which is not a valid
			node id), cras will choose the active node
			automatically.

		int32 GetNumberOfActiveStreams()

			Returns the number of streams currently being
			played or recorded.

		int32 GetNumberOfActiveInputStreams()

			Returns the number of streams currently using input hardware.

		int32 GetNumberOfActiveOutputStreams()

			Returns the number of streams currently using output hardware.

		int32 IsAudioOutputActive()

			Returns 1 if there are currently any active output streams,
			excluding 'fake' streams that are not actually outputting any
			audio. Returns 0 if there are no active streams, or all active
			streams are 'fake' streams.

		void SetGlobalOutputChannelRemix(int32 num_channels,
						 array:double coefficient)

			Sets the conversion matrix for global output channel
			remixing. The coefficient array represents an N * N
			conversion matrix M, where N is num_channels, with
			M[i][j] = coefficient[i * N + j].
			The remix is done by multiplying the conversion matrix
			to each N-channel PCM data, i.e M * [L, R] = [L', R']
			For example, coefficient [0.1, 0.9, 0.4, 0.6] will
			result in:
			L' = 0.1 * L + 0.9 * R
			R' = 0.4 * L + 0.6 * R

		int32 SetHotwordModel(uint64_t node_id, string model_name)

			Set the hotword language model on the specified node.
			The node must have type HOTWORD and the model_name must
			be one of the supported locales returned by
			GetNodes() HotwordModels string.
			Returns 0 on success, or a negative errno on failure.

Signals		OutputVolumeChanged(int32 volume)

			Indicates that the output volume level has changed.

		OutputMuteChanged(boolean muted, boolean user_muted)

			Indicates that the output mute state has changed.  muted
			is true if the system is muted by a system process, such
			as suspend or device switch.  user_muted is set if the
			system has been muted by user action such as the mute
			key.

		InputGainChanged(int32 gain)

			Indicates what the system capture gain is now. gain
			expressed in dBFS*100.

		InputMuteChanged(boolean muted)

			Indicates that the input mute state has changed.

		NodesChanged()

			Indicates that nodes are added/removed.

		ActiveOutputNodeChanged(uint64 node_id)

			Indicates that the active output node has changed.

		ActiveInputNodeChanged(uint64 node_id)

			Indicates that the active input node has changed.

		OutputNodeVolumeChanged(uint64 node_id, int32 volume)

			Indicates the volume of the given node.

		NodeLeftRightSwappedChanged(uint64 node_id, boolean swapped)

			Indicates the left and right channel swapping state of the
			given node.

		InputNodeGainChanged(uint64 node_id, int32 gain)

			Indicates that the capture gain for the node is now gain
			expressed in dBFS*100.

		NumberOfActiveStreamsChanged(int32 num_active_streams)

			Indicates the number of active streams has changed.

		AudioOutputActiveStateChanged(boolean active)

			Indicates active output state has changed.
			See IsAudioOutputActive for details.

		HotwordTriggered(int64 tv_sec, int64 tv_nsec)

			Indicates that hotword was triggered at the given timestamp.
