mirror of
https://gitlab.freedesktop.org/pipewire/pipewire.git
synced 2025-11-01 22:58:50 -04:00
stream: add flush and drain command
This commit is contained in:
parent
754782f302
commit
9dba8f3a36
3 changed files with 41 additions and 5 deletions
|
|
@ -233,10 +233,10 @@ static inline void
|
|||
spa_graph_node_add(struct spa_graph *graph,
|
||||
struct spa_graph_node *node)
|
||||
{
|
||||
spa_debug("node %p add to graph %p", node, graph);
|
||||
node->graph = graph;
|
||||
spa_list_append(&graph->nodes, &node->link);
|
||||
spa_graph_link_add(node, graph->state, &node->graph_link);
|
||||
spa_debug("node %p add to graph %p", node, graph);
|
||||
}
|
||||
|
||||
static inline void spa_graph_node_remove(struct spa_graph_node *node)
|
||||
|
|
|
|||
|
|
@ -1223,3 +1223,32 @@ int pw_stream_queue_buffer(struct pw_stream *stream, struct pw_buffer *buffer)
|
|||
|
||||
return call_trigger(impl);
|
||||
}
|
||||
|
||||
static int
|
||||
do_flush(struct spa_loop *loop,
|
||||
bool async, uint32_t seq, const void *data, size_t size, void *user_data)
|
||||
{
|
||||
struct stream *impl = user_data;
|
||||
struct buffer *b;
|
||||
|
||||
pw_log_trace("stream %p: flush", impl);
|
||||
do {
|
||||
b = pop_queue(impl, &impl->queued);
|
||||
if (b != NULL)
|
||||
push_queue(impl, &impl->dequeued, b);
|
||||
}
|
||||
while (b);
|
||||
|
||||
impl->time.queued = impl->queued.outcount = impl->dequeued.incount =
|
||||
impl->dequeued.outcount = impl->queued.incount;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
int pw_stream_flush(struct pw_stream *stream, bool drain)
|
||||
{
|
||||
struct stream *impl = SPA_CONTAINER_OF(stream, struct stream, this);
|
||||
pw_loop_invoke(impl->core->data_loop,
|
||||
do_flush, 1, NULL, 0, true, impl);
|
||||
return 0;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -173,7 +173,8 @@ struct pw_buffer {
|
|||
* returned in the time info. */
|
||||
};
|
||||
|
||||
/** Events for a stream */
|
||||
/** Events for a stream. These events are always called from the mainloop
|
||||
* unless explicitly documented otherwise. */
|
||||
struct pw_stream_events {
|
||||
#define PW_VERSION_STREAM_EVENTS 0
|
||||
uint32_t version;
|
||||
|
|
@ -197,6 +198,9 @@ struct pw_stream_events {
|
|||
* mainloop but can also be called directly from the realtime data
|
||||
* thread if the user is prepared to deal with this. */
|
||||
void (*process) (void *data);
|
||||
|
||||
/** The stream is drained */
|
||||
void (*drained) (void *data);
|
||||
};
|
||||
|
||||
/** Convert a stream state to a readable string \memberof pw_stream */
|
||||
|
|
@ -307,9 +311,6 @@ int pw_stream_set_control(struct pw_stream *stream, const char *name, float valu
|
|||
/** Get a control value */
|
||||
int pw_stream_get_control(struct pw_stream *stream, const char *name, float *value);
|
||||
|
||||
/** Activate or deactivate the stream \memberof pw_stream */
|
||||
int pw_stream_set_active(struct pw_stream *stream, bool active);
|
||||
|
||||
/** A time structure \memberof pw_stream */
|
||||
struct pw_time {
|
||||
int64_t now; /**< the monotonic time */
|
||||
|
|
@ -333,6 +334,12 @@ struct pw_buffer *pw_stream_dequeue_buffer(struct pw_stream *stream);
|
|||
/** Submit a buffer for playback or recycle a buffer for capture. */
|
||||
int pw_stream_queue_buffer(struct pw_stream *stream, struct pw_buffer *buffer);
|
||||
|
||||
/** Activate or deactivate the stream \memberof pw_stream */
|
||||
int pw_stream_set_active(struct pw_stream *stream, bool active);
|
||||
|
||||
/** Flush a stream. When \a drain is true, the drained callback will
|
||||
* be called when all data is played or recorded */
|
||||
int pw_stream_flush(struct pw_stream *stream, bool drain);
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue