summaryrefslogtreecommitdiff
path: root/firmware/export
diff options
context:
space:
mode:
authorMichael Sevakis <jethead71@rockbox.org>2010-05-15 13:09:45 +0000
committerMichael Sevakis <jethead71@rockbox.org>2010-05-15 13:09:45 +0000
commit80d0d15ca9b253f8a446f50cf25d3d4b850bcfd1 (patch)
tree2598d3a019c33d6f9ea76010fd6d3a8301ef87a0 /firmware/export
parent0f77db73469920f0b0006f696ddb36029338c378 (diff)
downloadrockbox-80d0d15ca9b253f8a446f50cf25d3d4b850bcfd1.tar.gz
rockbox-80d0d15ca9b253f8a446f50cf25d3d4b850bcfd1.zip
Gigabeat S: Fully enable access to hardware tone controls and 3-D effect feature. Under the hood, it's designated a hardware equalizer since it is one. Implement code framework for hardware EQ in general. Menu aspect is well abstracted and so the UI and strings can be changed around if taste doesn't quite suit. So far the emphasis is distinction of the UI labelling from the software EQ so that it's clear the settings are for a different thing.
git-svn-id: svn://svn.rockbox.org/rockbox/trunk@26051 a1c6a512-1295-4272-9138-f99709370657
Diffstat (limited to 'firmware/export')
-rw-r--r--firmware/export/audiohw.h252
-rw-r--r--firmware/export/config/gigabeats.h3
-rw-r--r--firmware/export/sound.h62
-rw-r--r--firmware/export/wm8978.h13
4 files changed, 315 insertions, 15 deletions
diff --git a/firmware/export/audiohw.h b/firmware/export/audiohw.h
index 22f6e68562..12c4738f7c 100644
--- a/firmware/export/audiohw.h
+++ b/firmware/export/audiohw.h
@@ -26,13 +26,15 @@
26#include <stdbool.h> 26#include <stdbool.h>
27 27
28/* define some audiohw caps */ 28/* define some audiohw caps */
29#define TREBLE_CAP (1 << 0) 29#define TREBLE_CAP (1 << 0)
30#define BASS_CAP (1 << 1) 30#define BASS_CAP (1 << 1)
31#define BALANCE_CAP (1 << 2) 31#define BALANCE_CAP (1 << 2)
32#define CLIPPING_CAP (1 << 3) 32#define CLIPPING_CAP (1 << 3)
33#define PRESCALER_CAP (1 << 4) 33#define PRESCALER_CAP (1 << 4)
34#define BASS_CUTOFF_CAP (1 << 5) 34#define BASS_CUTOFF_CAP (1 << 5)
35#define TREBLE_CUTOFF_CAP (1 << 6) 35#define TREBLE_CUTOFF_CAP (1 << 6)
36#define EQ_CAP (1 << 7)
37#define DEPTH_3D_CAP (1 << 8)
36 38
37#ifdef HAVE_UDA1380 39#ifdef HAVE_UDA1380
38#include "uda1380.h" 40#include "uda1380.h"
@@ -75,12 +77,17 @@
75#define VOLUME_MAX 0 77#define VOLUME_MAX 0
76#endif 78#endif
77 79
80#ifndef AUDIOHW_NUM_TONE_CONTROLS
81#define AUDIOHW_NUM_TONE_CONTROLS 0
82#endif
83
78/* volume/balance/treble/bass interdependency main part */ 84/* volume/balance/treble/bass interdependency main part */
79#define VOLUME_RANGE (VOLUME_MAX - VOLUME_MIN) 85#define VOLUME_RANGE (VOLUME_MAX - VOLUME_MIN)
80 86
81 87
82/* convert caps into defines */ 88/* convert caps into defines */
83#ifdef AUDIOHW_CAPS 89#ifdef AUDIOHW_CAPS
90/* Tone controls */
84#if (AUDIOHW_CAPS & TREBLE_CAP) 91#if (AUDIOHW_CAPS & TREBLE_CAP)
85#define AUDIOHW_HAVE_TREBLE 92#define AUDIOHW_HAVE_TREBLE
86#endif 93#endif
@@ -89,6 +96,14 @@
89#define AUDIOHW_HAVE_BASS 96#define AUDIOHW_HAVE_BASS
90#endif 97#endif
91 98
99#if (AUDIOHW_CAPS & BASS_CUTOFF_CAP)
100#define AUDIOHW_HAVE_BASS_CUTOFF
101#endif
102
103#if (AUDIOHW_CAPS & TREBLE_CUTOFF_CAP)
104#define AUDIOHW_HAVE_TREBLE_CUTOFF
105#endif
106
92#if (AUDIOHW_CAPS & BALANCE_CAP) 107#if (AUDIOHW_CAPS & BALANCE_CAP)
93#define AUDIOHW_HAVE_BALANCE 108#define AUDIOHW_HAVE_BALANCE
94#endif 109#endif
@@ -101,19 +116,127 @@
101#define AUDIOHW_HAVE_PRESCALER 116#define AUDIOHW_HAVE_PRESCALER
102#endif 117#endif
103 118
104#if (AUDIOHW_CAPS & BASS_CUTOFF_CAP) 119/* Hardware EQ tone controls */
105#define AUDIOHW_HAVE_BASS_CUTOFF 120#if (AUDIOHW_CAPS & EQ_CAP)
121/* A hardware equalizer is present (or perhaps some tone control variation
122 * that is not Bass and/or Treble) */
123#define AUDIOHW_HAVE_EQ
124
125/* Defined band indexes for supported bands */
126enum
127{
128 /* Band 1 is implied; bands must be contiguous, 1 to N */
129 AUDIOHW_EQ_BAND1 = 0,
130#define AUDIOHW_HAVE_EQ_BAND1
131#if (AUDIOHW_EQ_BAND_CAPS & (EQ_CAP << 1))
132 AUDIOHW_EQ_BAND2,
133#define AUDIOHW_HAVE_EQ_BAND2
134#if (AUDIOHW_EQ_BAND_CAPS & (EQ_CAP << 2))
135 AUDIOHW_EQ_BAND3,
136#define AUDIOHW_HAVE_EQ_BAND3
137#if (AUDIOHW_EQ_BAND_CAPS & (EQ_CAP << 3))
138 AUDIOHW_EQ_BAND4,
139#define AUDIOHW_HAVE_EQ_BAND4
140#if (AUDIOHW_EQ_BAND_CAPS & (EQ_CAP << 4))
141 AUDIOHW_EQ_BAND5,
142#define AUDIOHW_HAVE_EQ_BAND5
143#endif /* 5 */
144#endif /* 4 */
145#endif /* 3 */
146#endif /* 2 */
147 AUDIOHW_EQ_BAND_NUM, /* Keep last */
148};
149
150#ifdef AUDIOHW_EQ_FREQUENCY_CAPS
151/* One or more bands supports frequency cutoff or center adjustment */
152#define AUDIOHW_HAVE_EQ_FREQUENCY
153enum
154{
155 __AUDIOHW_EQ_BAND_FREQUENCY = -1,
156#if defined(AUDIOHW_HAVE_EQ_BAND1) && \
157 (AUDIOHW_EQ_FREQUENCY_CAPS & (EQ_CAP << 0))
158 AUDIOHW_EQ_BAND1_FREQUENCY,
159#define AUDIOHW_HAVE_EQ_BAND1_FREQUENCY
160#endif
161#if defined(AUDIOHW_HAVE_EQ_BAND2) && \
162 (AUDIOHW_EQ_FREQUENCY_CAPS & (EQ_CAP << 1))
163 AUDIOHW_EQ_BAND2_FREQUENCY,
164#define AUDIOHW_HAVE_EQ_BAND2_FREQUENCY
106#endif 165#endif
166#if defined(AUDIOHW_HAVE_EQ_BAND3) && \
167 (AUDIOHW_EQ_FREQUENCY_CAPS & (EQ_CAP << 2))
168 AUDIOHW_EQ_BAND3_FREQUENCY,
169#define AUDIOHW_HAVE_EQ_BAND3_FREQUENCY
170#endif
171#if defined(AUDIOHW_HAVE_EQ_BAND4) && \
172 (AUDIOHW_EQ_FREQUENCY_CAPS & (EQ_CAP << 3))
173 AUDIOHW_EQ_BAND4_FREQUENCY,
174#define AUDIOHW_HAVE_EQ_BAND4_FREQUENCY
175#endif
176#if defined(AUDIOHW_HAVE_EQ_BAND5) && \
177 (AUDIOHW_EQ_FREQUENCY_CAPS & (EQ_CAP << 4))
178 AUDIOHW_EQ_BAND5_FREQUENCY,
179#define AUDIOHW_HAVE_EQ_BAND5_FREQUENCY
180#endif
181 AUDIOHW_EQ_FREQUENCY_NUM,
182};
183#endif /* AUDIOHW_EQ_FREQUENCY_CAPS */
184
185#ifdef AUDIOHW_EQ_WIDTH_CAPS
186/* One or more bands supports bandwidth adjustment */
187#define AUDIOHW_HAVE_EQ_WIDTH
188enum
189{
190 __AUDIOHW_EQ_BAND_WIDTH = -1,
191#if defined(AUDIOHW_HAVE_EQ_BAND1) && \
192 (AUDIOHW_EQ_WIDTH_CAPS & (EQ_CAP << 1))
193 AUDIOHW_EQ_BAND2_WIDTH,
194#define AUDIOHW_HAVE_EQ_BAND2_WIDTH
195#endif
196#if defined(AUDIOHW_HAVE_EQ_BAND2) && \
197 (AUDIOHW_EQ_WIDTH_CAPS & (EQ_CAP << 2))
198 AUDIOHW_EQ_BAND3_WIDTH,
199#define AUDIOHW_HAVE_EQ_BAND3_WIDTH
200#endif
201#if defined(AUDIOHW_HAVE_EQ_BAND3) && \
202 (AUDIOHW_EQ_WIDTH_CAPS & (EQ_CAP << 3))
203 AUDIOHW_EQ_BAND4_WIDTH,
204#define AUDIOHW_HAVE_EQ_BAND4_WIDTH
205#endif
206 AUDIOHW_EQ_WIDTH_NUM, /* Keep last */
207};
208#endif /* AUDIOHW_EQ_WIDTH_CAPS */
209
210/* Types and number of settings types (gain, frequency, width) */
211enum AUDIOHW_EQ_SETTINGS
212{
213 AUDIOHW_EQ_GAIN = 0,
214#ifdef AUDIOHW_HAVE_EQ_FREQUENCY
215 AUDIOHW_EQ_FREQUENCY,
216#endif
217#ifdef AUDIOHW_HAVE_EQ_WIDTH
218 AUDIOHW_EQ_WIDTH,
219#endif
220 AUDIOHW_EQ_SETTING_NUM
221};
107 222
108#if (AUDIOHW_CAPS & TREBLE_CUTOFF_CAP) 223#endif /* (AUDIOHW_CAPS & EQ_CAP) */
109#define AUDIOHW_HAVE_TREBLE_CUTOFF 224
225#if (AUDIOHW_CAPS & DEPTH_3D_CAP)
226#define AUDIOHW_HAVE_DEPTH_3D
110#endif 227#endif
228
111#endif /* AUDIOHW_CAPS */ 229#endif /* AUDIOHW_CAPS */
112 230
113enum { 231enum {
114 SOUND_VOLUME = 0, 232 SOUND_VOLUME = 0,
233/* Tone control */
234#if defined(AUDIOHW_HAVE_BASS)
115 SOUND_BASS, 235 SOUND_BASS,
236#endif
237#if defined(AUDIOHW_HAVE_TREBLE)
116 SOUND_TREBLE, 238 SOUND_TREBLE,
239#endif
117 SOUND_BALANCE, 240 SOUND_BALANCE,
118 SOUND_CHANNELS, 241 SOUND_CHANNELS,
119 SOUND_STEREO_WIDTH, 242 SOUND_STEREO_WIDTH,
@@ -132,12 +255,61 @@ enum {
132 SOUND_RIGHT_GAIN, 255 SOUND_RIGHT_GAIN,
133 SOUND_MIC_GAIN, 256 SOUND_MIC_GAIN,
134#endif 257#endif
258/* Bass and treble tone controls */
135#if defined(AUDIOHW_HAVE_BASS_CUTOFF) 259#if defined(AUDIOHW_HAVE_BASS_CUTOFF)
136 SOUND_BASS_CUTOFF, 260 SOUND_BASS_CUTOFF,
137#endif 261#endif
138#if defined(AUDIOHW_HAVE_TREBLE_CUTOFF) 262#if defined(AUDIOHW_HAVE_TREBLE_CUTOFF)
139 SOUND_TREBLE_CUTOFF, 263 SOUND_TREBLE_CUTOFF,
140#endif 264#endif
265/* 3D effect */
266#if defined(AUDIOHW_HAVE_DEPTH_3D)
267 SOUND_DEPTH_3D,
268#endif
269/* Hardware EQ tone controls */
270/* Band gains */
271#if defined(AUDIOHW_HAVE_EQ)
272 /* Band 1 implied */
273 SOUND_EQ_BAND1_GAIN,
274#if defined(AUDIOHW_HAVE_EQ_BAND2)
275 SOUND_EQ_BAND2_GAIN,
276#endif
277#if defined(AUDIOHW_HAVE_EQ_BAND3)
278 SOUND_EQ_BAND3_GAIN,
279#endif
280#if defined(AUDIOHW_HAVE_EQ_BAND4)
281 SOUND_EQ_BAND4_GAIN,
282#endif
283#if defined(AUDIOHW_HAVE_EQ_BAND5)
284 SOUND_EQ_BAND5_GAIN,
285#endif
286/* Band frequencies */
287#if defined(AUDIOHW_HAVE_EQ_BAND1_FREQUENCY)
288 SOUND_EQ_BAND1_FREQUENCY,
289#endif
290#if defined(AUDIOHW_HAVE_EQ_BAND2_FREQUENCY)
291 SOUND_EQ_BAND2_FREQUENCY,
292#endif
293#if defined(AUDIOHW_HAVE_EQ_BAND3_FREQUENCY)
294 SOUND_EQ_BAND3_FREQUENCY,
295#endif
296#if defined(AUDIOHW_HAVE_EQ_BAND4_FREQUENCY)
297 SOUND_EQ_BAND4_FREQUENCY,
298#endif
299#if defined(AUDIOHW_HAVE_EQ_BAND5_FREQUENCY)
300 SOUND_EQ_BAND5_FREQUENCY,
301#endif
302/* Band widths */
303#if defined(AUDIOHW_HAVE_EQ_BAND2_WIDTH)
304 SOUND_EQ_BAND2_WIDTH,
305#endif
306#if defined(AUDIOHW_HAVE_EQ_BAND3_WIDTH)
307 SOUND_EQ_BAND3_WIDTH,
308#endif
309#if defined(AUDIOHW_HAVE_EQ_BAND4_WIDTH)
310 SOUND_EQ_BAND4_WIDTH,
311#endif
312#endif /* AUDIOHW_HAVE_EQ */
141 SOUND_LAST_SETTING, /* Keep this last */ 313 SOUND_LAST_SETTING, /* Keep this last */
142}; 314};
143 315
@@ -262,6 +434,64 @@ void audiohw_set_bass_cutoff(int val);
262void audiohw_set_treble_cutoff(int val); 434void audiohw_set_treble_cutoff(int val);
263#endif 435#endif
264 436
437#ifdef AUDIOHW_HAVE_EQ
438/**
439 * Set new band gain value.
440 * @param band index to which val is set
441 * @param val to set.
442 * NOTE: AUDIOHW_CAPS need to contain
443 * EQ_CAP
444 *
445 * AUDIOHW_EQ_BAND_CAPS must be defined as a bitmask
446 * of EQ_CAP each shifted by the zero-based band number
447 * for each band. Bands 1 to N are indexed 0 to N-1.
448 */
449void audiohw_set_eq_band_gain(unsigned int band, int val);
450#endif
451
452#ifdef AUDIOHW_HAVE_EQ_FREQUENCY
453/**
454 * Set new band cutoff or center frequency value.
455 * @param band index to which val is set
456 * @param val to set.
457 * NOTE: AUDIOHW_CAPS need to contain
458 * EQ_CAP
459 *
460 * AUDIOHW_EQ_FREQUENCY_CAPS must be defined as a bitmask
461 * of EQ_CAP each shifted by the zero-based band number
462 * for each band that supports frequency adjustment.
463 * Bands 1 to N are indexed 0 to N-1.
464 */
465void audiohw_set_eq_band_frequency(unsigned int band, int val);
466#endif
467
468#ifdef AUDIOHW_HAVE_EQ_WIDTH
469/**
470 * Set new band cutoff or center frequency value.
471 * @param band index to which val is set
472 * @param val to set.
473 * NOTE: AUDIOHW_CAPS need to contain
474 * EQ_CAP
475 *
476 * AUDIOHW_EQ_WIDTH_CAPS must be defined as a bitmask
477 * of EQ_CAP each shifted by the zero-based band number
478 * for each band that supports width adjustment.
479 * Bands 1 to N are indexed 0 to N-1.
480 */
481void audiohw_set_eq_band_width(unsigned int band, int val);
482#endif
483
484#ifdef AUDIOHW_HAVE_DEPTH_3D
485/**
486 * Set new 3-d enhancement (stereo expansion) effect value.
487 * @param val to set.
488 * NOTE: AUDIOHW_CAPS need to contain
489 * DEPTH_3D_CAP
490 */
491void audiohw_set_depth_3d(int val);
492#endif
493
494
265void audiohw_set_frequency(int fsel); 495void audiohw_set_frequency(int fsel);
266 496
267#ifdef HAVE_RECORDING 497#ifdef HAVE_RECORDING
diff --git a/firmware/export/config/gigabeats.h b/firmware/export/config/gigabeats.h
index 2bc56ec98c..73eb79ce90 100644
--- a/firmware/export/config/gigabeats.h
+++ b/firmware/export/config/gigabeats.h
@@ -90,9 +90,6 @@
90/* Define this if you have the WM8978 audio codec */ 90/* Define this if you have the WM8978 audio codec */
91#define HAVE_WM8978 91#define HAVE_WM8978
92 92
93/* Tone controls for WM8978 have not been implemented yet */
94#define HAVE_SW_TONE_CONTROLS
95
96/* Define bitmask of input sources - recordable bitmask can be defined 93/* Define bitmask of input sources - recordable bitmask can be defined
97 explicitly if different */ 94 explicitly if different */
98#define INPUT_SRC_CAPS SRC_CAP_FMRADIO 95#define INPUT_SRC_CAPS SRC_CAP_FMRADIO
diff --git a/firmware/export/sound.h b/firmware/export/sound.h
index e68ae23774..7243f48e79 100644
--- a/firmware/export/sound.h
+++ b/firmware/export/sound.h
@@ -55,10 +55,70 @@ void sound_set_bass(int value);
55void sound_set_treble(int value); 55void sound_set_treble(int value);
56void sound_set_channels(int value); 56void sound_set_channels(int value);
57void sound_set_stereo_width(int value); 57void sound_set_stereo_width(int value);
58#if defined(HAVE_WM8758) || defined(HAVE_WM8985) 58#if defined(AUDIOHW_HAVE_BASS_CUTOFF)
59void sound_set_bass_cutoff(int value); 59void sound_set_bass_cutoff(int value);
60#endif
61#if defined(AUDIOHW_HAVE_TREBLE_CUTOFF)
60void sound_set_treble_cutoff(int value); 62void sound_set_treble_cutoff(int value);
61#endif 63#endif
64
65#if defined(AUDIOHW_HAVE_DEPTH_3D)
66void sound_set_depth_3d(int value);
67#endif
68
69#ifdef AUDIOHW_HAVE_EQ
70/*
71 * band = SOUND_EQ_BANDb
72 * band_setting = AUDIOHW_EQ_s
73 *
74 * Returns SOUND_EQ_BANDb_s or -1 if it doesn't exist.
75 *
76 * b: band number
77 * s: one of GAIN, FREQUENCY, WIDTH
78 */
79int sound_enum_hw_eq_band_setting(unsigned int band,
80 unsigned int band_setting);
81/* Band1 implied */
82void sound_set_hw_eq_band1_gain(int value);
83#ifdef AUDIOHW_HAVE_EQ_BAND1_FREQUENCY
84void sound_set_hw_eq_band1_frequency(int value);
85#endif
86#ifdef AUDIOHW_HAVE_EQ_BAND2
87void sound_set_hw_eq_band2_gain(int value);
88#ifdef AUDIOHW_HAVE_EQ_BAND2_FREQUENCY
89void sound_set_hw_eq_band2_frequency(int value);
90#endif
91#ifdef AUDIOHW_HAVE_EQ_BAND2_WIDTH
92void sound_set_hw_eq_band2_width(int value);
93#endif
94#endif /* AUDIOHW_HAVE_EQ_BAND2 */
95#ifdef AUDIOHW_HAVE_EQ_BAND3
96/* Band 3 */
97void sound_set_hw_eq_band3_gain(int value);
98#ifdef AUDIOHW_HAVE_EQ_BAND3_FREQUENCY
99void sound_set_hw_eq_band3_frequency(int value);
100#endif
101#if defined(AUDIOHW_HAVE_EQ_BAND3_WIDTH)
102void sound_set_hw_eq_band3_width(int value);
103#endif
104#endif /* AUDIOHW_HAVE_EQ_BAND3 */
105#ifdef AUDIOHW_HAVE_EQ_BAND4
106void sound_set_hw_eq_band4_gain(int value);
107#ifdef AUDIOHW_HAVE_EQ_BAND4_FREQUENCY
108void sound_set_hw_eq_band4_frequency(int value);
109#endif
110#ifdef AUDIOHW_HAVE_EQ_BAND4_WIDTH
111void sound_set_hw_eq_band4_width(int value);
112#endif
113#endif /* AUDIOHW_HAVE_EQ_BAND4 */
114#ifdef AUDIOHW_HAVE_EQ_BAND5
115void sound_set_hw_eq_band5_gain(int value);
116#ifdef AUDIOHW_HAVE_EQ_BAND5_FREQUENCY
117void sound_set_hw_eq_band5_frequency(int value);
118#endif
119#endif /* AUDIOHW_HAVE_EQ_BAND5 */
120#endif /* AUDIOHW_HAVE_EQ */
121
62#if (CONFIG_CODEC == MAS3587F) || (CONFIG_CODEC == MAS3539F) 122#if (CONFIG_CODEC == MAS3587F) || (CONFIG_CODEC == MAS3539F)
63void sound_set_loudness(int value); 123void sound_set_loudness(int value);
64void sound_set_avc(int value); 124void sound_set_avc(int value);
diff --git a/firmware/export/wm8978.h b/firmware/export/wm8978.h
index 270c666a4a..4081d05a89 100644
--- a/firmware/export/wm8978.h
+++ b/firmware/export/wm8978.h
@@ -26,6 +26,19 @@
26#define VOLUME_MIN -900 26#define VOLUME_MIN -900
27#define VOLUME_MAX 60 27#define VOLUME_MAX 60
28 28
29#define AUDIOHW_CAPS (EQ_CAP | PRESCALER_CAP | DEPTH_3D_CAP)
30/* Filter bitmask */
31#define AUDIOHW_EQ_BAND_CAPS ((EQ_CAP << 0) | (EQ_CAP << 1) | \
32 (EQ_CAP << 2) | (EQ_CAP << 3) | \
33 (EQ_CAP << 4))
34/* Filters that can adjust cutoff and center frequency */
35#define AUDIOHW_EQ_FREQUENCY_CAPS ((EQ_CAP << 0) | (EQ_CAP << 1) | \
36 (EQ_CAP << 2) | (EQ_CAP << 3) | \
37 (EQ_CAP << 4))
38/* Filters that can adjust band width */
39#define AUDIOHW_EQ_WIDTH_CAPS ((EQ_CAP << 1) | (EQ_CAP << 2) | \
40 (EQ_CAP << 3))
41
29int tenthdb2master(int db); 42int tenthdb2master(int db);
30void audiohw_set_headphone_vol(int vol_l, int vol_r); 43void audiohw_set_headphone_vol(int vol_l, int vol_r);
31void audiohw_set_recsrc(int source, bool recording); 44void audiohw_set_recsrc(int source, bool recording);