mirror of
				https://gitlab.freedesktop.org/pulseaudio/pulseaudio.git
				synced 2025-11-03 09:01:50 -05:00 
			
		
		
		
	bluetooth: Set off profile on SCO disconnect
Sends a message from IO thread to main thread using pa_msgobject when POLLERR or POLLHUP is received on SCO socket.
This commit is contained in:
		
							parent
							
								
									2c213607e2
								
							
						
					
					
						commit
						2f24a6e627
					
				
					 1 changed files with 42 additions and 0 deletions
				
			
		| 
						 | 
				
			
			@ -126,6 +126,15 @@ struct hsp_info {
 | 
			
		|||
    pa_hook_slot *source_state_changed_slot;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
struct bluetooth_msg {
 | 
			
		||||
    pa_msgobject parent;
 | 
			
		||||
    pa_card *card;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
typedef struct bluetooth_msg bluetooth_msg;
 | 
			
		||||
PA_DEFINE_PRIVATE_CLASS(bluetooth_msg, pa_msgobject);
 | 
			
		||||
#define BLUETOOTH_MSG(o) (bluetooth_msg_cast(o))
 | 
			
		||||
 | 
			
		||||
struct userdata {
 | 
			
		||||
    pa_core *core;
 | 
			
		||||
    pa_module *module;
 | 
			
		||||
| 
						 | 
				
			
			@ -148,6 +157,7 @@ struct userdata {
 | 
			
		|||
    pa_rtpoll *rtpoll;
 | 
			
		||||
    pa_rtpoll_item *rtpoll_item;
 | 
			
		||||
    pa_thread *thread;
 | 
			
		||||
    bluetooth_msg *msg;
 | 
			
		||||
 | 
			
		||||
    uint64_t read_index, write_index;
 | 
			
		||||
    pa_usec_t started_at;
 | 
			
		||||
| 
						 | 
				
			
			@ -176,6 +186,11 @@ struct userdata {
 | 
			
		|||
    pa_bool_t filter_added;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
enum {
 | 
			
		||||
    BLUETOOTH_MESSAGE_SET_PROFILE,
 | 
			
		||||
    BLUETOOTH_MESSAGE_MAX
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
#define FIXED_LATENCY_PLAYBACK_A2DP (25*PA_USEC_PER_MSEC)
 | 
			
		||||
#define FIXED_LATENCY_RECORD_A2DP (25*PA_USEC_PER_MSEC)
 | 
			
		||||
#define FIXED_LATENCY_PLAYBACK_HSP (125*PA_USEC_PER_MSEC)
 | 
			
		||||
| 
						 | 
				
			
			@ -1115,6 +1130,23 @@ static int source_process_msg(pa_msgobject *o, int code, void *data, int64_t off
 | 
			
		|||
    return (r < 0 || !failed) ? r : -1;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/* Called from main thread context */
 | 
			
		||||
static int device_process_msg(pa_msgobject *obj, int code, void *data, int64_t offset, pa_memchunk *chunk) {
 | 
			
		||||
    struct bluetooth_msg *u = BLUETOOTH_MSG(obj);
 | 
			
		||||
 | 
			
		||||
    switch (code) {
 | 
			
		||||
        case BLUETOOTH_MESSAGE_SET_PROFILE: {
 | 
			
		||||
            const char *profile = data;
 | 
			
		||||
            pa_log_debug("Switch profile to %s requested", profile);
 | 
			
		||||
 | 
			
		||||
            if (pa_card_set_profile(u->card, profile, FALSE) < 0)
 | 
			
		||||
                pa_log_debug("Failed to switch profile to %s", profile);
 | 
			
		||||
            break;
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
    return 0;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/* Run from IO thread */
 | 
			
		||||
static int hsp_process_render(struct userdata *u) {
 | 
			
		||||
    int ret = 0;
 | 
			
		||||
| 
						 | 
				
			
			@ -1721,6 +1753,7 @@ static void thread_func(void *userdata) {
 | 
			
		|||
fail:
 | 
			
		||||
    /* If this was no regular exit from the loop we have to continue processing messages until we receive PA_MESSAGE_SHUTDOWN */
 | 
			
		||||
    pa_log_debug("IO thread failed");
 | 
			
		||||
    pa_asyncmsgq_post(pa_thread_mq_get()->outq, PA_MSGOBJECT(u->msg), BLUETOOTH_MESSAGE_SET_PROFILE, "off", 0, NULL, NULL);
 | 
			
		||||
    pa_asyncmsgq_wait_for(u->thread_mq.inq, PA_MESSAGE_SHUTDOWN);
 | 
			
		||||
 | 
			
		||||
finish:
 | 
			
		||||
| 
						 | 
				
			
			@ -2881,6 +2914,12 @@ int pa__init(pa_module* m) {
 | 
			
		|||
    if (add_card(u, device) < 0)
 | 
			
		||||
        goto fail;
 | 
			
		||||
 | 
			
		||||
    if (!(u->msg = pa_msgobject_new(bluetooth_msg)))
 | 
			
		||||
        goto fail;
 | 
			
		||||
 | 
			
		||||
    u->msg->parent.process_msg = device_process_msg;
 | 
			
		||||
    u->msg->card = u->card;
 | 
			
		||||
 | 
			
		||||
    if (!dbus_connection_add_filter(pa_dbus_connection_get(u->connection), filter_cb, u, NULL)) {
 | 
			
		||||
        pa_log_error("Failed to add filter function");
 | 
			
		||||
        goto fail;
 | 
			
		||||
| 
						 | 
				
			
			@ -2981,6 +3020,9 @@ void pa__done(pa_module *m) {
 | 
			
		|||
        pa_dbus_connection_unref(u->connection);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    if (u->msg)
 | 
			
		||||
        pa_xfree(u->msg);
 | 
			
		||||
 | 
			
		||||
    if (u->card)
 | 
			
		||||
        pa_card_free(u->card);
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue