Bluetooth Audio Plugin
======================

The audio plugin happen to be in a different socket but all the rules for
HAL socket apply here as well, the abstract socket name is
"\0bluez_audio_socket" (tentative):

	.---Audio---.                             .--Android--.
	|  Plugin   |                             |   Daemon  |
	|           |          Command            |           |
	|           | --------------------------> |           |
	|           |                             |           |
	|           | <-------------------------- |           |
	|           |          Response           |           |
	|           |                             |           |
	|           |                             |           |
	|           |                             |           |
	'-----------'                             '-----------'


	Audio HAL                               Daemon
	----------------------------------------------------

	call dev->open()                    --> command 0x01
	return dev->open()                  <-- response 0x01

	call dev->open_output_stream()      --> command 0x03
	return dev->open_output_stream()    <-- response 0x03

	call stream->write()                --> command 0x05
	return stream->write()              <-- response 0x05

	call stream->common.standby()       --> command 0x06
	return stream->common.standby()     <-- response 0x06

	call dev->close_output_stream()     --> command 0x04
	return dev->close_output_stream()   <-- response 0x04

	call dev->close()                   --> command 0x02
	return dev->close()                 <-- response 0x02

Audio Service (ID 0)
====================

	Opcode 0x00 - Error response

		Response parameters: Status (1 octet)

	Opcode 0x01 - Open Audio Endpoint commmand

		Command parameters: Service UUID (16 octets)
				    Codec ID (1 octet)
				    Number of codec presets (1 octet)
				    Codec capabilities length (1 octet)
				    Codec capabilities (variable)
				    Codec preset # length (1 octet)
				    Codec preset # configuration (variable)
				    ...
		Response parameters: Endpoint ID (1 octet)

	Opcode 0x02 - Close Audio Endpoint command

		Command parameters: Endpoint ID (1 octet)
		Response parameters: <none>

	Opcode 0x03 - Open Stream command

		Command parameters: Endpoint ID (1 octet)
		Response parameters: Outgoing MTU (2 octets)
				     Codec configuration length (1 octet)
				     Codec configuration (1 octet)
				     File descriptor (inline)

	Opcode 0x04 - Close Stream command

		Command parameters: Endpoint ID (1 octet)
		Response parameters: <none>

	Opcode 0x05 - Resume Stream command

		Command parameters: Endpoint ID (1 octet)
		Response parameters: <none>

	Opcode 0x06 - Suspend Stream command

		Command parameters: Endpoint ID (1 octet)
		Response parameters: <none>
