long double queue timeout

This commit is contained in:
Maxim Devaev
2022-07-10 02:54:32 +03:00
parent db5b9d3cd7
commit c874929e9d
4 changed files with 26 additions and 13 deletions

View File

@@ -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);

View File

@@ -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];

View File

@@ -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);