From 2d46a14a372b1dea3a34e8b33669ff3647b5d7fe Mon Sep 17 00:00:00 2001 From: John Lorentzson Date: Tue, 8 Apr 2025 20:23:30 +0200 Subject: [PATCH] Working but very choppy audio --- src/Backends/Audio/SoftwareMixer/Solaris.cpp | 34 +++++++++++++------- 1 file changed, 23 insertions(+), 11 deletions(-) diff --git a/src/Backends/Audio/SoftwareMixer/Solaris.cpp b/src/Backends/Audio/SoftwareMixer/Solaris.cpp index b4fe24cb..689a9972 100644 --- a/src/Backends/Audio/SoftwareMixer/Solaris.cpp +++ b/src/Backends/Audio/SoftwareMixer/Solaris.cpp @@ -20,13 +20,16 @@ static const int parkSignal = SIGUSR1; static pthread_t mainThread; static int sndfp; +static FILE* sndfile; static void (*parent_callback)(long *stream, size_t frames_total); static bool audioDone = false; +static void soundSetup() { +} + static void* soundcheckthread(void*) { printf("Entered sound thread.\n"); //sndfp = open("/dev/audio", 0, O_WRONLY); - FILE* sndfile = fopen("/dev/audio", "wb"); audioDone = true; unsigned long for_as_long_as_it_seems_we_should = 0; uint16_t out[0x400 * 2]; @@ -49,7 +52,7 @@ static void* soundcheckthread(void*) { } */ long mix[0x400 * 2]; - memset(mix, 0, 0x400 * 2 * 4); + memset(mix, 0, 0x400 * 2 * sizeof(long)); //printf("Cleared mix buffer\n"); // park the main thread since the game probably expects it to not be // doing anything else while we're requesting audio frames. @@ -64,15 +67,23 @@ static void* soundcheckthread(void*) { //printf("Audio done\n"); for(int i = 0; i < 0x400 * 2; i++) { - if(i % 2 == 0) { - fputc((mix[i] >> 8) & 0xFF, sndfile); - } + //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); + //} } //write(sndfp, mix, 0x400 * 2); //write(sndfp, NULL, 0); - ioctl(sndfp, AUDIO_GETINFO, &audioInfo); - oldeof = audioInfo.play.eof; + //ioctl(sndfp, AUDIO_GETINFO, &audioInfo); + //oldeof = audioInfo.play.eof; for_as_long_as_it_seems_we_should = ((float)0x400 / (float)8000) * 1000000; firstTime = false; @@ -85,27 +96,28 @@ static void threadPark(int signo) { unsigned long SoftwareMixerBackend_Init(void (*callback)(long *stream, size_t frames_total)) { parent_callback = callback; - sndfp = open("/dev/audio", 0, O_WRONLY); if(sndfp == -1) { Backend_PrintError("Failed to open audio device.\n"); return 0; } + sndfile = fopen("/dev/audio", "wb"); + sndfp = fileno(sndfile); audio_info_t audioInfo; ioctl(sndfp, AUDIO_GETINFO, &audioInfo); audio_prinfo_t info = audioInfo.play; info.sample_rate = 8000; info.channels = 2; - info.precision = 8; + info.precision = 16; info.encoding = AUDIO_ENCODING_LINEAR; - info.port = AUDIO_SPEAKER; + info.port = AUDIO_SPEAKER | AUDIO_HEADPHONE; info.gain = 32; audioInfo.play = info; ioctl(sndfp, AUDIO_SETINFO, &audioInfo); - close(sndfp); + //close(sndfp); if(signal(parkSignal, threadPark) == SIG_ERR) { Backend_PrintError("Failed to register thread park signal handler for audio system.\n");