diff options
| author | Johan Hedberg <johan.hedberg@nokia.com> | 2007-04-17 14:07:49 +0000 | 
|---|---|---|
| committer | Johan Hedberg <johan.hedberg@nokia.com> | 2007-04-17 14:07:49 +0000 | 
| commit | ed805ba6dc4ab8315e6fd83ecadbe57112dc93b5 (patch) | |
| tree | faf54e2ee837cd11c61f7f7c21022ed858bd5d5c | |
| parent | cd7716fd58c5578f43634ddbb9e78ec508be2d21 (diff) | |
Cleanup the headset event parsing function a little
| -rw-r--r-- | audio/headset.c | 93 | 
1 files changed, 45 insertions, 48 deletions
| diff --git a/audio/headset.c b/audio/headset.c index 4a7e8db4..9189177b 100644 --- a/audio/headset.c +++ b/audio/headset.c @@ -359,10 +359,11 @@ static gboolean rfcomm_io_cb(GIOChannel *chan, GIOCondition cond,  				struct headset *hs)  {  	unsigned char buf[BUF_SIZE]; -	char *cr; +	char *cr, rsp[BUF_SIZE];  	gsize bytes_read = 0; -	gsize free_space; +	gsize free_space, count, bytes_written, total_bytes_written;  	GIOError err; +	off_t cmd_len;  	if (cond & G_IO_NVAL)  		return FALSE; @@ -391,58 +392,54 @@ static gboolean rfcomm_io_cb(GIOChannel *chan, GIOCondition cond,  	hs->buf[hs->data_start + hs->data_length] = '\0';  	cr = strchr(&hs->buf[hs->data_start], '\r'); -	if (cr) { -		char rsp[BUF_SIZE]; -		gsize count, bytes_written, total_bytes_written; -		off_t cmd_len; - -		cmd_len	= 1 + (off_t) cr - (off_t) &hs->buf[hs->data_start]; -		*cr = '\0'; - -		memset(rsp, 0, sizeof(rsp)); - -		/* FIXME: make a better parse function */ -		switch (parse_headset_event(&hs->buf[hs->data_start], rsp, sizeof(rsp))) { -		case HEADSET_EVENT_GAIN: -			hs_signal_gain_setting(hs, &hs->buf[hs->data_start] + 2); -			break; - -		case HEADSET_EVENT_KEYPRESS: -			if (hs->ring_timer) { -				g_source_remove(hs->ring_timer); -				hs->ring_timer = 0; -			} - -			hs_signal(hs, "AnswerRequested"); -			break; - -		case HEADSET_EVENT_INVALID: -		case HEADSET_EVENT_UNKNOWN: -		default: -			debug("Unknown headset event"); -			break; -		} +	if (!cr) +		return TRUE; + +	cmd_len	= 1 + (off_t) cr - (off_t) &hs->buf[hs->data_start]; +	*cr = '\0'; -		count = strlen(rsp); -		total_bytes_written = bytes_written = 0; -		err = G_IO_ERROR_NONE; +	memset(rsp, 0, sizeof(rsp)); + +	switch (parse_headset_event(&hs->buf[hs->data_start], rsp, sizeof(rsp))) { +	case HEADSET_EVENT_GAIN: +		hs_signal_gain_setting(hs, &hs->buf[hs->data_start] + 2); +		break; -		while (err == G_IO_ERROR_NONE && total_bytes_written < count) { -			/* FIXME: make it async */ -			err = g_io_channel_write(hs->rfcomm, rsp + total_bytes_written,  -						count - total_bytes_written, &bytes_written); -			if (err != G_IO_ERROR_NONE) -				error("Error while writting to the audio output channel"); -			total_bytes_written += bytes_written; -		}; +	case HEADSET_EVENT_KEYPRESS: +		if (hs->ring_timer) { +			g_source_remove(hs->ring_timer); +			hs->ring_timer = 0; +		} -		hs->data_start += cmd_len; -		hs->data_length -= cmd_len; +		hs_signal(hs, "AnswerRequested"); +		break; -		if (!hs->data_length) -			hs->data_start = 0; +	case HEADSET_EVENT_INVALID: +	case HEADSET_EVENT_UNKNOWN: +	default: +		debug("Unknown headset event"); +		break;  	} +	count = strlen(rsp); +	total_bytes_written = bytes_written = 0; +	err = G_IO_ERROR_NONE; + +	while (err == G_IO_ERROR_NONE && total_bytes_written < count) { +		/* FIXME: make it async */ +		err = g_io_channel_write(hs->rfcomm, rsp + total_bytes_written,  +				count - total_bytes_written, &bytes_written); +		if (err != G_IO_ERROR_NONE) +			error("Error while writting to the audio output channel"); +		total_bytes_written += bytes_written; +	}; + +	hs->data_start += cmd_len; +	hs->data_length -= cmd_len; + +	if (!hs->data_length) +		hs->data_start = 0; +  	return TRUE;  failed: | 
