diff options
| -rw-r--r-- | audio/a2dp.c | 22 | 
1 files changed, 21 insertions, 1 deletions
| diff --git a/audio/a2dp.c b/audio/a2dp.c index f0ada567..b364cf8d 100644 --- a/audio/a2dp.c +++ b/audio/a2dp.c @@ -82,6 +82,7 @@ struct a2dp_setup {  	GSList *client_caps;  	gboolean reconfigure;  	gboolean canceled; +	gboolean start;  	GSList *cb;  	int ref;  }; @@ -586,6 +587,7 @@ static void suspend_cfm(struct avdtp *session, struct avdtp_local_sep *sep,  {  	struct a2dp_sep *a2dp_sep = user_data;  	struct a2dp_setup *setup; +	gboolean start;  	if (a2dp_sep->type == AVDTP_SEP_TYPE_SINK)  		debug("SBC Sink: Suspend_Cfm"); @@ -598,12 +600,27 @@ static void suspend_cfm(struct avdtp *session, struct avdtp_local_sep *sep,  	if (!setup)  		return; +	start = setup->start; +	setup->start = FALSE; +  	if (err) {  		setup->stream = NULL;  		finalize_suspend(setup, err);  	}  	else  		finalize_suspend_errno(setup, 0); + +	if (!start) +		return; + +	if (err) +		finalize_resume(setup, err); +	else if (avdtp_start(session, a2dp_sep->stream) < 0) { +		struct avdtp_error start_err; +		error("avdtp_start failed"); +		avdtp_error_init(&start_err, AVDTP_ERROR_ERRNO, EIO); +		finalize_resume(setup, &start_err); +	}  }  static gboolean close_ind(struct avdtp *session, struct avdtp_local_sep *sep, @@ -1116,7 +1133,10 @@ unsigned int a2dp_source_resume(struct avdtp *session, struct a2dp_sep *sep,  			avdtp_unref(sep->session);  			sep->session = NULL;  		} -		g_idle_add((GSourceFunc) finalize_resume, setup); +		if (sep->suspending) +			setup->start = TRUE; +		else +			g_idle_add((GSourceFunc) finalize_resume, setup);  		break;  	default:  		error("SEP in bad state"); | 
