mirror of
				https://gitlab.freedesktop.org/pipewire/pipewire.git
				synced 2025-11-03 09:01:54 -05:00 
			
		
		
		
	spa: make a new FREEWHEEL clock flag
When freewheeling, the clock is going faster than real time. When freewheeling, skip samples in alsa sink/source.
This commit is contained in:
		
							parent
							
								
									fab199d5b9
								
							
						
					
					
						commit
						efc497a38a
					
				
					 6 changed files with 22 additions and 2 deletions
				
			
		| 
						 | 
				
			
			@ -364,6 +364,7 @@ struct client {
 | 
			
		|||
	unsigned int merge_monitor:1;
 | 
			
		||||
	unsigned int short_name:1;
 | 
			
		||||
	unsigned int filter_name:1;
 | 
			
		||||
	unsigned int freewheeling:1;
 | 
			
		||||
	int self_connect_mode;
 | 
			
		||||
 | 
			
		||||
	jack_position_t jack_position;
 | 
			
		||||
| 
						 | 
				
			
			@ -1393,8 +1394,17 @@ do_update_driver_activation(struct spa_loop *loop,
 | 
			
		|||
static int update_driver_activation(struct client *c)
 | 
			
		||||
{
 | 
			
		||||
	struct link *link;
 | 
			
		||||
	bool freewheeling;
 | 
			
		||||
 | 
			
		||||
	pw_log_debug(NAME" %p: driver %d", c, c->driver_id);
 | 
			
		||||
 | 
			
		||||
	freewheeling = SPA_FLAG_IS_SET(c->position->clock.flags, SPA_IO_CLOCK_FLAG_FREEWHEEL);
 | 
			
		||||
	if (c->freewheeling != freewheeling) {
 | 
			
		||||
		c->freewheeling = freewheeling;
 | 
			
		||||
		if (c->freewheel_callback)
 | 
			
		||||
			c->freewheel_callback(freewheeling, c->freewheel_arg);
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	link = find_activation(&c->links, c->driver_id);
 | 
			
		||||
	c->driver_activation = link ? link->activation : NULL;
 | 
			
		||||
	pw_data_loop_invoke(c->loop,
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -125,6 +125,7 @@ struct spa_io_range {
 | 
			
		|||
 * since the provider was last started.
 | 
			
		||||
 */
 | 
			
		||||
struct spa_io_clock {
 | 
			
		||||
#define SPA_IO_CLOCK_FLAG_FREEWHEEL (1u<<0)
 | 
			
		||||
	uint32_t flags;			/**< clock flags */
 | 
			
		||||
	uint32_t id;			/**< unique clock id, set by application */
 | 
			
		||||
	char name[64];			/**< clock name prefixed with API, set by node. The clock name
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -640,8 +640,9 @@ static int impl_node_process(void *object)
 | 
			
		|||
	spa_log_trace_fp(this->log, NAME " %p: process %d %d/%d", this, input->status,
 | 
			
		||||
			input->buffer_id,
 | 
			
		||||
			this->n_buffers);
 | 
			
		||||
 | 
			
		||||
	if (input->status == SPA_STATUS_HAVE_DATA &&
 | 
			
		||||
	if (this->position && this->position->clock.flags & SPA_IO_CLOCK_FLAG_FREEWHEEL) {
 | 
			
		||||
		input->status = SPA_STATUS_NEED_DATA;
 | 
			
		||||
	} else if (input->status == SPA_STATUS_HAVE_DATA &&
 | 
			
		||||
	    input->buffer_id < this->n_buffers) {
 | 
			
		||||
		struct buffer *b = &this->buffers[input->buffer_id];
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -666,6 +666,12 @@ static int impl_node_process(void *object)
 | 
			
		|||
		spa_alsa_recycle_buffer(this, io->buffer_id);
 | 
			
		||||
		io->buffer_id = SPA_ID_INVALID;
 | 
			
		||||
	}
 | 
			
		||||
	if (this->position && this->position->clock.flags & SPA_IO_CLOCK_FLAG_FREEWHEEL) {
 | 
			
		||||
		spa_log_info(this->log, NAME " %p:freewheel", this);
 | 
			
		||||
		io->status = SPA_STATUS_HAVE_DATA;
 | 
			
		||||
		io->buffer_id = 0;
 | 
			
		||||
		return SPA_STATUS_HAVE_DATA;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	if (spa_list_is_empty(&this->ready) && this->following)
 | 
			
		||||
		spa_alsa_read(this, 0);
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -864,6 +864,7 @@ static void check_properties(struct pw_impl_node *node)
 | 
			
		|||
	if (strcmp(str, node->group) != 0) {
 | 
			
		||||
		pw_log_info(NAME" %p: group '%s'->'%s'", node, node->group, str);
 | 
			
		||||
		snprintf(node->group, sizeof(node->group), "%s", str);
 | 
			
		||||
		node->freewheel = strcmp(node->group, "pipewire.freewheel") == 0;
 | 
			
		||||
		recalc_reason = "group changed";
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -636,6 +636,7 @@ struct pw_impl_node {
 | 
			
		|||
	unsigned int visited:1;		/**< for sorting */
 | 
			
		||||
	unsigned int want_driver:1;	/**< this node wants to be assigned to a driver */
 | 
			
		||||
	unsigned int passive:1;		/**< driver graph only has passive links */
 | 
			
		||||
	unsigned int freewheel:1;	/**< if this is the freewheel driver */
 | 
			
		||||
 | 
			
		||||
	uint32_t port_user_data_size;	/**< extra size for port user data */
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue