diff options
author | Solomon Peachy <pizza@shaftnet.org> | 2024-10-10 13:25:47 -0400 |
---|---|---|
committer | Solomon Peachy <pizza@shaftnet.org> | 2024-11-01 14:12:31 -0400 |
commit | 51ba8b3eee2ccfede2c766494b38b1b3404b95e4 (patch) | |
tree | 9045030858488e25e1241f289a7d732ee2a509f5 /firmware/drivers | |
parent | 1c28cb439b0f2838a8132bb951787207bd0fe0f6 (diff) | |
download | rockbox-51ba8b3eee2ccfede2c766494b38b1b3404b95e4.tar.gz rockbox-51ba8b3eee2ccfede2c766494b38b1b3404b95e4.zip |
erosqhosted: Support HW volume control on rev2+ hardware
This also adds hwrev info to the debug output.
Change-Id: Ia75218cacb8f756a23a77334ea6ab69ac3b20d10
Diffstat (limited to 'firmware/drivers')
-rw-r--r-- | firmware/drivers/audio/erosqlinux_codec.c | 81 |
1 files changed, 74 insertions, 7 deletions
diff --git a/firmware/drivers/audio/erosqlinux_codec.c b/firmware/drivers/audio/erosqlinux_codec.c index 02c35e3c00..d1b3e884d3 100644 --- a/firmware/drivers/audio/erosqlinux_codec.c +++ b/firmware/drivers/audio/erosqlinux_codec.c | |||
@@ -53,11 +53,29 @@ | |||
53 | BUFFER_BYTES: [4096 524288] | 53 | BUFFER_BYTES: [4096 524288] |
54 | TICK_TIME: ALL | 54 | TICK_TIME: ALL |
55 | 55 | ||
56 | Mixer controls: | 56 | Mixer controls (v1): |
57 | 57 | ||
58 | numid=1,iface=MIXER,name='Output Port Switch' | 58 | numid=1,iface=MIXER,name='Output Port Switch' |
59 | ; type=INTEGER,access=rw------,values=1,min=0,max=5,step=0 | 59 | ; type=INTEGER,access=rw------,values=1,min=0,max=5,step=0 |
60 | : values=4 | 60 | : values=4 |
61 | |||
62 | Mixer controls (v2+): | ||
63 | |||
64 | numid=3,iface=MIXER,name='ES9018_K2M Digital Filter' | ||
65 | ; type=INTEGER,access=rw------,values=1,min=0,max=4,step=0 | ||
66 | : values=0 | ||
67 | numid=1,iface=MIXER,name='Left Playback Volume' | ||
68 | ; type=INTEGER,access=rw------,values=1,min=0,max=255,step=0 | ||
69 | : values=0 | ||
70 | numid=4,iface=MIXER,name='Output Port Switch' | ||
71 | ; type=INTEGER,access=rw------,values=1,min=0,max=5,step=0 | ||
72 | : values=0 | ||
73 | numid=2,iface=MIXER,name='Right Playback Volume' | ||
74 | ; type=INTEGER,access=rw------,values=1,min=0,max=255,step=0 | ||
75 | : values=0 | ||
76 | numid=5,iface=MIXER,name='isDSD' | ||
77 | ; type=BOOLEAN,access=rw------,values=1 | ||
78 | : values=off | ||
61 | */ | 79 | */ |
62 | 80 | ||
63 | static int hw_init = 0; | 81 | static int hw_init = 0; |
@@ -68,6 +86,8 @@ static long int last_ps = -1; | |||
68 | 86 | ||
69 | static int muted = -1; | 87 | static int muted = -1; |
70 | 88 | ||
89 | extern int hwver; | ||
90 | |||
71 | void audiohw_mute(int mute) | 91 | void audiohw_mute(int mute) |
72 | { | 92 | { |
73 | logf("mute %d", mute); | 93 | logf("mute %d", mute); |
@@ -129,6 +149,13 @@ void audiohw_preinit(void) | |||
129 | logf("hw preinit"); | 149 | logf("hw preinit"); |
130 | alsa_controls_init("default"); | 150 | alsa_controls_init("default"); |
131 | hw_init = 1; | 151 | hw_init = 1; |
152 | |||
153 | /* See if we have hw2 or later */ | ||
154 | if (alsa_controls_find("Left Playback Volume") == -1) | ||
155 | hwver = 1; | ||
156 | else if (hwver == 1) | ||
157 | hwver = 23; | ||
158 | |||
132 | audiohw_mute(false); /* No need to stay muted */ | 159 | audiohw_mute(false); /* No need to stay muted */ |
133 | } | 160 | } |
134 | 161 | ||
@@ -154,10 +181,8 @@ void audiohw_set_frequency(int fsel) | |||
154 | const int min_pcm = -740; | 181 | const int min_pcm = -740; |
155 | const int max_pcm = 0; | 182 | const int max_pcm = 0; |
156 | 183 | ||
157 | void audiohw_set_volume(int vol_l, int vol_r) | 184 | static void audiohw_set_volume_v1(int vol_l, int vol_r) |
158 | { | 185 | { |
159 | logf("hw vol %d %d", vol_l, vol_r); | ||
160 | |||
161 | long l,r; | 186 | long l,r; |
162 | 187 | ||
163 | vol_l_hw = vol_l; | 188 | vol_l_hw = vol_l; |
@@ -180,6 +205,39 @@ void audiohw_set_volume(int vol_l, int vol_r) | |||
180 | pcm_set_mixer_volume(sw_volume_l / 20, sw_volume_r / 20); | 205 | pcm_set_mixer_volume(sw_volume_l / 20, sw_volume_r / 20); |
181 | } | 206 | } |
182 | 207 | ||
208 | static void audiohw_set_volume_v2(int vol_l, int vol_r) | ||
209 | { | ||
210 | long l,r; | ||
211 | |||
212 | if (lineout_inserted()) { | ||
213 | vol_l_hw = vol_r_hw = global_settings.volume_limit * 10; | ||
214 | } else { | ||
215 | vol_l_hw = -vol_l; | ||
216 | vol_r_hw = -vol_r; | ||
217 | } | ||
218 | |||
219 | if (!hw_init) | ||
220 | return; | ||
221 | |||
222 | l = vol_l_hw / 5; | ||
223 | r = vol_l_hw / 5; | ||
224 | |||
225 | alsa_controls_set_ints("Left Playback Volume", 1, &l); | ||
226 | alsa_controls_set_ints("Right Playback Volume", 1, &r); | ||
227 | |||
228 | /* Dial back PCM mixer to avoid compression */ | ||
229 | pcm_set_mixer_volume(global_settings.volume_limit / 2, global_settings.volume_limit / 2); | ||
230 | } | ||
231 | |||
232 | void audiohw_set_volume(int vol_l, int vol_r) | ||
233 | { | ||
234 | if (hwver >= 2) { | ||
235 | audiohw_set_volume_v2(vol_l, vol_r); | ||
236 | } else { | ||
237 | audiohw_set_volume_v1(vol_l, vol_r); | ||
238 | } | ||
239 | } | ||
240 | |||
183 | void audiohw_set_lineout_volume(int vol_l, int vol_r) | 241 | void audiohw_set_lineout_volume(int vol_l, int vol_r) |
184 | { | 242 | { |
185 | long l,r; | 243 | long l,r; |
@@ -196,7 +254,16 @@ void audiohw_set_lineout_volume(int vol_l, int vol_r) | |||
196 | r = vol_r_hw; | 254 | r = vol_r_hw; |
197 | } | 255 | } |
198 | 256 | ||
199 | int sw_volume_l = l <= min_pcm ? min_pcm : MIN(l, max_pcm); | 257 | if (hwver >= 2) { |
200 | int sw_volume_r = r <= min_pcm ? min_pcm : MIN(r, max_pcm); | 258 | if (hw_init) { |
201 | pcm_set_mixer_volume(sw_volume_l / 20, sw_volume_r / 20); | 259 | l /= 5; |
260 | r /= 5; | ||
261 | alsa_controls_set_ints("Left Playback Volume", 1, &l); | ||
262 | alsa_controls_set_ints("Right Playback Volume", 1, &r); | ||
263 | } | ||
264 | } else { | ||
265 | int sw_volume_l = l <= min_pcm ? min_pcm : MIN(l, max_pcm); | ||
266 | int sw_volume_r = r <= min_pcm ? min_pcm : MIN(r, max_pcm); | ||
267 | pcm_set_mixer_volume(sw_volume_l / 20, sw_volume_r / 20); | ||
268 | } | ||
202 | } | 269 | } |