comparison 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
comparison
equal deleted inserted replaced
2092:8665d8da0e1c 2093:46ee354f29bd
131 if (audio_sources[i]->front_populated) { 131 if (audio_sources[i]->front_populated) {
132 num_populated++; 132 num_populated++;
133 } 133 }
134 } 134 }
135 return num_populated == num_audio_sources; 135 return num_populated == num_audio_sources;
136 }
137
138 uint8_t audio_deadlock_hack(void)
139 {
140 uint32_t min_buffer_pos = 0xFFFFFFFFU;
141 for (uint8_t i = 0; i < num_audio_sources; i++)
142 {
143 if (audio_sources[i]->front_populated) {
144 uint32_t buffer_pos = audio_sources[i]->buffer_pos;
145 if (audio_sources[i]->num_channels == 1) {
146 buffer_pos *= 2;
147 }
148 if (buffer_pos < min_buffer_pos) {
149 min_buffer_pos = buffer_pos;
150 }
151 }
152 }
153 uint8_t do_signal = 0;
154 for (uint8_t i = 0; i < num_audio_sources; i++)
155 {
156 if (!audio_sources[i]->front_populated) {
157 audio_sources[i]->front_populated = 1;
158 int16_t *tmp = audio_sources[i]->front;
159 audio_sources[i]->front = audio_sources[i]->back;
160 audio_sources[i]->back = tmp;
161 if (audio_sources[i]->num_channels == 2) {
162 audio_sources[i]->buffer_pos = min_buffer_pos;
163 } else {
164 audio_sources[i]->buffer_pos = min_buffer_pos / 2;
165 }
166 do_signal = 1;
167 }
168 }
169 return do_signal;
136 } 170 }
137 171
138 #define BUFFER_INC_RES 0x40000000UL 172 #define BUFFER_INC_RES 0x40000000UL
139 173
140 void render_audio_adjust_clock(audio_source *src, uint64_t master_clock, uint64_t sample_divider) 174 void render_audio_adjust_clock(audio_source *src, uint64_t master_clock, uint64_t sample_divider)