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 SetInputGain(int32 gain)

			Sets the capture gain of the system. Gain is specified
			in dBFS * 100.  For example 5dB of gain would be
			specified with an argument of 500, while -10 would be
			specified with -1000, and 11.5 maps to 1150.

		void SetInputNodeGain(uint64 node_id, int32 gain)

			Sets the capture gain of the node. Gain is specified
			in dBFS * 100.  For example 5dB of gain would be
			specified with an argument of 500, while -10 would be
			specified with -1000, and 11.5 maps to 1150.

		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.
				string MicPositions
					The string formed by floating numbers
					describing the position of mic array.
				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 'dummy' streams that are not actually outputting any
			audio. Returns 0 if there are no active streams, or all active
			streams are 'dummy' 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.
