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):

	.--Android--.                             .---Audio---.
	|  daemon   |                             |   Plugin  |
	|           |          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_in->read()              --> command 0x05
	return stream_in->read()            <-- response 0x05

	call stream_in->common.standby()    --> command 0x06
	return  stream_in->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

Identifier: "audio" (BT_AUDIO_ID)

	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)
				    Codec capabilities length (1 octet)
				    Codec capabilities (variable)
				    Number of codec presets (1 octet)
				    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: 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>
