mirror of
				https://gitlab.freedesktop.org/pipewire/pipewire.git
				synced 2025-11-03 09:01:54 -05:00 
			
		
		
		
	a2dp: place buffer id in io when reusing
This commit is contained in:
		
							parent
							
								
									dd0f4c7295
								
							
						
					
					
						commit
						d7fb382b7b
					
				
					 1 changed files with 9 additions and 6 deletions
				
			
		| 
						 | 
					@ -64,7 +64,8 @@ struct props {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
struct buffer {
 | 
					struct buffer {
 | 
				
			||||||
	uint32_t id;
 | 
						uint32_t id;
 | 
				
			||||||
	unsigned int outstanding:1;
 | 
					#define BUFFER_FLAG_OUT	(1<<0)
 | 
				
			||||||
 | 
						uint32_t flags;
 | 
				
			||||||
	struct spa_buffer *buf;
 | 
						struct spa_buffer *buf;
 | 
				
			||||||
	struct spa_meta_header *h;
 | 
						struct spa_meta_header *h;
 | 
				
			||||||
	struct spa_list link;
 | 
						struct spa_list link;
 | 
				
			||||||
| 
						 | 
					@ -592,7 +593,8 @@ static int flush_data(struct impl *this, uint64_t now_time)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
			if (written < 0 && written != -ENOSPC) {
 | 
								if (written < 0 && written != -ENOSPC) {
 | 
				
			||||||
				spa_list_remove(&b->link);
 | 
									spa_list_remove(&b->link);
 | 
				
			||||||
				b->outstanding = true;
 | 
									SPA_FLAG_SET(b->flags, BUFFER_FLAG_OUT);
 | 
				
			||||||
 | 
									this->port.io->buffer_id = b->id;
 | 
				
			||||||
				spa_log_trace(this->log, NAME " %p: error %s, reuse buffer %u",
 | 
									spa_log_trace(this->log, NAME " %p: error %s, reuse buffer %u",
 | 
				
			||||||
						this, spa_strerror(written), b->id);
 | 
											this, spa_strerror(written), b->id);
 | 
				
			||||||
				spa_node_call_reuse_buffer(&this->callbacks, 0, b->id);
 | 
									spa_node_call_reuse_buffer(&this->callbacks, 0, b->id);
 | 
				
			||||||
| 
						 | 
					@ -607,8 +609,9 @@ static int flush_data(struct impl *this, uint64_t now_time)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		if (port->ready_offset >= d[0].chunk->size) {
 | 
							if (port->ready_offset >= d[0].chunk->size) {
 | 
				
			||||||
			spa_list_remove(&b->link);
 | 
								spa_list_remove(&b->link);
 | 
				
			||||||
			b->outstanding = true;
 | 
								SPA_FLAG_SET(b->flags, BUFFER_FLAG_OUT);
 | 
				
			||||||
			spa_log_trace(this->log, NAME " %p: reuse buffer %u", this, b->id);
 | 
								spa_log_trace(this->log, NAME " %p: reuse buffer %u", this, b->id);
 | 
				
			||||||
 | 
								this->port.io->buffer_id = b->id;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
			spa_node_call_reuse_buffer(&this->callbacks, 0, b->id);
 | 
								spa_node_call_reuse_buffer(&this->callbacks, 0, b->id);
 | 
				
			||||||
			port->ready_offset = 0;
 | 
								port->ready_offset = 0;
 | 
				
			||||||
| 
						 | 
					@ -1292,7 +1295,7 @@ impl_node_port_use_buffers(void *object,
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		b->buf = buffers[i];
 | 
							b->buf = buffers[i];
 | 
				
			||||||
		b->id = i;
 | 
							b->id = i;
 | 
				
			||||||
		b->outstanding = true;
 | 
							SPA_FLAG_SET(b->flags, BUFFER_FLAG_OUT);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		b->h = spa_buffer_find_meta_data(buffers[i], SPA_META_Header, sizeof(*b->h));
 | 
							b->h = spa_buffer_find_meta_data(buffers[i], SPA_META_Header, sizeof(*b->h));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -1359,7 +1362,7 @@ static int impl_node_process(void *object)
 | 
				
			||||||
	if (io->status == SPA_STATUS_HAVE_DATA && io->buffer_id < port->n_buffers) {
 | 
						if (io->status == SPA_STATUS_HAVE_DATA && io->buffer_id < port->n_buffers) {
 | 
				
			||||||
		struct buffer *b = &port->buffers[io->buffer_id];
 | 
							struct buffer *b = &port->buffers[io->buffer_id];
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		if (!b->outstanding) {
 | 
							if (!SPA_FLAG_SET(b->flags, BUFFER_FLAG_OUT)) {
 | 
				
			||||||
			spa_log_warn(this->log, NAME " %p: buffer %u in use", this, io->buffer_id);
 | 
								spa_log_warn(this->log, NAME " %p: buffer %u in use", this, io->buffer_id);
 | 
				
			||||||
			io->status = -EINVAL;
 | 
								io->status = -EINVAL;
 | 
				
			||||||
			return -EINVAL;
 | 
								return -EINVAL;
 | 
				
			||||||
| 
						 | 
					@ -1368,7 +1371,7 @@ static int impl_node_process(void *object)
 | 
				
			||||||
		spa_log_trace(this->log, NAME " %p: queue buffer %u", this, io->buffer_id);
 | 
							spa_log_trace(this->log, NAME " %p: queue buffer %u", this, io->buffer_id);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		spa_list_append(&port->ready, &b->link);
 | 
							spa_list_append(&port->ready, &b->link);
 | 
				
			||||||
		b->outstanding = false;
 | 
							SPA_FLAG_CLEAR(b->flags, BUFFER_FLAG_OUT);
 | 
				
			||||||
		port->need_data = false;
 | 
							port->need_data = false;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		this->threshold = SPA_MIN(b->buf->datas[0].chunk->size / port->frame_size,
 | 
							this->threshold = SPA_MIN(b->buf->datas[0].chunk->size / port->frame_size,
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue