mirror of
https://github.com/pikvm/ustreamer.git
synced 2026-03-10 01:31:41 +00:00
long double queue timeout
This commit is contained in:
@@ -159,7 +159,7 @@ int audio_get_encoded(audio_s *audio, uint8_t *data, size_t *size, uint64_t *pts
|
||||
return -1;
|
||||
}
|
||||
_enc_buffer_s *buf;
|
||||
if (!queue_get(audio->enc_queue, (void **)&buf, 1)) {
|
||||
if (!queue_get(audio->enc_queue, (void **)&buf, 0.1)) {
|
||||
if (*size < buf->used) {
|
||||
free(buf);
|
||||
return -3;
|
||||
@@ -193,7 +193,7 @@ static void *_pcm_thread(void *v_audio) {
|
||||
_pcm_buffer_s *out;
|
||||
A_CALLOC(out, 1);
|
||||
memcpy(out->data, in, audio->pcm_size);
|
||||
assert(!queue_put(audio->pcm_queue, out, 1));
|
||||
assert(!queue_put(audio->pcm_queue, out, 0.1));
|
||||
} else {
|
||||
JLOG_ERROR("audio", "PCM queue is full");
|
||||
}
|
||||
@@ -211,7 +211,7 @@ static void *_encoder_thread(void *v_audio) {
|
||||
|
||||
while (!atomic_load(&audio->stop)) {
|
||||
_pcm_buffer_s *in;
|
||||
if (!queue_get(audio->pcm_queue, (void **)&in, 1)) {
|
||||
if (!queue_get(audio->pcm_queue, (void **)&in, 0.1)) {
|
||||
int16_t *in_ptr;
|
||||
if (audio->res) {
|
||||
assert(audio->pcm_hz != ENCODER_INPUT_HZ);
|
||||
@@ -239,7 +239,7 @@ static void *_encoder_thread(void *v_audio) {
|
||||
audio->pts += HZ_TO_FRAMES(ENCODER_INPUT_HZ);
|
||||
|
||||
if (queue_get_free(audio->enc_queue)) {
|
||||
assert(!queue_put(audio->enc_queue, out, 1));
|
||||
assert(!queue_put(audio->enc_queue, out, 0.1));
|
||||
} else {
|
||||
JLOG_ERROR("audio", "OPUS encoder queue is full");
|
||||
free(out);
|
||||
|
||||
@@ -45,11 +45,11 @@ void queue_destroy(queue_s *queue) {
|
||||
}
|
||||
|
||||
#define WAIT_OR_UNLOCK(_var, _cond) { \
|
||||
struct timespec ts; \
|
||||
assert(!clock_gettime(CLOCK_MONOTONIC, &ts)); \
|
||||
ts.tv_sec += timeout; \
|
||||
struct timespec _ts; \
|
||||
assert(!clock_gettime(CLOCK_MONOTONIC, &_ts)); \
|
||||
ld_to_timespec(timespec_to_ld(&_ts) + timeout, &_ts); \
|
||||
while (_var) { \
|
||||
int err = pthread_cond_timedwait(_cond, &queue->mutex, &ts); \
|
||||
int err = pthread_cond_timedwait(_cond, &queue->mutex, &_ts); \
|
||||
if (err == ETIMEDOUT) { \
|
||||
A_MUTEX_UNLOCK(&queue->mutex); \
|
||||
return -1; \
|
||||
@@ -58,7 +58,7 @@ void queue_destroy(queue_s *queue) {
|
||||
} \
|
||||
}
|
||||
|
||||
int queue_put(queue_s *queue, void *item, unsigned timeout) {
|
||||
int queue_put(queue_s *queue, void *item, long double timeout) {
|
||||
A_MUTEX_LOCK(&queue->mutex);
|
||||
WAIT_OR_UNLOCK(queue->size == queue->capacity, &queue->full_cond);
|
||||
queue->items[queue->in] = item;
|
||||
@@ -70,7 +70,7 @@ int queue_put(queue_s *queue, void *item, unsigned timeout) {
|
||||
return 0;
|
||||
}
|
||||
|
||||
int queue_get(queue_s *queue, void **item, unsigned timeout) {
|
||||
int queue_get(queue_s *queue, void **item, long double timeout) {
|
||||
A_MUTEX_LOCK(&queue->mutex);
|
||||
WAIT_OR_UNLOCK(queue->size == 0, &queue->empty_cond);
|
||||
*item = queue->items[queue->out];
|
||||
|
||||
@@ -50,7 +50,7 @@ typedef struct {
|
||||
#define QUEUE_FREE_ITEMS_AND_DESTROY(_queue, _free_item) { \
|
||||
while (!queue_get_free(_queue)) { \
|
||||
void *_ptr; \
|
||||
assert(!queue_get(_queue, &_ptr, 1)); \
|
||||
assert(!queue_get(_queue, &_ptr, 0.1)); \
|
||||
_free_item(_ptr); \
|
||||
} \
|
||||
queue_destroy(_queue); \
|
||||
@@ -60,6 +60,6 @@ typedef struct {
|
||||
queue_s *queue_init(unsigned capacity);
|
||||
void queue_destroy(queue_s *queue);
|
||||
|
||||
int queue_put(queue_s *queue, void *item, unsigned timeout);
|
||||
int queue_get(queue_s *queue, void **item, unsigned timeout);
|
||||
int queue_put(queue_s *queue, void *item, long double timeout);
|
||||
int queue_get(queue_s *queue, void **item, long double timeout);
|
||||
int queue_get_free(queue_s *queue);
|
||||
|
||||
Reference in New Issue
Block a user