doom: Rework audio init to properly respect pcm_sink capabilities

rockbox-gerrit-noreply--- via rockbox-cvs <[email protected]>
Newsgroups gmane.comp.systems.archos.rockbox.cvs
Message-ID <[email protected]>
commit ba69fb9bbf7833424f7054f30f14fc50bc13b528
Author: Solomon Peachy <[email protected]>
Date:   Thu Mar 5 07:51:27 2026 -0500

    doom:  Rework audio init to properly respect pcm_sink capabilities
    
    Try to use 11KHz if possible, if that's not an option, fall
    back to 44KHz which is always available.  Simulators always use
    44KHz.
    
    Change-Id: I7547e7c1bddf7ce4634f7fd7bc64d4a5c9b62c29

diff --git a/apps/plugins/doom/i_sound.c b/apps/plugins/doom/i_sound.c
index 3581b0e301..53a172694b 100644
--- a/apps/plugins/doom/i_sound.c
+++ b/apps/plugins/doom/i_sound.c
@@ -51,16 +51,11 @@
 #define SAMPLECOUNT     128
 
 #define NUM_CHANNELS    24
-// It is 2 for 16bit, and 2 for two channels.
-#define BUFMUL          2
+#define BUFMUL      2             // 2 channels
+#define SAMPLESIZE  sizeof(short) // 16-bit
 #define MIXBUFFERSIZE  (SAMPLECOUNT*BUFMUL)
 
-#ifdef HW_HAVE_11
-#define SAMPLERATE  SAMPR_11 // 44100 22050 11025
-#else
-#define SAMPLERATE  SAMPR_44 // 44100 22050 11025
-#endif
-#define SAMPLESIZE  2      // 16bit
+static unsigned short samplerate;
 
 // The global mixing buffer.
 //  Basically, samples from all active internal channels
@@ -207,9 +202,9 @@ static void updateSoundParams(int handle, int volume, int seperation, int pitch)
    // Patched to shift left *then* divide, to minimize roundoff errors
    // as well as to use SAMPLERATE as defined above, not to assume 11025 Hz
    if (pitched_sounds)
-      channelinfo[slot].step = step + (((channelinfo[slot].samplerate<<16)/SAMPLERATE)-65536);
+      channelinfo[slot].step = step + (((channelinfo[slot].samplerate<<16)/samplerate)-65536);
    else
-      channelinfo[slot].step = ((channelinfo[slot].samplerate<<16)/SAMPLERATE);
+      channelinfo[slot].step = ((channelinfo[slot].samplerate<<16)/samplerate);
 
    // Separation, that is, orientation/stereo.
    //  range is: 1 - 256
@@ -265,7 +260,7 @@ void I_SetChannels()
    // This table provides step widths for pitch parameters.
    for (i=-128 ; i<128 ; i++)
       steptablemid[i]=2;
-//      steptablemid[i] = (int)(pow(1.2, ((double)i/(64.0*SAMPLERATE/11025)))*65536.0);
+//      steptablemid[i] = (int)(pow(1.2, ((double)i/(64.0*samplerate/11025)))*65536.0);
 
    // Generates volume lookup tables
    //  which also turn the unsigned samples
@@ -462,7 +457,7 @@ void get_more(const void** start, size_t* size)
    I_UpdateSound(); // Force sound update
 
    *start = mixbuffer;
-   *size = MIXBUFFERSIZE*sizeof(short);
+   *size = MIXBUFFERSIZE*SAMPLESIZE;
 }
 
 
@@ -480,10 +475,25 @@ void I_ShutdownSound(void)
    rb->mixer_set_frequency(HW_SAMPR_DEFAULT);
 }
 
+#if defined(SIMULATOR)
+#define PREFERRED_SAMPR SAMPR_44
+#else
+#define PREFERRED_SAMPR SAMPR_11
+#endif
+
 void I_InitSound()
 {
    int i;
 
+   const struct pcm_sink_caps* caps = rb->pcm_current_sink_caps();
+   for (i = 0 ; i < caps->num_samprs; i++) {
+       if (caps->samprs[i] == PREFERRED_SAMPR)
+           break;
+   }
+   if (i == caps->num_samprs)
+       i = SAMPR_44;
+   samplerate = caps->samprs[i];
+
    // Initialize external data (all sounds) at start, keep static.
    printf( "I_InitSound: ");
    rb->audio_stop();
@@ -493,11 +503,11 @@ void I_InitSound()
    rb->audio_set_input_source(AUDIO_SRC_PLAYBACK, SRCF_PLAYBACK);
    rb->audio_set_output_source(AUDIO_SRC_PLAYBACK);
 #endif
-   rb->mixer_set_frequency(SAMPLERATE);
+   rb->mixer_set_frequency(samplerate);
 
    vol_lookup=malloc(128*256*sizeof(int));
 
-   mixbuffer=malloc(MIXBUFFERSIZE*sizeof(short));
+   mixbuffer=malloc(MIXBUFFERSIZE*SAMPLESIZE);
    steptable=malloc(256*sizeof(int));
 
    for (i=1 ; i<NUMSFX ; i++)
-- 
rockbox-cvs mailing list
[email protected]
https://lists.haxx.se/mailman/listinfo/rockbox-cvs
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.