diff options
Diffstat (limited to 'audio/ipc.h')
| -rw-r--r-- | audio/ipc.h | 308 | 
1 files changed, 308 insertions, 0 deletions
diff --git a/audio/ipc.h b/audio/ipc.h new file mode 100644 index 00000000..c900fcd1 --- /dev/null +++ b/audio/ipc.h @@ -0,0 +1,308 @@ +/* + * + *  BlueZ - Bluetooth protocol stack for Linux + * + *  Copyright (C) 2004-2008  Marcel Holtmann <marcel@holtmann.org> + * + *  This library is free software; you can redistribute it and/or + *  modify it under the terms of the GNU Lesser General Public + *  License as published by the Free Software Foundation; either + *  version 2.1 of the License, or (at your option) any later version. + * + *  This library is distributed in the hope that it will be useful, + *  but WITHOUT ANY WARRANTY; without even the implied warranty of + *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU + *  Lesser General Public License for more details. + * + *  You should have received a copy of the GNU Lesser General Public + *  License along with this library; if not, write to the Free Software + *  Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA + * + */ + +/* +  Message sequence chart of streaming sequence for A2DP transport + +  Audio daemon                       User +                             on snd_pcm_open +                 <--BT_GETCAPABILITIES_REQ + +  BT_GETCAPABILITIES_RSP--> + +                        on snd_pcm_hw_params +                <--BT_SETCONFIGURATION_REQ + +  BT_SETCONFIGURATION_RSP--> + +			on snd_pcm_prepare +                <--BT_STREAMSTART_REQ + +  <Moves to streaming state> +  BT_STREAMSTART_RSP--> + +  BT_STREAMFD_IND --> + +                          <  streams data > +                             .......... + +               on snd_pcm_drop/snd_pcm_drain + +                <--BT_STREAMSTOP_REQ + +  <Moves to open state> +  BT_STREAMSTOP_RSP--> + +			on IPC close or appl crash +  <Moves to idle> + + */ + +#ifndef BT_AUDIOCLIENT_H +#define BT_AUDIOCLIENT_H + +#ifdef __cplusplus +extern "C" { +#endif + +#include <stdint.h> +#include <stdio.h> +#include <unistd.h> +#include <sys/socket.h> +#include <sys/un.h> +#include <errno.h> + +#define BT_AUDIO_IPC_PACKET_SIZE   128 +#define BT_IPC_SOCKET_NAME "\0/org/bluez/audio" + +/* Generic message header definition, except for RSP messages */ +typedef struct { +	uint8_t msg_type; +} __attribute__ ((packed)) bt_audio_msg_header_t; + +/* Generic message header definition, for all RSP messages */ +typedef struct { +	bt_audio_msg_header_t	msg_h; +	uint8_t			posix_errno; +} __attribute__ ((packed)) bt_audio_rsp_msg_header_t; + +/* Messages list */ +#define BT_GETCAPABILITIES_REQ		0 +#define BT_GETCAPABILITIES_RSP		1 + +#define BT_SETCONFIGURATION_REQ		2 +#define BT_SETCONFIGURATION_RSP		3 + +#define BT_STREAMSTART_REQ		4 +#define BT_STREAMSTART_RSP		5 + +#define BT_STREAMSTOP_REQ		6 +#define BT_STREAMSTOP_RSP		7 + +#define BT_STREAMSUSPEND_IND		8 +#define BT_STREAMRESUME_IND		9 + +#define BT_CONTROL_REQ		       10 +#define BT_CONTROL_RSP		       11 +#define BT_CONTROL_IND		       12 + +#define BT_STREAMFD_IND		       13 + +/* BT_GETCAPABILITIES_REQ */ + +#define BT_CAPABILITIES_TRANSPORT_A2DP	0 +#define BT_CAPABILITIES_TRANSPORT_SCO	1 +#define BT_CAPABILITIES_TRANSPORT_ANY	2 + +#define BT_CAPABILITIES_ACCESS_MODE_READ	1 +#define BT_CAPABILITIES_ACCESS_MODE_WRITE	2 +#define BT_CAPABILITIES_ACCESS_MODE_READWRITE	3 + +#define BT_FLAG_AUTOCONNECT	1 + +struct bt_getcapabilities_req { +	bt_audio_msg_header_t	h; +	char			device[18];	/* Address of the remote Device */ +	uint8_t			transport;	/* Requested transport */ +	uint8_t			flags;		/* Requested flags */ +} __attribute__ ((packed)); + +/* BT_GETCAPABILITIES_RSP */ + +/** + * SBC Codec parameters as per A2DP profile 1.0 ยง 4.3 + */ + +#define BT_SBC_SAMPLING_FREQ_16000		(1 << 3) +#define BT_SBC_SAMPLING_FREQ_32000		(1 << 2) +#define BT_SBC_SAMPLING_FREQ_44100		(1 << 1) +#define BT_SBC_SAMPLING_FREQ_48000		1 + +#define BT_A2DP_CHANNEL_MODE_MONO		(1 << 3) +#define BT_A2DP_CHANNEL_MODE_DUAL_CHANNEL	(1 << 2) +#define BT_A2DP_CHANNEL_MODE_STEREO		(1 << 1) +#define BT_A2DP_CHANNEL_MODE_JOINT_STEREO	1 + +#define BT_A2DP_BLOCK_LENGTH_4			(1 << 3) +#define BT_A2DP_BLOCK_LENGTH_8			(1 << 2) +#define BT_A2DP_BLOCK_LENGTH_12			(1 << 1) +#define BT_A2DP_BLOCK_LENGTH_16			1 + +#define BT_A2DP_SUBBANDS_4			(1 << 1) +#define BT_A2DP_SUBBANDS_8			1 + +#define BT_A2DP_ALLOCATION_SNR			(1 << 1) +#define BT_A2DP_ALLOCATION_LOUDNESS		1 + +#define BT_MPEG_SAMPLING_FREQ_16000		(1 << 5) +#define BT_MPEG_SAMPLING_FREQ_22050		(1 << 4) +#define BT_MPEG_SAMPLING_FREQ_24000		(1 << 3) +#define BT_MPEG_SAMPLING_FREQ_32000		(1 << 2) +#define BT_MPEG_SAMPLING_FREQ_44100		(1 << 1) +#define BT_MPEG_SAMPLING_FREQ_48000		1 + +#define BT_MPEG_LAYER_1				(1 << 2) +#define BT_MPEG_LAYER_2				(1 << 1) +#define BT_MPEG_LAYER_3				1 + +typedef struct { +	uint8_t channel_mode; +	uint8_t frequency; +	uint8_t allocation_method; +	uint8_t subbands; +	uint8_t block_length; +	uint8_t min_bitpool; +	uint8_t max_bitpool; +} __attribute__ ((packed)) sbc_capabilities_t; + +typedef struct { +	uint8_t channel_mode; +	uint8_t crc; +	uint8_t layer; +	uint8_t frequency; +	uint8_t mpf; +	uint16_t bitrate; +} __attribute__ ((packed)) mpeg_capabilities_t; + +struct bt_getcapabilities_rsp { +	bt_audio_rsp_msg_header_t	rsp_h; +	uint8_t				transport;	   /* Granted transport */ +	sbc_capabilities_t		sbc_capabilities;  /* A2DP only */ +	mpeg_capabilities_t		mpeg_capabilities; /* A2DP only */ +	uint16_t			sampling_rate;	   /* SCO only */ +} __attribute__ ((packed)); + +/* BT_SETCONFIGURATION_REQ */ +struct bt_setconfiguration_req { +	bt_audio_msg_header_t	h; +	char			device[18];		/* Address of the remote Device */ +	uint8_t			transport;		/* Requested transport */ +	uint8_t			access_mode;		/* Requested access mode */ +	sbc_capabilities_t	sbc_capabilities;	/* A2DP only - only one of this field +							and next one must be filled */ +	mpeg_capabilities_t	mpeg_capabilities;	/* A2DP only */ +} __attribute__ ((packed)); + +/* BT_SETCONFIGURATION_RSP */ +struct bt_setconfiguration_rsp { +	bt_audio_rsp_msg_header_t	rsp_h; +	uint8_t				transport;	/* Granted transport */ +	uint8_t				access_mode;	/* Granted access mode */ +	uint16_t			link_mtu;	/* Max length that transport supports */ +} __attribute__ ((packed)); + +/* BT_STREAMSTART_REQ */ +#define BT_STREAM_ACCESS_READ		0 +#define BT_STREAM_ACCESS_WRITE		1 +#define BT_STREAM_ACCESS_READWRITE	2 +struct bt_streamstart_req { +	bt_audio_msg_header_t	h; +} __attribute__ ((packed)); + +/* BT_STREAMSTART_RSP */ +struct bt_streamstart_rsp { +	bt_audio_rsp_msg_header_t	rsp_h; +} __attribute__ ((packed)); + +/* BT_STREAMFD_IND */ +/* This message is followed by one byte of data containing the stream data fd +   as ancilliary data */ +struct bt_streamfd_ind { +	bt_audio_msg_header_t	h; +} __attribute__ ((packed)); + +/* BT_STREAMSTOP_REQ */ +struct bt_streamstop_req { +	bt_audio_msg_header_t	h; +} __attribute__ ((packed)); + +/* BT_STREAMSTOP_RSP */ +struct bt_streamstop_rsp { +	bt_audio_rsp_msg_header_t	rsp_h; +} __attribute__ ((packed)); + +/* BT_STREAMSUSPEND_IND */ +struct bt_streamsuspend_ind { +	bt_audio_msg_header_t	h; +} __attribute__ ((packed)); + +/* BT_STREAMRESUME_IND */ +struct bt_streamresume_ind { +	bt_audio_msg_header_t	h; +} __attribute__ ((packed)); + +/* BT_CONTROL_REQ */ + +#define BT_CONTROL_KEY_POWER			0x40 +#define BT_CONTROL_KEY_VOL_UP			0x41 +#define BT_CONTROL_KEY_VOL_DOWN			0x42 +#define BT_CONTROL_KEY_MUTE			0x43 +#define BT_CONTROL_KEY_PLAY			0x44 +#define BT_CONTROL_KEY_STOP			0x45 +#define BT_CONTROL_KEY_PAUSE			0x46 +#define BT_CONTROL_KEY_RECORD			0x47 +#define BT_CONTROL_KEY_REWIND			0x48 +#define BT_CONTROL_KEY_FAST_FORWARD		0x49 +#define BT_CONTROL_KEY_EJECT			0x4A +#define BT_CONTROL_KEY_FORWARD			0x4B +#define BT_CONTROL_KEY_BACKWARD			0x4C + +struct bt_control_req { +	bt_audio_msg_header_t	h; +	uint8_t			mode;		/* Control Mode */ +	uint8_t			key;		/* Control Key */ +} __attribute__ ((packed)); + +/* BT_CONTROL_RSP */ +struct bt_control_rsp { +	bt_audio_rsp_msg_header_t	rsp_h; +	uint8_t				mode;	/* Control Mode */ +	uint8_t				key;	/* Control Key */ +} __attribute__ ((packed)); + +/* BT_CONTROL_IND */ +struct bt_control_ind { +	bt_audio_msg_header_t	h; +	uint8_t			mode;		/* Control Mode */ +	uint8_t			key;		/* Control Key */ +} __attribute__ ((packed)); + +/* Function declaration */ + +/* Opens a connection to the audio service: return a socket descriptor */ +int bt_audio_service_open(); + +/* Closes a connection to the audio service */ +int bt_audio_service_close(int sk); + +/* Receives stream data file descriptor : must be called after a +BT_STREAMFD_IND message is returned */ +int bt_audio_service_get_data_fd(int sk); + +/* Human readable message type string */ +const char *bt_audio_strmsg(int type); + +#ifdef __cplusplus +} +#endif + +#endif /* BT_AUDIOCLIENT_H */  | 
