summaryrefslogtreecommitdiff
path: root/firmware
diff options
context:
space:
mode:
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;
37static int vol_tenthdb2hw(int db) 37static int vol_tenthdb2hw(int db)
38{ 38{
39 /* 0 to -63.0dB in 1dB steps, aic3x can goto -63.5 in 0.5dB steps */ 39 /* 0 to -63.0dB in 1dB steps, aic3x can goto -63.5 in 0.5dB steps */
40 if (db < VOLUME_MIN) 40 if (db <= -640)
41 { 41 {
42 return 0x7E; 42 return 0x7E;
43 } 43 }
44 else if (db >= VOLUME_MAX) 44 else if (db >= 0)
45 { 45 {
46 return 0x00; 46 return 0x00;
47 } 47 }
48 else 48 else
49 { 49 {
50 return (-((db)/5)); /* VOLUME_MIN is negative */ 50 return (-((db)/5));
51 } 51 }
52} 52}
53 53
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)
67/* convert tenth of dB volume (-1270..0) to master volume register value */ 67/* convert tenth of dB volume (-1270..0) to master volume register value */
68static int vol_tenthdb2hw(int db) 68static int vol_tenthdb2hw(int db)
69{ 69{
70 if (db < VOLUME_MIN) 70 if (db <= -1280)
71 return 0xff; /* mute */ 71 return 0xff; /* mute */
72 else if (db >= VOLUME_MAX) 72 else if (db >= 0)
73 return 0x00; 73 return 0x00;
74 else 74 else
75 return ((-db)/5); 75 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 @@
31#include "i2s.h" 31#include "i2s.h"
32#include "ascodec.h" 32#include "ascodec.h"
33 33
34#if CONFIG_CPU == AS3525v2
35/* Headphone volume goes from -81.0 ... +6dB */
36#define VOLUME_MIN -820
37#define VOLUME_MAX 60
38#else
39/* Headphone volume goes from -73.5 ... +6dB */
40#define VOLUME_MIN -740
41#define VOLUME_MAX 60
42#endif
43
34/* 44/*
35 * This drivers supports: 45 * This drivers supports:
36 * as3514 , as used in the PP targets 46 * as3514 , as used in the PP targets
@@ -99,13 +109,12 @@ static void as3514_write_masked(unsigned int reg, unsigned int bits,
99/* convert tenth of dB volume to master volume register value */ 109/* convert tenth of dB volume to master volume register value */
100static int vol_tenthdb2hw(int db) 110static int vol_tenthdb2hw(int db)
101{ 111{
102 /* +6 to -73.5dB (or -81.0 dB) in 1.5dB steps == 53 (or 58) levels */ 112 if (db <= VOLUME_MIN) {
103 if (db < VOLUME_MIN) {
104 return 0x0; 113 return 0x0;
105 } else if (db > VOLUME_MAX) { 114 } else if (db > VOLUME_MAX) {
106 return (VOLUME_MAX-VOLUME_MIN)/15; 115 return (VOLUME_MAX - VOLUME_MIN) / 15;
107 } else { 116 } else {
108 return((db-VOLUME_MIN)/15); /* VOLUME_MIN is negative */ 117 return (db - VOLUME_MIN) / 15;
109 } 118 }
110} 119}
111 120
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)
38 /* 0001100 == +12dB (0xc) */ 38 /* 0001100 == +12dB (0xc) */
39 /* 0000000 == 0dB (0x0) */ 39 /* 0000000 == 0dB (0x0) */
40 /* 1000100 == -60dB (0x44, this is actually -58dB) */ 40 /* 1000100 == -60dB (0x44, this is actually -58dB) */
41 if (db < VOLUME_MIN) return HPACTL_HPAMUTE; 41 if (db <= -600) return HPACTL_HPAMUTE;
42 return (db / 10) & HPACTL_HPAVOL_MASK; 42 return (db / 10) & HPACTL_HPAVOL_MASK;
43} 43}
44 44
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)
40#ifdef HAVE_SW_VOLUME_CONTROL 40#ifdef HAVE_SW_VOLUME_CONTROL
41void audiohw_set_volume(int vol_l, int vol_r) 41void audiohw_set_volume(int vol_l, int vol_r)
42{ 42{
43 /* SW volume for <= 1.0 gain, HW at unity, < VOLUME_MIN == MUTE */ 43 /* SW volume for <= 1.0 gain, HW at unity, <= DUMMY_VOLUME_MIN == MUTE */
44 int sw_volume_l = vol_l < VOLUME_MIN ? PCM_MUTE_LEVEL : MIN(vol_l, 0); 44 int sw_volume_l = vol_l <= DUMMY_VOLUME_MIN ? PCM_MUTE_LEVEL : vol_l;
45 int sw_volume_r = vol_r < VOLUME_MIN ? PCM_MUTE_LEVEL : MIN(vol_r, 0); 45 int sw_volume_r = vol_r <= DUMMY_VOLUME_MIN ? PCM_MUTE_LEVEL : vol_r;
46 pcm_set_master_volume(sw_volume_l, sw_volume_r); 46 pcm_set_master_volume(sw_volume_l, sw_volume_r);
47} 47}
48#endif /* HAVE_SW_VOLUME_CONTROL */ 48#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)
58 * depending on gain region. 58 * depending on gain region.
59 */ 59 */
60 60
61 if (tdb < VOLUME_MIN) 61 if (tdb <= -340)
62 return 32; 62 return 32;
63 else if (tdb < -115) 63 else if (tdb < -115)
64 return -(((tdb + 115)/20) - 20); /* 2.0 dB steps */ 64 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 @@
23#include "config.h" 23#include "config.h"
24#include "sound.h" 24#include "sound.h"
25#include "pcm_sampr.h" 25#include "pcm_sampr.h"
26#if CONFIG_CODEC == SWCODEC
27#include "fixedpoint.h"
28#ifdef HAVE_SW_VOLUME_CONTROL
29#include "pcm_sw_volume.h"
30#endif
31#endif
26 32
27/** 33/**
28 * Audio Hardware api. Make them do nothing as we cannot properly simulate with 34 * Audio Hardware api. Make them do nothing as we cannot properly simulate with
@@ -30,8 +36,6 @@
30 **/ 36 **/
31 37
32#ifdef HAVE_SW_VOLUME_CONTROL 38#ifdef HAVE_SW_VOLUME_CONTROL
33#include "pcm_sw_volume.h"
34
35void audiohw_set_volume(int vol_l, int vol_r) 39void audiohw_set_volume(int vol_l, int vol_r)
36{ 40{
37 pcm_set_master_volume(vol_l, vol_r); 41 pcm_set_master_volume(vol_l, vol_r);
@@ -39,21 +43,13 @@ void audiohw_set_volume(int vol_l, int vol_r)
39 43
40#else /* ndef HAVE_SW_VOLUME_CONTROL */ 44#else /* ndef HAVE_SW_VOLUME_CONTROL */
41 45
42extern void pcm_set_mixer_volume(int);
43 46
44void audiohw_set_volume(int volume) 47void audiohw_set_volume(int volume)
45{ 48{
46#if CONFIG_CODEC == SWCODEC 49#if CONFIG_CODEC == SWCODEC
47#if !(CONFIG_PLATFORM & PLATFORM_MAEMO5) 50 extern void pcm_set_mixer_volume(int volume);
48 if (volume < VOLUME_MIN)
49 volume = 0;
50 else
51 volume = SDL_MIX_MAXVOLUME * (volume - VOLUME_MIN + ONE_DB) /
52 (VOLUME_RANGE + ONE_DB);
53#endif /* !(CONFIG_PLATFORM & PLATFORM_MAEMO5) */
54
55 pcm_set_mixer_volume(volume); 51 pcm_set_mixer_volume(volume);
56#endif /* CONFIG_CODEC == SWCODEC */ 52#endif
57 (void)volume; 53 (void)volume;
58} 54}
59#endif /* HAVE_SW_VOLUME_CONTROL */ 55#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)
40 /* 0110000 == -73dB (0x30) */ 40 /* 0110000 == -73dB (0x30) */
41 /* 0101111 == mute (0x2f) */ 41 /* 0101111 == mute (0x2f) */
42 42
43 if (db < VOLUME_MIN) { 43 if (db <= -740) {
44 return 0x2f; 44 return 0x2f;
45 } else { 45 } else {
46 return((db/10)+73+0x30); 46 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;
34static int vol_tenthdb2hw(int db) 34static int vol_tenthdb2hw(int db)
35{ 35{
36 /* 0 to -63.0dB in 1dB steps, tsc2100 can goto -63.5 in 0.5dB steps */ 36 /* 0 to -63.0dB in 1dB steps, tsc2100 can goto -63.5 in 0.5dB steps */
37 if (db < VOLUME_MIN) { 37 if (db <= -640) {
38 return 0x7E; 38 return 0x7E;
39 } else if (db >= VOLUME_MAX) { 39 } else if (db >= 0) {
40 return 0x00; 40 return 0x00;
41 } else { 41 } else {
42 return(-((db)/5)); /* VOLUME_MIN is negative */ 42 return(-((db)/5));
43 } 43 }
44} 44}
45 45
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 @@
31/* convert tenth of dB volume (-600..0) to volume register value */ 31/* convert tenth of dB volume (-600..0) to volume register value */
32static int vol_tenthdb2hw(int db) 32static int vol_tenthdb2hw(int db)
33{ 33{
34 if (db < -600) 34 if (db <= -610)
35 return 63; 35 return 63;
36 else /* 1 dB steps */ 36 else /* 1 dB steps */
37 return -(db / 10) + 1; 37 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)
101 /* 1111001 == 0dB (0x79) */ 101 /* 1111001 == 0dB (0x79) */
102 /* 0110000 == -73dB (0x30) */ 102 /* 0110000 == -73dB (0x30) */
103 /* 0101111 == mute (0x2f) */ 103 /* 0101111 == mute (0x2f) */
104 if (db < VOLUME_MIN) { 104 if (db <= -740) {
105 return 0x2f; 105 return 0x2f;
106 } else { 106 } else {
107 return((db/10)+0x30+73); 107 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)
117 /* 1111001 == 0dB (0x79) */ 117 /* 1111001 == 0dB (0x79) */
118 /* 0110000 == -73dB (0x30) */ 118 /* 0110000 == -73dB (0x30) */
119 /* 0101111..0000000 == mute (<= 0x2f) */ 119 /* 0101111..0000000 == mute (<= 0x2f) */
120 if (db < VOLUME_MIN) 120 if (db <= -740)
121 return 0x0; 121 return 0x0;
122 else 122 else
123 return (db / 10) + 73 + 0x30; 123 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);
38static unsigned short eq5_reg = EQ_GAIN_VALUE(0); 38static unsigned short eq5_reg = EQ_GAIN_VALUE(0);
39 39
40/* convert tenth of dB volume (-89..6) to master volume register value */ 40/* convert tenth of dB volume (-89..6) to master volume register value */
41int tenthdb2master(int db) 41static int vol_tenthdb2hw(int db)
42{ 42{
43 /* att DAC AMP result 43 /* att DAC AMP result
44 +6dB 0 +6 96 44 +6dB 0 +6 96
@@ -47,10 +47,10 @@ int tenthdb2master(int db)
47 -58dB -1 -57 32 47 -58dB -1 -57 32
48 -89dB -32 -57 1 48 -89dB -32 -57 1
49 -90dB -oo -oo 0 */ 49 -90dB -oo -oo 0 */
50 if (db < VOLUME_MIN) { 50 if (db <= -900) {
51 return 0; 51 return 0;
52 } else { 52 } else {
53 return (db-VOLUME_MIN)/10 + 1; 53 return db / 10 - -90;
54 } 54 }
55} 55}
56 56
@@ -137,6 +137,10 @@ void audiohw_postinit(void)
137void audiohw_set_volume(int vol_l, int vol_r) 137void audiohw_set_volume(int vol_l, int vol_r)
138{ 138{
139 int dac_l, amp_l, dac_r, amp_r; 139 int dac_l, amp_l, dac_r, amp_r;
140
141 vol_l = vol_tenthdb2hw(vol_l);
142 vol_r = vol_tenthdb2hw(vol_r);
143
140 get_volume_params(vol_l, &dac_l, &amp_l); 144 get_volume_params(vol_l, &dac_l, &amp_l);
141 get_volume_params(vol_r, &dac_r, &amp_r); 145 get_volume_params(vol_r, &dac_r, &amp_r);
142 146
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)
79 /* 0110000 == -73dB (0x30 */ 79 /* 0110000 == -73dB (0x30 */
80 /* 0101111..0000000 == mute (0x2f) */ 80 /* 0101111..0000000 == mute (0x2f) */
81 81
82 if (db < VOLUME_MIN) { 82 if (db <= -740) {
83 return 0x0; 83 return 0x0;
84 } else { 84 } else {
85 return((db/10)+73+0x30); 85 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,
155 * (000000...111111) */ 155 * (000000...111111) */
156static int vol_tenthdb2hw(int db) 156static int vol_tenthdb2hw(int db)
157{ 157{
158 /* -90dB to +6dB 1dB steps (96 levels) 7bits */ 158 /* att DAC AMP result
159 /* 1100000 == +6dB (0x60,96) */ 159 +6dB 0 +6 96
160 /* 1101010 == 0dB (0x5a,90) */ 160 0dB 0 0 90
161 /* 1000001 == -57dB (0x21,33,DAC) */ 161 -57dB 0 -57 33
162 /* 0000001 == -89dB (0x01,01) */ 162 -58dB -1 -57 32
163 /* 0000000 == -90dB (0x00,00,Mute) */ 163 -89dB -32 -57 1
164 if (db < VOLUME_MIN) 164 -90dB -oo -oo 0 */
165 { 165 if (db <= -900)
166 return 0x0; 166 return 0x0;
167 }
168 else 167 else
169 { 168 return db / 10 - -90;
170 return (db - VOLUME_MIN) / 10;
171 }
172} 169}
173 170
174void audiohw_preinit(void) 171void 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)
104 -89dB -32 -57 1 104 -89dB -32 -57 1
105 -90dB -oo -oo 0 */ 105 -90dB -oo -oo 0 */
106 106
107 if (db < VOLUME_MIN) { 107 if (db <= -900) {
108 return 0; 108 return 0;
109 } else { 109 } else {
110 return (db-VOLUME_MIN)/10 + 1; 110 return db / 10 - -90;
111 } 111 }
112} 112}
113 113
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 @@
22#ifndef _AIC3X_H_ 22#ifndef _AIC3X_H_
23#define _AIC3X_H_ 23#define _AIC3X_H_
24 24
25#define VOLUME_MIN -630
26#define VOLUME_MAX 0
27
28AUDIOHW_SETTING(VOLUME, "dB", 0, 1, -64, 0, -25) 25AUDIOHW_SETTING(VOLUME, "dB", 0, 1, -64, 0, -25)
29 26
30/*** definitions ***/ 27/*** 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 @@
23#define _AK4537_H 23#define _AK4537_H
24 24
25/* Volume goes from -127.0 ... 0 dB in 0.5 dB increments */ 25/* Volume goes from -127.0 ... 0 dB in 0.5 dB increments */
26#define VOLUME_MIN -1270
27#define VOLUME_MAX 0
28
29AUDIOHW_SETTING(VOLUME, "dB", 0, 1, -128, 0, -25) 26AUDIOHW_SETTING(VOLUME, "dB", 0, 1, -128, 0, -25)
30 27
31#define AKC_NUM_REGS 0x11 28#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 @@
32 32
33/*different volume ranges for different AMS chips*/ 33/*different volume ranges for different AMS chips*/
34#if CONFIG_CPU == AS3525v2 34#if CONFIG_CPU == AS3525v2
35/* Headphone volume goes from -81.0 ... +6dB */
36#define VOLUME_MIN -810
37#define VOLUME_MAX 60
38AUDIOHW_SETTING(VOLUME, "dB", 0, 1, -82, 6, -25) 35AUDIOHW_SETTING(VOLUME, "dB", 0, 1, -82, 6, -25)
39#else /* AS3525v1 */ 36#else /* AS3525v1 */
40/* Headphone volume goes from -73.5 ... +6dB */
41#define VOLUME_MIN -735
42#define VOLUME_MAX 60
43AUDIOHW_SETTING(VOLUME, "dB", 0, 1, -74, 6, -25) 37AUDIOHW_SETTING(VOLUME, "dB", 0, 1, -74, 6, -25)
44#endif /* CONFIG_CPU == AS3525v2 */ 38#endif /* CONFIG_CPU == AS3525v2 */
45 39
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)
126AUDIOHW_SETTING(CHANNELS, "", 0, 1, 0, 5, 0) 126AUDIOHW_SETTING(CHANNELS, "", 0, 1, 0, 5, 0)
127AUDIOHW_SETTING(STEREO_WIDTH, "%", 0, 5, 0, 250, 100) 127AUDIOHW_SETTING(STEREO_WIDTH, "%", 0, 5, 0, 250, 100)
128 128
129#define ONE_DB 10
130
131#if !defined(VOLUME_MIN) && !defined(VOLUME_MAX)
132#warning define for VOLUME_MIN and VOLUME_MAX is missing
133#define VOLUME_MIN -700
134#define VOLUME_MAX 0
135#endif
136
137#ifndef AUDIOHW_NUM_TONE_CONTROLS
138#define AUDIOHW_NUM_TONE_CONTROLS 0
139#endif
140
141/* volume/balance/treble/bass interdependency main part */
142#define VOLUME_RANGE (VOLUME_MAX - VOLUME_MIN)
143
144
145/* convert caps into defines */ 129/* convert caps into defines */
146#ifdef AUDIOHW_CAPS 130#ifdef AUDIOHW_CAPS
147/* Tone controls */ 131/* Tone controls */
@@ -183,7 +167,7 @@ AUDIOHW_SETTING(STEREO_WIDTH, "%", 0, 5, 0, 250, 100)
183enum 167enum
184{ 168{
185 /* Band 1 is implied; bands must be contiguous, 1 to N */ 169 /* Band 1 is implied; bands must be contiguous, 1 to N */
186 AUDIOHW_EQ_BAND1 = 0, 170 AUDIOHW_EQ_BAND1,
187#define AUDIOHW_HAVE_EQ_BAND1 171#define AUDIOHW_HAVE_EQ_BAND1
188#if (AUDIOHW_EQ_BAND_CAPS & (EQ_CAP << 1)) 172#if (AUDIOHW_EQ_BAND_CAPS & (EQ_CAP << 1))
189 AUDIOHW_EQ_BAND2, 173 AUDIOHW_EQ_BAND2,
@@ -209,7 +193,6 @@ enum
209#define AUDIOHW_HAVE_EQ_FREQUENCY 193#define AUDIOHW_HAVE_EQ_FREQUENCY
210enum 194enum
211{ 195{
212 __AUDIOHW_EQ_BAND_FREQUENCY = -1,
213#if defined(AUDIOHW_HAVE_EQ_BAND1) && \ 196#if defined(AUDIOHW_HAVE_EQ_BAND1) && \
214 (AUDIOHW_EQ_FREQUENCY_CAPS & (EQ_CAP << 0)) 197 (AUDIOHW_EQ_FREQUENCY_CAPS & (EQ_CAP << 0))
215 AUDIOHW_EQ_BAND1_FREQUENCY, 198 AUDIOHW_EQ_BAND1_FREQUENCY,
@@ -235,7 +218,7 @@ enum
235 AUDIOHW_EQ_BAND5_FREQUENCY, 218 AUDIOHW_EQ_BAND5_FREQUENCY,
236#define AUDIOHW_HAVE_EQ_BAND5_FREQUENCY 219#define AUDIOHW_HAVE_EQ_BAND5_FREQUENCY
237#endif 220#endif
238 AUDIOHW_EQ_FREQUENCY_NUM, 221 AUDIOHW_EQ_FREQUENCY_NUM, /* Keep last */
239}; 222};
240#endif /* AUDIOHW_EQ_FREQUENCY_CAPS */ 223#endif /* AUDIOHW_EQ_FREQUENCY_CAPS */
241 224
@@ -244,7 +227,6 @@ enum
244#define AUDIOHW_HAVE_EQ_WIDTH 227#define AUDIOHW_HAVE_EQ_WIDTH
245enum 228enum
246{ 229{
247 __AUDIOHW_EQ_BAND_WIDTH = -1,
248#if defined(AUDIOHW_HAVE_EQ_BAND1) && \ 230#if defined(AUDIOHW_HAVE_EQ_BAND1) && \
249 (AUDIOHW_EQ_WIDTH_CAPS & (EQ_CAP << 1)) 231 (AUDIOHW_EQ_WIDTH_CAPS & (EQ_CAP << 1))
250 AUDIOHW_EQ_BAND2_WIDTH, 232 AUDIOHW_EQ_BAND2_WIDTH,
@@ -267,7 +249,7 @@ enum
267/* Types and number of settings types (gain, frequency, width) */ 249/* Types and number of settings types (gain, frequency, width) */
268enum AUDIOHW_EQ_SETTINGS 250enum AUDIOHW_EQ_SETTINGS
269{ 251{
270 AUDIOHW_EQ_GAIN = 0, 252 AUDIOHW_EQ_GAIN,
271#ifdef AUDIOHW_HAVE_EQ_FREQUENCY 253#ifdef AUDIOHW_HAVE_EQ_FREQUENCY
272 AUDIOHW_EQ_FREQUENCY, 254 AUDIOHW_EQ_FREQUENCY,
273#endif 255#endif
@@ -309,104 +291,8 @@ enum AUDIOHW_EQ_SETTINGS
309#endif 291#endif
310#endif /* AUDIOHW_CAPS */ 292#endif /* AUDIOHW_CAPS */
311 293
312enum { 294/* Generate enumeration of SOUND_xxx constants */
313 /* TODO: Volume shouldn't be needed if device doesn't have digital control */ 295#include "audiohw_settings.h"
314 SOUND_VOLUME = 0,
315/* Tone control */
316#if defined(AUDIOHW_HAVE_BASS)
317 SOUND_BASS,
318#endif
319#if defined(AUDIOHW_HAVE_TREBLE)
320 SOUND_TREBLE,
321#endif
322 SOUND_BALANCE,
323 SOUND_CHANNELS,
324 SOUND_STEREO_WIDTH,
325#if (CONFIG_CODEC == MAS3587F) || (CONFIG_CODEC == MAS3539F)
326 SOUND_LOUDNESS,
327 SOUND_AVC,
328 SOUND_MDB_STRENGTH,
329 SOUND_MDB_HARMONICS,
330 SOUND_MDB_CENTER,
331 SOUND_MDB_SHAPE,
332 SOUND_MDB_ENABLE,
333 SOUND_SUPERBASS,
334#endif
335#if defined(AUDIOHW_HAVE_LIN_GAIN)
336 SOUND_LEFT_GAIN,
337 SOUND_RIGHT_GAIN,
338#endif
339#if defined(AUDIOHW_HAVE_MIC_GAIN)
340 SOUND_MIC_GAIN,
341#endif
342/* Bass and treble tone controls */
343#if defined(AUDIOHW_HAVE_BASS_CUTOFF)
344 SOUND_BASS_CUTOFF,
345#endif
346#if defined(AUDIOHW_HAVE_TREBLE_CUTOFF)
347 SOUND_TREBLE_CUTOFF,
348#endif
349/* 3D effect */
350#if defined(AUDIOHW_HAVE_DEPTH_3D)
351 SOUND_DEPTH_3D,
352#endif
353/* Hardware EQ tone controls */
354/* Band gains */
355#if defined(AUDIOHW_HAVE_EQ)
356 /* Band 1 implied */
357 SOUND_EQ_BAND1_GAIN,
358#if defined(AUDIOHW_HAVE_EQ_BAND2)
359 SOUND_EQ_BAND2_GAIN,
360#endif
361#if defined(AUDIOHW_HAVE_EQ_BAND3)
362 SOUND_EQ_BAND3_GAIN,
363#endif
364#if defined(AUDIOHW_HAVE_EQ_BAND4)
365 SOUND_EQ_BAND4_GAIN,
366#endif
367#if defined(AUDIOHW_HAVE_EQ_BAND5)
368 SOUND_EQ_BAND5_GAIN,
369#endif
370/* Band frequencies */
371#if defined(AUDIOHW_HAVE_EQ_BAND1_FREQUENCY)
372 SOUND_EQ_BAND1_FREQUENCY,
373#endif
374#if defined(AUDIOHW_HAVE_EQ_BAND2_FREQUENCY)
375 SOUND_EQ_BAND2_FREQUENCY,
376#endif
377#if defined(AUDIOHW_HAVE_EQ_BAND3_FREQUENCY)
378 SOUND_EQ_BAND3_FREQUENCY,
379#endif
380#if defined(AUDIOHW_HAVE_EQ_BAND4_FREQUENCY)
381 SOUND_EQ_BAND4_FREQUENCY,
382#endif
383#if defined(AUDIOHW_HAVE_EQ_BAND5_FREQUENCY)
384 SOUND_EQ_BAND5_FREQUENCY,
385#endif
386/* Band widths */
387#if defined(AUDIOHW_HAVE_EQ_BAND2_WIDTH)
388 SOUND_EQ_BAND2_WIDTH,
389#endif
390#if defined(AUDIOHW_HAVE_EQ_BAND3_WIDTH)
391 SOUND_EQ_BAND3_WIDTH,
392#endif
393#if defined(AUDIOHW_HAVE_EQ_BAND4_WIDTH)
394 SOUND_EQ_BAND4_WIDTH,
395#endif
396#endif /* AUDIOHW_HAVE_EQ */
397 SOUND_LAST_SETTING, /* Keep this last */
398};
399
400enum Channel
401{
402 SOUND_CHAN_STEREO,
403 SOUND_CHAN_MONO,
404 SOUND_CHAN_CUSTOM,
405 SOUND_CHAN_MONO_LEFT,
406 SOUND_CHAN_MONO_RIGHT,
407 SOUND_CHAN_KARAOKE,
408 SOUND_CHAN_NUM_MODES,
409};
410 296
411/* All usable functions implemented by a audio codec drivers. Most of 297/* All usable functions implemented by a audio codec drivers. Most of
412 * the function in sound settings are only called, when in audio codecs 298 * the function in sound settings are only called, when in audio codecs
@@ -619,8 +505,19 @@ void audiohw_set_monitor(bool enable);
619 505
620/** 506/**
621 * Set channel configuration. 507 * Set channel configuration.
622 * @param val new channel value (see enum Channel). 508 * @param val new channel value (see enum below).
623 */ 509 */
510enum AUDIOHW_CHANNEL_CONFIG
511{
512 SOUND_CHAN_STEREO,
513 SOUND_CHAN_MONO,
514 SOUND_CHAN_CUSTOM,
515 SOUND_CHAN_MONO_LEFT,
516 SOUND_CHAN_MONO_RIGHT,
517 SOUND_CHAN_KARAOKE,
518 SOUND_CHAN_NUM_MODES,
519};
520
624void audiohw_set_channel(int val); 521void audiohw_set_channel(int val);
625 522
626#ifdef HAVE_PITCHCONTROL 523#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 @@
21 * 21 *
22 ****************************************************************************/ 22 ****************************************************************************/
23#if defined(AUDIOHW_SOUND_SETTINGS_ENTRIES) 23#if defined(AUDIOHW_SOUND_SETTINGS_ENTRIES)
24#undef AUDIOHW_SOUND_SETTINGS_ENTRIES
24/* Define sound_setting_entries table */ 25/* Define sound_setting_entries table */
25 26
26#define AUDIOHW_SETTINGS(...) \ 27#define AUDIOHW_SETTINGS(...) \
@@ -38,6 +39,7 @@
38 [SOUND_##name] = { .info = &_audiohw_setting_##name, .function = fn }, 39 [SOUND_##name] = { .info = &_audiohw_setting_##name, .function = fn },
39 40
40#elif defined(AUDIOHW_SOUND_SETTINGS_VAL2PHYS) 41#elif defined(AUDIOHW_SOUND_SETTINGS_VAL2PHYS)
42#undef AUDIOHW_SOUND_SETTINGS_VAL2PHYS
41 43
42/* Implements sound_val2phys */ 44/* Implements sound_val2phys */
43#define AUDIOHW_SETTINGS(...) \ 45#define AUDIOHW_SETTINGS(...) \
@@ -54,6 +56,19 @@
54#define AUDIOHW_SETTING_ENT(name, fn) \ 56#define AUDIOHW_SETTING_ENT(name, fn) \
55 case SOUND_##name: return _sound_val2phys_##name(value); 57 case SOUND_##name: return _sound_val2phys_##name(value);
56 58
59#else
60
61/* Generate enumeration of SOUND_xxx constants */
62#define AUDIOHW_SETTINGS(...) \
63 enum \
64 { \
65 __VA_ARGS__ \
66 SOUND_LAST_SETTING, \
67 };
68
69#define AUDIOHW_SETTING_ENT(name, fn) \
70 SOUND_##name,
71
57#endif /* setting table type selection */ 72#endif /* setting table type selection */
58 73
59AUDIOHW_SETTINGS( 74AUDIOHW_SETTINGS(
@@ -139,5 +154,3 @@ AUDIOHW_SETTINGS(
139 154
140#undef AUDIOHW_SETTINGS 155#undef AUDIOHW_SETTINGS
141#undef AUDIOHW_SETTING_ENT 156#undef AUDIOHW_SETTING_ENT
142#undef AUDIOHW_SOUND_SETTINGS_ENTRIES
143#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 @@
22#ifndef __CS42L55_H__ 22#ifndef __CS42L55_H__
23#define __CS42L55_H__ 23#define __CS42L55_H__
24 24
25/* volume/balance/treble/bass interdependency */
26#define VOLUME_MIN -580
27#define VOLUME_MAX 120
28
29#define AUDIOHW_CAPS (BASS_CAP | TREBLE_CAP | BASS_CUTOFF_CAP | \ 25#define AUDIOHW_CAPS (BASS_CAP | TREBLE_CAP | BASS_CUTOFF_CAP | \
30 TREBLE_CUTOFF_CAP | PRESCALER_CAP | LINEOUT_CAP) 26 TREBLE_CUTOFF_CAP | PRESCALER_CAP | LINEOUT_CAP)
31 27
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 @@
22#ifndef __DUMMY_CODEC_H_ 22#ifndef __DUMMY_CODEC_H_
23#define __DUMMY_CODEC_H_ 23#define __DUMMY_CODEC_H_
24 24
25#define VOLUME_MIN -730 25#define DUMMY_VOLUME_MIN -740
26#define VOLUME_MAX 0 26#define DUMMY_VOLUME_MAX 0
27 27AUDIOHW_SETTING(VOLUME, "dB", 0, 1, -74, 0, 0)
28AUDIOHW_SETTING(VOLUME, "dB", 0, 1, VOLUME_MIN/10, VOLUME_MAX/10, 0)
29 28
30#endif /* __DUMMY_CODEC_H_ */ 29#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 @@
21#ifndef HOSTED_CODEC_H 21#ifndef HOSTED_CODEC_H
22#define HOSTED_CODEC_H 22#define HOSTED_CODEC_H
23 23
24#define VOLUME_MIN -990
25#define VOLUME_MAX 0
26
27#define AUDIOHW_CAPS (MONO_VOL_CAP) 24#define AUDIOHW_CAPS (MONO_VOL_CAP)
28AUDIOHW_SETTING(VOLUME, "dB", 0, 1,-100, 0, 0) 25AUDIOHW_SETTING(VOLUME, "dB", 0, 1, -99, 0, 0)
29 26
30#if (CONFIG_PLATFORM & PLATFORM_ANDROID) 27#if (CONFIG_PLATFORM & PLATFORM_ANDROID)
31/* Bass and treble tone controls */ 28/* 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 @@
24/* i.MX233 can boost up to 6dB in DAC mode and 12dB in line mode. Since mic/line 24/* i.MX233 can boost up to 6dB in DAC mode and 12dB in line mode. Since mic/line
25 * already have adjustable gain, keep lowest of both. With chained DAC volume 25 * already have adjustable gain, keep lowest of both. With chained DAC volume
26 * and headphone volume, the i.MX233 can achieve < -100dB but stay at -100dB. */ 26 * and headphone volume, the i.MX233 can achieve < -100dB but stay at -100dB. */
27#define VOLUME_MIN -1000
28#define VOLUME_MAX 60
29
30#define AUDIOHW_CAPS (DEPTH_3D_CAP | BASS_CAP | TREBLE_CAP | \ 27#define AUDIOHW_CAPS (DEPTH_3D_CAP | BASS_CAP | TREBLE_CAP | \
31 LIN_GAIN_CAP | MIC_GAIN_CAP) 28 LIN_GAIN_CAP | MIC_GAIN_CAP)
32 29
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 @@
21#ifndef __JZ4740_CODEC_H_ 21#ifndef __JZ4740_CODEC_H_
22#define __JZ4740_CODEC_H_ 22#define __JZ4740_CODEC_H_
23 23
24#define VOLUME_MIN -730
25#define VOLUME_MAX 60
26
27/* TODO */
28#ifdef HAVE_SW_VOLUME_CONTROL 24#ifdef HAVE_SW_VOLUME_CONTROL
29AUDIOHW_SETTING(VOLUME, "dB", 0, 1, -74, 6, -25) 25AUDIOHW_SETTING(VOLUME, "dB", 0, 1, -74, 6, -25)
30#else 26#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 @@
39 39
40#if CONFIG_CODEC == MAS3507D 40#if CONFIG_CODEC == MAS3507D
41 41
42#define VOLUME_MIN -780
43#define VOLUME_MAX 180
44#define AUDIOHW_CAPS (BASS_CAP | TREBLE_CAP | PRESCALER_CAP) 42#define AUDIOHW_CAPS (BASS_CAP | TREBLE_CAP | PRESCALER_CAP)
45 43
46AUDIOHW_SETTING(VOLUME, "dB", 0, 1, -78, 18, -18) 44AUDIOHW_SETTING(VOLUME, "dB", 0, 1, -78, 18, -18)
@@ -171,9 +169,6 @@ static const unsigned int prescale_table[] =
171 169
172#else /* CONFIG_CODEC == MAS3587F) || (CONFIG_CODEC == MAS3539F */ 170#else /* CONFIG_CODEC == MAS3587F) || (CONFIG_CODEC == MAS3539F */
173 171
174#define VOLUME_MIN -400
175#define VOLUME_MAX 600
176
177AUDIOHW_SETTING(VOLUME, "dB", 0, 1,-100, 12, -25) 172AUDIOHW_SETTING(VOLUME, "dB", 0, 1,-100, 12, -25)
178AUDIOHW_SETTING(BASS, "dB", 0, 1, -12, 12, 6) 173AUDIOHW_SETTING(BASS, "dB", 0, 1, -12, 12, 6)
179AUDIOHW_SETTING(TREBLE, "dB", 0, 1, -12, 12, 6) 174AUDIOHW_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 @@
24#ifndef _RK27XX_CODEC_H_ 24#ifndef _RK27XX_CODEC_H_
25#define _RK27XX_CODEC_H_ 25#define _RK27XX_CODEC_H_
26 26
27#define VOLUME_MIN -330
28#define VOLUME_MAX 40
29#define AUDIOHW_CAPS (BASS_CAP | TREBLE_CAP | LIN_GAIN_CAP | MIC_GAIN_CAP) 27#define AUDIOHW_CAPS (BASS_CAP | TREBLE_CAP | LIN_GAIN_CAP | MIC_GAIN_CAP)
30 28
31AUDIOHW_SETTING(VOLUME, "dB", 0, 1, -34, 4, -25) 29AUDIOHW_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 @@
22#ifndef _TLV320_H_ 22#ifndef _TLV320_H_
23#define _TLV320_H_ 23#define _TLV320_H_
24 24
25#define VOLUME_MIN -730
26#define VOLUME_MAX 60
27
28#define AUDIOHW_CAPS (LIN_GAIN_CAP | MIC_GAIN_CAP) 25#define AUDIOHW_CAPS (LIN_GAIN_CAP | MIC_GAIN_CAP)
29 26
30AUDIOHW_SETTING(VOLUME, "dB", 0, 1, -74, 6, -20) 27AUDIOHW_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 @@
21#ifndef __TSC2100_H_ 21#ifndef __TSC2100_H_
22#define __TSC2100_H_ 22#define __TSC2100_H_
23 23
24/* volume/balance/treble/bass interdependency */
25#define VOLUME_MIN -630
26#define VOLUME_MAX 0
27
28AUDIOHW_SETTING(VOLUME, "dB", 0, 1, -64, 0, -25) 24AUDIOHW_SETTING(VOLUME, "dB", 0, 1, -64, 0, -25)
29 25
30void tsc2100_read_data(void); 26void tsc2100_read_data(void);
@@ -94,8 +90,6 @@ void tsc2100_keyclick(void);
94/* ts codec dac gain control */ 90/* ts codec dac gain control */
95#define TSDACGAIN_PAGE 2 91#define TSDACGAIN_PAGE 2
96#define TSDACGAIN_ADDRESS 0x02 92#define TSDACGAIN_ADDRESS 0x02
97#define VOLUME_MAX 0
98#define VOLUME_MIN -630
99 93
100/* ts audio control 2 */ 94/* ts audio control 2 */
101#define TSAC2_PAGE 2 95#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 @@
22#ifndef _UDA1341_H 22#ifndef _UDA1341_H
23#define _UDA1341_H 23#define _UDA1341_H
24 24
25/* volume/balance/treble/bass interdependency */
26#define VOLUME_MIN -840
27#define VOLUME_MAX 0
28
29#define AUDIOHW_CAPS (BASS_CAP | TREBLE_CAP | MIC_GAIN_CAP | LIN_GAIN_CAP\ 25#define AUDIOHW_CAPS (BASS_CAP | TREBLE_CAP | MIC_GAIN_CAP | LIN_GAIN_CAP\
30 | MONO_VOL_CAP) 26 | MONO_VOL_CAP)
31 27
32AUDIOHW_SETTING(VOLUME, "dB", 0, 1, -84, 0, -25) 28AUDIOHW_SETTING(VOLUME, "dB", 0, 1, -61, 0, -25)
33AUDIOHW_SETTING(BASS, "dB", 0, 2, 0, 24, 0) 29AUDIOHW_SETTING(BASS, "dB", 0, 2, 0, 24, 0)
34AUDIOHW_SETTING(TREBLE, "dB", 0, 2, 0, 6, 0) 30AUDIOHW_SETTING(TREBLE, "dB", 0, 2, 0, 6, 0)
35#ifdef HAVE_RECORDING 31#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 @@
22#ifndef _UDA1380_H 22#ifndef _UDA1380_H
23#define _UDA1380_H 23#define _UDA1380_H
24 24
25/* volume/balance/treble/bass interdependency */
26#define VOLUME_MIN -840
27#define VOLUME_MAX 0
28
29#define AUDIOHW_CAPS (BASS_CAP | TREBLE_CAP | PRESCALER_CAP | \ 25#define AUDIOHW_CAPS (BASS_CAP | TREBLE_CAP | PRESCALER_CAP | \
30 LIN_GAIN_CAP | MIC_GAIN_CAP) 26 LIN_GAIN_CAP | MIC_GAIN_CAP)
31 27
32AUDIOHW_SETTING(VOLUME, "dB", 0, 1, -85, 0, -25) 28AUDIOHW_SETTING(VOLUME, "dB", 0, 1, -84, 0, -25)
33AUDIOHW_SETTING(BASS, "dB", 0, 2, 0, 24, 0) 29AUDIOHW_SETTING(BASS, "dB", 0, 2, 0, 24, 0)
34AUDIOHW_SETTING(TREBLE, "dB", 0, 2, 0, 6, 0) 30AUDIOHW_SETTING(TREBLE, "dB", 0, 2, 0, 6, 0)
35#ifdef HAVE_RECORDING 31#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 @@
24#ifndef _WM8731_H 24#ifndef _WM8731_H
25#define _WM8731_H 25#define _WM8731_H
26 26
27/* volume/balance/treble/bass interdependency */
28#define VOLUME_MIN -730
29#define VOLUME_MAX 60
30
31#define AUDIOHW_CAPS (LIN_GAIN_CAP | MIC_GAIN_CAP) 27#define AUDIOHW_CAPS (LIN_GAIN_CAP | MIC_GAIN_CAP)
32 28
33AUDIOHW_SETTING(VOLUME, "dB", 0, 1, -74, 6, -25) 29AUDIOHW_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 @@
21#ifndef _WM8751_H 21#ifndef _WM8751_H
22#define _WM8751_H 22#define _WM8751_H
23 23
24/* volume/balance/treble/bass interdependency */
25#define VOLUME_MIN -730
26#define VOLUME_MAX 60
27
28#if defined(HAVE_WM8750) 24#if defined(HAVE_WM8750)
29#define AUDIOHW_CAPS (BASS_CAP | TREBLE_CAP | PRESCALER_CAP | \ 25#define AUDIOHW_CAPS (BASS_CAP | TREBLE_CAP | PRESCALER_CAP | \
30 BASS_CUTOFF_CAP | TREBLE_CUTOFF_CAP | \ 26 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 @@
22#ifndef _WM8758_H 22#ifndef _WM8758_H
23#define _WM8758_H 23#define _WM8758_H
24 24
25/* volume/balance/treble/bass interdependency */
26#define VOLUME_MIN -890
27#define VOLUME_MAX 60
28
29#define AUDIOHW_CAPS (BASS_CAP | TREBLE_CAP | BASS_CUTOFF_CAP | \ 25#define AUDIOHW_CAPS (BASS_CAP | TREBLE_CAP | BASS_CUTOFF_CAP | \
30 TREBLE_CUTOFF_CAP | LINEOUT_CAP | LIN_GAIN_CAP | \ 26 TREBLE_CUTOFF_CAP | LINEOUT_CAP | LIN_GAIN_CAP | \
31 MIC_GAIN_CAP) 27 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 @@
22#ifndef _WM8975_H 22#ifndef _WM8975_H
23#define _WM8975_H 23#define _WM8975_H
24 24
25/* volume/balance/treble/bass interdependency */
26#define VOLUME_MIN -730
27#define VOLUME_MAX 60
28
29#define AUDIOHW_CAPS (BASS_CAP | TREBLE_CAP | LINEOUT_CAP | \ 25#define AUDIOHW_CAPS (BASS_CAP | TREBLE_CAP | LINEOUT_CAP | \
30 LIN_GAIN_CAP | MIC_GAIN_CAP) 26 LIN_GAIN_CAP | MIC_GAIN_CAP)
31 27
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 @@
23#ifndef _WM8978_H 23#ifndef _WM8978_H
24#define _WM8978_H 24#define _WM8978_H
25 25
26#define VOLUME_MIN -890
27#define VOLUME_MAX 60
28
29#if 0 26#if 0
30#define AUDIOHW_CAPS (EQ_CAP | PRESCALER_CAP | DEPTH_3D_CAP | \ 27#define AUDIOHW_CAPS (EQ_CAP | PRESCALER_CAP | DEPTH_3D_CAP | \
31 LIN_GAIN_CAP | MIC_GAIN_CAP) 28 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 @@
22#ifndef _WM8985_H 22#ifndef _WM8985_H
23#define _WM8985_H 23#define _WM8985_H
24 24
25/* volume/balance/treble/bass interdependency */
26#define VOLUME_MIN -890
27#define VOLUME_MAX 60
28
29#ifdef COWON_D2 25#ifdef COWON_D2
30/* FIXME: somehow something was out of sync in the .lang, settings and caps. Keep the 26/* FIXME: somehow something was out of sync in the .lang, settings and caps. Keep the
31 * cutoffs disabled until someone with the device works it out. */ 27 * 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)
112 * by 12 dB after processing. 112 * by 12 dB after processing.
113 */ 113 */
114 114
115static int current_volume = 0; /* tenth dB */
116static int current_balance = 0; /* percent */
117#ifdef AUDIOHW_HAVE_TREBLE
118static int current_treble = 0; /* tenth dB */
119#endif
120#ifdef AUDIOHW_HAVE_BASS
121static int current_bass = 0; /* tenth dB */
122#endif
123#ifdef AUDIOHW_HAVE_EQ
124static int current_eq_band_gain[AUDIOHW_EQ_BAND_NUM]; /* tenth dB */
125#endif
126
127/* Return the sound value scaled to centibels (tenth-decibels) */ 115/* Return the sound value scaled to centibels (tenth-decibels) */
128static int sound_value_to_cb(int setting, int value) 116static int sound_value_to_cb(int setting, int value)
129{ 117{
@@ -133,20 +121,44 @@ static int sound_value_to_cb(int setting, int value)
133 return value; 121 return value;
134} 122}
135 123
124static struct
125{
126 int volume; /* tenth dB */
127 int balance; /* percent */
128#if defined(AUDIOHW_HAVE_BASS)
129 int bass; /* tenth dB */
130#endif
131#if defined(AUDIOHW_HAVE_TREBLE)
132 int treble; /* tenth dB */
133#endif
134#if defined(AUDIOHW_HAVE_EQ)
135 int eq_gain[AUDIOHW_EQ_BAND_NUM]; /* tenth dB */
136#endif
137} sound_prescaler;
138
139#if defined(AUDIOHW_HAVE_BASS) || defined (AUDIOHW_HAVE_TREBLE) \
140 || defined(AUDIOHW_HAVE_EQ)
141#define TONE_PRESCALER
142#endif
143
136static void set_prescaled_volume(void) 144static void set_prescaled_volume(void)
137{ 145{
138 int prescale = 0; 146#if defined(TONE_PRESCALER) || !defined(AUDIOHW_HAVE_MONO_VOLUME)
147 const int minvol = sound_value_to_cb(SOUND_VOLUME, sound_min(SOUND_VOLUME));
148#endif
149 int volume = sound_prescaler.volume;
139 150
140#if defined(AUDIOHW_HAVE_BASS) || defined(AUDIOHW_HAVE_TREBLE) \ 151#if defined(TONE_PRESCALER)
141 || defined(AUDIOHW_HAVE_EQ) 152 int prescale = 0;
142 153
143 /* Note: Having Tone + EQ isn't prohibited */ 154 /* Note: Having Tone + EQ isn't prohibited */
144#if defined(AUDIOHW_HAVE_BASS) && defined(AUDIOHW_HAVE_TREBLE) 155#if defined(AUDIOHW_HAVE_BASS) && defined(AUDIOHW_HAVE_TREBLE)
145 prescale = MAX(current_bass, current_treble); 156 prescale = MAX(sound_prescaler.bass, sound_prescaler.treble);
146#endif 157#endif
158
147#if defined(AUDIOHW_HAVE_EQ) 159#if defined(AUDIOHW_HAVE_EQ)
148 for (int i = 0; i < AUDIOHW_EQ_BAND_NUM; i++) 160 for (int i = 0; i < AUDIOHW_EQ_BAND_NUM; i++)
149 prescale = MAX(current_eq_band_gain[i], prescale); 161 prescale = MAX(sound_prescaler.eq_gain[i], prescale);
150#endif 162#endif
151 163
152 if (prescale < 0) 164 if (prescale < 0)
@@ -156,31 +168,38 @@ static void set_prescaled_volume(void)
156 /* Gain up the analog volume to compensate the prescale gain reduction, 168 /* Gain up the analog volume to compensate the prescale gain reduction,
157 * but if this would push the volume over the top, reduce prescaling 169 * but if this would push the volume over the top, reduce prescaling
158 * instead (might cause clipping). */ 170 * instead (might cause clipping). */
159 if (current_volume + prescale > VOLUME_MAX) 171 const int maxvol = sound_value_to_cb(SOUND_VOLUME, sound_max(SOUND_VOLUME));
160 prescale = VOLUME_MAX - current_volume; 172
173 if (volume + prescale > maxvol)
174 prescale = maxvol - volume;
161 175
162 audiohw_set_prescaler(prescale); 176 audiohw_set_prescaler(prescale);
163 177
164 if (current_volume < VOLUME_MIN) 178 if (volume <= minvol)
165 prescale = 0; /* Make sure the audio gets muted */ 179 prescale = 0; /* Make sure the audio gets muted */
166#endif /* AUDIOHW_HAVE_BASS || AUDIOHW_HAVE_TREBLE || AUDIOHW_HAVE_EQ */ 180
181#ifndef AUDIOHW_HAVE_MONO_VOLUME
182 /* At the moment, such targets have lousy volume resolution and so minute
183 boost won't work how we'd like */
184 volume += prescale;
185#endif
186#endif /* TONE_PRESCALER */
167 187
168#if defined(AUDIOHW_HAVE_MONO_VOLUME) 188#if defined(AUDIOHW_HAVE_MONO_VOLUME)
169 audiohw_set_volume(current_volume); 189 audiohw_set_volume(volume);
170#else /* Stereo volume */ 190#else /* Stereo volume */
171 int l = current_volume + prescale, r = l; 191 int l = volume, r = volume;
172 192
173 /* Balance the channels scaled by the current volume and min volume. */ 193 /* Balance the channels scaled by the current volume and min volume */
174 /* Subtract a dB from VOLUME_MIN to get it to a mute level */ 194 int balance = sound_prescaler.balance; /* percent */
175 int volshift = current_balance * VOLUME_RANGE / 100; /* tenth of dB */
176 195
177 if (volshift > 0) 196 if (balance > 0)
178 { 197 {
179 l -= ((l - (VOLUME_MIN - ONE_DB)) * volshift) / VOLUME_RANGE; 198 l -= (l - minvol) * balance / 100;
180 } 199 }
181 else if (volshift < 0) 200 else if (balance < 0)
182 { 201 {
183 r += ((r - (VOLUME_MIN - ONE_DB)) * volshift) / VOLUME_RANGE; 202 r += (r - minvol) * balance / 100;
184 } 203 }
185 204
186 audiohw_set_volume(l, r); 205 audiohw_set_volume(l, r);
@@ -190,8 +209,6 @@ static void set_prescaled_volume(void)
190 /* For now, lineout stays at unity */ 209 /* For now, lineout stays at unity */
191 audiohw_set_lineout_volume(0, 0); 210 audiohw_set_lineout_volume(0, 0);
192#endif /* AUDIOHW_HAVE_LINEOUT */ 211#endif /* AUDIOHW_HAVE_LINEOUT */
193
194 (void)prescale; /* In case of no tone controls + mono volume */
195} 212}
196#endif /* AUDIOIHW_HAVE_CLIPPING */ 213#endif /* AUDIOIHW_HAVE_CLIPPING */
197 214
@@ -203,7 +220,7 @@ void sound_set_volume(int value)
203#if defined(AUDIOHW_HAVE_CLIPPING) 220#if defined(AUDIOHW_HAVE_CLIPPING)
204 audiohw_set_volume(value); 221 audiohw_set_volume(value);
205#else 222#else
206 current_volume = sound_value_to_cb(SOUND_VOLUME, value); 223 sound_prescaler.volume = sound_value_to_cb(SOUND_VOLUME, value);
207 set_prescaled_volume(); 224 set_prescaled_volume();
208#endif 225#endif
209} 226}
@@ -216,12 +233,12 @@ void sound_set_balance(int value)
216#if defined(AUDIOHW_HAVE_BALANCE) 233#if defined(AUDIOHW_HAVE_BALANCE)
217 audiohw_set_balance(value); 234 audiohw_set_balance(value);
218#else 235#else
219 current_balance = value; 236 sound_prescaler.balance = value;
220 set_prescaled_volume(); 237 set_prescaled_volume();
221#endif 238#endif
222} 239}
223 240
224#ifdef AUDIOHW_HAVE_BASS 241#if defined(AUDIOHW_HAVE_BASS)
225void sound_set_bass(int value) 242void sound_set_bass(int value)
226{ 243{
227 if (!audio_is_initialized) 244 if (!audio_is_initialized)
@@ -230,13 +247,13 @@ void sound_set_bass(int value)
230 audiohw_set_bass(value); 247 audiohw_set_bass(value);
231 248
232#if !defined(AUDIOHW_HAVE_CLIPPING) 249#if !defined(AUDIOHW_HAVE_CLIPPING)
233 current_bass = sound_value_to_cb(SOUND_BASS, value); 250 sound_prescaler.bass = sound_value_to_cb(SOUND_BASS, value);
234 set_prescaled_volume(); 251 set_prescaled_volume();
235#endif 252#endif
236} 253}
237#endif /* AUDIOHW_HAVE_BASS */ 254#endif /* AUDIOHW_HAVE_BASS */
238 255
239#ifdef AUDIOHW_HAVE_TREBLE 256#if defined(AUDIOHW_HAVE_TREBLE)
240void sound_set_treble(int value) 257void sound_set_treble(int value)
241{ 258{
242 if (!audio_is_initialized) 259 if (!audio_is_initialized)
@@ -245,7 +262,7 @@ void sound_set_treble(int value)
245 audiohw_set_treble(value); 262 audiohw_set_treble(value);
246 263
247#if !defined(AUDIOHW_HAVE_CLIPPING) 264#if !defined(AUDIOHW_HAVE_CLIPPING)
248 current_treble = sound_value_to_cb(SOUND_TREBLE, value); 265 sound_prescaler.treble = sound_value_to_cb(SOUND_TREBLE, value);
249 set_prescaled_volume(); 266 set_prescaled_volume();
250#endif 267#endif
251} 268}
@@ -259,7 +276,7 @@ void sound_set_bass_cutoff(int value)
259 276
260 audiohw_set_bass_cutoff(value); 277 audiohw_set_bass_cutoff(value);
261} 278}
262#endif 279#endif /* AUDIOHW_HAVE_BASS_CUTOFF */
263 280
264#if defined(AUDIOHW_HAVE_TREBLE_CUTOFF) 281#if defined(AUDIOHW_HAVE_TREBLE_CUTOFF)
265void sound_set_treble_cutoff(int value) 282void sound_set_treble_cutoff(int value)
@@ -269,7 +286,7 @@ void sound_set_treble_cutoff(int value)
269 286
270 audiohw_set_treble_cutoff(value); 287 audiohw_set_treble_cutoff(value);
271} 288}
272#endif 289#endif /* AUDIOHW_HAVE_TREBLE_CUTOFF */
273 290
274void sound_set_channels(int value) 291void sound_set_channels(int value)
275{ 292{
@@ -295,7 +312,7 @@ void sound_set_depth_3d(int value)
295 312
296 audiohw_set_depth_3d(value); 313 audiohw_set_depth_3d(value);
297} 314}
298#endif 315#endif /* AUDIOHW_HAVE_DEPTH_3D */
299 316
300#if defined(AUDIOHW_HAVE_EQ) 317#if defined(AUDIOHW_HAVE_EQ)
301int sound_enum_hw_eq_band_setting(unsigned int band, 318int 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)
370 if (!audio_is_initialized) 387 if (!audio_is_initialized)
371 return; 388 return;
372 389
373 int setting = sound_enum_hw_eq_band_setting(band, AUDIOHW_EQ_GAIN);
374 current_eq_band_gain[band] = sound_value_to_cb(setting, value);
375
376 audiohw_set_eq_band_gain(band, value); 390 audiohw_set_eq_band_gain(band, value);
391
392#if !defined (AUDIOHW_HAVE_CLIPPING)
393 int setting = sound_enum_hw_eq_band_setting(band, AUDIOHW_EQ_GAIN);
394 sound_prescaler.eq_gain[band] = sound_value_to_cb(setting, value);
377 set_prescaled_volume(); 395 set_prescaled_volume();
396#endif /* AUDIOHW_HAVE_CLIPPING */
378} 397}
379 398
380void sound_set_hw_eq_band1_gain(int value) 399void sound_set_hw_eq_band1_gain(int value)
@@ -557,7 +576,7 @@ void sound_set_superbass(int value)
557} 576}
558#endif /* CONFIG_CODEC == MAS3587F || CONFIG_CODEC == MAS3539F */ 577#endif /* CONFIG_CODEC == MAS3587F || CONFIG_CODEC == MAS3539F */
559 578
560#ifdef HAVE_PITCHCONTROL 579#if defined(HAVE_PITCHCONTROL)
561void sound_set_pitch(int32_t pitch) 580void sound_set_pitch(int32_t pitch)
562{ 581{
563 if (!audio_is_initialized) 582 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)
427 427
428void pcm_set_mixer_volume(int volume) 428void pcm_set_mixer_volume(int volume)
429{ 429{
430 /* gstreamer volume range is from 0.00 to 1.00 */ 430 /* gstreamer volume range is from 0.00 to 1.00
431 gdouble gst_vol = (gdouble)(volume - VOLUME_MIN) / (gdouble)VOLUME_RANGE; 431 * input is -990..0 */
432 432 gdouble gst_vol = 1.0f - (gdouble)volume / -990.0f;
433 g_object_set (G_OBJECT(gst_volume), "volume", gst_vol, NULL); 433 g_object_set (G_OBJECT(gst_volume), "volume", gst_vol, NULL);
434} 434}
435 435
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)
421#ifndef HAVE_SW_VOLUME_CONTROL 421#ifndef HAVE_SW_VOLUME_CONTROL
422void pcm_set_mixer_volume(int volume) 422void pcm_set_mixer_volume(int volume)
423{ 423{
424 sim_volume = volume; 424 int minvol = sound_min(SOUND_VOLUME);
425 int volrange = sound_max(SOUND_VOLUME) - minvol;
426 sim_volume = SDL_MIX_MAXVOLUME * (volume / 10 - minvol) / volrange;
425} 427}
426#endif /* HAVE_SW_VOLUME_CONTROL */ 428#endif /* HAVE_SW_VOLUME_CONTROL */
427 429
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)
273void audiohw_set_volume(int vol_l, int vol_r) 273void audiohw_set_volume(int vol_l, int vol_r)
274{ 274{
275#ifdef HAVE_SW_VOLUME_CONTROL 275#ifdef HAVE_SW_VOLUME_CONTROL
276 /* SW volume for <= 1.0 gain, HW at unity, < VOLUME_MIN == MUTE */ 276 /* SW volume for <= 1.0 gain, HW at unity, < -740 == MUTE */
277 int sw_volume_l = vol_l < VOLUME_MIN ? PCM_MUTE_LEVEL : MIN(vol_l, 0); 277 int sw_volume_l = vol_l <= -740 ? PCM_MUTE_LEVEL : MIN(vol_l, 0);
278 int sw_volume_r = vol_r < VOLUME_MIN ? PCM_MUTE_LEVEL : MIN(vol_r, 0); 278 int sw_volume_r = vol_r <= -740 ? PCM_MUTE_LEVEL : MIN(vol_r, 0);
279 pcm_set_master_volume(sw_volume_l, sw_volume_r); 279 pcm_set_master_volume(sw_volume_l, sw_volume_r);
280#endif /* HAVE_SW_VOLUME_CONTROL */ 280#endif /* HAVE_SW_VOLUME_CONTROL */
281 281