mirror of
				https://gitlab.freedesktop.org/pipewire/pipewire.git
				synced 2025-11-03 09:01:54 -05:00 
			
		
		
		
	adapter: increase max-retry to 64
When the follower doesn't produce enough data for this many attempts, bail and cause an xrun to avoid an infinite loop. The limit of 8 cause real-life problems and should be larger. It should probably depend on the expected size per cycle (node.latency) and the current quantum but we don't always have this information. See #4334
This commit is contained in:
		
							parent
							
								
									885f8ab517
								
							
						
					
					
						commit
						c132a67c7d
					
				
					 2 changed files with 6 additions and 4 deletions
				
			
		| 
						 | 
					@ -33,6 +33,7 @@ SPA_LOG_TOPIC_DEFINE_STATIC(log_topic, "spa.audioadapter");
 | 
				
			||||||
#define DEFAULT_ALIGN	16
 | 
					#define DEFAULT_ALIGN	16
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#define MAX_PORTS	(SPA_AUDIO_MAX_CHANNELS+1)
 | 
					#define MAX_PORTS	(SPA_AUDIO_MAX_CHANNELS+1)
 | 
				
			||||||
 | 
					#define MAX_RETRY	64
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/** \cond */
 | 
					/** \cond */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -1393,7 +1394,7 @@ static int follower_ready(void *data, int status)
 | 
				
			||||||
		this->driver = true;
 | 
							this->driver = true;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		if (this->direction == SPA_DIRECTION_OUTPUT) {
 | 
							if (this->direction == SPA_DIRECTION_OUTPUT) {
 | 
				
			||||||
			int retry = 8;
 | 
								int retry = MAX_RETRY;
 | 
				
			||||||
			while (retry--) {
 | 
								while (retry--) {
 | 
				
			||||||
				status = spa_node_process_fast(this->convert);
 | 
									status = spa_node_process_fast(this->convert);
 | 
				
			||||||
				if (status & SPA_STATUS_HAVE_DATA)
 | 
									if (status & SPA_STATUS_HAVE_DATA)
 | 
				
			||||||
| 
						 | 
					@ -1621,7 +1622,7 @@ impl_node_port_reuse_buffer(void *object, uint32_t port_id, uint32_t buffer_id)
 | 
				
			||||||
static int impl_node_process(void *object)
 | 
					static int impl_node_process(void *object)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	struct impl *this = object;
 | 
						struct impl *this = object;
 | 
				
			||||||
	int status = 0, fstatus, retry = 8;
 | 
						int status = 0, fstatus, retry = MAX_RETRY;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if (!this->ready) {
 | 
						if (!this->ready) {
 | 
				
			||||||
		if (!this->warned)
 | 
							if (!this->warned)
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -34,6 +34,7 @@ SPA_LOG_TOPIC_DEFINE_STATIC(log_topic, "spa.videoadapter");
 | 
				
			||||||
#define DEFAULT_ALIGN	16
 | 
					#define DEFAULT_ALIGN	16
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#define MAX_PORTS	(1+1)
 | 
					#define MAX_PORTS	(1+1)
 | 
				
			||||||
 | 
					#define MAX_RETRY	64
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/** \cond */
 | 
					/** \cond */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -1366,7 +1367,7 @@ static int follower_ready(void *data, int status)
 | 
				
			||||||
		this->driver = true;
 | 
							this->driver = true;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		if (this->direction == SPA_DIRECTION_OUTPUT) {
 | 
							if (this->direction == SPA_DIRECTION_OUTPUT) {
 | 
				
			||||||
			int retry = 8;
 | 
								int retry = MAX_RETRY;
 | 
				
			||||||
			while (retry--) {
 | 
								while (retry--) {
 | 
				
			||||||
				status = spa_node_process(this->convert);
 | 
									status = spa_node_process(this->convert);
 | 
				
			||||||
				if (status & SPA_STATUS_HAVE_DATA)
 | 
									if (status & SPA_STATUS_HAVE_DATA)
 | 
				
			||||||
| 
						 | 
					@ -1596,7 +1597,7 @@ impl_node_port_reuse_buffer(void *object, uint32_t port_id, uint32_t buffer_id)
 | 
				
			||||||
static int impl_node_process(void *object)
 | 
					static int impl_node_process(void *object)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	struct impl *this = object;
 | 
						struct impl *this = object;
 | 
				
			||||||
	int status = 0, fstatus, retry = 8;
 | 
						int status = 0, fstatus, retry = MAX_RETRY;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if (!this->ready) {
 | 
						if (!this->ready) {
 | 
				
			||||||
		if (!this->warned)
 | 
							if (!this->warned)
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue