diff render_audio.c @ 2093:46ee354f29bd

Hack fix for audio deadlock issue
author Michael Pavone <pavone@retrodev.com>
date Sun, 06 Feb 2022 23:25:23 -0800
parents cfd53c94fffb
children b3832f73444f
line wrap: on
line diff
--- a/render_audio.c	Sun Feb 06 22:52:24 2022 -0800
+++ b/render_audio.c	Sun Feb 06 23:25:23 2022 -0800
@@ -135,6 +135,40 @@
 	return num_populated == num_audio_sources;
 }
 
+uint8_t audio_deadlock_hack(void)
+{
+	uint32_t min_buffer_pos = 0xFFFFFFFFU;
+	for (uint8_t i = 0; i < num_audio_sources; i++)
+	{
+		if (audio_sources[i]->front_populated) {
+			uint32_t buffer_pos = audio_sources[i]->buffer_pos;
+			if (audio_sources[i]->num_channels == 1) {
+				buffer_pos *= 2;
+			}
+			if (buffer_pos < min_buffer_pos) {
+				min_buffer_pos = buffer_pos;
+			}
+		}
+	}
+	uint8_t do_signal = 0;
+	for (uint8_t i = 0; i < num_audio_sources; i++)
+	{
+		if (!audio_sources[i]->front_populated) {
+			audio_sources[i]->front_populated = 1;
+			int16_t *tmp = audio_sources[i]->front;
+			audio_sources[i]->front = audio_sources[i]->back;
+			audio_sources[i]->back = tmp;
+			if (audio_sources[i]->num_channels == 2) {
+				audio_sources[i]->buffer_pos = min_buffer_pos;
+			} else {
+				audio_sources[i]->buffer_pos = min_buffer_pos / 2;
+			}
+			do_signal = 1;
+		}
+	}
+	return do_signal;
+}
+
 #define BUFFER_INC_RES 0x40000000UL
 
 void render_audio_adjust_clock(audio_source *src, uint64_t master_clock, uint64_t sample_divider)