All of lore.kernel.org
 help / color / mirror / Atom feed
From: Denis Kenzior <denkenz@gmail.com>
To: ofono@ofono.org
Subject: Re: [PATCH v4 8/9] handsfree-audio: mSBC support
Date: Mon, 01 Apr 2013 11:29:55 -0500	[thread overview]
Message-ID: <5159B603.1080009@gmail.com> (raw)
In-Reply-To: <1364231795-13787-9-git-send-email-frederic.dalleau@linux.intel.com>

[-- Attachment #1: Type: text/plain, Size: 23491 bytes --]

Hi Fred,

On 03/25/2013 12:16 PM, Frédéric Dalleau wrote:
> ---
>   tools/handsfree-audio.c |  513 ++++++++++++++++++++++++++++++++++++-----------
>   1 file changed, 396 insertions(+), 117 deletions(-)

You need to break this patch up some more and structure it a bit more 
logically.  For example, I would start with the hfp_thread driver 
changes and how they affect the read / write logic.  Then I would add 
CVSD parts, mSBC parts, etc.

>
> diff --git a/tools/handsfree-audio.c b/tools/handsfree-audio.c
> index 9a4f85b..e8725b7 100644
> --- a/tools/handsfree-audio.c
> +++ b/tools/handsfree-audio.c
> @@ -40,6 +40,7 @@
>   #include<pthread.h>
>   #include<bluetooth/bluetooth.h>
>   #include<bluetooth/sco.h>
> +#include<sbc/sbc.h>
>
>   #define OFONO_SERVICE			"org.ofono"
>   #define HFP_AUDIO_MANAGER_PATH		"/"
> @@ -65,11 +66,50 @@ static gboolean option_server = FALSE;
>   static gboolean option_defer = FALSE;
>   static gchar *option_client_addr = NULL;
>
> -struct hfp_audio_thread {
> -	unsigned char codec;
> +static const char sntable[4] = { 0x08, 0x38, 0xC8, 0xF8 };
> +static const int audio_rates[3] = { 0, 8000, 16000 };
> +
> +struct msbc_parser {
> +	int len;
> +	uint8_t buffer[60];
> +};
> +
> +struct msbc_codec {
> +	sbc_t sbcenc; /* Coder data */
> +	char *ebuffer; /* Codec transfer buffer */
> +	size_t ebuffer_size; /* Size of the buffer */
> +	size_t ebuffer_start; /* start of encoding data */
> +	size_t ebuffer_end; /* end of encoding data */
> +
> +	struct msbc_parser parser; /* mSBC parser for concatenating frames */
> +	sbc_t sbcdec; /* Decoder data */
> +
> +	size_t msbc_frame_size;
> +	size_t decoded_frame_size;
> +};
> +
> +struct hfp_thread {
>   	int fd;
>   	int running;
>   	pthread_t thread;
> +	GSList *outq;
> +
> +	int rate;
> +	char *capture_buffer;
> +	int capture_size;
> +	int captured;
> +	int mtu;
> +	int (*init)(struct hfp_thread *);
> +	int (*free)(struct hfp_thread *);
> +	int (*encode)(struct hfp_thread *, char *data, int len);
> +	int (*decode)(struct hfp_thread *, char *data, int len, char *out,
> +								int outlen);
> +	struct msbc_codec msbc;
> +};
> +
> +struct hack_sco_options {
> +	uint16_t mtu;
> +	uint16_t voice_setting;
>   };
>
>   static int btstr2ba(const char *str, bdaddr_t *ba)
> @@ -82,21 +122,232 @@ static int btstr2ba(const char *str, bdaddr_t *ba)
>   	return 0;
>   }
>
> -static snd_pcm_t *hfp_audio_pcm_init(snd_pcm_stream_t stream)
> +static void msbc_parser_reset(struct msbc_parser *p)
> +{
> +	p->len = 0;
> +}
> +
> +static int msbc_state_machine(struct msbc_parser *p, uint8_t byte)
> +{
> +	switch (p->len) {
> +	case 0:
> +		if (byte == 0x01)
> +			goto copy;
> +		return 0;
> +	case 1:
> +		if (byte == 0x08 || byte == 0x38 || byte == 0xC8
> +				|| byte == 0xF8)
> +			goto copy;
> +		break;
> +	case 2:
> +		if (byte == 0xAD)
> +			goto copy;
> +		break;
> +	case 3:
> +		if (byte == 0x00)
> +			goto copy;
> +		break;
> +	case 4:
> +		if (byte == 0x00)
> +			goto copy;
> +		break;
> +	default:
> +		goto copy;
> +	}
> +
> +	p->len = 0;
> +	return 0;
> +
> +copy:
> +	p->buffer[p->len] = byte;
> +	p->len++;
> +
> +	return p->len;
> +}
> +
> +static size_t msbc_parse(sbc_t *sbcdec, struct msbc_parser *p, char *data,
> +		int len, char *out, int outlen, int *bytes)
> +{
> +	size_t totalwritten = 0;
> +	size_t written = 0;
> +	int i;
> +	*bytes = 0;
> +
> +	for (i = 0; i<  len; i++) {
> +		if (msbc_state_machine(p, data[i]) == 60) {
> +			int decoded;
> +			decoded = sbc_decode(sbcdec, p->buffer + 2,
> +					p->len - 2 - 1, out, outlen,&written);
> +			if (decoded>  0) {
> +				totalwritten += written;
> +				*bytes += decoded;
> +			} else {
> +				DBG("Error while decoding: %d", decoded);
> +			}
> +			msbc_parser_reset(p);
> +		}
> +	}
> +	return totalwritten;
> +}
> +
> +static int hfp_audio_cvsd_init(struct hfp_thread *thread)
> +{
> +	thread->rate = 8000;
> +	thread->capture_size = 48;
> +	return 0;
> +}
> +
> +static int hfp_audio_cvsd_free(struct hfp_thread *thread)
> +{
> +	return 0;
> +}
> +
> +static int hfp_audio_cvsd_encode(struct hfp_thread *thread, char *data,
> +						int len)
> +{
> +	char *qbuf;
> +
> +	if (len>  thread->mtu) {
> +		DBG("Mtu too small: len %d, mtu %d", len, thread->mtu);
> +		return -EINVAL;
> +	}
> +
> +	qbuf = g_try_malloc(thread->mtu);
> +	if (!qbuf)
> +		return -ENOMEM;
> +
> +	memcpy(qbuf, data, len);
> +
> +	thread->outq = g_slist_insert(thread->outq, qbuf, -1);
> +
> +	return len;
> +}
> +
> +static int hfp_audio_cvsd_decode(struct hfp_thread *thread, char *data,
> +						int len, char *out, int outlen)
> +{
> +	int size = (len<  outlen) ? len : outlen;
> +	memcpy(out, data, size);
> +	return size;
> +}
> +
> +/* Run from IO thread */
> +static int hfp_audio_msbc_init(struct hfp_thread *thread)
> +{
> +	struct msbc_codec *codec =&thread->msbc;
> +	struct hack_sco_options opts;
> +
> +	thread->rate = 16000;
> +	thread->capture_size = 240; /* decoded mSBC frame */
> +
> +	memset(&opts, 0, sizeof(opts));
> +	opts.voice_setting = 0X0003;
> +	if (setsockopt(thread->fd, SOL_SCO, SCO_OPTIONS,&opts, sizeof(opts))
> +			<  0) {
> +		DBG("Can't set transparent mode: %s (%d)",
> +				strerror(errno), errno);
> +		return -ENOTSUP;
> +	}
> +
> +	sbc_init_msbc(&codec->sbcenc, 0);
> +	sbc_init_msbc(&codec->sbcdec, 0);
> +
> +	codec->msbc_frame_size = 2 + sbc_get_frame_length(&codec->sbcenc) + 1;
> +	codec->decoded_frame_size = sbc_get_codesize(&codec->sbcenc);
> +	msbc_parser_reset(&codec->parser);
> +
> +	/* 5 * 48 == 10 * 24 == 4 * 60 */
> +	codec->ebuffer_size = codec->msbc_frame_size * 4;
> +	codec->ebuffer = g_try_malloc(codec->ebuffer_size);
> +	codec->ebuffer_start = 0;
> +	codec->ebuffer_end = 0;
> +
> +	DBG("codec->msbc_frame_size %d", (int) codec->msbc_frame_size);
> +	DBG("codec->ebuffer_size %d", (int) codec->ebuffer_size);
> +	DBG("codec->decoded_frame_size %d", (int) codec->decoded_frame_size);
> +	return 0;
> +}
> +
> +/* Run from IO thread */
> +static int hfp_audio_msbc_free(struct hfp_thread *thread)
> +{
> +	struct msbc_codec *codec =&thread->msbc;
> +
> +	g_free(codec->ebuffer);
> +	sbc_finish(&codec->sbcenc);
> +	sbc_finish(&codec->sbcdec);
> +
> +	return 0;
> +}
> +
> +/* Run from IO thread */
> +static int hfp_audio_msbc_encode(struct hfp_thread *thread, char *data, int len)
> +{
> +	struct msbc_codec *codec =&thread->msbc;
> +	char *h2 = codec->ebuffer + codec->ebuffer_end;
> +	static int sn = 0;
> +	int written = 0;
> +	char *qbuf;
> +
> +	h2[0] = 0x01;
> +	h2[1] = sntable[sn];
> +	h2[59] = 0xff;
> +	sn = (sn + 1) % 4;
> +
> +	sbc_encode(&codec->sbcenc, data, len,
> +			codec->ebuffer + codec->ebuffer_end + 2,
> +			codec->ebuffer_size - codec->ebuffer_end - 2,
> +			(ssize_t *)&written);
> +
> +	written += 2 /* H2 */ + 1 /* 0xff */;
> +	codec->ebuffer_end += written;
> +
> +	/* Split into MTU sized chunks */
> +	while (codec->ebuffer_start + thread->mtu<= codec->ebuffer_end) {
> +		qbuf = g_try_malloc(thread->mtu);
> +		if (!qbuf)
> +			return -ENOMEM;
> +
> +		/* DBG("Enqueuing %d bytes", thread->mtu); */
> +		memcpy(qbuf, codec->ebuffer + codec->ebuffer_start, thread->mtu);
> +
> +		thread->outq = g_slist_insert(thread->outq, qbuf, -1);
> +
> +		codec->ebuffer_start += thread->mtu;
> +		if (codec->ebuffer_start>= codec->ebuffer_end)
> +			codec->ebuffer_start = codec->ebuffer_end = 0;
> +	}
> +
> +	return 0;
> +}
> +
> +/* Run from IO thread */
> +static int hfp_audio_msbc_decode(struct hfp_thread *thread, char *data,
> +						int len, char *out, int outlen)
> +{
> +	struct msbc_codec *codec =&thread->msbc;
> +	int written, decoded;
> +
> +	written = msbc_parse(&codec->sbcdec,&codec->parser, data, len, out,
> +			outlen,&decoded);
> +
> +	return written;
> +}
> +
> +static snd_pcm_t *hfp_audio_pcm_init(snd_pcm_stream_t stream, int rate)
>   {
>   	snd_pcm_t *pcm;
>   	DBG("Initializing pcm for %s", (stream == SND_PCM_STREAM_CAPTURE) ?
> -			"capture" : "playback");
> +							"capture" : "playback");
>
>   	if (snd_pcm_open(&pcm, "default", stream, SND_PCM_NONBLOCK)<  0) {
>   		DBG("Failed to open pcm");
>   		return NULL;
>   	}
>
> -	/* 8000 khz, 16 bits, 128000 bytes/s, 48 bytes/frame, 6000 fps */
> +	/* 16 bits */
>   	if (snd_pcm_set_params(pcm, SND_PCM_FORMAT_S16_LE,
> -					SND_PCM_ACCESS_RW_INTERLEAVED,
> -					1, 8000, 1, 20000)<  0) {
> +			SND_PCM_ACCESS_RW_INTERLEAVED, 1, rate, 1, 120000)<  0) {
>   		DBG("Failed to set pcm params");
>   		snd_pcm_close(pcm);
>   		pcm = NULL;
> @@ -105,29 +356,35 @@ static snd_pcm_t *hfp_audio_pcm_init(snd_pcm_stream_t stream)
>   	return pcm;
>   }
>
> -static void hfp_audio_thread_free(struct hfp_audio_thread *hcon)
> +static void hfp_audio_thread_free(struct hfp_thread *thread)
>   {
> -	DBG("Freeing audio connection %p", hcon);
> -	if (!hcon)
> +	DBG("Freeing audio connection %p", thread);
> +	if (!thread)
>   		return;
>
> -	hcon->running = 0;
> -	if (hcon->thread)
> -		pthread_join(hcon->thread, NULL);
> +	thread->running = 0;
> +	if (thread->thread)
> +		pthread_join(thread->thread, NULL);
>
> -	threads = g_slist_remove(threads, hcon);
> -	g_free(hcon);
> -	DBG("freed %p", hcon);
> +	if (shutdown(thread->fd, SHUT_RDWR)<  0)
> +			DBG("Failed to shutdown socket");
> +	if (close(thread->fd)<  0)
> +		DBG("Failed to close socket");
> +
> +	threads = g_slist_remove(threads, thread);
> +	g_free(thread);
> +	DBG("freed %p", thread);
>   }
>
>   /* Returns the number of data on sco socket */
> -static int hfp_audio_playback(int fd, snd_pcm_t *playback)
> +static int hfp_audio_playback(struct hfp_thread *thread,
> +		snd_pcm_t *playback)
>   {
> -	char buf[800];
> +	char buf[512], out[512];
> +	int bytes, outlen;
>   	snd_pcm_sframes_t frames;
> -	int bytes;
>
> -	bytes = read(fd, buf, sizeof(buf));
> +	bytes = read(thread->fd, buf, sizeof(buf));
>   	if (bytes<  0) {
>   		DBG("Failed to read: bytes %d, errno %d", bytes, errno);
>   		switch (errno) {
> @@ -140,178 +397,201 @@ static int hfp_audio_playback(int fd, snd_pcm_t *playback)
>   		}
>   	}
>
> -	frames = snd_pcm_writei(playback, buf, bytes / 2);
> +	/* DBG("received %d bytes", bytes); */
> +	outlen = thread->decode(thread, buf, bytes, out, sizeof(out));
> +
> +	frames = snd_pcm_writei(playback, out, outlen / 2);
>   	switch (frames) {
>   	case -EPIPE:
> -		DBG("Playback underrun");
>   		snd_pcm_prepare(playback);
>   		return bytes;
>   	case -EAGAIN:
> -		DBG("??? %d", bytes / 2);
>   		return bytes;
>   	case -EBADFD:
>   	case -ESTRPIPE:
>   		return -EINVAL;
>   	}
>
> -	if (frames<  bytes / 2)
> -		DBG("played %d<  requested %d", (int)frames, bytes / 2);
> +	if (frames<  outlen / 2)
> +		DBG("played %d<  requested %d", (int)frames, outlen / 2);
>
>   	return bytes;
>   }
>
>   /* Returns the number of data on sco socket */
> -static int hfp_audio_capture(int fd, snd_pcm_t *capture, GList **outq, int mtu)
> +static int hfp_audio_capture(struct hfp_thread *thread, snd_pcm_t *capture)
>   {
>   	snd_pcm_sframes_t frames;
> -	gchar *buf;
> -
> -	buf = g_try_malloc(mtu);
> -	if (!buf)
> -		return -ENOMEM;
>
> -	frames = snd_pcm_readi(capture, buf, mtu / 2);
> +	frames = snd_pcm_readi(capture, thread->capture_buffer+thread->captured,
> +				(thread->capture_size - thread->captured) / 2);
>   	switch (frames) {
>   	case -EPIPE:
> -		DBG("Capture overrun");
>   		snd_pcm_prepare(capture);
> -		g_free(buf);
>   		return 0;
>   	case -EAGAIN:
> -		DBG("No data to capture");
> -		g_free(buf);
>   		return 0;
>   	case -EBADFD:
>   	case -ESTRPIPE:
> -		DBG("Other error");
> -		g_free(buf);
> +		DBG("Other error %s (%d)", strerror(frames), (int) frames);
>   		return -EINVAL;
>   	}
>
> -	if (frames<  mtu / 2)
> -		DBG("Small frame: %d", (int) frames);
> +	thread->captured += frames * 2;
> +	if (thread->captured<  thread->capture_size)
> +		return frames * 2;
>
> -	if (g_list_length(*outq)>  32)
> -		DBG("Too many queued packets");
> -
> -	*outq = g_list_append(*outq, buf);
> +	/* DBG("Encoding %d bytes", (int) thread->captured); */
> +	thread->encode(thread, thread->capture_buffer, thread->captured);
> +	thread->captured = 0;
>
>   	return frames * 2;
>   }
>
> -static void pop_outq(int fd, GList **outq, int mtu)
> +static void pop_outq(struct hfp_thread *thread)
>   {
> -	GList *el;
> -
> -	el = g_list_first(*outq);
> -	if (!el)
> -		return;
> +	char *qbuf;
>
> -	*outq = g_list_remove_link(*outq, el);
> +	while (thread->outq != NULL) {
> +		qbuf = thread->outq->data;
> +		thread->outq = g_slist_remove(thread->outq, qbuf);
>
> -	if (write(fd, el->data, mtu)<  0)
> -		DBG("Failed to write: %d", errno);
> +		if (write(thread->fd, qbuf, thread->mtu)<  0)
> +			DBG("Failed to write: %d", errno);
>
> -	g_free(el->data);
> -	g_list_free(el);
> +		g_free(qbuf);
> +	}
>   }
>
>   static void *thread_func(void *userdata)
>   {
> -	struct hfp_audio_thread *hcon = userdata;
> +	struct hfp_thread *thread = userdata;
>   	snd_pcm_t *playback, *capture;
> -	GList *outq = NULL;
> -	struct sco_options  opts;
> +	struct sco_options opts;
>   	struct pollfd fds[8];
>
> -	DBG("thread started");
> +	DBG("thread started: rate %d", thread->rate);
> +
> +	if (thread->init(thread)<  0)
> +		return NULL;
>
> -	capture = hfp_audio_pcm_init(SND_PCM_STREAM_CAPTURE);
> +	capture = hfp_audio_pcm_init(SND_PCM_STREAM_CAPTURE, thread->rate);
>   	if (!capture)
>   		return NULL;
>
> -	playback = hfp_audio_pcm_init(SND_PCM_STREAM_PLAYBACK);
> +	playback = hfp_audio_pcm_init(SND_PCM_STREAM_PLAYBACK, thread->rate);
>   	if (!playback) {
>   		snd_pcm_close(capture);
>   		return NULL;
>   	}
>
> +	thread->capture_buffer = g_try_malloc(thread->capture_size);
> +	if (!thread->capture_buffer) {
> +		snd_pcm_close(capture);
> +		snd_pcm_close(playback);
> +		return NULL;
> +	}
> +
>   	/* Force defered setup */
> -	if (read(hcon->fd,&opts, sizeof(opts))<  0)
> +	if (recv(thread->fd, NULL, 0, 0)<  0)
>   		DBG("Defered setup failed: %d (%s)", errno, strerror(errno));
>
>   	/* Add SCO options
> -	len = sizeof(opts);
> -	if (getsockopt(hcon->fd, SOL_SCO, SCO_OPTIONS,&opts,&len)<  0) {
> -		DBG("getsockopt failed %d", errno);
> -		return NULL;
> -	}
> -	*/
> +	 len = sizeof(opts);
> +	 if (getsockopt(thread->fd, SOL_SCO, SCO_OPTIONS,&opts,&len)<  0) {
> +	 DBG("getsockopt failed %d", errno);
> +	 return NULL;
> +	 }
> +	 */
>   	opts.mtu = 48;
> -	DBG("mtu %d", opts.mtu);
> +	thread->mtu = opts.mtu;
> +	DBG("thread->mtu %d", thread->mtu);
>
> -	while (hcon->running) {
> +	while (thread->running) {
>   		/* Queue alsa captured data (snd_pcm_poll_descriptors failed) */
> -		if (hfp_audio_capture(hcon->fd, capture,&outq, opts.mtu)<  0) {
> +		if (hfp_audio_capture(thread, capture)<  0) {
>   			DBG("Failed to capture");
>   			break;
>   		}
>
>   		memset(fds, 0, sizeof(fds));
> -		fds[0].fd = hcon->fd;
> +		fds[0].fd = thread->fd;
>   		fds[0].events = POLLIN | POLLERR | POLLHUP | POLLNVAL;
>   		if (poll(fds, 1, 200) == 0)
>   			continue;
>
>   		if (fds[0].revents&  (POLLERR | POLLHUP | POLLNVAL)) {
> -			DBG("POLLERR | POLLHUP | POLLNVAL triggered");
> +			DBG("POLLERR | POLLHUP | POLLNVAL triggered (%d)",
> +					fds[0].revents);
>   			break;
>   		}
>
>   		if (!fds[0].revents&  POLLIN)
>   			continue;
>
> -		if (hfp_audio_playback(hcon->fd, playback)<  0) {
> +		if (hfp_audio_playback(thread, playback)<  0) {
>   			DBG("POLLIN triggered, but read error");
>   			break;
>   		}
>
> +		/* DBG("Received and send"); */
> +
>   		/* Dequeue in sync with readings */
> -		pop_outq(hcon->fd,&outq, opts.mtu);
> +		pop_outq(thread);
>   	}
>
>   	DBG("thread terminating");
> +	g_slist_free_full(thread->outq, g_free);
> +	g_free(thread->capture_buffer);
>   	snd_pcm_close(playback);
>   	snd_pcm_close(capture);
> +
> +	thread->free(thread);
> +
>   	return NULL;
>   }
>
>   static int new_connection(int fd, int codec)
>   {
> -	struct hfp_audio_thread *hcon;
> +	struct hfp_thread *thread;
> +
>   	DBG("New connection: fd=%d codec=%d", fd, codec);
> -	hcon = g_try_malloc0(sizeof(struct hfp_audio_thread));
> -	if (hcon == NULL)
> +	thread = g_try_malloc0(sizeof(struct hfp_thread));
> +	if (thread == NULL)
>   		return -ENOMEM;
>
> -	hcon->fd = fd;
> -	hcon->codec = codec;
> -	hcon->running = 1;
> +	thread->fd = fd;
> +	thread->running = 1;
> +
> +	switch (codec) {
> +	case HFP_AUDIO_CVSD:
> +		thread->init = hfp_audio_cvsd_init;
> +		thread->free = hfp_audio_cvsd_free;
> +		thread->decode = hfp_audio_cvsd_decode;
> +		thread->encode = hfp_audio_cvsd_encode;
> +		break;
> +	case HFP_AUDIO_MSBC:
> +		thread->rate = 16000;
> +		thread->init = hfp_audio_msbc_init;
> +		thread->free = hfp_audio_msbc_free;
> +		thread->decode = hfp_audio_msbc_decode;
> +		thread->encode = hfp_audio_msbc_encode;
> +		break;
> +	}
>
> -	if (pthread_create(&hcon->thread, NULL, thread_func, hcon)<  0)
> -		goto fail;
> +	if (pthread_create(&thread->thread, NULL, thread_func, thread)<  0) {
> +		hfp_audio_thread_free(thread);
> +		return -EINVAL;
> +	}
>
>   	/* FIXME thread is not detached until we quit */
>
> -	threads = g_slist_prepend(threads, hcon);
> +	threads = g_slist_prepend(threads, thread);
>   	return 0;
> -fail:
> -	hfp_audio_thread_free(hcon);
> -	return -EINVAL;
>   }
>
>   static DBusMessage *agent_newconnection(DBusConnection *conn, DBusMessage *msg,
> -					void *data)
> +								void *data)

Why is this needed?

>   {
>   	const char *card;
>   	int fd;
> @@ -321,9 +601,8 @@ static DBusMessage *agent_newconnection(DBusConnection *conn, DBusMessage *msg,
>   	DBG("New connection");
>
>   	if (dbus_message_get_args(msg, NULL, DBUS_TYPE_OBJECT_PATH,&card,
> -						DBUS_TYPE_UNIX_FD,&fd,
> -						DBUS_TYPE_BYTE,&codec,
> -						DBUS_TYPE_INVALID) == FALSE)
> +			DBUS_TYPE_UNIX_FD,&fd, DBUS_TYPE_BYTE,&codec,
> +			DBUS_TYPE_INVALID) == FALSE)

Why is this needed?

>   		return g_dbus_create_error(msg,
>   				HFP_AUDIO_AGENT_INTERFACE ".InvalidArguments",
>   				"Invalid arguments");
> @@ -345,7 +624,7 @@ fail:
>   }
>
>   static DBusMessage *agent_release(DBusConnection *conn, DBusMessage *msg,
> -					void *data)
> +		void *data)
>   {
>   	DBG("HFP audio agent released");
>   	/* agent will be registered on next oFono startup */
> @@ -368,8 +647,8 @@ static void hfp_audio_agent_register_reply(DBusPendingCall *call, void *data)
>   	dbus_error_init(&err);
>
>   	if (dbus_set_error_from_message(&err, reply) == TRUE) {
> -		DBG("Failed to register audio agent (%s: %s)", err.name,
> -								err.message);
> +		DBG("Failed to register audio agent (%s: %s)",
> +				err.name, err.message);

Or this?

>   		dbus_error_free(&err);
>   	} else {
>   		DBG("HFP audio agent registered");
> @@ -390,9 +669,8 @@ static void hfp_audio_agent_register(DBusConnection *conn)
>   	DBG("Registering audio agent in oFono");
>
>   	msg = dbus_message_new_method_call(OFONO_SERVICE,
> -						HFP_AUDIO_MANAGER_PATH,
> -						HFP_AUDIO_MANAGER_INTERFACE,
> -						"Register");
> +			HFP_AUDIO_MANAGER_PATH, HFP_AUDIO_MANAGER_INTERFACE,
> +			"Register");

Or this?

>   	if (msg == NULL) {
>   		DBG("Not enough memory");
>   		return;
> @@ -405,8 +683,8 @@ static void hfp_audio_agent_register(DBusConnection *conn)
>   		codecs[ncodecs++] = HFP_AUDIO_MSBC;
>
>   	dbus_message_append_args(msg, DBUS_TYPE_OBJECT_PATH,&path,
> -					DBUS_TYPE_ARRAY, DBUS_TYPE_BYTE,
> -					&pcodecs, ncodecs, DBUS_TYPE_INVALID);
> +			DBUS_TYPE_ARRAY, DBUS_TYPE_BYTE,&pcodecs, ncodecs,
> +			DBUS_TYPE_INVALID);
>
>   	if (!dbus_connection_send_with_reply(conn, msg,&call, -1)) {
>   		dbus_message_unref(msg);
> @@ -416,8 +694,8 @@ static void hfp_audio_agent_register(DBusConnection *conn)
>
>   	dbus_message_unref(msg);
>
> -	dbus_pending_call_set_notify(call, hfp_audio_agent_register_reply,
> -						NULL, NULL);
> +	dbus_pending_call_set_notify(call, hfp_audio_agent_register_reply, NULL,
> +			NULL);
>
>   	dbus_pending_call_unref(call);
>   }
> @@ -483,30 +761,32 @@ static int sco_listen_watch()
>
>   	if (bind(sk, (struct sockaddr *)&saddr, sizeof(saddr))<  0) {
>   		DBG("Can't bind socket: %s (%d)", strerror(errno), errno);
> -		goto error;
> +		goto fail;
>   	}
>
>   	/* Enable deferred setup */
> -	if (option_defer&&  setsockopt(sk, SOL_BLUETOOTH, BT_DEFER_SETUP,
> -				&option_defer, sizeof(option_defer))<  0) {
> +	if (option_defer
> +			&&  setsockopt(sk, SOL_BLUETOOTH, BT_DEFER_SETUP,
> +					&option_defer, sizeof(option_defer))
> +					<  0) {
>   		DBG("Can't defer setup : %s (%d)", strerror(errno), errno);
> -		goto error;
> +		goto fail;
>   	}
>
>   	/* Listen for connections */
>   	if (listen(sk, 10)) {
>   		DBG("Can not listen socket: %s (%d)", strerror(errno), errno);
> -		goto error;
> +		goto fail;
>   	}
>
>   	DBG("Waiting for connection ...");
>   	io = g_io_channel_unix_new(sk);
>   	if (!io)
> -		goto error;
> +		goto fail;
>
>   	return g_io_add_watch(io, G_IO_IN, sco_accept_cb, NULL);
>
> -error:
> +fail:
>   	close(sk);
>   	return -1;

All of these should be merged into previous patches and not be part of 
this patch.

>   }
> @@ -530,7 +810,7 @@ static int sco_connect_watch()
>
>   	if (bind(sk, (struct sockaddr *)&saddr, sizeof(saddr))<  0) {
>   		DBG("Can't bind socket: %s (%d)", strerror(errno), errno);
> -		goto error;
> +		goto fail;
>   	}
>
>   	/* Connect to remote address */
> @@ -539,17 +819,17 @@ static int sco_connect_watch()
>   	btstr2ba(option_client_addr,&saddr.sco_bdaddr);
>   	if (connect(sk, (struct sockaddr *)&saddr, sizeof(saddr))) {
>   		DBG("Can not connect socket: %s (%d)", strerror(errno), errno);
> -		goto error;
> +		goto fail;
>   	}
>
>   	DBG("Connecting to %s...", option_client_addr);
>   	io = g_io_channel_unix_new(sk);
>   	if (!io)
> -		goto error;
> +		goto fail;
>
> -	return g_io_add_watch(io, G_IO_IN|G_IO_OUT, sco_connect_cb, NULL);
> +	return g_io_add_watch(io, G_IO_IN | G_IO_OUT, sco_connect_cb, NULL);
>
> -error:
> +fail:
>   	close(sk);
>   	return -1;
>   }
> @@ -559,9 +839,8 @@ static void hfp_audio_agent_create(DBusConnection *conn)
>   	DBG("Registering audio agent on DBUS");
>
>   	if (!g_dbus_register_interface(conn, HFP_AUDIO_AGENT_PATH,
> -					HFP_AUDIO_AGENT_INTERFACE,
> -					agent_methods, NULL, NULL,
> -					NULL, NULL)) {
> +			HFP_AUDIO_AGENT_INTERFACE, agent_methods, NULL, NULL,
> +			NULL, NULL)) {
>   		DBG("Unable to create local agent");
>   		g_main_loop_quit(main_loop);
>   	}
> @@ -572,7 +851,7 @@ static void hfp_audio_agent_destroy(DBusConnection *conn)
>   	DBG("Unregistering audio agent on DBUS");
>
>   	g_dbus_unregister_interface(conn, HFP_AUDIO_AGENT_PATH,
> -						HFP_AUDIO_AGENT_INTERFACE);
> +			HFP_AUDIO_AGENT_INTERFACE);
>   }
>
>   static void ofono_connect(DBusConnection *conn, void *user_data)

Same as above.

Regards,
-Denis

  reply	other threads:[~2013-04-01 16:29 UTC|newest]

Thread overview: 13+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2013-03-25 17:16 [PATCH v4 0/9] bluetooth: handsfree audio agent =?unknown-8bit?q?Fr=C3=A9d=C3=A9ric?= Dalleau
2013-03-25 17:16 ` [PATCH v4 1/9] handsfree-audio: Initial DBUS code =?unknown-8bit?q?Fr=C3=A9d=C3=A9ric?= Dalleau
2013-04-01 16:10   ` Denis Kenzior
2013-03-25 17:16 ` [PATCH v4 2/9] handsfree-audio: Build handsfree-audio command line tool =?unknown-8bit?q?Fr=C3=A9d=C3=A9ric?= Dalleau
2013-03-25 17:16 ` [PATCH v4 3/9] handsfree-audio: Add Alsa dependancy =?unknown-8bit?q?Fr=C3=A9d=C3=A9ric?= Dalleau
2013-03-25 17:16 ` [PATCH v4 4/9] handsfree-audio: Link tool with Alsa =?unknown-8bit?q?Fr=C3=A9d=C3=A9ric?= Dalleau
2013-03-25 17:16 ` [PATCH v4 5/9] handsfree-audio: Implement alsa playback =?unknown-8bit?q?Fr=C3=A9d=C3=A9ric?= Dalleau
2013-04-01 16:19   ` Denis Kenzior
2013-03-25 17:16 ` [PATCH v4 6/9] handsfree-audio: Add SBC dependency =?unknown-8bit?q?Fr=C3=A9d=C3=A9ric?= Dalleau
2013-03-25 17:16 ` [PATCH v4 7/9] handsfree-audio: Link tool with SBC library =?unknown-8bit?q?Fr=C3=A9d=C3=A9ric?= Dalleau
2013-03-25 17:16 ` [PATCH v4 8/9] handsfree-audio: mSBC support =?unknown-8bit?q?Fr=C3=A9d=C3=A9ric?= Dalleau
2013-04-01 16:29   ` Denis Kenzior [this message]
2013-03-25 17:16 ` [PATCH v4 9/9] handsfree-audio: Add an option to kill incoming connections =?unknown-8bit?q?Fr=C3=A9d=C3=A9ric?= Dalleau

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=5159B603.1080009@gmail.com \
    --to=denkenz@gmail.com \
    --cc=ofono@ofono.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.