diff --git a/src/arvstream.c b/src/arvstream.c index 09b156a5e..40f2c3c2a 100644 --- a/src/arvstream.c +++ b/src/arvstream.c @@ -199,6 +199,16 @@ arv_stream_pop_input_buffer (ArvStream *stream) return g_async_queue_try_pop (priv->input_queue); } +ArvBuffer * +arv_stream_timeout_pop_input_buffer (ArvStream *stream, guint64 timeout) +{ + ArvStreamPrivate *priv = arv_stream_get_instance_private (stream); + + g_return_val_if_fail (ARV_IS_STREAM (stream), NULL); + + return g_async_queue_timeout_pop (priv->input_queue, timeout); +} + void arv_stream_push_output_buffer (ArvStream *stream, ArvBuffer *buffer) { diff --git a/src/arvstreamprivate.h b/src/arvstreamprivate.h index 2644bfc38..382896703 100644 --- a/src/arvstreamprivate.h +++ b/src/arvstreamprivate.h @@ -32,6 +32,7 @@ G_BEGIN_DECLS ArvBuffer * arv_stream_pop_input_buffer (ArvStream *stream); +ArvBuffer * arv_stream_timeout_pop_input_buffer (ArvStream *stream, guint64 timeout); void arv_stream_push_output_buffer (ArvStream *stream, ArvBuffer *buffer); void arv_stream_take_init_error (ArvStream *device, GError *error); diff --git a/src/arvuvstream.c b/src/arvuvstream.c index 91bfc13e1..2d95f6db7 100644 --- a/src/arvuvstream.c +++ b/src/arvuvstream.c @@ -39,6 +39,8 @@ #define ARV_UV_STREAM_MAXIMUM_TRANSFER_SIZE (1024*1024*1) #define ARV_UV_STREAM_MAXIMUM_SUBMIT_TOTAL (8*1024*1024) +#define ARV_UV_STREAM_POP_INPUT_BUFFER_TIMEOUT_US 10000 + enum { ARV_UV_STREAM_PROPERTY_0, ARV_UV_STREAM_PROPERTY_USB_MODE @@ -463,7 +465,8 @@ arv_uv_stream_thread_async (void *data) arv_uv_device_is_connected (thread_data->uv_device)) { ArvUvStreamBufferContext* ctx; - buffer = arv_stream_pop_input_buffer (thread_data->stream); + buffer = arv_stream_timeout_pop_input_buffer (thread_data->stream, + ARV_UV_STREAM_POP_INPUT_BUFFER_TIMEOUT_US); if( buffer == NULL ) { thread_data->statistics.n_underruns += 1;