From b1d35497234a87cd267b4dba9a17eb772f4f1af4 Mon Sep 17 00:00:00 2001 From: John Lorentzson Date: Fri, 18 Apr 2025 21:40:02 +0200 Subject: [PATCH] Untested maybe improved audio code (no more pre-computed sleeps) --- src/Backends/Audio/SoftwareMixer/Solaris.cpp | 78 ++++++++++---------- 1 file changed, 40 insertions(+), 38 deletions(-) diff --git a/src/Backends/Audio/SoftwareMixer/Solaris.cpp b/src/Backends/Audio/SoftwareMixer/Solaris.cpp index d9a9592f..18e90149 100644 --- a/src/Backends/Audio/SoftwareMixer/Solaris.cpp +++ b/src/Backends/Audio/SoftwareMixer/Solaris.cpp @@ -17,7 +17,7 @@ #include #include -static const int samplesPerGo = 0x200; +static const int samplesPerGo = 1600; static const int parkSignal = SIGUSR1; static pthread_t mainThread; static int sndfp; @@ -25,50 +25,52 @@ static FILE* sndfile; static void (*parent_callback)(long *stream, size_t frames_total); static bool audioDone = false; -static void soundSetup() { +static inline void setUpSoundFrame(long *mix) { + memset(mix, 0, samplesPerGo * 2 * sizeof(long)); + parent_callback(mix, samplesPerGo); +} + +static inline void soundWait() { + audio_info_t audioInfo; + ioctl(sndfp, AUDIO_GETINFO, &audioInfo); + int playedBefore = audioInfo.play.samples; + int playedNow = audioInfo.play.samples; + while(playedNow - playedBefore < samplesPerGo) { + Backend_Delay(10); + ioctl(sndfp, AUDIO_GETINFO, &audioInfo); + playedNow = audioInfo.play.samples; + } +} + +static inline void feedOutSound(long* mix) { + for(int i = 0; i < samplesPerGo * 2; i++) { + short sample = mix[i]; + if(mix[i] > 0x7FFF) { + sample = 0x7FFF; + } + if(mix[i] < -0x7FFF) { + sample = -0x7FFF; + } + fputc((sample >> 8) & 0xFF, sndfile); + fputc(sample & 0xFF, sndfile); + } } static void* soundcheckthread(void*) { printf("Entered sound thread.\n"); - unsigned long for_as_long_as_it_seems_we_should = 0; - bool firstTime = true; - int counter = 0; + long mix[samplesPerGo * 2]; + setUpSoundFrame(mix); + feedOutSound(mix); + setUpSoundFrame(mix); + feedOutSound(mix); while(1) { - long mix[samplesPerGo * 2]; - memset(mix, 0, samplesPerGo * 2 * sizeof(long)); + + setUpSoundFrame(mix); - parent_callback(mix, samplesPerGo); + // Waiting for more to be needed + soundWait(); - for_as_long_as_it_seems_we_should = ((float)(samplesPerGo) / (float)8000) * 1000000; - - audio_info_t audioInfo; - ioctl(sndfp, AUDIO_GETINFO, &audioInfo); - //printf("%d\n", audioInfo.play.error); - - if(counter > 4 && audioInfo.play.error == 0) { - usleep(for_as_long_as_it_seems_we_should); - } else { - printf("ae\n"); - audioInfo.play.error = 0; - ioctl(sndfp, AUDIO_SETINFO, &audioInfo); - } - - for(int i = 0; i < samplesPerGo * 2; i++) { - //if(i % 2 == 0) { - short sample = mix[i]; - if(mix[i] > 0x7FFF) { - sample = 0x7FFF; - } - if(mix[i] < -0x7FFF) { - sample = -0x7FFF; - } - fputc((sample >> 8) & 0xFF, sndfile); - fputc(sample & 0xFF, sndfile); - //} - } - - counter += 1; - firstTime = false; + feedOutSound(mix); } }