summaryrefslogtreecommitdiff
path: root/firmware
diff options
context:
space:
mode:
authorMichael Sevakis <jethead71@rockbox.org>2013-04-20 04:06:13 -0400
committerMichael Sevakis <jethead71@rockbox.org>2013-04-22 20:38:17 -0400
commite61e9c61d0ba6990576d59efca07afa13fd97566 (patch)
tree4b17b22dd4f56568666e25292f38224529ec7113 /firmware
parent91b33d5a3e92d62cf6fb6be875437d35b632caf5 (diff)
Do some cleanup, adjustment and a couple fixes to recent sound changes.
* SOUND_x enum can be generated by audiohw_settings.h along with settings entries and sound_val2phys. * VOLUME_MIN and VOLUME_MAX are no longer necessary within sound.c. If you need them, they are for target-defined purposes. * Fix up SDL volume implementation in sdl.c. Move sim volume calculation code to pcm-sdl.c. * Min trigger tresholds were based upon VOLUME_MIN for some reason. These setting have nothing to do with playback volume. Since it is no longer present, set these at -89dB which is the minimum peak meter sensitivity setting. * Fix an oversight in wm8758.c. I forgot to add the dB->register conversion to audiohw_set_volume. Change-Id: Ie1df33f1793eee75e6793f16bc7bddd16edb7f75
Diffstat (limited to 'firmware')
-rw-r--r--firmware/drivers/audio/aic3x.c6
-rw-r--r--firmware/drivers/audio/ak4537.c4
-rw-r--r--firmware/drivers/audio/as3514.c17
-rw-r--r--firmware/drivers/audio/cs42l55.c2
-rw-r--r--firmware/drivers/audio/dummy_codec.c6
-rw-r--r--firmware/drivers/audio/rk27xx_codec.c2
-rw-r--r--firmware/drivers/audio/sdl.c20
-rw-r--r--firmware/drivers/audio/tlv320.c2
-rw-r--r--firmware/drivers/audio/tsc2100.c6
-rw-r--r--firmware/drivers/audio/uda1341.c2
-rw-r--r--firmware/drivers/audio/wm8731.c2
-rw-r--r--firmware/drivers/audio/wm8751.c2
-rw-r--r--firmware/drivers/audio/wm8758.c10
-rw-r--r--firmware/drivers/audio/wm8975.c2
-rw-r--r--firmware/drivers/audio/wm8978.c21
-rw-r--r--firmware/drivers/audio/wm8985.c4
-rw-r--r--firmware/export/aic3x.h3
-rw-r--r--firmware/export/ak4537.h3
-rw-r--r--firmware/export/as3514.h6
-rw-r--r--firmware/export/audiohw.h137
-rw-r--r--firmware/export/audiohw_settings.h17
-rw-r--r--firmware/export/cs42l55.h4
-rw-r--r--firmware/export/dummy_codec.h7
-rw-r--r--firmware/export/hosted_codec.h5
-rw-r--r--firmware/export/imx233-codec.h3
-rw-r--r--firmware/export/jz4740-codec.h4
-rw-r--r--firmware/export/mas35xx.h5
-rw-r--r--firmware/export/rk27xx_codec.h2
-rw-r--r--firmware/export/tlv320.h3
-rw-r--r--firmware/export/tsc2100.h6
-rw-r--r--firmware/export/uda1341.h6
-rw-r--r--firmware/export/uda1380.h6
-rw-r--r--firmware/export/wm8731.h4
-rw-r--r--firmware/export/wm8751.h4
-rw-r--r--firmware/export/wm8758.h4
-rw-r--r--firmware/export/wm8975.h4
-rw-r--r--firmware/export/wm8978.h3
-rw-r--r--firmware/export/wm8985.h4
-rw-r--r--firmware/sound.c109
-rw-r--r--firmware/target/hosted/maemo/pcm-gstreamer.c6
-rw-r--r--firmware/target/hosted/sdl/pcm-sdl.c4
-rw-r--r--firmware/target/mips/ingenic_jz47xx/codec-jz4740.c6
42 files changed, 168 insertions, 305 deletions
diff --git a/firmware/drivers/audio/aic3x.c b/firmware/drivers/audio/aic3x.c
index 60330f1779..9b705db7f5 100644
--- a/firmware/drivers/audio/aic3x.c
+++ b/firmware/drivers/audio/aic3x.c
@@ -37,17 +37,17 @@ static char volume_left = 0, volume_right = 0;
static int vol_tenthdb2hw(int db)
{
/* 0 to -63.0dB in 1dB steps, aic3x can goto -63.5 in 0.5dB steps */
- if (db < VOLUME_MIN)
+ if (db <= -640)
{
return 0x7E;
}
- else if (db >= VOLUME_MAX)
+ else if (db >= 0)
{
return 0x00;
}
else
{
- return (-((db)/5)); /* VOLUME_MIN is negative */
+ return (-((db)/5));
}
}
diff --git a/firmware/drivers/audio/ak4537.c b/firmware/drivers/audio/ak4537.c
index 1628af8a5c..90d264e445 100644
--- a/firmware/drivers/audio/ak4537.c
+++ b/firmware/drivers/audio/ak4537.c
@@ -67,9 +67,9 @@ static void codec_set_active(int active)
/* convert tenth of dB volume (-1270..0) to master volume register value */
static int vol_tenthdb2hw(int db)
{
- if (db < VOLUME_MIN)
+ if (db <= -1280)
return 0xff; /* mute */
- else if (db >= VOLUME_MAX)
+ else if (db >= 0)
return 0x00;
else
return ((-db)/5);
diff --git a/firmware/drivers/audio/as3514.c b/firmware/drivers/audio/as3514.c
index e1c7f6575e..1f79277423 100644
--- a/firmware/drivers/audio/as3514.c
+++ b/firmware/drivers/audio/as3514.c
@@ -31,6 +31,16 @@
#include "i2s.h"
#include "ascodec.h"
+#if CONFIG_CPU == AS3525v2
+/* Headphone volume goes from -81.0 ... +6dB */
+#define VOLUME_MIN -820
+#define VOLUME_MAX 60
+#else
+/* Headphone volume goes from -73.5 ... +6dB */
+#define VOLUME_MIN -740
+#define VOLUME_MAX 60
+#endif
+
/*
* This drivers supports:
* as3514 , as used in the PP targets
@@ -99,13 +109,12 @@ static void as3514_write_masked(unsigned int reg, unsigned int bits,
/* convert tenth of dB volume to master volume register value */
static int vol_tenthdb2hw(int db)
{
- /* +6 to -73.5dB (or -81.0 dB) in 1.5dB steps == 53 (or 58) levels */
- if (db < VOLUME_MIN) {
+ if (db <= VOLUME_MIN) {
return 0x0;
} else if (db > VOLUME_MAX) {
- return (VOLUME_MAX-VOLUME_MIN)/15;
+ return (VOLUME_MAX - VOLUME_MIN) / 15;
} else {
- return((db-VOLUME_MIN)/15); /* VOLUME_MIN is negative */
+ return (db - VOLUME_MIN) / 15;
}
}
diff --git a/firmware/drivers/audio/cs42l55.c b/firmware/drivers/audio/cs42l55.c
index 6c6e17abd4..02c80daf7d 100644
--- a/firmware/drivers/audio/cs42l55.c
+++ b/firmware/drivers/audio/cs42l55.c
@@ -38,7 +38,7 @@ static int vol_tenthdb2hw(int db)
/* 0001100 == +12dB (0xc) */
/* 0000000 == 0dB (0x0) */
/* 1000100 == -60dB (0x44, this is actually -58dB) */
- if (db < VOLUME_MIN) return HPACTL_HPAMUTE;
+ if (db <= -600) return HPACTL_HPAMUTE;
return (db / 10) & HPACTL_HPAVOL_MASK;
}
diff --git a/firmware/drivers/audio/dummy_codec.c b/firmware/drivers/audio/dummy_codec.c
index 3e73137eb9..fbbe836499 100644
--- a/firmware/drivers/audio/dummy_codec.c
+++ b/firmware/drivers/audio/dummy_codec.c
@@ -40,9 +40,9 @@ void audiohw_set_frequency(int fsel)
#ifdef HAVE_SW_VOLUME_CONTROL
void audiohw_set_volume(int vol_l, int vol_r)
{
- /* SW volume for <= 1.0 gain, HW at unity, < VOLUME_MIN == MUTE */
- int sw_volume_l = vol_l < VOLUME_MIN ? PCM_MUTE_LEVEL : MIN(vol_l, 0);
- int sw_volume_r = vol_r < VOLUME_MIN ? PCM_MUTE_LEVEL : MIN(vol_r, 0);
+ /* SW volume for <= 1.0 gain, HW at unity, <= DUMMY_VOLUME_MIN == MUTE */
+ int sw_volume_l = vol_l <= DUMMY_VOLUME_MIN ? PCM_MUTE_LEVEL : vol_l;
+ int sw_volume_r = vol_r <= DUMMY_VOLUME_MIN ? PCM_MUTE_LEVEL : vol_r;
pcm_set_master_volume(sw_volume_l, sw_volume_r);
}
#endif /* HAVE_SW_VOLUME_CONTROL */
diff --git a/firmware/drivers/audio/rk27xx_codec.c b/firmware/drivers/audio/rk27xx_codec.c
index 8f294ba9f3..2b0f2dbb22 100644
--- a/firmware/drivers/audio/rk27xx_codec.c
+++ b/firmware/drivers/audio/rk27xx_codec.c
@@ -58,7 +58,7 @@ static int vol_tenthdb2hw(int tdb)
* depending on gain region.
*/
- if (tdb < VOLUME_MIN)
+ if (tdb <= -340)
return 32;
else if (tdb < -115)
return -(((tdb + 115)/20) - 20); /* 2.0 dB steps */
diff --git a/firmware/drivers/audio/sdl.c b/firmware/drivers/audio/sdl.c
index c14ba0c583..f35cec8cb7 100644
--- a/firmware/drivers/audio/sdl.c
+++ b/firmware/drivers/audio/sdl.c
@@ -23,6 +23,12 @@
#include "config.h"
#include "sound.h"
#include "pcm_sampr.h"
+#if CONFIG_CODEC == SWCODEC
+#include "fixedpoint.h"
+#ifdef HAVE_SW_VOLUME_CONTROL
+#include "pcm_sw_volume.h"
+#endif
+#endif
/**
* Audio Hardware api. Make them do nothing as we cannot properly simulate with
@@ -30,8 +36,6 @@
**/
#ifdef HAVE_SW_VOLUME_CONTROL
-#include "pcm_sw_volume.h"
-
void audiohw_set_volume(int vol_l, int vol_r)
{
pcm_set_master_volume(vol_l, vol_r);
@@ -39,21 +43,13 @@ void audiohw_set_volume(int vol_l, int vol_r)
#else /* ndef HAVE_SW_VOLUME_CONTROL */
-extern void pcm_set_mixer_volume(int);
void audiohw_set_volume(int volume)
{
#if CONFIG_CODEC == SWCODEC
-#if !(CONFIG_PLATFORM & PLATFORM_MAEMO5)
- if (volume < VOLUME_MIN)
- volume = 0;
- else
- volume = SDL_MIX_MAXVOLUME * (volume - VOLUME_MIN + ONE_DB) /
- (VOLUME_RANGE + ONE_DB);
-#endif /* !(CONFIG_PLATFORM & PLATFORM_MAEMO5) */
-
+ extern void pcm_set_mixer_volume(int volume);
pcm_set_mixer_volume(volume);
-#endif /* CONFIG_CODEC == SWCODEC */
+#endif
(void)volume;
}
#endif /* HAVE_SW_VOLUME_CONTROL */
diff --git a/firmware/drivers/audio/tlv320.c b/firmware/drivers/audio/tlv320.c
index 6118734d37..9fa676f3d5 100644
--- a/firmware/drivers/audio/tlv320.c
+++ b/firmware/drivers/audio/tlv320.c
@@ -40,7 +40,7 @@ static int vol_tenthdb2hw(int db)
/* 0110000 == -73dB (0x30) */
/* 0101111 == mute (0x2f) */
- if (db < VOLUME_MIN) {
+ if (db <= -740) {
return 0x2f;
} else {
return((db/10)+73+0x30);
diff --git a/firmware/drivers/audio/tsc2100.c b/firmware/drivers/audio/tsc2100.c
index fda192a62a..b74d445056 100644
--- a/firmware/drivers/audio/tsc2100.c
+++ b/firmware/drivers/audio/tsc2100.c
@@ -34,12 +34,12 @@ static bool is_muted = false;
static int vol_tenthdb2hw(int db)
{
/* 0 to -63.0dB in 1dB steps, tsc2100 can goto -63.5 in 0.5dB steps */
- if (db < VOLUME_MIN) {
+ if (db <= -640) {
return 0x7E;
- } else if (db >= VOLUME_MAX) {
+ } else if (db >= 0) {
return 0x00;
} else {
- return(-((db)/5)); /* VOLUME_MIN is negative */
+ return(-((db)/5));
}
}
diff --git a/firmware/drivers/audio/uda1341.c b/firmware/drivers/audio/uda1341.c
index e15cd39bfc..75573105de 100644
--- a/firmware/drivers/audio/uda1341.c
+++ b/firmware/drivers/audio/uda1341.c
@@ -31,7 +31,7 @@
/* convert tenth of dB volume (-600..0) to volume register value */
static int vol_tenthdb2hw(int db)
{
- if (db < -600)
+ if (db <= -610)
return 63;
else /* 1 dB steps */
return -(db / 10) + 1;
diff --git a/firmware/drivers/audio/wm8731.c b/firmware/drivers/audio/wm8731.c
index f84edc55da..5c1e623a35 100644
--- a/firmware/drivers/audio/wm8731.c
+++ b/firmware/drivers/audio/wm8731.c
@@ -101,7 +101,7 @@ static int vol_tenthdb2hw(int db)
/* 1111001 == 0dB (0x79) */
/* 0110000 == -73dB (0x30) */
/* 0101111 == mute (0x2f) */
- if (db < VOLUME_MIN) {
+ if (db <= -740) {
return 0x2f;
} else {
return((db/10)+0x30+73);
diff --git a/firmware/drivers/audio/wm8751.c b/firmware/drivers/audio/wm8751.c
index feba05e504..476c6c342a 100644
--- a/firmware/drivers/audio/wm8751.c
+++ b/firmware/drivers/audio/wm8751.c
@@ -117,7 +117,7 @@ static int vol_tenthdb2hw(int db)
/* 1111001 == 0dB (0x79) */
/* 0110000 == -73dB (0x30) */
/* 0101111..0000000 == mute (<= 0x2f) */
- if (db < VOLUME_MIN)
+ if (db <= -740)
return 0x0;
else
return (db / 10) + 73 + 0x30;
diff --git a/firmware/drivers/audio/wm8758.c b/firmware/drivers/audio/wm8758.c
index 3f3ac79229..f7d7a5bc22 100644
--- a/firmware/drivers/audio/wm8758.c
+++ b/firmware/drivers/audio/wm8758.c
@@ -38,7 +38,7 @@ static unsigned short eq1_reg = EQ1_EQ3DMODE | EQ_GAIN_VALUE(0);
static unsigned short eq5_reg = EQ_GAIN_VALUE(0);
/* convert tenth of dB volume (-89..6) to master volume register value */
-int tenthdb2master(int db)
+static int vol_tenthdb2hw(int db)
{
/* att DAC AMP result
+6dB 0 +6 96
@@ -47,10 +47,10 @@ int tenthdb2master(int db)
-58dB -1 -57 32
-89dB -32 -57 1
-90dB -oo -oo 0 */
- if (db < VOLUME_MIN) {
+ if (db <= -900) {
return 0;
} else {
- return (db-VOLUME_MIN)/10 + 1;
+ return db / 10 - -90;
}
}
@@ -137,6 +137,10 @@ void audiohw_postinit(void)
void audiohw_set_volume(int vol_l, int vol_r)
{
int dac_l, amp_l, dac_r, amp_r;
+
+ vol_l = vol_tenthdb2hw(vol_l);
+ vol_r = vol_tenthdb2hw(vol_r);
+
get_volume_params(vol_l, &dac_l, &amp_l);
get_volume_params(vol_r, &dac_r, &amp_r);
diff --git a/firmware/drivers/audio/wm8975.c b/firmware/drivers/audio/wm8975.c
index 4905445aea..931dae9c6f 100644
--- a/firmware/drivers/audio/wm8975.c
+++ b/firmware/drivers/audio/wm8975.c
@@ -79,7 +79,7 @@ static int vol_tenthdb2hw(int db)
/* 0110000 == -73dB (0x30 */
/* 0101111..0000000 == mute (0x2f) */
- if (db < VOLUME_MIN) {
+ if (db <= -740) {
return 0x0;
} else {
return((db/10)+73+0x30);
diff --git a/firmware/drivers/audio/wm8978.c b/firmware/drivers/audio/wm8978.c
index 3a86ef204e..69ae608e5d 100644
--- a/firmware/drivers/audio/wm8978.c
+++ b/firmware/drivers/audio/wm8978.c
@@ -155,20 +155,17 @@ static void wmc_write_masked(unsigned int reg, unsigned int bits,
* (000000...111111) */
static int vol_tenthdb2hw(int db)
{
- /* -90dB to +6dB 1dB steps (96 levels) 7bits */
- /* 1100000 == +6dB (0x60,96) */
- /* 1101010 == 0dB (0x5a,90) */
- /* 1000001 == -57dB (0x21,33,DAC) */
- /* 0000001 == -89dB (0x01,01) */
- /* 0000000 == -90dB (0x00,00,Mute) */
- if (db < VOLUME_MIN)
- {
+ /* att DAC AMP result
+ +6dB 0 +6 96
+ 0dB 0 0 90
+ -57dB 0 -57 33
+ -58dB -1 -57 32
+ -89dB -32 -57 1
+ -90dB -oo -oo 0 */
+ if (db <= -900)
return 0x0;
- }
else
- {
- return (db - VOLUME_MIN) / 10;
- }
+ return db / 10 - -90;
}
void audiohw_preinit(void)
diff --git a/firmware/drivers/audio/wm8985.c b/firmware/drivers/audio/wm8985.c
index 2d49e706c8..fab7354685 100644
--- a/firmware/drivers/audio/wm8985.c
+++ b/firmware/drivers/audio/wm8985.c
@@ -104,10 +104,10 @@ static int vol_tenthdb2hw(int db)
-89dB -32 -57 1
-90dB -oo -oo 0 */
- if (db < VOLUME_MIN) {
+ if (db <= -900) {
return 0;
} else {
- return (db-VOLUME_MIN)/10 + 1;
+ return db / 10 - -90;
}
}
diff --git a/firmware/export/aic3x.h b/firmware/export/aic3x.h
index 65e1ebd62c..1baf52684a 100644
--- a/firmware/export/aic3x.h
+++ b/firmware/export/aic3x.h
@@ -22,9 +22,6 @@
#ifndef _AIC3X_H_
#define _AIC3X_H_
-#define VOLUME_MIN -630
-#define VOLUME_MAX 0
-
AUDIOHW_SETTING(VOLUME, "dB", 0, 1, -64, 0, -25)
/*** definitions ***/
diff --git a/firmware/export/ak4537.h b/firmware/export/ak4537.h
index abf2a378ae..d66205af7c 100644
--- a/firmware/export/ak4537.h
+++ b/firmware/export/ak4537.h
@@ -23,9 +23,6 @@
#define _AK4537_H
/* Volume goes from -127.0 ... 0 dB in 0.5 dB increments */
-#define VOLUME_MIN -1270
-#define VOLUME_MAX 0
-
AUDIOHW_SETTING(VOLUME, "dB", 0, 1, -128, 0, -25)
#define AKC_NUM_REGS 0x11
diff --git a/firmware/export/as3514.h b/firmware/export/as3514.h
index e9e48fab63..b5c9438786 100644
--- a/firmware/export/as3514.h
+++ b/firmware/export/as3514.h
@@ -32,14 +32,8 @@
/*different volume ranges for different AMS chips*/
#if CONFIG_CPU == AS3525v2
-/* Headphone volume goes from -81.0 ... +6dB */
-#define VOLUME_MIN -810
-#define VOLUME_MAX 60
AUDIOHW_SETTING(VOLUME, "dB", 0, 1, -82, 6, -25)
#else /* AS3525v1 */
-/* Headphone volume goes from -73.5 ... +6dB */
-#define VOLUME_MIN -735
-#define VOLUME_MAX 60
AUDIOHW_SETTING(VOLUME, "dB", 0, 1, -74, 6, -25)
#endif /* CONFIG_CPU == AS3525v2 */
diff --git a/firmware/export/audiohw.h b/firmware/export/audiohw.h
index 3fce3fc6d4..e3b9623262 100644
--- a/firmware/export/audiohw.h
+++ b/firmware/export/audiohw.h
@@ -126,22 +126,6 @@ AUDIOHW_SETTING(BALANCE, "%", 0, 1, -100, 100, 0)
AUDIOHW_SETTING(CHANNELS, "", 0, 1, 0, 5, 0)
AUDIOHW_SETTING(STEREO_WIDTH, "%", 0, 5, 0, 250, 100)
-#define ONE_DB 10
-
-#if !defined(VOLUME_MIN) && !defined(VOLUME_MAX)
-#warning define for VOLUME_MIN and VOLUME_MAX is missing
-#define VOLUME_MIN -700
-#define VOLUME_MAX 0
-#endif
-
-#ifndef AUDIOHW_NUM_TONE_CONTROLS
-#define AUDIOHW_NUM_TONE_CONTROLS 0
-#endif
-
-/* volume/balance/treble/bass interdependency main part */
-#define VOLUME_RANGE (VOLUME_MAX - VOLUME_MIN)
-
-
/* convert caps into defines */
#ifdef AUDIOHW_CAPS
/* Tone controls */
@@ -183,7 +167,7 @@ AUDIOHW_SETTING(STEREO_WIDTH, "%", 0, 5, 0, 250, 100)
enum
{
/* Band 1 is implied; bands must be contiguous, 1 to N */
- AUDIOHW_EQ_BAND1 = 0,
+ AUDIOHW_EQ_BAND1,
#define AUDIOHW_HAVE_EQ_BAND1
#if (AUDIOHW_EQ_BAND_CAPS & (EQ_CAP << 1))
AUDIOHW_EQ_BAND2,
@@ -209,7 +193,6 @@ enum
#define AUDIOHW_HAVE_EQ_FREQUENCY
enum
{
- __AUDIOHW_EQ_BAND_FREQUENCY = -1,
#if defined(AUDIOHW_HAVE_EQ_BAND1) && \
(AUDIOHW_EQ_FREQUENCY_CAPS & (EQ_CAP << 0))
AUDIOHW_EQ_BAND1_FREQUENCY,
@@ -235,7 +218,7 @@ enum
AUDIOHW_EQ_BAND5_FREQUENCY,
#define AUDIOHW_HAVE_EQ_BAND5_FREQUENCY
#endif
- AUDIOHW_EQ_FREQUENCY_NUM,
+ AUDIOHW_EQ_FREQUENCY_NUM, /* Keep last */
};
#endif /* AUDIOHW_EQ_FREQUENCY_CAPS */
@@ -244,7 +227,6 @@ enum
#define AUDIOHW_HAVE_EQ_WIDTH
enum
{
- __AUDIOHW_EQ_BAND_WIDTH = -1,
#if defined(AUDIOHW_HAVE_EQ_BAND1) && \
(AUDIOHW_EQ_WIDTH_CAPS & (EQ_CAP << 1))
AUDIOHW_EQ_BAND2_WIDTH,
@@ -267,7 +249,7 @@ enum
/* Types and number of settings types (gain, frequency, width) */
enum AUDIOHW_EQ_SETTINGS
{
- AUDIOHW_EQ_GAIN = 0,
+ AUDIOHW_EQ_GAIN,
#ifdef AUDIOHW_HAVE_EQ_FREQUENCY
AUDIOHW_EQ_FREQUENCY,
#endif
@@ -309,104 +291,8 @@ enum AUDIOHW_EQ_SETTINGS
#endif
#endif /* AUDIOHW_CAPS */
-enum {
- /* TODO: Volume shouldn't be needed if device doesn't have digital control */
- SOUND_VOLUME = 0,
-/* Tone control */
-#if defined(AUDIOHW_HAVE_BASS)
- SOUND_BASS,
-#endif
-#if defined(AUDIOHW_HAVE_TREBLE)
- SOUND_TREBLE,
-#endif
- SOUND_BALANCE,
- SOUND_CHANNELS,
- SOUND_STEREO_WIDTH,
-#if (CONFIG_CODEC == MAS3587F) || (CONFIG_CODEC == MAS3539F)
- SOUND_LOUDNESS,
- SOUND_AVC,
- SOUND_MDB_STRENGTH,
- SOUND_MDB_HARMONICS,
- SOUND_MDB_CENTER,
- SOUND_MDB_SHAPE,
- SOUND_MDB_ENABLE,
- SOUND_SUPERBASS,
-#endif
-#if defined(AUDIOHW_HAVE_LIN_GAIN)
- SOUND_LEFT_GAIN,
- SOUND_RIGHT_GAIN,
-#endif
-#if defined(AUDIOHW_HAVE_MIC_GAIN)
- SOUND_MIC_GAIN,
-#endif
-/* Bass and treble tone controls */
-#if defined(AUDIOHW_HAVE_BASS_CUTOFF)
- SOUND_BASS_CUTOFF,
-#endif
-#if defined(AUDIOHW_HAVE_TREBLE_CUTOFF)
- SOUND_TREBLE_CUTOFF,
-#endif
-/* 3D effect */
-#if defined(AUDIOHW_HAVE_DEPTH_3D)
- SOUND_DEPTH_3D,
-#endif
-/* Hardware EQ tone controls */
-/* Band gains */
-#if defined(AUDIOHW_HAVE_EQ)
- /* Band 1 implied */
- SOUND_EQ_BAND1_GAIN,
-#if defined(AUDIOHW_HAVE_EQ_BAND2)
- SOUND_EQ_BAND2_GAIN,
-#endif
-#if defined(AUDIOHW_HAVE_EQ_BAND3)
- SOUND_EQ_BAND3_GAIN,
-#endif
-#if defined(AUDIOHW_HAVE_EQ_BAND4)
- SOUND_EQ_BAND4_GAIN,
-#endif
-#if defined(AUDIOHW_HAVE_EQ_BAND5)
- SOUND_EQ_BAND5_GAIN,
-#endif
-/* Band frequencies */
-#if defined(AUDIOHW_HAVE_EQ_BAND1_FREQUENCY)
- SOUND_EQ_BAND1_FREQUENCY,
-#endif
-#if defined(AUDIOHW_HAVE_EQ_BAND2_FREQUENCY)
- SOUND_EQ_BAND2_FREQUENCY,
-#endif
-#if defined(AUDIOHW_HAVE_EQ_BAND3_FREQUENCY)
- SOUND_EQ_BAND3_FREQUENCY,
-#endif
-#if defined(AUDIOHW_HAVE_EQ_BAND4_FREQUENCY)
- SOUND_EQ_BAND4_FREQUENCY,
-#endif
-#if defined(AUDIOHW_HAVE_EQ_BAND5_FREQUENCY)
- SOUND_EQ_BAND5_FREQUENCY,
-#endif
-/* Band widths */
-#if defined(AUDIOHW_HAVE_EQ_BAND2_WIDTH)
- SOUND_EQ_BAND2_WIDTH,
-#endif
-#if defined(AUDIOHW_HAVE_EQ_BAND3_WIDTH)
- SOUND_EQ_BAND3_WIDTH,
-#endif
-#if defined(AUDIOHW_HAVE_EQ_BAND4_WIDTH)
- SOUND_EQ_BAND4_WIDTH,
-#endif
-#endif /* AUDIOHW_HAVE_EQ */
- SOUND_LAST_SETTING, /* Keep this last */
-};
-
-enum Channel
-{
- SOUND_CHAN_STEREO,
- SOUND_CHAN_MONO,
- SOUND_CHAN_CUSTOM,
- SOUND_CHAN_MONO_LEFT,
- SOUND_CHAN_MONO_RIGHT,
- SOUND_CHAN_KARAOKE,
- SOUND_CHAN_NUM_MODES,
-};
+/* Generate enumeration of SOUND_xxx constants */
+#include "audiohw_settings.h"
/* All usable functions implemented by a audio codec drivers. Most of
* the function in sound settings are only called, when in audio codecs
@@ -619,8 +505,19 @@ void audiohw_set_monitor(bool enable);
/**
* Set channel configuration.
- * @param val new channel value (see enum Channel).
+ * @param val new channel value (see enum below).
*/
+enum AUDIOHW_CHANNEL_CONFIG
+{
+ SOUND_CHAN_STEREO,
+ SOUND_CHAN_MONO,
+ SOUND_CHAN_CUSTOM,
+ SOUND_CHAN_MONO_LEFT,
+ SOUND_CHAN_MONO_RIGHT,
+ SOUND_CHAN_KARAOKE,
+ SOUND_CHAN_NUM_MODES,
+};
+
void audiohw_set_channel(int val);
#ifdef HAVE_PITCHCONTROL
diff --git a/firmware/export/audiohw_settings.h b/firmware/export/audiohw_settings.h
index 8efbc0dbe7..f934c96302 100644
--- a/firmware/export/audiohw_settings.h
+++ b/firmware/export/audiohw_settings.h
@@ -21,6 +21,7 @@
*
****************************************************************************/
#if defined(AUDIOHW_SOUND_SETTINGS_ENTRIES)
+#undef AUDIOHW_SOUND_SETTINGS_ENTRIES
/* Define sound_setting_entries table */
#define AUDIOHW_SETTINGS(...) \
@@ -38,6 +39,7 @@
[SOUND_##name] = { .info = &_audiohw_setting_##name, .function = fn },
#elif defined(AUDIOHW_SOUND_SETTINGS_VAL2PHYS)
+#undef AUDIOHW_SOUND_SETTINGS_VAL2PHYS
/* Implements sound_val2phys */
#define AUDIOHW_SETTINGS(...) \
@@ -54,6 +56,19 @@
#define AUDIOHW_SETTING_ENT(name, fn) \
case SOUND_##name: return _sound_val2phys_##name(value);
+#else
+
+/* Generate enumeration of SOUND_xxx constants */
+#define AUDIOHW_SETTINGS(...) \
+ enum \
+ { \
+ __VA_ARGS__ \
+ SOUND_LAST_SETTING, \
+ };
+
+#define AUDIOHW_SETTING_ENT(name, fn) \
+ SOUND_##name,
+
#endif /* setting table type selection */
AUDIOHW_SETTINGS(
@@ -139,5 +154,3 @@ AUDIOHW_SETTINGS(
#undef AUDIOHW_SETTINGS
#undef AUDIOHW_SETTING_ENT
-#undef AUDIOHW_SOUND_SETTINGS_ENTRIES
-#undef AUDIOHW_SOUND_SETTINGS_VAL2PHYS
diff --git a/firmware/export/cs42l55.h b/firmware/export/cs42l55.h
index 4584706dfd..d8d177e693 100644
--- a/firmware/export/cs42l55.h
+++ b/firmware/export/cs42l55.h
@@ -22,10 +22,6 @@
#ifndef __CS42L55_H__
#define __CS42L55_H__
-/* volume/balance/treble/bass interdependency */
-#define VOLUME_MIN -580
-#define VOLUME_MAX 120
-
#define AUDIOHW_CAPS (BASS_CAP | TREBLE_CAP | BASS_CUTOFF_CAP | \
TREBLE_CUTOFF_CAP | PRESCALER_CAP | LINEOUT_CAP)
diff --git a/firmware/export/dummy_codec.h b/firmware/export/dummy_codec.h
index 90fd7b03c2..7337c2c730 100644
--- a/firmware/export/dummy_codec.h
+++ b/firmware/export/dummy_codec.h
@@ -22,9 +22,8 @@
#ifndef __DUMMY_CODEC_H_
#define __DUMMY_CODEC_H_
-#define VOLUME_MIN -730
-#define VOLUME_MAX 0
-
-AUDIOHW_SETTING(VOLUME, "dB", 0, 1, VOLUME_MIN/10, VOLUME_MAX/10, 0)
+#define DUMMY_VOLUME_MIN -740
+#define DUMMY_VOLUME_MAX 0
+AUDIOHW_SETTING(VOLUME, "dB", 0, 1, -74, 0, 0)
#endif /* __DUMMY_CODEC_H_ */
diff --git a/firmware/export/hosted_codec.h b/firmware/export/hosted_codec.h
index e44da37c8d..72495709e8 100644
--- a/firmware/export/hosted_codec.h
+++ b/firmware/export/hosted_codec.h
@@ -21,11 +21,8 @@
#ifndef HOSTED_CODEC_H
#define HOSTED_CODEC_H
-#define VOLUME_MIN -990
-#define VOLUME_MAX 0
-
#define AUDIOHW_CAPS (MONO_VOL_CAP)
-AUDIOHW_SETTING(VOLUME, "dB", 0, 1,-100, 0, 0)
+AUDIOHW_SETTING(VOLUME, "dB", 0, 1, -99, 0, 0)
#if (CONFIG_PLATFORM & PLATFORM_ANDROID)
/* Bass and treble tone controls */
diff --git a/firmware/export/imx233-codec.h b/firmware/export/imx233-codec.h
index 2fbd8bde59..a02ef22fec 100644
--- a/firmware/export/imx233-codec.h
+++ b/firmware/export/imx233-codec.h
@@ -24,9 +24,6 @@
/* i.MX233 can boost up to 6dB in DAC mode and 12dB in line mode. Since mic/line
* already have adjustable gain, keep lowest of both. With chained DAC volume
* and headphone volume, the i.MX233 can achieve < -100dB but stay at -100dB. */
-#define VOLUME_MIN -1000
-#define VOLUME_MAX 60
-
#define AUDIOHW_CAPS (DEPTH_3D_CAP | BASS_CAP | TREBLE_CAP | \
LIN_GAIN_CAP | MIC_GAIN_CAP)
diff --git a/firmware/export/jz4740-codec.h b/firmware/export/jz4740-codec.h
index fc731fdf50..4a2ca19a82 100644
--- a/firmware/export/jz4740-codec.h
+++ b/firmware/export/jz4740-codec.h
@@ -21,10 +21,6 @@
#ifndef __JZ4740_CODEC_H_
#define __JZ4740_CODEC_H_
-#define VOLUME_MIN -730
-#define VOLUME_MAX 60
-
-/* TODO */
#ifdef HAVE_SW_VOLUME_CONTROL
AUDIOHW_SETTING(VOLUME, "dB", 0, 1, -74, 6, -25)
#else
diff --git a/firmware/export/mas35xx.h b/firmware/export/mas35xx.h
index 0c6d21140c..02691f3de2 100644
--- a/firmware/export/mas35xx.h
+++ b/firmware/export/mas35xx.h
@@ -39,8 +39,6 @@
#if CONFIG_CODEC == MAS3507D
-#define VOLUME_MIN -780
-#define VOLUME_MAX 180
#define AUDIOHW_CAPS (BASS_CAP | TREBLE_CAP | PRESCALER_CAP)
AUDIOHW_SETTING(VOLUME, "dB", 0, 1, -78, 18, -18)
@@ -171,9 +169,6 @@ static const unsigned int prescale_table[] =
#else /* CONFIG_CODEC == MAS3587F) || (CONFIG_CODEC == MAS3539F */
-#define VOLUME_MIN -400
-#define VOLUME_MAX 600
-
AUDIOHW_SETTING(VOLUME, "dB", 0, 1,-100, 12, -25)
AUDIOHW_SETTING(BASS, "dB", 0, 1, -12, 12, 6)
AUDIOHW_SETTING(TREBLE, "dB", 0, 1, -12, 12, 6)
diff --git a/firmware/export/rk27xx_codec.h b/firmware/export/rk27xx_codec.h
index 5a6796d63c..28ab4730d8 100644
--- a/firmware/export/rk27xx_codec.h
+++ b/firmware/export/rk27xx_codec.h
@@ -24,8 +24,6 @@
#ifndef _RK27XX_CODEC_H_
#define _RK27XX_CODEC_H_
-#define VOLUME_MIN -330
-#define VOLUME_MAX 40
#define AUDIOHW_CAPS (BASS_CAP | TREBLE_CAP | LIN_GAIN_CAP | MIC_GAIN_CAP)
AUDIOHW_SETTING(VOLUME, "dB", 0, 1, -34, 4, -25)
diff --git a/firmware/export/tlv320.h b/firmware/export/tlv320.h
index ea7ccfceb2..75f98bc142 100644
--- a/firmware/export/tlv320.h
+++ b/firmware/export/tlv320.h
@@ -22,9 +22,6 @@
#ifndef _TLV320_H_
#define _TLV320_H_
-#define VOLUME_MIN -730
-#define VOLUME_MAX 60
-
#define AUDIOHW_CAPS (LIN_GAIN_CAP | MIC_GAIN_CAP)
AUDIOHW_SETTING(VOLUME, "dB", 0, 1, -74, 6, -20)
diff --git a/firmware/export/tsc2100.h b/firmware/export/tsc2100.h
index 4e1e7d9287..11baf3ffcb 100644
--- a/firmware/export/tsc2100.h
+++ b/firmware/export/tsc2100.h
@@ -21,10 +21,6 @@
#ifndef __TSC2100_H_
#define __TSC2100_H_
-/* volume/balance/treble/bass interdependency */
-#define VOLUME_MIN -630
-#define VOLUME_MAX 0
-
AUDIOHW_SETTING(VOLUME, "dB", 0, 1, -64, 0, -25)
void tsc2100_read_data(void);
@@ -94,8 +90,6 @@ void tsc2100_keyclick(void);
/* ts codec dac gain control */
#define TSDACGAIN_PAGE 2
#define TSDACGAIN_ADDRESS 0x02
-#define VOLUME_MAX 0
-#define VOLUME_MIN -630
/* ts audio control 2 */
#define TSAC2_PAGE 2
diff --git a/firmware/export/uda1341.h b/firmware/export/uda1341.h
index 81eb1a3fa9..f07b4c62bf 100644
--- a/firmware/export/uda1341.h
+++ b/firmware/export/uda1341.h
@@ -22,14 +22,10 @@
#ifndef _UDA1341_H
#define _UDA1341_H
-/* volume/balance/treble/bass interdependency */
-#define VOLUME_MIN -840
-#define VOLUME_MAX 0
-
#define AUDIOHW_CAPS (BASS_CAP | TREBLE_CAP | MIC_GAIN_CAP | LIN_GAIN_CAP\
| MONO_VOL_CAP)
-AUDIOHW_SETTING(VOLUME, "dB", 0, 1, -84, 0, -25)
+AUDIOHW_SETTING(VOLUME, "dB", 0, 1, -61, 0, -25)
AUDIOHW_SETTING(BASS, "dB", 0, 2, 0, 24, 0)
AUDIOHW_SETTING(TREBLE, "dB", 0, 2, 0, 6, 0)
#ifdef HAVE_RECORDING
diff --git a/firmware/export/uda1380.h b/firmware/export/uda1380.h
index a2200967dd..4d4f22ff82 100644
--- a/firmware/export/uda1380.h
+++ b/firmware/export/uda1380.h
@@ -22,14 +22,10 @@
#ifndef _UDA1380_H
#define _UDA1380_H
-/* volume/balance/treble/bass interdependency */
-#define VOLUME_MIN -840
-#define VOLUME_MAX 0
-
#define AUDIOHW_CAPS (BASS_CAP | TREBLE_CAP | PRESCALER_CAP | \
LIN_GAIN_CAP | MIC_GAIN_CAP)
-AUDIOHW_SETTING(VOLUME, "dB", 0, 1, -85, 0, -25)
+AUDIOHW_SETTING(VOLUME, "dB", 0, 1, -84, 0, -25)
AUDIOHW_SETTING(BASS, "dB", 0, 2, 0, 24, 0)
AUDIOHW_SETTING(TREBLE, "dB", 0, 2, 0, 6, 0)
#ifdef HAVE_RECORDING
diff --git a/firmware/export/wm8731.h b/firmware/export/wm8731.h
index 086c847ee1..10925880c3 100644
--- a/firmware/export/wm8731.h
+++ b/firmware/export/wm8731.h
@@ -24,10 +24,6 @@
#ifndef _WM8731_H
#define _WM8731_H
-/* volume/balance/treble/bass interdependency */
-#define VOLUME_MIN -730
-#define VOLUME_MAX 60
-
#define AUDIOHW_CAPS (LIN_GAIN_CAP | MIC_GAIN_CAP)
AUDIOHW_SETTING(VOLUME, "dB", 0, 1, -74, 6, -25)
diff --git a/firmware/export/wm8751.h b/firmware/export/wm8751.h
index aa18972c23..214643c64d 100644
--- a/firmware/export/wm8751.h
+++ b/firmware/export/wm8751.h
@@ -21,10 +21,6 @@
#ifndef _WM8751_H
#define _WM8751_H
-/* volume/balance/treble/bass interdependency */
-#define VOLUME_MIN -730
-#define VOLUME_MAX 60
-
#if defined(HAVE_WM8750)
#define AUDIOHW_CAPS (BASS_CAP | TREBLE_CAP | PRESCALER_CAP | \
BASS_CUTOFF_CAP | TREBLE_CUTOFF_CAP | \
diff --git a/firmware/export/wm8758.h b/firmware/export/wm8758.h
index 89b000cf8c..db6dd083dd 100644
--- a/firmware/export/wm8758.h
+++ b/firmware/export/wm8758.h
@@ -22,10 +22,6 @@
#ifndef _WM8758_H
#define _WM8758_H
-/* volume/balance/treble/bass interdependency */
-#define VOLUME_MIN -890
-#define VOLUME_MAX 60
-
#define AUDIOHW_CAPS (BASS_CAP | TREBLE_CAP | BASS_CUTOFF_CAP | \
TREBLE_CUTOFF_CAP | LINEOUT_CAP | LIN_GAIN_CAP | \
MIC_GAIN_CAP)
diff --git a/firmware/export/wm8975.h b/firmware/export/wm8975.h
index bc0d113c4c..cdae7af865 100644
--- a/firmware/export/wm8975.h
+++ b/firmware/export/wm8975.h
@@ -22,10 +22,6 @@
#ifndef _WM8975_H
#define _WM8975_H
-/* volume/balance/treble/bass interdependency */
-#define VOLUME_MIN -730
-#define VOLUME_MAX 60
-
#define AUDIOHW_CAPS (BASS_CAP | TREBLE_CAP | LINEOUT_CAP | \
LIN_GAIN_CAP | MIC_GAIN_CAP)
diff --git a/firmware/export/wm8978.h b/firmware/export/wm8978.h
index d5ed8f184c..00f46a02d5 100644
--- a/firmware/export/wm8978.h
+++ b/firmware/export/wm8978.h
@@ -23,9 +23,6 @@
#ifndef _WM8978_H
#define _WM8978_H
-#define VOLUME_MIN -890
-#define VOLUME_MAX 60
-
#if 0
#define AUDIOHW_CAPS (EQ_CAP | PRESCALER_CAP | DEPTH_3D_CAP | \
LIN_GAIN_CAP | MIC_GAIN_CAP)
diff --git a/firmware/export/wm8985.h b/firmware/export/wm8985.h
index a5eb59f159..f733133917 100644
--- a/firmware/export/wm8985.h
+++ b/firmware/export/wm8985.h
@@ -22,10 +22,6 @@
#ifndef _WM8985_H
#define _WM8985_H
-/* volume/balance/treble/bass interdependency */
-#define VOLUME_MIN -890
-#define VOLUME_MAX 60
-
#ifdef COWON_D2
/* FIXME: somehow something was out of sync in the .lang, settings and caps. Keep the
* cutoffs disabled until someone with the device works it out. */
diff --git a/firmware/sound.c b/firmware/sound.c
index f8358c690d..336fe90c25 100644
--- a/firmware/sound.c
+++ b/firmware/sound.c
@@ -112,18 +112,6 @@ void sound_set(int setting, int value)
* by 12 dB after processing.
*/
-static int current_volume = 0; /* tenth dB */
-static int current_balance = 0; /* percent */
-#ifdef AUDIOHW_HAVE_TREBLE
-static int current_treble = 0; /* tenth dB */
-#endif
-#ifdef AUDIOHW_HAVE_BASS
-static int current_bass = 0; /* tenth dB */
-#endif
-#ifdef AUDIOHW_HAVE_EQ
-static int current_eq_band_gain[AUDIOHW_EQ_BAND_NUM]; /* tenth dB */
-#endif
-
/* Return the sound value scaled to centibels (tenth-decibels) */
static int sound_value_to_cb(int setting, int value)
{
@@ -133,20 +121,44 @@ static int sound_value_to_cb(int setting, int value)
return value;
}
+static struct
+{
+ int volume; /* tenth dB */
+ int balance; /* percent */
+#if defined(AUDIOHW_HAVE_BASS)
+ int bass; /* tenth dB */
+#endif
+#if defined(AUDIOHW_HAVE_TREBLE)
+ int treble; /* tenth dB */
+#endif
+#if defined(AUDIOHW_HAVE_EQ)
+ int eq_gain[AUDIOHW_EQ_BAND_NUM]; /* tenth dB */
+#endif
+} sound_prescaler;
+
+#if defined(AUDIOHW_HAVE_BASS) || defined (AUDIOHW_HAVE_TREBLE) \
+ || defined(AUDIOHW_HAVE_EQ)
+#define TONE_PRESCALER
+#endif
+
static void set_prescaled_volume(void)
{
- int prescale = 0;
+#if defined(TONE_PRESCALER) || !defined(AUDIOHW_HAVE_MONO_VOLUME)
+ const int minvol = sound_value_to_cb(SOUND_VOLUME, sound_min(SOUND_VOLUME));
+#endif
+ int volume = sound_prescaler.volume;
-#if defined(AUDIOHW_HAVE_BASS) || defined(AUDIOHW_HAVE_TREBLE) \
- || defined(AUDIOHW_HAVE_EQ)
+#if defined(TONE_PRESCALER)
+ int prescale = 0;
/* Note: Having Tone + EQ isn't prohibited */
#if defined(AUDIOHW_HAVE_BASS) && defined(AUDIOHW_HAVE_TREBLE)
- prescale = MAX(current_bass, current_treble);
+ prescale = MAX(sound_prescaler.bass, sound_prescaler.treble);
#endif
+
#if defined(AUDIOHW_HAVE_EQ)
for (int i = 0; i < AUDIOHW_EQ_BAND_NUM; i++)
- prescale = MAX(current_eq_band_gain[i], prescale);
+ prescale = MAX(sound_prescaler.eq_gain[i], prescale);
#endif
if (prescale < 0)
@@ -156,31 +168,38 @@ static void set_prescaled_volume(void)
/* Gain up the analog volume to compensate the prescale gain reduction,
* but if this would push the volume over the top, reduce prescaling
* instead (might cause clipping). */
- if (current_volume + prescale > VOLUME_MAX)
- prescale = VOLUME_MAX - current_volume;
+ const int maxvol = sound_value_to_cb(SOUND_VOLUME, sound_max(SOUND_VOLUME));
+
+ if (volume + prescale > maxvol)
+ prescale = maxvol - volume;
audiohw_set_prescaler(prescale);
- if (current_volume < VOLUME_MIN)
+ if (volume <= minvol)
prescale = 0; /* Make sure the audio gets muted */
-#endif /* AUDIOHW_HAVE_BASS || AUDIOHW_HAVE_TREBLE || AUDIOHW_HAVE_EQ */
+
+#ifndef AUDIOHW_HAVE_MONO_VOLUME
+ /* At the moment, such targets have lousy volume resolution and so minute
+ boost won't work how we'd like */
+ volume += prescale;
+#endif
+#endif /* TONE_PRESCALER */
#if defined(AUDIOHW_HAVE_MONO_VOLUME)
- audiohw_set_volume(current_volume);
+ audiohw_set_volume(volume);
#else /* Stereo volume */
- int l = current_volume + prescale, r = l;
+ int l = volume, r = volume;
- /* Balance the channels scaled by the current volume and min volume. */
- /* Subtract a dB from VOLUME_MIN to get it to a mute level */
- int volshift = current_balance * VOLUME_RANGE / 100; /* tenth of dB */
+ /* Balance the channels scaled by the current volume and min volume */
+ int balance = sound_prescaler.balance; /* percent */
- if (volshift > 0)
+ if (balance > 0)
{
- l -= ((l - (VOLUME_MIN - ONE_DB)) * volshift) / VOLUME_RANGE;
+ l -= (l - minvol) * balance / 100;
}
- else if (volshift < 0)
+ else if (balance < 0)
{
- r += ((r - (VOLUME_MIN - ONE_DB)) * volshift) / VOLUME_RANGE;
+ r += (r - minvol) * balance / 100;
}
audiohw_set_volume(l, r);
@@ -190,8 +209,6 @@ static void set_prescaled_volume(void)
/* For now, lineout stays at unity */
audiohw_set_lineout_volume(0, 0);
#endif /* AUDIOHW_HAVE_LINEOUT */
-
- (void)prescale; /* In case of no tone controls + mono volume */
}
#endif /* AUDIOIHW_HAVE_CLIPPING */
@@ -203,7 +220,7 @@ void sound_set_volume(int value)
#if defined(AUDIOHW_HAVE_CLIPPING)
audiohw_set_volume(value);
#else
- current_volume = sound_value_to_cb(SOUND_VOLUME, value);
+ sound_prescaler.volume = sound_value_to_cb(SOUND_VOLUME, value);
set_prescaled_volume();
#endif
}
@@ -216,12 +233,12 @@ void sound_set_balance(int value)
#if defined(AUDIOHW_HAVE_BALANCE)
audiohw_set_balance(value);
#else
- current_balance = value;
+ sound_prescaler.balance = value;
set_prescaled_volume();
#endif
}
-#ifdef AUDIOHW_HAVE_BASS
+#if defined(AUDIOHW_HAVE_BASS)
void sound_set_bass(int value)
{
if (!audio_is_initialized)
@@ -230,13 +247,13 @@ void sound_set_bass(int value)
audiohw_set_bass(value);
#if !defined(AUDIOHW_HAVE_CLIPPING)
- current_bass = sound_value_to_cb(SOUND_BASS, value);
+ sound_prescaler.bass = sound_value_to_cb(SOUND_BASS, value);
set_prescaled_volume();
#endif
}
#endif /* AUDIOHW_HAVE_BASS */
-#ifdef AUDIOHW_HAVE_TREBLE
+#if defined(AUDIOHW_HAVE_TREBLE)
void sound_set_treble(int value)
{
if (!audio_is_initialized)
@@ -245,7 +262,7 @@ void sound_set_treble(int value)
audiohw_set_treble(value);
#if !defined(AUDIOHW_HAVE_CLIPPING)
- current_treble = sound_value_to_cb(SOUND_TREBLE, value);
+ sound_prescaler.treble = sound_value_to_cb(SOUND_TREBLE, value);
set_prescaled_volume();
#endif
}
@@ -259,7 +276,7 @@ void sound_set_bass_cutoff(int value)
audiohw_set_bass_cutoff(value);
}
-#endif
+#endif /* AUDIOHW_HAVE_BASS_CUTOFF */
#if defined(AUDIOHW_HAVE_TREBLE_CUTOFF)
void sound_set_treble_cutoff(int value)
@@ -269,7 +286,7 @@ void sound_set_treble_cutoff(int value)
audiohw_set_treble_cutoff(value);
}
-#endif
+#endif /* AUDIOHW_HAVE_TREBLE_CUTOFF */
void sound_set_channels(int value)
{
@@ -295,7 +312,7 @@ void sound_set_depth_3d(int value)
audiohw_set_depth_3d(value);
}
-#endif
+#endif /* AUDIOHW_HAVE_DEPTH_3D */
#if defined(AUDIOHW_HAVE_EQ)
int sound_enum_hw_eq_band_setting(unsigned int band,
@@ -370,11 +387,13 @@ static void sound_set_hw_eq_band_gain(unsigned int band, int value)
if (!audio_is_initialized)
return;
- int setting = sound_enum_hw_eq_band_setting(band, AUDIOHW_EQ_GAIN);
- current_eq_band_gain[band] = sound_value_to_cb(setting, value);
-
audiohw_set_eq_band_gain(band, value);
+
+#if !defined (AUDIOHW_HAVE_CLIPPING)
+ int setting = sound_enum_hw_eq_band_setting(band, AUDIOHW_EQ_GAIN);
+ sound_prescaler.eq_gain[band] = sound_value_to_cb(setting, value);
set_prescaled_volume();
+#endif /* AUDIOHW_HAVE_CLIPPING */
}
void sound_set_hw_eq_band1_gain(int value)
@@ -557,7 +576,7 @@ void sound_set_superbass(int value)
}
#endif /* CONFIG_CODEC == MAS3587F || CONFIG_CODEC == MAS3539F */
-#ifdef HAVE_PITCHCONTROL
+#if defined(HAVE_PITCHCONTROL)
void sound_set_pitch(int32_t pitch)
{
if (!audio_is_initialized)
diff --git a/firmware/target/hosted/maemo/pcm-gstreamer.c b/firmware/target/hosted/maemo/pcm-gstreamer.c
index 10a9d77880..5bca6f2d92 100644
--- a/firmware/target/hosted/maemo/pcm-gstreamer.c
+++ b/firmware/target/hosted/maemo/pcm-gstreamer.c
@@ -427,9 +427,9 @@ void pcm_play_dma_postinit(void)
void pcm_set_mixer_volume(int volume)
{
- /* gstreamer volume range is from 0.00 to 1.00 */
- gdouble gst_vol = (gdouble)(volume - VOLUME_MIN) / (gdouble)VOLUME_RANGE;
-
+ /* gstreamer volume range is from 0.00 to 1.00
+ * input is -990..0 */
+ gdouble gst_vol = 1.0f - (gdouble)volume / -990.0f;
g_object_set (G_OBJECT(gst_volume), "volume", gst_vol, NULL);
}
diff --git a/firmware/target/hosted/sdl/pcm-sdl.c b/firmware/target/hosted/sdl/pcm-sdl.c
index 812211288e..beefc7818c 100644
--- a/firmware/target/hosted/sdl/pcm-sdl.c
+++ b/firmware/target/hosted/sdl/pcm-sdl.c
@@ -421,7 +421,9 @@ void pcm_play_dma_postinit(void)
#ifndef HAVE_SW_VOLUME_CONTROL
void pcm_set_mixer_volume(int volume)
{
- sim_volume = volume;
+ int minvol = sound_min(SOUND_VOLUME);
+ int volrange = sound_max(SOUND_VOLUME) - minvol;
+ sim_volume = SDL_MIX_MAXVOLUME * (volume / 10 - minvol) / volrange;
}
#endif /* HAVE_SW_VOLUME_CONTROL */
diff --git a/firmware/target/mips/ingenic_jz47xx/codec-jz4740.c b/firmware/target/mips/ingenic_jz47xx/codec-jz4740.c
index ee15b27fae..702f3bb50e 100644
--- a/firmware/target/mips/ingenic_jz47xx/codec-jz4740.c
+++ b/firmware/target/mips/ingenic_jz47xx/codec-jz4740.c
@@ -273,9 +273,9 @@ void audiohw_init(void)
void audiohw_set_volume(int vol_l, int vol_r)
{
#ifdef HAVE_SW_VOLUME_CONTROL
- /* SW volume for <= 1.0 gain, HW at unity, < VOLUME_MIN == MUTE */
- int sw_volume_l = vol_l < VOLUME_MIN ? PCM_MUTE_LEVEL : MIN(vol_l, 0);
- int sw_volume_r = vol_r < VOLUME_MIN ? PCM_MUTE_LEVEL : MIN(vol_r, 0);
+ /* SW volume for <= 1.0 gain, HW at unity, < -740 == MUTE */
+ int sw_volume_l = vol_l <= -740 ? PCM_MUTE_LEVEL : MIN(vol_l, 0);
+ int sw_volume_r = vol_r <= -740 ? PCM_MUTE_LEVEL : MIN(vol_r, 0);
pcm_set_master_volume(sw_volume_l, sw_volume_r);
#endif /* HAVE_SW_VOLUME_CONTROL */