diff options
| author | 2026-08-26 17:56:52 -0400 | |
|---|---|---|
| committer | 2026-08-26 17:56:52 -0400 | |
| commit | 197d41a3e23cab35848f623c6133baccc62aacbe (patch) | |
| tree | 04943c1de9653de53615e10ced1eab07c2562325 /src/liana/vcr.c | |
| parent | 6094c907b26e21f13373bae6bf3306dbae40af3c (diff) | |
| download | camu-197d41a3e23cab35848f623c6133baccc62aacbe.tar.gz camu-197d41a3e23cab35848f623c6133baccc62aacbe.tar.bz2 camu-197d41a3e23cab35848f623c6133baccc62aacbe.zip | |
OSD stuff and Android fixes
Signed-off-by: Andrew Opalach <andrew@akon.city>
Diffstat (limited to 'src/liana/vcr.c')
| -rw-r--r-- | src/liana/vcr.c | 14 |
1 files changed, 10 insertions, 4 deletions
diff --git a/src/liana/vcr.c b/src/liana/vcr.c index f9dad7b..3a61e32 100644 --- a/src/liana/vcr.c +++ b/src/liana/vcr.c @@ -26,6 +26,7 @@ enum { enum { VCR_TRACK_RUNNING = 0, VCR_TRACK_STOPPED, + VCR_TRACK_ERRORED, VCR_TRACK_CLOSED }; @@ -131,8 +132,8 @@ static nn_thread_result NNWT_THREADCALL vcr_track_thread(void *userdata) nn_thread_set_priority(NNWT_THREAD_SCHED_FIFO, 32); struct lia_vcr_track *track = (struct lia_vcr_track *)userdata; struct lia_vcr *vcr = track->vcr; - const char thread_name[16] = "\0"; // 16 = limit. - al_snprintf((char *)thread_name, sizeof(thread_name), "vcr:%hu_%d", vcr->node_id, track->stream->index); + char thread_name[16] = "\0"; // 16 = limit. + al_snprintf(thread_name, sizeof(thread_name), "vcr:%hu_%d", vcr->node_id, track->stream->index); nn_thread_set_name(thread_name); bool corked; @@ -177,12 +178,13 @@ static nn_thread_result NNWT_THREADCALL vcr_track_thread(void *userdata) return_entire_cache(track); track->cache.disabled = true; nn_packet_cache_unlock(&track->cache); + // Let flush()/close() know we forcefully exited the thread. + track->state = VCR_TRACK_ERRORED; nn_mutex_unlock(&track->lock); return 0; } - if (!packet) { - // Wait on EOF. + if (!packet) { // Wait on EOF. track->state = VCR_TRACK_STOPPED; } @@ -410,6 +412,7 @@ void lia_vcr_set_buffered(struct lia_vcr_track *track) // Meaning track->lock will be held. void lia_vcr_cork(struct lia_vcr_track *track) { + al_assert(track->state != VCR_TRACK_ERRORED); track->state = VCR_TRACK_STOPPED; } @@ -422,6 +425,9 @@ void lia_vcr_uncork(struct lia_vcr_track *track) // being held by flush(). flush() sets the state to CLOSED and signals the // cond. Now nn_cond_is_waiting() is false at the point uncork() acquires the lock. nn_mutex_lock(&track->lock); + // If a buffer is running under MARK_LOW, it will be continuously trying to uncork() + // the track. Meaning an erroring handle_packet() could happen at the same time as + // an uncork(). Causing track->state to be ERRORED after we acquire the lock here. if (track->state != VCR_TRACK_STOPPED) { nn_mutex_unlock(&track->lock); return; |