Sfoglia il codice sorgente

libobs/media-io: Sleep to next audio time accurately

Prior to this change, the audio thread roughly waits the time of
`AUDIO_OUTPUT_FRAMES`, and consecutively processes twice or more if the
latency is accumulated. This behavior causes fluctuation of timing to
output audio packets. This change introduces `os_sleepto_ns_fast` so
that the audio packets will be periodically output.
Norihiro Kamae 3 anni fa
parent
commit
d044231bfc
1 ha cambiato i file con 6 aggiunte e 15 eliminazioni
  1. 6 15
      libobs/media-io/audio-io.c

+ 6 - 15
libobs/media-io/audio-io.c

@@ -213,10 +213,6 @@ static void *audio_thread(void *param)
 	uint64_t samples = 0;
 	uint64_t start_time = os_gettime_ns();
 	uint64_t prev_time = start_time;
-	uint64_t audio_time = prev_time;
-	uint32_t audio_wait_time =
-		(uint32_t)(audio_frames_to_ns(rate, AUDIO_OUTPUT_FRAMES) /
-			   1000000);
 
 	os_set_thread_name("audio-io: audio thread");
 
@@ -225,21 +221,16 @@ static void *audio_thread(void *param)
 				   "audio_thread(%s)", audio->info.name);
 
 	while (os_event_try(audio->stop_event) == EAGAIN) {
-		uint64_t cur_time;
+		samples += AUDIO_OUTPUT_FRAMES;
+		uint64_t audio_time =
+			start_time + audio_frames_to_ns(rate, samples);
 
-		os_sleep_ms(audio_wait_time);
+		os_sleepto_ns_fast(audio_time);
 
 		profile_start(audio_thread_name);
 
-		cur_time = os_gettime_ns();
-		while (audio_time <= cur_time) {
-			samples += AUDIO_OUTPUT_FRAMES;
-			audio_time =
-				start_time + audio_frames_to_ns(rate, samples);
-
-			input_and_output(audio, audio_time, prev_time);
-			prev_time = audio_time;
-		}
+		input_and_output(audio, audio_time, prev_time);
+		prev_time = audio_time;
 
 		profile_end(audio_thread_name);