mirror of
				https://gitlab.freedesktop.org/pipewire/pipewire.git
				synced 2025-11-03 09:01:54 -05:00 
			
		
		
		
	bluez5: indicate to LC3 plugin whether endpoint is sink/duplex
The codec can make use of information on whether the endpoint is sink, and whether there will be both sink and source configured.
This commit is contained in:
		
							parent
							
								
									9474030582
								
							
						
					
					
						commit
						08819e3d17
					
				
					 2 changed files with 24 additions and 3 deletions
				
			
		| 
						 | 
					@ -44,6 +44,8 @@ struct pac_data {
 | 
				
			||||||
	int index;
 | 
						int index;
 | 
				
			||||||
	uint32_t locations;
 | 
						uint32_t locations;
 | 
				
			||||||
	uint32_t channel_allocation;
 | 
						uint32_t channel_allocation;
 | 
				
			||||||
 | 
						bool sink;
 | 
				
			||||||
 | 
						bool duplex;
 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
typedef struct {
 | 
					typedef struct {
 | 
				
			||||||
| 
						 | 
					@ -52,6 +54,8 @@ typedef struct {
 | 
				
			||||||
	uint32_t channels;
 | 
						uint32_t channels;
 | 
				
			||||||
	uint16_t framelen;
 | 
						uint16_t framelen;
 | 
				
			||||||
	uint8_t n_blks;
 | 
						uint8_t n_blks;
 | 
				
			||||||
 | 
						bool sink;
 | 
				
			||||||
 | 
						bool duplex;
 | 
				
			||||||
} bap_lc3_t;
 | 
					} bap_lc3_t;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static const struct {
 | 
					static const struct {
 | 
				
			||||||
| 
						 | 
					@ -282,6 +286,9 @@ static bool select_config(bap_lc3_t *conf, const struct pac_data *pac,	struct sp
 | 
				
			||||||
		return false;
 | 
							return false;
 | 
				
			||||||
	memset(conf, 0, sizeof(*conf));
 | 
						memset(conf, 0, sizeof(*conf));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						conf->sink = pac->sink;
 | 
				
			||||||
 | 
						conf->duplex = pac->duplex;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	conf->frame_duration = 0xFF;
 | 
						conf->frame_duration = 0xFF;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	/* XXX: we always use one frame block */
 | 
						/* XXX: we always use one frame block */
 | 
				
			||||||
| 
						 | 
					@ -514,6 +521,7 @@ static int conf_cmp(const bap_lc3_t *conf1, int res1, const bap_lc3_t *conf2, in
 | 
				
			||||||
	PREFER_BOOL(conf->channels & LC3_CHAN_1);
 | 
						PREFER_BOOL(conf->channels & LC3_CHAN_1);
 | 
				
			||||||
	PREFER_BOOL(conf->rate & (LC3_CONFIG_FREQ_48KHZ | LC3_CONFIG_FREQ_32KHZ | \
 | 
						PREFER_BOOL(conf->rate & (LC3_CONFIG_FREQ_48KHZ | LC3_CONFIG_FREQ_32KHZ | \
 | 
				
			||||||
		LC3_CONFIG_FREQ_24KHZ | LC3_CONFIG_FREQ_16KHZ | LC3_CONFIG_FREQ_8KHZ));
 | 
							LC3_CONFIG_FREQ_24KHZ | LC3_CONFIG_FREQ_16KHZ | LC3_CONFIG_FREQ_8KHZ));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	PREFER_BOOL(conf->rate & LC3_CONFIG_FREQ_48KHZ);
 | 
						PREFER_BOOL(conf->rate & LC3_CONFIG_FREQ_48KHZ);
 | 
				
			||||||
	PREFER_BOOL(conf->rate & LC3_CONFIG_FREQ_32KHZ);
 | 
						PREFER_BOOL(conf->rate & LC3_CONFIG_FREQ_32KHZ);
 | 
				
			||||||
	PREFER_BOOL(conf->rate & LC3_CONFIG_FREQ_24KHZ);
 | 
						PREFER_BOOL(conf->rate & LC3_CONFIG_FREQ_24KHZ);
 | 
				
			||||||
| 
						 | 
					@ -551,6 +559,7 @@ static int codec_select_config(const struct media_codec *codec, uint32_t flags,
 | 
				
			||||||
	uint8_t *data = config;
 | 
						uint8_t *data = config;
 | 
				
			||||||
	uint32_t locations = 0;
 | 
						uint32_t locations = 0;
 | 
				
			||||||
	uint32_t channel_allocation = 0;
 | 
						uint32_t channel_allocation = 0;
 | 
				
			||||||
 | 
						bool sink = false, duplex = false;
 | 
				
			||||||
	struct spa_debug_log_ctx debug_ctx = SPA_LOG_DEBUG_INIT(log, SPA_LOG_LEVEL_TRACE);
 | 
						struct spa_debug_log_ctx debug_ctx = SPA_LOG_DEBUG_INIT(log, SPA_LOG_LEVEL_TRACE);
 | 
				
			||||||
	int i;
 | 
						int i;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -567,6 +576,12 @@ static int codec_select_config(const struct media_codec *codec, uint32_t flags,
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		if (spa_atob(spa_dict_lookup(settings, "bluez5.bap.debug")))
 | 
							if (spa_atob(spa_dict_lookup(settings, "bluez5.bap.debug")))
 | 
				
			||||||
			debug_ctx = SPA_LOG_DEBUG_INIT(log, SPA_LOG_LEVEL_DEBUG);
 | 
								debug_ctx = SPA_LOG_DEBUG_INIT(log, SPA_LOG_LEVEL_DEBUG);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							/* Is remote endpoint sink or source */
 | 
				
			||||||
 | 
							sink = spa_atob(spa_dict_lookup(settings, "bluez5.bap.sink"));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							/* Is remote endpoint duplex */
 | 
				
			||||||
 | 
							duplex = spa_atob(spa_dict_lookup(settings, "bluez5.bap.duplex"));
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	/* Select best conf from those possible */
 | 
						/* Select best conf from those possible */
 | 
				
			||||||
| 
						 | 
					@ -582,6 +597,8 @@ static int codec_select_config(const struct media_codec *codec, uint32_t flags,
 | 
				
			||||||
	for (i = 0; i < npacs; ++i) {
 | 
						for (i = 0; i < npacs; ++i) {
 | 
				
			||||||
		pacs[i].locations = locations;
 | 
							pacs[i].locations = locations;
 | 
				
			||||||
		pacs[i].channel_allocation = channel_allocation;
 | 
							pacs[i].channel_allocation = channel_allocation;
 | 
				
			||||||
 | 
							pacs[i].sink = sink;
 | 
				
			||||||
 | 
							pacs[i].duplex = duplex;
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	qsort(pacs, npacs, sizeof(struct pac_data), pac_cmp);
 | 
						qsort(pacs, npacs, sizeof(struct pac_data), pac_cmp);
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -882,10 +882,10 @@ static DBusHandlerResult endpoint_select_properties(DBusConnection *conn, DBusMe
 | 
				
			||||||
	int res;
 | 
						int res;
 | 
				
			||||||
	const struct media_codec *codec;
 | 
						const struct media_codec *codec;
 | 
				
			||||||
	struct spa_bt_remote_endpoint *ep;
 | 
						struct spa_bt_remote_endpoint *ep;
 | 
				
			||||||
	bool sink;
 | 
						bool sink, duplex;
 | 
				
			||||||
	const char *err_msg = "Unknown error";
 | 
						const char *err_msg = "Unknown error";
 | 
				
			||||||
	struct spa_dict settings;
 | 
						struct spa_dict settings;
 | 
				
			||||||
	struct spa_dict_item setting_items[SPA_N_ELEMENTS(monitor->global_setting_items) + 3];
 | 
						struct spa_dict_item setting_items[SPA_N_ELEMENTS(monitor->global_setting_items) + 5];
 | 
				
			||||||
	int i;
 | 
						int i;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	const char *endpoint_path = NULL;
 | 
						const char *endpoint_path = NULL;
 | 
				
			||||||
| 
						 | 
					@ -933,11 +933,13 @@ static DBusHandlerResult endpoint_select_properties(DBusConnection *conn, DBusMe
 | 
				
			||||||
		spa_scnprintf(channel_allocation, sizeof(channel_allocation), "%"PRIu32, endpoint_qos.channel_allocation);
 | 
							spa_scnprintf(channel_allocation, sizeof(channel_allocation), "%"PRIu32, endpoint_qos.channel_allocation);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	ep = remote_endpoint_find(monitor, endpoint_path);
 | 
						ep = remote_endpoint_find(monitor, endpoint_path);
 | 
				
			||||||
	if (!ep) {
 | 
						if (!ep || !ep->device) {
 | 
				
			||||||
		spa_log_warn(monitor->log, "Unable to find remote endpoint for %s", endpoint_path);
 | 
							spa_log_warn(monitor->log, "Unable to find remote endpoint for %s", endpoint_path);
 | 
				
			||||||
		goto error_invalid;
 | 
							goto error_invalid;
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						duplex = SPA_FLAG_IS_SET(ep->device->profiles, SPA_BT_PROFILE_BAP_DUPLEX);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	/* Call of SelectProperties means that local device acts as an initiator
 | 
						/* Call of SelectProperties means that local device acts as an initiator
 | 
				
			||||||
	 * and therefor remote endpoint is an acceptor
 | 
						 * and therefor remote endpoint is an acceptor
 | 
				
			||||||
	 */
 | 
						 */
 | 
				
			||||||
| 
						 | 
					@ -947,6 +949,8 @@ static DBusHandlerResult endpoint_select_properties(DBusConnection *conn, DBusMe
 | 
				
			||||||
		setting_items[i] = monitor->global_settings.items[i];
 | 
							setting_items[i] = monitor->global_settings.items[i];
 | 
				
			||||||
	setting_items[i++] = SPA_DICT_ITEM_INIT("bluez5.bap.locations", locations);
 | 
						setting_items[i++] = SPA_DICT_ITEM_INIT("bluez5.bap.locations", locations);
 | 
				
			||||||
	setting_items[i++] = SPA_DICT_ITEM_INIT("bluez5.bap.channel-allocation", channel_allocation);
 | 
						setting_items[i++] = SPA_DICT_ITEM_INIT("bluez5.bap.channel-allocation", channel_allocation);
 | 
				
			||||||
 | 
						setting_items[i++] = SPA_DICT_ITEM_INIT("bluez5.bap.sink", sink ? "true" : "false");
 | 
				
			||||||
 | 
						setting_items[i++] = SPA_DICT_ITEM_INIT("bluez5.bap.duplex", duplex ? "true" : "false");
 | 
				
			||||||
	setting_items[i++] = SPA_DICT_ITEM_INIT("bluez5.bap.debug", "true");
 | 
						setting_items[i++] = SPA_DICT_ITEM_INIT("bluez5.bap.debug", "true");
 | 
				
			||||||
	settings = SPA_DICT_INIT(setting_items, i);
 | 
						settings = SPA_DICT_INIT(setting_items, i);
 | 
				
			||||||
	spa_assert((size_t)i <= SPA_N_ELEMENTS(setting_items));
 | 
						spa_assert((size_t)i <= SPA_N_ELEMENTS(setting_items));
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue