pcm_sink: allow per-sink swvol/hwvol selection

rockbox-gerrit-noreply--- via rockbox-cvs <[email protected]>
Newsgroups gmane.comp.systems.archos.rockbox.cvs
Message-ID <[email protected]>
commit 9a7ffac2e4f46d812334d19fa7df59f21771eef2
Author: Skye <[email protected]>
Date:   Fri Aug 14 22:39:13 2026 +0900

    pcm_sink: allow per-sink swvol/hwvol selection
    
    Change-Id: I5b0a66f2e41ca32a2d6c88bda3ffe0db0df08ce0

diff --git a/firmware/SOURCES b/firmware/SOURCES
index 7ae34427e9..488f61ccab 100644
--- a/firmware/SOURCES
+++ b/firmware/SOURCES
@@ -552,9 +552,9 @@ sound.c
 pcm_sampr.c
 pcm.c
 pcm_mixer.c
-#ifdef HAVE_SW_VOLUME_CONTROL
+#ifdef WANT_SWVOL
 pcm_sw_volume.c
-#endif /* HAVE_SW_VOLUME_CONTROL */
+#endif /* WANT_SWVOL */
 #ifdef HAVE_RECORDING
 enc_base.c
 #endif /* HAVE_RECORDING */
diff --git a/firmware/export/audiohw.h b/firmware/export/audiohw.h
index c6308b3aff..75e65e05a4 100644
--- a/firmware/export/audiohw.h
+++ b/firmware/export/audiohw.h
@@ -696,4 +696,12 @@ AUDIOHW_SETTING(STEREO_WIDTH, "%", 0, 5,    0, 250, 100)
 # define PCM_NATIVE_BITDEPTH 16
 #endif
 
+#ifndef PCM_NATIVE_VOLUME_TYPE
+#if !defined(HAVE_SW_VOLUME_CONTROL) || defined(PCM_SW_VOLUME_UNBUFFERED)
+#define PCM_NATIVE_VOLUME_TYPE PCM_SINK_HWVOL
+#else
+#define PCM_NATIVE_VOLUME_TYPE PCM_SINK_SWVOL
+#endif
+#endif
+
 #endif /* _AUDIOHW_H_ */
diff --git a/firmware/export/config.h b/firmware/export/config.h
index afa0b274f8..1a70ad7bdb 100644
--- a/firmware/export/config.h
+++ b/firmware/export/config.h
@@ -1494,4 +1494,12 @@ Lyre prototype 1 */
 #define ucschar_t unsigned short
 #endif
 
+#ifdef HAVE_SW_VOLUME_CONTROL
+#define WANT_SWVOL
+#endif
+
+#if defined(PCM_NATIVE_BITDEPTH) && (PCM_NATIVE_BITDEPTH > 16)
+#define WANT_SWVOL_32
+#endif
+
 #endif /* __CONFIG_H__ */
diff --git a/firmware/export/pcm-internal.h b/firmware/export/pcm-internal.h
index 4f69f77806..7ffbb08b36 100644
--- a/firmware/export/pcm-internal.h
+++ b/firmware/export/pcm-internal.h
@@ -45,21 +45,22 @@
 #define PCM_FACTOR_UNITY    (1u << PCM_SW_VOLUME_FRACBITS)
 #endif /* PCM_SW_VOLUME_FRACBITS */
 
+#ifdef HAVE_SDL_AUDIO
 #ifdef PCM_SW_VOLUME_UNBUFFERED
 /* Copies buffer with volume scaling applied */
 void pcm_sw_volume_copy_buffer(void *dst, const void *src, size_t size);
 #define pcm_copy_buffer pcm_sw_volume_copy_buffer
-#else /* !PCM_SW_VOLUME_UNBUFFERED */
-#ifdef HAVE_SDL_AUDIO
+#else /* PCM_SW_VOLUME_UNBUFFERED */
 #define pcm_copy_buffer memcpy
-#endif
+#endif /* PCM_SW_VOLUME_UNBUFFERED */
+#endif /* HAVE_SDL_AUDIO */
+
 #ifndef PCM_PLAY_DBL_BUF_SAMPLES
 #define PCM_PLAY_DBL_BUF_SAMPLES 1024 /* Max 4KByte chunks */
 #endif
 #ifndef PCM_DBL_BUF_BSS
 #define PCM_DBL_BUF_BSS               /* In DRAM, uncached may be better */
 #endif
-#endif /* PCM_SW_VOLUME_UNBUFFERED */
 
 void pcm_sync_pcm_factors(void);
 #endif /* HAVE_SW_VOLUME_CONTROL */
@@ -126,20 +127,15 @@ static FORCE_INLINE enum pcm_dma_status pcm_play_call_status_cb(
 static FORCE_INLINE enum pcm_dma_status
 pcm_play_dma_status_callback(enum pcm_dma_status status)
 {
-#if defined(HAVE_SW_VOLUME_CONTROL) && !defined(PCM_SW_VOLUME_UNBUFFERED)
+#ifdef WANT_SWVOL
     extern enum pcm_dma_status
-        pcm_play_dma_status_callback_int(enum pcm_dma_status status);
-    return pcm_play_dma_status_callback_int(status);
-#else
+        pcm_play_dma_status_callback_int_swvol(enum pcm_dma_status status);
+    if (pcm_current_sink_caps()->volume_type == PCM_SINK_SWVOL)
+        return pcm_play_dma_status_callback_int_swvol(status);
+#endif /* WANT_SWVOL */
     return pcm_play_call_status_cb(status);
-#endif /* HAVE_SW_VOLUME_CONTROL && !PCM_SW_VOLUME_UNBUFFERED */
 }
 
-#if defined(HAVE_SW_VOLUME_CONTROL) && !defined(PCM_SW_VOLUME_UNBUFFERED)
-void pcm_play_dma_start_int(const void *addr, size_t size);
-void pcm_play_dma_stop_int(void);
-#endif /* HAVE_SW_VOLUME_CONTROL && !PCM_SW_VOLUME_UNBUFFERED */
-
 /* Called by the bottom layer ISR when more data is needed. Returns true
  * if a new buffer is available, false otherwise. */
 bool pcm_play_dma_complete_callback(enum pcm_dma_status status,
diff --git a/firmware/export/pcm_sink.h b/firmware/export/pcm_sink.h
index 522a5aa853..54eb261014 100644
--- a/firmware/export/pcm_sink.h
+++ b/firmware/export/pcm_sink.h
@@ -23,10 +23,16 @@
 
 #include "config.h"
 
+#define PCM_SINK_HWVOL 0
+#ifdef WANT_SWVOL
+#define PCM_SINK_SWVOL 1
+#endif
+
 struct pcm_sink_caps {
     const unsigned long* samprs;
-    uint16_t             num_samprs;
-    uint16_t             default_freq;
+    uint8_t              num_samprs;
+    uint8_t              default_freq;
+    uint8_t              volume_type;
 };
 
 struct pcm_sink_ops {
diff --git a/firmware/export/pcm_sw_volume.h b/firmware/export/pcm_sw_volume.h
index 5aba259b2a..dc9962fbb5 100644
--- a/firmware/export/pcm_sw_volume.h
+++ b/firmware/export/pcm_sw_volume.h
@@ -26,10 +26,11 @@
  ** the library or a hardware necessity. Normally, it shouldn't be used and
  ** only the port developer can properly decide.
  **/
-#ifdef HAVE_SW_VOLUME_CONTROL
+#ifdef WANT_SWVOL
 
 #include <audiohw.h>
 #include <limits.h>
+#include <stddef.h>
 
 #define PCM_MUTE_LEVEL INT_MIN
 
@@ -41,6 +42,11 @@ void pcm_set_prescaler(int prescale);
 /* Set the per-channel volume cut/gain for all PCM playback */
 void pcm_set_master_volume(int vol_l, int vol_r);
 
-#endif /* HAVE_SW_VOLUME_CONTROL */
+void pcm_play_dma_start_int_swvol(const void *addr, size_t size);
+void pcm_play_dma_stop_int_swvol(void);
+enum pcm_dma_status pcm_play_dma_status_callback_int_swvol(enum pcm_dma_status status);
+bool pcm_play_dma_complete_callback_swvol(enum pcm_dma_status status,
+                                          const void **addr, size_t *size);
+#endif /* WANT_SWVOL */
 
 #endif /* PCM_SW_VOLUME_H */
diff --git a/firmware/pcm.c b/firmware/pcm.c
index 5fa368911f..bea1edb376 100644
--- a/firmware/pcm.c
+++ b/firmware/pcm.c
@@ -30,6 +30,7 @@
 #include "general.h"
 #include "pcm-internal.h"
 #include "pcm_mixer.h"
+#include "pcm_sw_volume.h"
 
 /**
  * Aspects implemented in the target-specific portion:
@@ -105,12 +106,15 @@ struct pcm_sink* pcm_get_current_sink(void)
     return sinks[cur_sink];
 }
 
-#if !defined(HAVE_SW_VOLUME_CONTROL) || defined(PCM_SW_VOLUME_UNBUFFERED)
 /** Standard hw volume/unbuffered control functions - otherwise, see
  ** pcm_sw_volume.c **/
 static inline void pcm_play_dma_start_int(const void *addr, size_t size)
 {
-#ifdef HAVE_SW_VOLUME_CONTROL
+#ifdef WANT_SWVOL
+    if (sinks[cur_sink]->caps.volume_type == PCM_SINK_SWVOL) {
+        pcm_play_dma_start_int_swvol(addr, size);
+        return;
+    }
     /* Smoothed transition might not have happened so sync now */
     pcm_sync_pcm_factors();
 #endif
@@ -119,12 +123,23 @@ static inline void pcm_play_dma_start_int(const void *addr, size_t size)
 
 static inline void pcm_play_dma_stop_int(void)
 {
+#ifdef WANT_SWVOL
+    if (sinks[cur_sink]->caps.volume_type == PCM_SINK_SWVOL) {
+        pcm_play_dma_stop_int_swvol();
+        return;
+    }
+#endif
     sinks[cur_sink]->ops.stop();
 }
 
 bool pcm_play_dma_complete_callback(enum pcm_dma_status status,
                                     const void **addr, size_t *size)
 {
+#ifdef WANT_SWVOL
+    if (sinks[cur_sink]->caps.volume_type == PCM_SINK_SWVOL) {
+        return pcm_play_dma_complete_callback_swvol(status, addr, size);
+    }
+#endif
     /* Check status callback first if error */
     if (status < PCM_DMAST_OK)
         status = pcm_play_dma_status_callback(status);
@@ -137,7 +152,6 @@ bool pcm_play_dma_complete_callback(enum pcm_dma_status status,
     pcm_play_stop_int();
     return false;
 }
-#endif /* !HAVE_SW_VOLUME_CONTROL || PCM_SW_VOLUME_UNBUFFERED */
 
 void pcm_play_stop_int(void)
 {
diff --git a/firmware/pcm_sw_volume.c b/firmware/pcm_sw_volume.c
index 99e5d62cb4..293cda643b 100644
--- a/firmware/pcm_sw_volume.c
+++ b/firmware/pcm_sw_volume.c
@@ -210,7 +210,7 @@ void pcm_sync_pcm_factors(void)
 #endif
 }
 
-#ifndef PCM_SW_VOLUME_UNBUFFERED
+#ifdef WANT_SWVOL
 /* source buffer from client */
 static const void * volatile src_buf_addr = NULL;
 static size_t volatile src_buf_rem = 0;
@@ -227,7 +227,7 @@ static unsigned int frame_count, frame_err, frame_frac;
 
 /** Overrides of certain functions in pcm.c and pcm-internal.h **/
 
-bool pcm_play_dma_complete_callback(enum pcm_dma_status status,
+bool pcm_play_dma_complete_callback_swvol(enum pcm_dma_status status,
                                     const void **addr, size_t *size)
 {
     /* Check status callback first if error */
@@ -268,7 +268,7 @@ static void update_frame_params(size_t size)
 
 /* Obtain the next buffer and prepare it for pcm driver playback */
 enum pcm_dma_status
-pcm_play_dma_status_callback_int(enum pcm_dma_status status)
+pcm_play_dma_status_callback_int_swvol(enum pcm_dma_status status)
 {
     if (status != PCM_DMAST_STARTED)
         return status;
@@ -327,7 +327,7 @@ static void start_pcm(bool reframe)
     pcm_get_current_sink()->ops.play(pcm_dbl_buf[1], pcm_dbl_buf_size[1]);
 }
 
-void pcm_play_dma_start_int(const void *addr, size_t size)
+void pcm_play_dma_start_int_swvol(const void *addr, size_t size)
 {
     src_buf_addr = addr;
     /* divide by 2 for 32 bit, optimize away to 1 for 16 bit */
@@ -335,14 +335,14 @@ void pcm_play_dma_start_int(const void *addr, size_t size)
     start_pcm(true);
 }
 
-void pcm_play_dma_stop_int(void)
+void pcm_play_dma_stop_int_swvol(void)
 {
     pcm_get_current_sink()->ops.stop();
     src_buf_addr = NULL;
     src_buf_rem = 0;
 }
 
-#endif /* PCM_SW_VOLUME_UNBUFFERED */
+#endif /* WANT_SWVOL */
 
 
 /** Internal **/
diff --git a/firmware/target/arm/as3525/pcm-as3525.c b/firmware/target/arm/as3525/pcm-as3525.c
index 029c075e52..dbc362910f 100644
--- a/firmware/target/arm/as3525/pcm-as3525.c
+++ b/firmware/target/arm/as3525/pcm-as3525.c
@@ -205,6 +205,7 @@ struct pcm_sink builtin_pcm_sink = {
         .samprs       = hw_freq_sampr,
         .num_samprs   = HW_NUM_FREQ,
         .default_freq = HW_FREQ_DEFAULT,
+        .volume_type  = PCM_NATIVE_VOLUME_TYPE,
     },
     .ops = {
         .init     = sink_dma_init,
diff --git a/firmware/target/arm/imx233/pcm-imx233.c b/firmware/target/arm/imx233/pcm-imx233.c
index 0c5b4624f4..7ee5860c0f 100644
--- a/firmware/target/arm/imx233/pcm-imx233.c
+++ b/firmware/target/arm/imx233/pcm-imx233.c
@@ -175,6 +175,7 @@ struct pcm_sink builtin_pcm_sink = {
         .samprs       = hw_freq_sampr,
         .num_samprs   = HW_NUM_FREQ,
         .default_freq = HW_FREQ_DEFAULT,
+        .volume_type  = PCM_NATIVE_VOLUME_TYPE,
     },
     .ops = {
         .init     = audiohw_preinit,
diff --git a/firmware/target/arm/imx31/gigabeat-s/pcm-gigabeat-s.c b/firmware/target/arm/imx31/gigabeat-s/pcm-gigabeat-s.c
index 25d149f74d..772964aaae 100644
--- a/firmware/target/arm/imx31/gigabeat-s/pcm-gigabeat-s.c
+++ b/firmware/target/arm/imx31/gigabeat-s/pcm-gigabeat-s.c
@@ -229,6 +229,7 @@ struct pcm_sink builtin_pcm_sink = {
         .samprs       = hw_freq_sampr,
         .num_samprs   = HW_NUM_FREQ,
         .default_freq = HW_FREQ_DEFAULT,
+        .volume_type  = PCM_NATIVE_VOLUME_TYPE,
     },
     .ops = {
         .init     = sink_dma_init,
diff --git a/firmware/target/arm/pcm-telechips.c b/firmware/target/arm/pcm-telechips.c
index 3c9ca6b9b5..37c69a5323 100644
--- a/firmware/target/arm/pcm-telechips.c
+++ b/firmware/target/arm/pcm-telechips.c
@@ -174,6 +174,7 @@ struct pcm_sink builtin_pcm_sink = {
         .samprs       = hw_freq_sampr,
         .num_samprs   = HW_NUM_FREQ,
         .default_freq = HW_FREQ_DEFAULT,
+        .volume_type  = PCM_NATIVE_VOLUME_TYPE,
     },
     .ops = {
         .init     = sink_dma_init,
diff --git a/firmware/target/arm/pp/pcm-pp.c b/firmware/target/arm/pp/pcm-pp.c
index 2a1ddd7668..08b7328e1c 100644
--- a/firmware/target/arm/pp/pcm-pp.c
+++ b/firmware/target/arm/pp/pcm-pp.c
@@ -517,6 +517,7 @@ struct pcm_sink builtin_pcm_sink = {
         .samprs       = hw_freq_sampr,
         .num_samprs   = HW_NUM_FREQ,
         .default_freq = HW_FREQ_DEFAULT,
+        .volume_type  = PCM_NATIVE_VOLUME_TYPE,
     },
     .ops = {
         .init     = sink_dma_init,
diff --git a/firmware/target/arm/rk27xx/pcm-rk27xx.c b/firmware/target/arm/rk27xx/pcm-rk27xx.c
index 3d7532d787..88139aecc4 100644
--- a/firmware/target/arm/rk27xx/pcm-rk27xx.c
+++ b/firmware/target/arm/rk27xx/pcm-rk27xx.c
@@ -263,6 +263,7 @@ struct pcm_sink builtin_pcm_sink = {
         .samprs       = hw_freq_sampr,
         .num_samprs   = HW_NUM_FREQ,
         .default_freq = HW_FREQ_DEFAULT,
+        .volume_type  = PCM_NATIVE_VOLUME_TYPE,
     },
     .ops = {
         .init     = sink_dma_init,
diff --git a/firmware/target/arm/s3c2440/gigabeat-fx/pcm-meg-fx.c b/firmware/target/arm/s3c2440/gigabeat-fx/pcm-meg-fx.c
index 432862d39d..c76790d609 100644
--- a/firmware/target/arm/s3c2440/gigabeat-fx/pcm-meg-fx.c
+++ b/firmware/target/arm/s3c2440/gigabeat-fx/pcm-meg-fx.c
@@ -220,6 +220,7 @@ struct pcm_sink builtin_pcm_sink = {
         .samprs       = hw_freq_sampr,
         .num_samprs   = HW_NUM_FREQ,
         .default_freq = HW_FREQ_DEFAULT,
+        .volume_type  = PCM_NATIVE_VOLUME_TYPE,
     },
     .ops = {
         .init     = sink_dma_init,
diff --git a/firmware/target/arm/s5l8700/pcm-s5l8700.c b/firmware/target/arm/s5l8700/pcm-s5l8700.c
index 5bd2d4046d..8e36c9d60e 100644
--- a/firmware/target/arm/s5l8700/pcm-s5l8700.c
+++ b/firmware/target/arm/s5l8700/pcm-s5l8700.c
@@ -272,6 +272,7 @@ struct pcm_sink builtin_pcm_sink = {
         .samprs       = hw_freq_sampr,
         .num_samprs   = HW_NUM_FREQ,
         .default_freq = HW_FREQ_DEFAULT,
+        .volume_type  = PCM_NATIVE_VOLUME_TYPE,
     },
     .ops = {
         .init     = sink_dma_init,
diff --git a/firmware/target/arm/s5l8702/pcm-s5l8702.c b/firmware/target/arm/s5l8702/pcm-s5l8702.c
index bd110f31c4..9af30b9c4b 100644
--- a/firmware/target/arm/s5l8702/pcm-s5l8702.c
+++ b/firmware/target/arm/s5l8702/pcm-s5l8702.c
@@ -220,6 +220,7 @@ struct pcm_sink builtin_pcm_sink = {
         .samprs       = hw_freq_sampr,
         .num_samprs   = HW_NUM_FREQ,
         .default_freq = HW_FREQ_DEFAULT,
+        .volume_type  = PCM_NATIVE_VOLUME_TYPE,
     },
     .ops = {
         .init     = sink_dma_init,
diff --git a/firmware/target/arm/stm32/echoplayer/pcm-echoplayer.c b/firmware/target/arm/stm32/echoplayer/pcm-echoplayer.c
index d4944ce241..d1b4830d47 100644
--- a/firmware/target/arm/stm32/echoplayer/pcm-echoplayer.c
+++ b/firmware/target/arm/stm32/echoplayer/pcm-echoplayer.c
@@ -309,6 +309,7 @@ struct pcm_sink builtin_pcm_sink = {
         .samprs       = hw_freq_sampr,
         .num_samprs   = HW_NUM_FREQ,
         .default_freq = HW_FREQ_DEFAULT,
+        .volume_type  = PCM_NATIVE_VOLUME_TYPE,
     },
     .ops = {
         .init     = sink_dma_init,
diff --git a/firmware/target/arm/tms320dm320/mrobe-500/pcm-mr500.c b/firmware/target/arm/tms320dm320/mrobe-500/pcm-mr500.c
index 8cb966fb8a..f8c261755e 100644
--- a/firmware/target/arm/tms320dm320/mrobe-500/pcm-mr500.c
+++ b/firmware/target/arm/tms320dm320/mrobe-500/pcm-mr500.c
@@ -162,6 +162,7 @@ struct pcm_sink builtin_pcm_sink = {
         .samprs       = hw_freq_sampr,
         .num_samprs   = HW_NUM_FREQ,
         .default_freq = HW_FREQ_DEFAULT,
+        .volume_type  = PCM_NATIVE_VOLUME_TYPE,
     },
     .ops = {
         .init     = sink_dma_init,
diff --git a/firmware/target/arm/tms320dm320/sansa-connect/pcm-sansaconnect.c b/firmware/target/arm/tms320dm320/sansa-connect/pcm-sansaconnect.c
index 0f529f733d..61cd143221 100644
--- a/firmware/target/arm/tms320dm320/sansa-connect/pcm-sansaconnect.c
+++ b/firmware/target/arm/tms320dm320/sansa-connect/pcm-sansaconnect.c
@@ -164,6 +164,7 @@ struct pcm_sink builtin_pcm_sink = {
         .samprs       = hw_freq_sampr,
         .num_samprs   = HW_NUM_FREQ,
         .default_freq = HW_FREQ_DEFAULT,
+        .volume_type  = PCM_NATIVE_VOLUME_TYPE,
     },
     .ops = {
         .init     = sink_dma_init,
diff --git a/firmware/target/coldfire/pcm-coldfire.c b/firmware/target/coldfire/pcm-coldfire.c
index 531feeec2d..24ef8ee190 100644
--- a/firmware/target/coldfire/pcm-coldfire.c
+++ b/firmware/target/coldfire/pcm-coldfire.c
@@ -306,6 +306,7 @@ struct pcm_sink builtin_pcm_sink = {
         .samprs       = hw_freq_sampr,
         .num_samprs   = HW_NUM_FREQ,
         .default_freq = HW_FREQ_DEFAULT,
+        .volume_type  = PCM_NATIVE_VOLUME_TYPE,
     },
     .ops = {
         .init     = sink_dma_init,
diff --git a/firmware/target/hosted/android/pcm-android.c b/firmware/target/hosted/android/pcm-android.c
index 467f60e6cb..ca53d9a27d 100644
--- a/firmware/target/hosted/android/pcm-android.c
+++ b/firmware/target/hosted/android/pcm-android.c
@@ -29,6 +29,7 @@
 #include "pcm-internal.h"
 #include "pcm_sampr.h"
 #include "pcm_sink.h"
+#include "audiohw.h"
 
 extern JNIEnv *env_ptr;
 
@@ -220,6 +221,7 @@ struct pcm_sink builtin_pcm_sink = {
         .samprs       = hw_freq_sampr,
         .num_samprs   = HW_NUM_FREQ,
         .default_freq = HW_FREQ_DEFAULT,
+        .volume_type  = PCM_NATIVE_VOLUME_TYPE,
     },
     .ops = {
         .init     = sink_dma_init,
diff --git a/firmware/target/hosted/ctru/pcm-ctru.c b/firmware/target/hosted/ctru/pcm-ctru.c
index 4c296b6284..999b87ca0e 100644
--- a/firmware/target/hosted/ctru/pcm-ctru.c
+++ b/firmware/target/hosted/ctru/pcm-ctru.c
@@ -364,6 +364,7 @@ struct pcm_sink builtin_pcm_sink = {
         .samprs       = hw_freq_sampr,
         .num_samprs   = HW_NUM_FREQ,
         .default_freq = HW_FREQ_DEFAULT,
+        .volume_type  = PCM_NATIVE_VOLUME_TYPE,
     },
     .ops = {
         .init     = sink_dma_init,
diff --git a/firmware/target/hosted/ibasso/pcm-ibasso.c b/firmware/target/hosted/ibasso/pcm-ibasso.c
index ea5651ac7e..94f9359029 100644
--- a/firmware/target/hosted/ibasso/pcm-ibasso.c
+++ b/firmware/target/hosted/ibasso/pcm-ibasso.c
@@ -33,6 +33,7 @@
 #include "pcm-internal.h"
 #include "pcm_sampr.h"
 #include "pcm_sink.h"
+#include "audiohw.h"
 
 #include "sound/asound.h"
 #include "tinyalsa/asoundlib.h"
@@ -458,6 +459,7 @@ struct pcm_sink builtin_pcm_sink = {
         .samprs       = hw_freq_sampr,
         .num_samprs   = HW_NUM_FREQ,
         .default_freq = HW_FREQ_DEFAULT,
+        .volume_type  = PCM_NATIVE_VOLUME_TYPE,
     },
     .ops = {
         .init     = sink_dma_init,
diff --git a/firmware/target/hosted/pcm-alsa.c b/firmware/target/hosted/pcm-alsa.c
index 7e4833fdfe..10b379b03d 100644
--- a/firmware/target/hosted/pcm-alsa.c
+++ b/firmware/target/hosted/pcm-alsa.c
@@ -775,6 +775,7 @@ struct pcm_sink builtin_pcm_sink = {
         .samprs       = hw_freq_sampr,
         .num_samprs   = HW_NUM_FREQ,
         .default_freq = HW_FREQ_DEFAULT,
+        .volume_type  = PCM_NATIVE_VOLUME_TYPE,
     },
     .ops = {
         .init     = sink_dma_init,
diff --git a/firmware/target/hosted/sdl/pcm-sdl.c b/firmware/target/hosted/sdl/pcm-sdl.c
index 2b9df50faf..d2ed462a4d 100644
--- a/firmware/target/hosted/sdl/pcm-sdl.c
+++ b/firmware/target/hosted/sdl/pcm-sdl.c
@@ -449,6 +449,7 @@ struct pcm_sink builtin_pcm_sink = {
         .samprs       = hw_freq_sampr,
         .num_samprs   = HW_NUM_FREQ,
         .default_freq = HW_FREQ_DEFAULT,
+        .volume_type  = PCM_NATIVE_VOLUME_TYPE,
     },
     .ops = {
         .init     = sink_dma_init,
diff --git a/firmware/target/mips/ingenic_jz47xx/pcm-jz4740.c b/firmware/target/mips/ingenic_jz47xx/pcm-jz4740.c
index a843480309..93fc4f4ca6 100644
--- a/firmware/target/mips/ingenic_jz47xx/pcm-jz4740.c
+++ b/firmware/target/mips/ingenic_jz47xx/pcm-jz4740.c
@@ -193,6 +193,7 @@ struct pcm_sink builtin_pcm_sink = {
         .samprs       = hw_freq_sampr,
         .num_samprs   = HW_NUM_FREQ,
         .default_freq = HW_FREQ_DEFAULT,
+        .volume_type  = PCM_NATIVE_VOLUME_TYPE,
     },
     .ops = {
         .init     = sink_dma_init,
diff --git a/firmware/target/mips/ingenic_jz47xx/pcm-jz4760.c b/firmware/target/mips/ingenic_jz47xx/pcm-jz4760.c
index 37718d08da..29e35b63a4 100644
--- a/firmware/target/mips/ingenic_jz47xx/pcm-jz4760.c
+++ b/firmware/target/mips/ingenic_jz47xx/pcm-jz4760.c
@@ -178,6 +178,7 @@ struct pcm_sink builtin_pcm_sink = {
         .samprs       = hw_freq_sampr,
         .num_samprs   = HW_NUM_FREQ,
         .default_freq = HW_FREQ_DEFAULT,
+        .volume_type  = PCM_NATIVE_VOLUME_TYPE,
     },
     .ops = {
         .init     = sink_dma_init,
diff --git a/firmware/target/mips/ingenic_x1000/pcm-x1000.c b/firmware/target/mips/ingenic_x1000/pcm-x1000.c
index 24dc49a1a1..05baa3cf44 100644
--- a/firmware/target/mips/ingenic_x1000/pcm-x1000.c
+++ b/firmware/target/mips/ingenic_x1000/pcm-x1000.c
@@ -208,6 +208,7 @@ struct pcm_sink builtin_pcm_sink = {
         .samprs       = hw_freq_sampr,
         .num_samprs   = HW_NUM_FREQ,
         .default_freq = HW_FREQ_DEFAULT,
+        .volume_type  = PCM_NATIVE_VOLUME_TYPE,
     },
     .ops = {
         .init     = sink_dma_init,
diff --git a/firmware/usbstack/iap/audio.c b/firmware/usbstack/iap/audio.c
index 9dcbd01025..f4706b56d6 100644
--- a/firmware/usbstack/iap/audio.c
+++ b/firmware/usbstack/iap/audio.c
@@ -187,6 +187,7 @@ struct pcm_sink iap_pcm_sink = {
         .samprs       = samprs,
         .num_samprs   = ARRAYLEN(samprs),
         .default_freq = 0,
+        .volume_type  = PCM_SINK_HWVOL,
     },
     .ops = {
         .init     = sink_nop,
-- 
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.