mirror of
				https://gitlab.freedesktop.org/pipewire/pipewire.git
				synced 2025-11-03 09:01:54 -05:00 
			
		
		
		
	bluez5: media-sink: Improvements for ASHA
Clean up as per feedback from Pauli and Barnabás.
This commit is contained in:
		
							parent
							
								
									b02b69b271
								
							
						
					
					
						commit
						1b6830f68f
					
				
					 1 changed files with 16 additions and 26 deletions
				
			
		| 
						 | 
					@ -116,8 +116,6 @@ struct spa_bt_asha {
 | 
				
			||||||
	uint8_t seqnum_pending;
 | 
						uint8_t seqnum_pending;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	uint64_t ref_t0;
 | 
						uint64_t ref_t0;
 | 
				
			||||||
	uint64_t skip_frames;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	uint64_t next_time;
 | 
						uint64_t next_time;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	unsigned int flush_pending:1;
 | 
						unsigned int flush_pending:1;
 | 
				
			||||||
| 
						 | 
					@ -216,8 +214,9 @@ struct impl {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#define CHECK_PORT(this,d,p)	((d) == SPA_DIRECTION_INPUT && (p) == 0)
 | 
					#define CHECK_PORT(this,d,p)	((d) == SPA_DIRECTION_INPUT && (p) == 0)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static struct spa_list asha_sinks;
 | 
					static struct spa_list asha_sinks = SPA_LIST_INIT(&asha_sinks);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					static void drop_frames(struct impl *this, uint32_t req);
 | 
				
			||||||
static uint64_t get_reference_time(struct impl *this, uint64_t *duration_ns_ret);
 | 
					static uint64_t get_reference_time(struct impl *this, uint64_t *duration_ns_ret);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static struct impl *find_other_asha(struct impl *this)
 | 
					static struct impl *find_other_asha(struct impl *this)
 | 
				
			||||||
| 
						 | 
					@ -380,14 +379,11 @@ static int set_asha_timer(struct impl *this, struct impl *other)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		/* Since the quantum and packet size aren't correlated, drop any samples from this
 | 
							/* Since the quantum and packet size aren't correlated, drop any samples from this
 | 
				
			||||||
		 * cycle that might have been used to send a packet starting in the previous cycle */
 | 
							 * cycle that might have been used to send a packet starting in the previous cycle */
 | 
				
			||||||
		this->asha->skip_frames = other_samples % this->process_duration;
 | 
							drop_frames(this, other_samples % this->process_duration);
 | 
				
			||||||
	} else {
 | 
						} else {
 | 
				
			||||||
		time = this->process_time;
 | 
							time = this->process_time;
 | 
				
			||||||
		this->asha->skip_frames = 0;
 | 
					 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	spa_log_debug(this->log, "will skip %"PRIu64 " frames", this->asha->skip_frames);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	this->asha->next_time = time;
 | 
						this->asha->next_time = time;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	return set_asha_timeout(this, this->asha->next_time);
 | 
						return set_asha_timeout(this, this->asha->next_time);
 | 
				
			||||||
| 
						 | 
					@ -903,14 +899,6 @@ again:
 | 
				
			||||||
		avail = d[0].chunk->size - port->ready_offset;
 | 
							avail = d[0].chunk->size - port->ready_offset;
 | 
				
			||||||
		avail /= port->frame_size;
 | 
							avail /= port->frame_size;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		if (is_asha && this->asha->skip_frames) {
 | 
					 | 
				
			||||||
			/* Skip initial frames if needed */
 | 
					 | 
				
			||||||
			uint64_t skip = SPA_MIN(this->asha->skip_frames, avail);
 | 
					 | 
				
			||||||
			spa_log_trace(this->log, "skipping %"PRIu64 " frames", skip);
 | 
					 | 
				
			||||||
			avail -= skip;
 | 
					 | 
				
			||||||
			this->asha->skip_frames -= skip;
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
		offs = index % d[0].maxsize;
 | 
							offs = index % d[0].maxsize;
 | 
				
			||||||
		n_frames = avail;
 | 
							n_frames = avail;
 | 
				
			||||||
		n_bytes = n_frames * port->frame_size;
 | 
							n_bytes = n_frames * port->frame_size;
 | 
				
			||||||
| 
						 | 
					@ -1330,16 +1318,16 @@ static void media_on_timeout(struct spa_source *source)
 | 
				
			||||||
static uint64_t asha_seqnum(struct impl *this)
 | 
					static uint64_t asha_seqnum(struct impl *this)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	uint64_t tn = get_reference_time(this, NULL);
 | 
						uint64_t tn = get_reference_time(this, NULL);
 | 
				
			||||||
	double dt = tn - this->asha->ref_t0;
 | 
						uint64_t dt = tn - this->asha->ref_t0;
 | 
				
			||||||
	double num_packets = dt / ASHA_CONN_INTERVAL;
 | 
						uint64_t num_packets = (dt + ASHA_CONN_INTERVAL / 2) / ASHA_CONN_INTERVAL;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	spa_log_trace(this->log, "%" PRIu64 " - %" PRIu64 " / 20ms = %g",
 | 
						spa_log_trace(this->log, "%" PRIu64 " - %" PRIu64 " / 20ms = %ld",
 | 
				
			||||||
			tn, this->asha->ref_t0, num_packets);
 | 
								tn, this->asha->ref_t0, num_packets);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if (this->asha->ref_t0 > tn)
 | 
						if (this->asha->ref_t0 > tn)
 | 
				
			||||||
		return 0;
 | 
							return 0;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	return (uint64_t)round(num_packets) % 256;
 | 
						return num_packets % 256;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static void media_asha_flush_timeout(struct spa_source *source)
 | 
					static void media_asha_flush_timeout(struct spa_source *source)
 | 
				
			||||||
| 
						 | 
					@ -1393,6 +1381,10 @@ static void media_asha_flush_timeout(struct spa_source *source)
 | 
				
			||||||
			asha->seqnum_pending = seqnum;
 | 
								asha->seqnum_pending = seqnum;
 | 
				
			||||||
			asha->poll_pending = true;
 | 
								asha->poll_pending = true;
 | 
				
			||||||
			asha->flush_pending = false;
 | 
								asha->flush_pending = false;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
								SPA_FLAG_UPDATE(asha->flush_source.mask, SPA_IO_OUT, 1);
 | 
				
			||||||
 | 
								spa_loop_update_source(this->data_loop, &asha->flush_source);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
			spa_log_warn(this->log, "%p: ASHA failed to flush %d seqnum on timer for %s, written:%d",
 | 
								spa_log_warn(this->log, "%p: ASHA failed to flush %d seqnum on timer for %s, written:%d",
 | 
				
			||||||
					this, seqnum, address, -errno);
 | 
										this, seqnum, address, -errno);
 | 
				
			||||||
			goto skip_flush;
 | 
								goto skip_flush;
 | 
				
			||||||
| 
						 | 
					@ -1435,6 +1427,9 @@ static void media_asha_cb(struct spa_source *source)
 | 
				
			||||||
			return;
 | 
								return;
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							SPA_FLAG_UPDATE(asha->flush_source.mask, SPA_IO_OUT, 0);
 | 
				
			||||||
 | 
							spa_loop_update_source(this->data_loop, &asha->flush_source);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		seqnum = asha->buf[0];
 | 
							seqnum = asha->buf[0];
 | 
				
			||||||
		written = send(asha->flush_source.fd, asha->buf,
 | 
							written = send(asha->flush_source.fd, asha->buf,
 | 
				
			||||||
				ASHA_ENCODED_PKT_SZ, MSG_DONTWAIT | MSG_NOSIGNAL);
 | 
									ASHA_ENCODED_PKT_SZ, MSG_DONTWAIT | MSG_NOSIGNAL);
 | 
				
			||||||
| 
						 | 
					@ -1595,7 +1590,7 @@ static int transport_start(struct impl *this)
 | 
				
			||||||
		asha->flush_source.data = this;
 | 
							asha->flush_source.data = this;
 | 
				
			||||||
		asha->flush_source.fd = this->transport->fd;
 | 
							asha->flush_source.fd = this->transport->fd;
 | 
				
			||||||
		asha->flush_source.func = media_asha_cb;
 | 
							asha->flush_source.func = media_asha_cb;
 | 
				
			||||||
		asha->flush_source.mask = SPA_IO_OUT | SPA_IO_ERR | SPA_IO_HUP;
 | 
							asha->flush_source.mask = SPA_IO_ERR | SPA_IO_HUP;
 | 
				
			||||||
		asha->flush_source.rmask = 0;
 | 
							asha->flush_source.rmask = 0;
 | 
				
			||||||
		spa_loop_add_source(this->data_loop, &asha->flush_source);
 | 
							spa_loop_add_source(this->data_loop, &asha->flush_source);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -1791,7 +1786,7 @@ static void emit_node_info(struct impl *this, bool full)
 | 
				
			||||||
				this->transport->bap_big);
 | 
									this->transport->bap_big);
 | 
				
			||||||
		node_group = node_group_buf;
 | 
							node_group = node_group_buf;
 | 
				
			||||||
	} else if (this->transport && (this->transport->profile & SPA_BT_PROFILE_ASHA_SINK)) {
 | 
						} else if (this->transport && (this->transport->profile & SPA_BT_PROFILE_ASHA_SINK)) {
 | 
				
			||||||
		spa_scnprintf(node_group_buf, sizeof(node_group_buf), "[\"bluez-asha-%zd\"]",
 | 
							spa_scnprintf(node_group_buf, sizeof(node_group_buf), "[\"bluez-asha-%" PRIu64 "d\"]",
 | 
				
			||||||
				this->transport->hisyncid);
 | 
									this->transport->hisyncid);
 | 
				
			||||||
		node_group = node_group_buf;
 | 
							node_group = node_group_buf;
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
| 
						 | 
					@ -2578,11 +2573,6 @@ impl_init(const struct spa_handle_factory *factory,
 | 
				
			||||||
		if (this->asha == NULL)
 | 
							if (this->asha == NULL)
 | 
				
			||||||
			return -ENOMEM;
 | 
								return -ENOMEM;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		if (!spa_list_is_initialized(&asha_sinks)) {
 | 
					 | 
				
			||||||
			spa_list_init(&asha_sinks);
 | 
					 | 
				
			||||||
			spa_log_info(this->log, "Initialized ASHA media sink list");
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
		this->asha->timerfd = spa_system_timerfd_create(this->data_system,
 | 
							this->asha->timerfd = spa_system_timerfd_create(this->data_system,
 | 
				
			||||||
				CLOCK_MONOTONIC, SPA_FD_CLOEXEC | SPA_FD_NONBLOCK);
 | 
									CLOCK_MONOTONIC, SPA_FD_CLOEXEC | SPA_FD_NONBLOCK);
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue