mirror of
				https://gitlab.freedesktop.org/pipewire/pipewire.git
				synced 2025-11-03 09:01:54 -05:00 
			
		
		
		
	pulse-server: implement flush for record stream
This commit is contained in:
		
							parent
							
								
									8c0f27c016
								
							
						
					
					
						commit
						c50b5bb072
					
				
					 1 changed files with 24 additions and 20 deletions
				
			
		| 
						 | 
				
			
			@ -186,7 +186,6 @@ struct stream {
 | 
			
		|||
	unsigned int volume_set:1;
 | 
			
		||||
	unsigned int muted_set:1;
 | 
			
		||||
	unsigned int adjust_latency:1;
 | 
			
		||||
	unsigned int have_time:1;
 | 
			
		||||
	unsigned int is_underrun:1;
 | 
			
		||||
	unsigned int in_prebuf:1;
 | 
			
		||||
	unsigned int done:1;
 | 
			
		||||
| 
						 | 
				
			
			@ -799,21 +798,6 @@ static int do_subscribe(struct client *client, uint32_t command, uint32_t tag, s
 | 
			
		|||
	return reply_simple_ack(client, tag);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static void stream_flush(struct stream *stream)
 | 
			
		||||
{
 | 
			
		||||
	stream->write_index = stream->read_index =
 | 
			
		||||
		stream->ring.writeindex = stream->ring.readindex;
 | 
			
		||||
	stream->missing = stream->attr.tlength;
 | 
			
		||||
 | 
			
		||||
	if (stream->attr.prebuf > 0)
 | 
			
		||||
		stream->in_prebuf = true;
 | 
			
		||||
 | 
			
		||||
	stream->playing_for = 0;
 | 
			
		||||
	stream->underrun_for = 0;
 | 
			
		||||
	stream->have_time = false;
 | 
			
		||||
	stream->is_underrun = true;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static void stream_free(struct stream *stream)
 | 
			
		||||
{
 | 
			
		||||
	struct client *client = stream->client;
 | 
			
		||||
| 
						 | 
				
			
			@ -827,7 +811,6 @@ static void stream_free(struct stream *stream)
 | 
			
		|||
 | 
			
		||||
	if (stream->channel != SPA_ID_INVALID)
 | 
			
		||||
		pw_map_remove(&client->streams, stream->channel);
 | 
			
		||||
	stream_flush(stream);
 | 
			
		||||
	if (stream->stream) {
 | 
			
		||||
		spa_hook_remove(&stream->stream_listener);
 | 
			
		||||
		pw_stream_destroy(stream->stream);
 | 
			
		||||
| 
						 | 
				
			
			@ -2413,6 +2396,29 @@ static int do_cork_stream(struct client *client, uint32_t command, uint32_t tag,
 | 
			
		|||
	return reply_simple_ack(client, tag);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static void stream_flush(struct stream *stream)
 | 
			
		||||
{
 | 
			
		||||
	pw_stream_flush(stream->stream, false);
 | 
			
		||||
 | 
			
		||||
	if (stream->type == STREAM_TYPE_PLAYBACK) {
 | 
			
		||||
		stream->write_index = stream->read_index =
 | 
			
		||||
			stream->ring.writeindex = stream->ring.readindex;
 | 
			
		||||
		stream->missing = stream->attr.tlength;
 | 
			
		||||
 | 
			
		||||
		if (stream->attr.prebuf > 0)
 | 
			
		||||
			stream->in_prebuf = true;
 | 
			
		||||
 | 
			
		||||
		stream->playing_for = 0;
 | 
			
		||||
		stream->underrun_for = 0;
 | 
			
		||||
		stream->is_underrun = true;
 | 
			
		||||
 | 
			
		||||
		send_command_request(stream);
 | 
			
		||||
	} else {
 | 
			
		||||
		stream->read_index = stream->write_index =
 | 
			
		||||
			stream->ring.readindex = stream->ring.writeindex;
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static int do_flush_trigger_prebuf_stream(struct client *client, uint32_t command, uint32_t tag, struct message *m)
 | 
			
		||||
{
 | 
			
		||||
	struct impl *impl = client->impl;
 | 
			
		||||
| 
						 | 
				
			
			@ -2429,15 +2435,13 @@ static int do_flush_trigger_prebuf_stream(struct client *client, uint32_t comman
 | 
			
		|||
			impl, client->name, commands[command].name, tag, channel);
 | 
			
		||||
 | 
			
		||||
	stream = pw_map_lookup(&client->streams, channel);
 | 
			
		||||
	if (stream == NULL || stream->type != STREAM_TYPE_PLAYBACK)
 | 
			
		||||
	if (stream == NULL || stream->type == STREAM_TYPE_UPLOAD)
 | 
			
		||||
		return -ENOENT;
 | 
			
		||||
 | 
			
		||||
	switch (command) {
 | 
			
		||||
	case COMMAND_FLUSH_PLAYBACK_STREAM:
 | 
			
		||||
	case COMMAND_FLUSH_RECORD_STREAM:
 | 
			
		||||
		pw_stream_flush(stream->stream, false);
 | 
			
		||||
		stream_flush(stream);
 | 
			
		||||
		send_command_request(stream);
 | 
			
		||||
		break;
 | 
			
		||||
	case COMMAND_TRIGGER_PLAYBACK_STREAM:
 | 
			
		||||
	case COMMAND_PREBUF_PLAYBACK_STREAM:
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue