mirror of
				https://gitlab.freedesktop.org/pipewire/pipewire.git
				synced 2025-11-03 09:01:54 -05:00 
			
		
		
		
	stream: expose the lazy flag with pw_stream_is_lazy()
Together with the is_driver() status, this can be used to check if the stream is using lazy scheduling or not.
This commit is contained in:
		
							parent
							
								
									f16f074725
								
							
						
					
					
						commit
						7abf11210d
					
				
					 4 changed files with 45 additions and 5 deletions
				
			
		| 
						 | 
				
			
			@ -2076,6 +2076,12 @@ bool pw_filter_is_driving(struct pw_filter *filter)
 | 
			
		|||
	return filter->node->driving;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
SPA_EXPORT
 | 
			
		||||
bool pw_filter_is_lazy(struct pw_filter *filter)
 | 
			
		||||
{
 | 
			
		||||
	return filter->node->lazy;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static int
 | 
			
		||||
do_trigger_process(struct spa_loop *loop,
 | 
			
		||||
                 bool async, uint32_t seq, const void *data, size_t size, void *user_data)
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -250,6 +250,10 @@ int pw_filter_flush(struct pw_filter *filter, bool drain);
 | 
			
		|||
 * available (output) or needed (input). Since 0.3.66 */
 | 
			
		||||
bool pw_filter_is_driving(struct pw_filter *filter);
 | 
			
		||||
 | 
			
		||||
/** Check if the graph is using lazy scheduling.
 | 
			
		||||
 * Since 1.4.0 */
 | 
			
		||||
bool pw_filter_is_lazy(struct pw_filter *filter);
 | 
			
		||||
 | 
			
		||||
/** Trigger a push/pull on the filter. One iteration of the graph will
 | 
			
		||||
 * be scheduled and process() will be called. Since 0.3.66 */
 | 
			
		||||
int pw_filter_trigger_process(struct pw_filter *filter);
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -2535,6 +2535,12 @@ bool pw_stream_is_driving(struct pw_stream *stream)
 | 
			
		|||
	return stream->node->driving;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
SPA_EXPORT
 | 
			
		||||
bool pw_stream_is_lazy(struct pw_stream *stream)
 | 
			
		||||
{
 | 
			
		||||
	return stream->node->lazy;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static int
 | 
			
		||||
do_trigger_driver(struct spa_loop *loop,
 | 
			
		||||
                 bool async, uint32_t seq, const void *data, size_t size, void *user_data)
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -614,16 +614,33 @@ int pw_stream_flush(struct pw_stream *stream, bool drain);
 | 
			
		|||
 * available (output) or needed (input). Since 0.3.34 */
 | 
			
		||||
bool pw_stream_is_driving(struct pw_stream *stream);
 | 
			
		||||
 | 
			
		||||
/** Check if the graph is using lazy scheduling. If the stream is
 | 
			
		||||
 * driving according to \ref pw_stream_is_driving(), then it should
 | 
			
		||||
 * consider taking into account the RequestProcess commands when
 | 
			
		||||
 * driving the graph.
 | 
			
		||||
 *
 | 
			
		||||
 * If the stream is not driving, it should send out RequestProcess
 | 
			
		||||
 * events with \ref pw_stream_emit_event() or indirectly with
 | 
			
		||||
 * \ref pw_stream_trigger_process() to suggest a new graph cycle
 | 
			
		||||
 * to the driver.
 | 
			
		||||
 *
 | 
			
		||||
 * It is not a requirement that all RequestProcess events/commands
 | 
			
		||||
 * need to start a graph cycle.
 | 
			
		||||
 * Since 1.4.0 */
 | 
			
		||||
bool pw_stream_is_lazy(struct pw_stream *stream);
 | 
			
		||||
 | 
			
		||||
/** Trigger a push/pull on the stream. One iteration of the graph will
 | 
			
		||||
 * be scheduled. If it successfully finishes, process() will be called.
 | 
			
		||||
 * It is possible for the graph iteration to not finish, so
 | 
			
		||||
 * be scheduled when the stream is driving according to
 | 
			
		||||
 * \ref pw_stream_is_driving(). If it successfully finishes, process()
 | 
			
		||||
 * will be called and the trigger_done event will be emitted. It is
 | 
			
		||||
 * possible for the graph iteration to not finish, so
 | 
			
		||||
 * pw_stream_trigger_process() needs to be called again even if process()
 | 
			
		||||
 * is not called.
 | 
			
		||||
 * and trigger_done is not called.
 | 
			
		||||
 *
 | 
			
		||||
 * If there is a deadline after which the stream will have xrun,
 | 
			
		||||
 * pw_stream_trigger_process() should be called then, whether or not
 | 
			
		||||
 * process() has been called. Sound hardware will xrun if there is
 | 
			
		||||
 * any delay in audio processing, so the ALSA plugin triggers the
 | 
			
		||||
 * process()/trigger_done has been called. Sound hardware will xrun if
 | 
			
		||||
 * there is any delay in audio processing, so the ALSA plugin triggers the
 | 
			
		||||
 * graph every quantum to ensure audio keeps flowing. Drivers that
 | 
			
		||||
 * do not have a deadline, such as the freewheel driver, should
 | 
			
		||||
 * use a timeout to ensure that forward progress keeps being made.
 | 
			
		||||
| 
						 | 
				
			
			@ -631,6 +648,13 @@ bool pw_stream_is_driving(struct pw_stream *stream);
 | 
			
		|||
 * the graph is taking 3x longer than normal, it is likely that it
 | 
			
		||||
 * is hung and should be retriggered.
 | 
			
		||||
 *
 | 
			
		||||
 * Streams that are not drivers according to \ref pw_stream_is_driving()
 | 
			
		||||
 * can also call this method. The result is that a RequestProcess event
 | 
			
		||||
 * is sent to the driver. If the graph is lazy scheduling according to
 | 
			
		||||
 * \ref pw_stream_is_lazy(), this might result in a graph cycle by the
 | 
			
		||||
 * driver. If the graph is not lazy scheduling and the stream is not a
 | 
			
		||||
 * driver, this method will have no effect.
 | 
			
		||||
 *
 | 
			
		||||
 * Since 0.3.34 */
 | 
			
		||||
int pw_stream_trigger_process(struct pw_stream *stream);
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue