diff options
Diffstat (limited to 'firmware')
-rw-r--r-- | firmware/drivers/uda1380.c | 23 | ||||
-rw-r--r-- | firmware/export/uda1380.h | 1 | ||||
-rw-r--r-- | firmware/sound.c | 2 |
3 files changed, 24 insertions, 2 deletions
diff --git a/firmware/drivers/uda1380.c b/firmware/drivers/uda1380.c index 4eb04d1ba3..bcc94474fa 100644 --- a/firmware/drivers/uda1380.c +++ b/firmware/drivers/uda1380.c | |||
@@ -38,6 +38,8 @@ | |||
38 | 38 | ||
39 | int uda1380_write_reg(unsigned char reg, unsigned short value); | 39 | int uda1380_write_reg(unsigned char reg, unsigned short value); |
40 | unsigned short uda1380_regs[0x30]; | 40 | unsigned short uda1380_regs[0x30]; |
41 | short uda1380_balance; | ||
42 | short uda1380_volume; | ||
41 | 43 | ||
42 | /* Definition of a playback configuration to start with */ | 44 | /* Definition of a playback configuration to start with */ |
43 | 45 | ||
@@ -90,8 +92,23 @@ int uda1380_write_reg(unsigned char reg, unsigned short value) | |||
90 | */ | 92 | */ |
91 | int uda1380_setvol(int vol) | 93 | int uda1380_setvol(int vol) |
92 | { | 94 | { |
95 | int vol_l, vol_r; | ||
96 | |||
97 | uda1380_volume = vol; | ||
98 | /* Simple linear volume crossfade curves */ | ||
99 | vol_l = MAX(uda1380_balance*0xff/100, 0); | ||
100 | vol_r = MAX(-uda1380_balance*0xff/100, 0); | ||
93 | return uda1380_write_reg(REG_MASTER_VOL, | 101 | return uda1380_write_reg(REG_MASTER_VOL, |
94 | MASTER_VOL_LEFT(vol) | MASTER_VOL_RIGHT(vol)); | 102 | MASTER_VOL_LEFT(vol_l) | MASTER_VOL_RIGHT(vol_r)); |
103 | } | ||
104 | |||
105 | /** | ||
106 | * Sets stereo balance | ||
107 | */ | ||
108 | void uda1380_set_balance(int bal) | ||
109 | { | ||
110 | uda1380_balance = bal; | ||
111 | uda1380_setvol(uda1380_volume); | ||
95 | } | 112 | } |
96 | 113 | ||
97 | /** | 114 | /** |
@@ -165,7 +182,9 @@ int uda1380_init(void) | |||
165 | { | 182 | { |
166 | if (uda1380_set_regs() == -1) | 183 | if (uda1380_set_regs() == -1) |
167 | return -1; | 184 | return -1; |
168 | 185 | uda1380_balance = 0; | |
186 | uda1380_volume = 0x20; /* Taken from uda1380_defaults */ | ||
187 | |||
169 | return 0; | 188 | return 0; |
170 | } | 189 | } |
171 | 190 | ||
diff --git a/firmware/export/uda1380.h b/firmware/export/uda1380.h index f7e97e13c7..b09d271808 100644 --- a/firmware/export/uda1380.h +++ b/firmware/export/uda1380.h | |||
@@ -23,6 +23,7 @@ | |||
23 | extern int uda1380_init(void); | 23 | extern int uda1380_init(void); |
24 | extern void uda1380_enable_output(bool enable); | 24 | extern void uda1380_enable_output(bool enable); |
25 | extern int uda1380_setvol(int vol); | 25 | extern int uda1380_setvol(int vol); |
26 | extern void uda1380_set_balance(int bal); | ||
26 | extern void uda1380_set_bass(int value); | 27 | extern void uda1380_set_bass(int value); |
27 | extern void uda1380_set_treble(int value); | 28 | extern void uda1380_set_treble(int value); |
28 | extern int uda1380_mute(int mute); | 29 | extern int uda1380_mute(int mute); |
diff --git a/firmware/sound.c b/firmware/sound.c index 7558a3349b..7dd1fbf98e 100644 --- a/firmware/sound.c +++ b/firmware/sound.c | |||
@@ -491,6 +491,8 @@ void sound_set(int setting, int value) | |||
491 | #elif CONFIG_HWCODEC == MAS3507D | 491 | #elif CONFIG_HWCODEC == MAS3507D |
492 | current_balance = value * 960 / 100; /* tenth of dB */ | 492 | current_balance = value * 960 / 100; /* tenth of dB */ |
493 | set_prescaled_volume(); | 493 | set_prescaled_volume(); |
494 | #elif defined(HAVE_UDA1380) | ||
495 | uda1380_set_balance(value); | ||
494 | #endif | 496 | #endif |
495 | break; | 497 | break; |
496 | 498 | ||