diff options
Diffstat (limited to 'audio')
| -rw-r--r-- | audio/headset.c | 87 | 
1 files changed, 45 insertions, 42 deletions
| diff --git a/audio/headset.c b/audio/headset.c index 0591a8f8..cace9ff8 100644 --- a/audio/headset.c +++ b/audio/headset.c @@ -111,16 +111,16 @@ struct manager* audio_manager_new(DBusConnection *conn);  void audio_manager_free(struct manager* amanager);  struct headset* audio_manager_find_headset_by_bda(struct manager *amanager, const bdaddr_t *bda);  void audio_manager_add_headset(struct manager *amanager, struct headset *hs); -void audio_manager_create_headset_server(struct manager *amanager, uint8_t chan); +gboolean audio_manager_create_headset_server(struct manager *amanager, uint8_t chan);  static DBusHandlerResult am_get_default_headset(struct manager *amanager, DBusMessage *msg);  static DBusHandlerResult am_create_headset(struct manager *amanager, DBusMessage *msg);  struct headset* audio_headset_new(DBusConnection *conn, const bdaddr_t *bda);  void audio_headset_unref(struct headset* hs); -int audio_headset_close_input(struct headset* hs); -int audio_headset_open_input(struct headset* hs, const char *audio_input); -int audio_headset_close_output(struct headset* hs); -int audio_headset_open_output(struct headset* hs, const char *audio_output); +gboolean audio_headset_close_input(struct headset* hs); +gboolean audio_headset_open_input(struct headset* hs, const char *audio_input); +gboolean audio_headset_close_output(struct headset* hs); +gboolean audio_headset_open_output(struct headset* hs, const char *audio_output);  GIOError audio_headset_send_ring(struct headset *hs);  static DBusHandlerResult hs_connect(struct headset *hs, DBusMessage *msg); @@ -455,8 +455,10 @@ static gboolean audio_input_to_sco_cb(GIOChannel *chan, GIOCondition cond, gpoin  	}  	err = g_io_channel_read(chan, buf, sizeof(buf), &bytes_read); -	if (err != G_IO_ERROR_NONE) +	if (err != G_IO_ERROR_NONE) { +		audio_headset_close_input(hs);  		return FALSE; +	}  	total_bytes_written = bytes_written = 0;  	err = G_IO_ERROR_NONE; @@ -660,6 +662,7 @@ failed:  		pending_connect_free(hs->connect_in_progress);  		hs->connect_in_progress = NULL;  	} +  	hs->state = HEADSET_STATE_DISCONNECTED;  	return FALSE; @@ -979,7 +982,7 @@ static void get_record_reply(DBusPendingCall *call, void *data)  	if (!sdp_get_access_protos(record, &protos)) {  		c->ch = sdp_get_proto_port(protos, RFCOMM_UUID); -		sdp_list_foreach(protos, (sdp_list_func_t)sdp_list_free, NULL); +		sdp_list_foreach(protos, (sdp_list_func_t) sdp_list_free, NULL);  		sdp_list_free(protos, NULL);  		protos = NULL;  	} @@ -1168,14 +1171,14 @@ static DBusHandlerResult hs_connect(struct headset *hs, DBusMessage *msg)  		return DBUS_HANDLER_RESULT_HANDLED;  	} -	hs->connect_in_progress = malloc(sizeof(struct pending_connect)); +	hs->connect_in_progress = g_try_new0(struct pending_connect, 1);  	if (!hs->connect_in_progress) {  		error("Out of memory when allocating new struct pending_connect");  		return DBUS_HANDLER_RESULT_NEED_MEMORY;  	} +  	hs->state = HEADSET_STATE_CONNECT_IN_PROGRESS; -	memset(hs->connect_in_progress, 0, sizeof(struct pending_connect));  	hs->connect_in_progress->conn = dbus_connection_ref(connection);  	hs->connect_in_progress->msg = msg ? dbus_message_ref(msg) : NULL; @@ -1488,22 +1491,22 @@ static const DBusObjectPathVTable hs_table = {  /*  ** audio_headset_new: -** Create a unique dbus object path for the headset and allocates a new headset or return NULL if fail +** Create a unique dbus object path for the headset and allocates a new +** headset or return NULL if fail  */ -struct headset* audio_headset_new(DBusConnection *conn, const bdaddr_t *bda) +struct headset *audio_headset_new(DBusConnection *conn, const bdaddr_t *bda)  {  	static int headset_uid = 0;  	struct headset *hs; -	hs = malloc(sizeof(struct headset)); +	hs = g_try_new0(struct headset, 1);  	if (!hs) {  		error("Allocating new hs connection struct failed!");  		return NULL;  	} -	memset(hs, 0, sizeof(struct headset)); - -	snprintf(hs->object_path, sizeof(hs->object_path), AUDIO_HEADSET_PATH_BASE "%d", headset_uid++); +	snprintf(hs->object_path, sizeof(hs->object_path), +			AUDIO_HEADSET_PATH_BASE "%d", headset_uid++);  	if (!dbus_connection_register_object_path(conn, hs->object_path,  						&hs_table, hs)) { @@ -1517,14 +1520,14 @@ struct headset* audio_headset_new(DBusConnection *conn, const bdaddr_t *bda)  	return hs;  } -void audio_headset_unref(struct headset* hs) +void audio_headset_unref(struct headset *hs)  {  	assert(hs != NULL);  	free(hs);  } -int audio_headset_close_output(struct headset* hs) +gboolean audio_headset_close_output(struct headset *hs)  {  	assert(hs != NULL); @@ -1533,11 +1536,12 @@ int audio_headset_close_output(struct headset* hs)  	g_io_channel_unref(hs->audio_output);  	hs->audio_output = NULL; -	return FALSE; + +	return TRUE;  }  /* FIXME: in the furture, that would be great to provide user space alsa driver (not plugin) */ -int audio_headset_open_output(struct headset* hs, const char *output) +gboolean audio_headset_open_output(struct headset *hs, const char *output)  {  	int out; @@ -1555,21 +1559,21 @@ int audio_headset_open_output(struct headset* hs, const char *output)  	if (out < 0) {  		error("open(%s): %s %d", hs->output, strerror(errno), errno); -		return TRUE; +		return FALSE;  	}  	hs->audio_output = g_io_channel_unix_new(out);  	if (!hs->audio_output) {  		error("Allocating new channel for audio output!"); -		return TRUE; +		return FALSE;  	}  	g_io_channel_set_close_on_unref(hs->audio_output, TRUE); -	return FALSE; +	return TRUE;  } -int audio_headset_close_input(struct headset* hs) +gboolean audio_headset_close_input(struct headset *hs)  {  	assert(hs != NULL); @@ -1579,10 +1583,12 @@ int audio_headset_close_input(struct headset* hs)  	g_io_channel_unref(hs->audio_input);  	hs->audio_input = NULL; -	return FALSE; +	hs->state = HEADSET_STATE_CONNECTED; + +	return TRUE;  } -int audio_headset_open_input(struct headset* hs, const char *input) +gboolean audio_headset_open_input(struct headset *hs, const char *input)  {  	int in; @@ -1602,20 +1608,21 @@ int audio_headset_open_input(struct headset* hs, const char *input)  	if (in < 0) {  		error("open(%s): %s %d", hs->input, strerror(errno), errno); -		return TRUE; +		return FALSE;  	}  	hs->audio_input = g_io_channel_unix_new(in);  	if (!hs->audio_input) {  		error("Allocating new channel for audio input!"); -		return TRUE; +		return FALSE;  	} +  	g_io_channel_set_close_on_unref(hs->audio_input, TRUE); -	return FALSE; +	return TRUE;  } -void audio_manager_create_headset_server(struct manager *amanager, uint8_t chan) +gboolean audio_manager_create_headset_server(struct manager *amanager, uint8_t chan)  {  	int srv_sk; @@ -1623,13 +1630,13 @@ void audio_manager_create_headset_server(struct manager *amanager, uint8_t chan)  	if (amanager->server_sk) {  		error("Server socket already created"); -		return; +		return FALSE;  	}  	srv_sk = server_socket(&chan);  	if (srv_sk < 0) {  		error("Unable to create server socket"); -		return; +		return FALSE;  	}  	if (!amanager->record_id) @@ -1638,7 +1645,7 @@ void audio_manager_create_headset_server(struct manager *amanager, uint8_t chan)  	if (!amanager->record_id) {  		error("Unable to register service record");  		close(srv_sk); -		return; +		return FALSE;  	}  	amanager->server_sk = g_io_channel_unix_new(srv_sk); @@ -1647,12 +1654,14 @@ void audio_manager_create_headset_server(struct manager *amanager, uint8_t chan)  		remove_ag_record(amanager->record_id);  		amanager->record_id = 0;  		close(srv_sk); -		return; +		return FALSE;  	}  	g_io_channel_set_close_on_unref(amanager->server_sk, TRUE);  	g_io_add_watch(amanager->server_sk, G_IO_IN, (GIOFunc) server_io_cb, amanager); + +	return TRUE;  }  static gint headset_bda_cmp(gconstpointer headset, gconstpointer bda) @@ -1662,7 +1671,7 @@ static gint headset_bda_cmp(gconstpointer headset, gconstpointer bda)  	return bacmp(&hs->bda, bda);  } -struct headset* audio_manager_find_headset_by_bda(struct manager *amanager, const bdaddr_t *bda) +struct headset *audio_manager_find_headset_by_bda(struct manager *amanager, const bdaddr_t *bda)  {  	GSList *elem; @@ -1803,13 +1812,6 @@ struct manager* audio_manager_new(DBusConnection *conn)  	return amanager;  } -static void headset_list_unref_each(gpointer aheadset, gpointer am) -{ -	struct headset *hs = aheadset; - -	audio_headset_unref(hs); -} -  void audio_manager_free(struct manager* amanager)  {  	assert(amanager != NULL); @@ -1825,7 +1827,8 @@ void audio_manager_free(struct manager* amanager)  	}  	if (amanager->headset_list) { -		g_slist_foreach(amanager->headset_list, headset_list_unref_each, amanager); +		g_slist_foreach(amanager->headset_list, (GFunc) audio_headset_unref, +				amanager);  		g_slist_free(amanager->headset_list);  		amanager->headset_list = NULL;  	} | 
