Mercurial > repos > blastem
comparison render_sdl.c @ 1567:66387b1645e4
Audio DRC seems to be working pretty well now. Removed debug printfs
author | Michael Pavone <pavone@retrodev.com> |
---|---|
date | Tue, 17 Apr 2018 22:26:39 -0700 |
parents | cbb40af77a94 |
children | a051d8ee4528 |
comparison
equal
deleted
inserted
replaced
1566:cbb40af77a94 | 1567:66387b1645e4 |
---|---|
181 | 181 |
182 #define NO_LAST_BUFFERED -2000000000 | 182 #define NO_LAST_BUFFERED -2000000000 |
183 static int32_t last_buffered = NO_LAST_BUFFERED; | 183 static int32_t last_buffered = NO_LAST_BUFFERED; |
184 static float average_change; | 184 static float average_change; |
185 #define BUFFER_FRAMES_THRESHOLD 6 | 185 #define BUFFER_FRAMES_THRESHOLD 6 |
186 #define BASE_MAX_ADJUST 0.025 | 186 #define BASE_MAX_ADJUST 0.0125 |
187 static float max_adjust; | 187 static float max_adjust; |
188 static int32_t cur_min_buffered; | 188 static int32_t cur_min_buffered; |
189 static uint32_t min_remaining_buffer; | 189 static uint32_t min_remaining_buffer; |
190 static void audio_callback_drc(void *userData, uint8_t *byte_stream, int len) | 190 static void audio_callback_drc(void *userData, uint8_t *byte_stream, int len) |
191 { | 191 { |
192 //TODO: update progress tracking so we can adjust resample rate | |
193 memset(byte_stream, 0, len); | 192 memset(byte_stream, 0, len); |
194 cur_min_buffered = 0x7FFFFFFF; | 193 cur_min_buffered = 0x7FFFFFFF; |
195 min_remaining_buffer = 0xFFFFFFFF; | 194 min_remaining_buffer = 0xFFFFFFFF; |
196 for (uint8_t i = 0; i < num_audio_sources; i++) | 195 for (uint8_t i = 0; i < num_audio_sources; i++) |
197 { | 196 { |
199 int32_t buffered = mix(audio_sources[i], byte_stream, len); | 198 int32_t buffered = mix(audio_sources[i], byte_stream, len); |
200 cur_min_buffered = buffered < cur_min_buffered ? buffered : cur_min_buffered; | 199 cur_min_buffered = buffered < cur_min_buffered ? buffered : cur_min_buffered; |
201 uint32_t remaining = (audio_sources[i]->mask + 1)/audio_sources[i]->num_channels - buffered; | 200 uint32_t remaining = (audio_sources[i]->mask + 1)/audio_sources[i]->num_channels - buffered; |
202 min_remaining_buffer = remaining < min_remaining_buffer ? remaining : min_remaining_buffer; | 201 min_remaining_buffer = remaining < min_remaining_buffer ? remaining : min_remaining_buffer; |
203 } | 202 } |
204 printf("cur_min_buffered: %d, source 0 %d:%d\n", cur_min_buffered, audio_sources[0]->read_start, audio_sources[0]->read_end); | |
205 } | 203 } |
206 | 204 |
207 static void lock_audio() | 205 static void lock_audio() |
208 { | 206 { |
209 if (sync_to_audio) { | 207 if (sync_to_audio) { |
868 source_frame = 0; | 866 source_frame = 0; |
869 source_frame_count = frame_repeat[0]; | 867 source_frame_count = frame_repeat[0]; |
870 //sync samples with audio thread approximately every 8 lines | 868 //sync samples with audio thread approximately every 8 lines |
871 sync_samples = 8 * sample_rate / (source_hz * (VID_PAL ? 313 : 262)); | 869 sync_samples = 8 * sample_rate / (source_hz * (VID_PAL ? 313 : 262)); |
872 max_repeat++; | 870 max_repeat++; |
873 float mult = max_repeat > 1 ? 1 : 1.35; | 871 min_buffered = (((float)max_repeat * (float)sample_rate/(float)source_hz)/* / (float)buffer_samples*/);// + 0.9999; |
874 min_buffered = (((float)max_repeat * mult * (float)sample_rate/(float)source_hz)/* / (float)buffer_samples*/);// + 0.9999; | |
875 //min_buffered *= buffer_samples; | 872 //min_buffered *= buffer_samples; |
876 printf("Min samples buffered before audio start: %d\n", min_buffered); | 873 printf("Min samples buffered before audio start: %d\n", min_buffered); |
877 max_adjust = BASE_MAX_ADJUST / source_hz; | 874 max_adjust = BASE_MAX_ADJUST / source_hz; |
878 } | 875 } |
879 | 876 |
1077 if (average_change < 0) { | 1074 if (average_change < 0) { |
1078 frames_to_problem = (float)local_cur_min / -average_change; | 1075 frames_to_problem = (float)local_cur_min / -average_change; |
1079 } else { | 1076 } else { |
1080 frames_to_problem = (float)local_min_remaining / average_change; | 1077 frames_to_problem = (float)local_min_remaining / average_change; |
1081 } | 1078 } |
1079 float adjust_ratio = 0.0f; | |
1082 if ( | 1080 if ( |
1083 frames_to_problem < BUFFER_FRAMES_THRESHOLD | 1081 frames_to_problem < BUFFER_FRAMES_THRESHOLD |
1084 || (average_change < 0 && local_cur_min < min_buffered / 2) | 1082 || (average_change < 0 && local_cur_min < 3*min_buffered / 4) |
1085 || (average_change >0 && local_cur_min > min_buffered * 2) | 1083 || (average_change >0 && local_cur_min > 5 * min_buffered / 4) |
1086 ) { | 1084 ) { |
1087 float adjust_ratio; | 1085 |
1088 if (cur_min_buffered < 0) { | 1086 if (cur_min_buffered < 0) { |
1089 adjust_ratio = max_adjust; | 1087 adjust_ratio = max_adjust; |
1090 SDL_PauseAudio(1); | 1088 SDL_PauseAudio(1); |
1091 last_buffered = NO_LAST_BUFFERED; | 1089 last_buffered = NO_LAST_BUFFERED; |
1092 } else { | 1090 } else { |
1093 adjust_ratio = -1.5 * average_change / ((float)sample_rate / (float)source_hz); | 1091 adjust_ratio = -1.0 * average_change / ((float)sample_rate / (float)source_hz); |
1092 adjust_ratio /= 2.5 * source_hz; | |
1094 if (fabsf(adjust_ratio) > max_adjust) { | 1093 if (fabsf(adjust_ratio) > max_adjust) { |
1095 adjust_ratio = adjust_ratio > 0 ? max_adjust : -max_adjust; | 1094 adjust_ratio = adjust_ratio > 0 ? max_adjust : -max_adjust; |
1096 } | 1095 } |
1097 } | 1096 } |
1098 printf("frames_to_problem: %f, avg_change: %f, adjust_ratio: %f\n", frames_to_problem, average_change, adjust_ratio); | 1097 } else if (local_cur_min < min_buffered / 2) { |
1098 adjust_ratio = max_adjust; | |
1099 } | |
1100 if (adjust_ratio != 0.0f) { | |
1099 average_change = 0; | 1101 average_change = 0; |
1100 for (uint8_t i = 0; i < num_audio_sources; i++) | 1102 for (uint8_t i = 0; i < num_audio_sources; i++) |
1101 { | 1103 { |
1102 audio_sources[i]->buffer_inc = ((double)audio_sources[i]->buffer_inc) + ((double)audio_sources[i]->buffer_inc) * adjust_ratio + 0.5; | 1104 audio_sources[i]->buffer_inc = ((double)audio_sources[i]->buffer_inc) + ((double)audio_sources[i]->buffer_inc) * adjust_ratio + 0.5; |
1103 } | 1105 } |
1104 } else { | |
1105 printf("no adjust - frames_to_problem: %f, avg_change: %f, cur_min_buffered: %d, min_remaining_buffer: %d\n", frames_to_problem, average_change, local_cur_min, local_min_remaining); | |
1106 } | 1106 } |
1107 while (source_frame_count > 0) | 1107 while (source_frame_count > 0) |
1108 { | 1108 { |
1109 render_update_display(); | 1109 render_update_display(); |
1110 source_frame_count--; | 1110 source_frame_count--; |