diff options
Diffstat (limited to 'firmware/export')
| -rw-r--r-- | firmware/export/audiohw.h | 252 | ||||
| -rw-r--r-- | firmware/export/config/gigabeats.h | 3 | ||||
| -rw-r--r-- | firmware/export/sound.h | 62 | ||||
| -rw-r--r-- | firmware/export/wm8978.h | 13 |
4 files changed, 315 insertions, 15 deletions
diff --git a/firmware/export/audiohw.h b/firmware/export/audiohw.h index 22f6e68..12c4738 100644 --- a/firmware/export/audiohw.h +++ b/firmware/export/audiohw.h @@ -26,13 +26,15 @@ #include <stdbool.h> /* define some audiohw caps */ -#define TREBLE_CAP (1 << 0) -#define BASS_CAP (1 << 1) -#define BALANCE_CAP (1 << 2) -#define CLIPPING_CAP (1 << 3) -#define PRESCALER_CAP (1 << 4) -#define BASS_CUTOFF_CAP (1 << 5) -#define TREBLE_CUTOFF_CAP (1 << 6) +#define TREBLE_CAP (1 << 0) +#define BASS_CAP (1 << 1) +#define BALANCE_CAP (1 << 2) +#define CLIPPING_CAP (1 << 3) +#define PRESCALER_CAP (1 << 4) +#define BASS_CUTOFF_CAP (1 << 5) +#define TREBLE_CUTOFF_CAP (1 << 6) +#define EQ_CAP (1 << 7) +#define DEPTH_3D_CAP (1 << 8) #ifdef HAVE_UDA1380 #include "uda1380.h" @@ -75,12 +77,17 @@ #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 */ #if (AUDIOHW_CAPS & TREBLE_CAP) #define AUDIOHW_HAVE_TREBLE #endif @@ -89,6 +96,14 @@ #define AUDIOHW_HAVE_BASS #endif +#if (AUDIOHW_CAPS & BASS_CUTOFF_CAP) +#define AUDIOHW_HAVE_BASS_CUTOFF +#endif + +#if (AUDIOHW_CAPS & TREBLE_CUTOFF_CAP) +#define AUDIOHW_HAVE_TREBLE_CUTOFF +#endif + #if (AUDIOHW_CAPS & BALANCE_CAP) #define AUDIOHW_HAVE_BALANCE #endif @@ -101,19 +116,127 @@ #define AUDIOHW_HAVE_PRESCALER #endif -#if (AUDIOHW_CAPS & BASS_CUTOFF_CAP) -#define AUDIOHW_HAVE_BASS_CUTOFF +/* Hardware EQ tone controls */ +#if (AUDIOHW_CAPS & EQ_CAP) +/* A hardware equalizer is present (or perhaps some tone control variation + * that is not Bass and/or Treble) */ +#define AUDIOHW_HAVE_EQ + +/* Defined band indexes for supported bands */ +enum +{ + /* Band 1 is implied; bands must be contiguous, 1 to N */ + AUDIOHW_EQ_BAND1 = 0, +#define AUDIOHW_HAVE_EQ_BAND1 +#if (AUDIOHW_EQ_BAND_CAPS & (EQ_CAP << 1)) + AUDIOHW_EQ_BAND2, +#define AUDIOHW_HAVE_EQ_BAND2 +#if (AUDIOHW_EQ_BAND_CAPS & (EQ_CAP << 2)) + AUDIOHW_EQ_BAND3, +#define AUDIOHW_HAVE_EQ_BAND3 +#if (AUDIOHW_EQ_BAND_CAPS & (EQ_CAP << 3)) + AUDIOHW_EQ_BAND4, +#define AUDIOHW_HAVE_EQ_BAND4 +#if (AUDIOHW_EQ_BAND_CAPS & (EQ_CAP << 4)) + AUDIOHW_EQ_BAND5, +#define AUDIOHW_HAVE_EQ_BAND5 +#endif /* 5 */ +#endif /* 4 */ +#endif /* 3 */ +#endif /* 2 */ + AUDIOHW_EQ_BAND_NUM, /* Keep last */ +}; + +#ifdef AUDIOHW_EQ_FREQUENCY_CAPS +/* One or more bands supports frequency cutoff or center adjustment */ +#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, +#define AUDIOHW_HAVE_EQ_BAND1_FREQUENCY +#endif +#if defined(AUDIOHW_HAVE_EQ_BAND2) && \ + (AUDIOHW_EQ_FREQUENCY_CAPS & (EQ_CAP << 1)) + AUDIOHW_EQ_BAND2_FREQUENCY, +#define AUDIOHW_HAVE_EQ_BAND2_FREQUENCY #endif +#if defined(AUDIOHW_HAVE_EQ_BAND3) && \ + (AUDIOHW_EQ_FREQUENCY_CAPS & (EQ_CAP << 2)) + AUDIOHW_EQ_BAND3_FREQUENCY, +#define AUDIOHW_HAVE_EQ_BAND3_FREQUENCY +#endif +#if defined(AUDIOHW_HAVE_EQ_BAND4) && \ + (AUDIOHW_EQ_FREQUENCY_CAPS & (EQ_CAP << 3)) + AUDIOHW_EQ_BAND4_FREQUENCY, +#define AUDIOHW_HAVE_EQ_BAND4_FREQUENCY +#endif +#if defined(AUDIOHW_HAVE_EQ_BAND5) && \ + (AUDIOHW_EQ_FREQUENCY_CAPS & (EQ_CAP << 4)) + AUDIOHW_EQ_BAND5_FREQUENCY, +#define AUDIOHW_HAVE_EQ_BAND5_FREQUENCY +#endif + AUDIOHW_EQ_FREQUENCY_NUM, +}; +#endif /* AUDIOHW_EQ_FREQUENCY_CAPS */ + +#ifdef AUDIOHW_EQ_WIDTH_CAPS +/* One or more bands supports bandwidth adjustment */ +#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, +#define AUDIOHW_HAVE_EQ_BAND2_WIDTH +#endif +#if defined(AUDIOHW_HAVE_EQ_BAND2) && \ + (AUDIOHW_EQ_WIDTH_CAPS & (EQ_CAP << 2)) + AUDIOHW_EQ_BAND3_WIDTH, +#define AUDIOHW_HAVE_EQ_BAND3_WIDTH +#endif +#if defined(AUDIOHW_HAVE_EQ_BAND3) && \ + (AUDIOHW_EQ_WIDTH_CAPS & (EQ_CAP << 3)) + AUDIOHW_EQ_BAND4_WIDTH, +#define AUDIOHW_HAVE_EQ_BAND4_WIDTH +#endif + AUDIOHW_EQ_WIDTH_NUM, /* Keep last */ +}; +#endif /* AUDIOHW_EQ_WIDTH_CAPS */ + +/* Types and number of settings types (gain, frequency, width) */ +enum AUDIOHW_EQ_SETTINGS +{ + AUDIOHW_EQ_GAIN = 0, +#ifdef AUDIOHW_HAVE_EQ_FREQUENCY + AUDIOHW_EQ_FREQUENCY, +#endif +#ifdef AUDIOHW_HAVE_EQ_WIDTH + AUDIOHW_EQ_WIDTH, +#endif + AUDIOHW_EQ_SETTING_NUM +}; -#if (AUDIOHW_CAPS & TREBLE_CUTOFF_CAP) -#define AUDIOHW_HAVE_TREBLE_CUTOFF +#endif /* (AUDIOHW_CAPS & EQ_CAP) */ + +#if (AUDIOHW_CAPS & DEPTH_3D_CAP) +#define AUDIOHW_HAVE_DEPTH_3D #endif + #endif /* AUDIOHW_CAPS */ enum { 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, @@ -132,12 +255,61 @@ enum { SOUND_RIGHT_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 */ }; @@ -262,6 +434,64 @@ void audiohw_set_bass_cutoff(int val); void audiohw_set_treble_cutoff(int val); #endif +#ifdef AUDIOHW_HAVE_EQ +/** + * Set new band gain value. + * @param band index to which val is set + * @param val to set. + * NOTE: AUDIOHW_CAPS need to contain + * EQ_CAP + * + * AUDIOHW_EQ_BAND_CAPS must be defined as a bitmask + * of EQ_CAP each shifted by the zero-based band number + * for each band. Bands 1 to N are indexed 0 to N-1. + */ +void audiohw_set_eq_band_gain(unsigned int band, int val); +#endif + +#ifdef AUDIOHW_HAVE_EQ_FREQUENCY +/** + * Set new band cutoff or center frequency value. + * @param band index to which val is set + * @param val to set. + * NOTE: AUDIOHW_CAPS need to contain + * EQ_CAP + * + * AUDIOHW_EQ_FREQUENCY_CAPS must be defined as a bitmask + * of EQ_CAP each shifted by the zero-based band number + * for each band that supports frequency adjustment. + * Bands 1 to N are indexed 0 to N-1. + */ +void audiohw_set_eq_band_frequency(unsigned int band, int val); +#endif + +#ifdef AUDIOHW_HAVE_EQ_WIDTH +/** + * Set new band cutoff or center frequency value. + * @param band index to which val is set + * @param val to set. + * NOTE: AUDIOHW_CAPS need to contain + * EQ_CAP + * + * AUDIOHW_EQ_WIDTH_CAPS must be defined as a bitmask + * of EQ_CAP each shifted by the zero-based band number + * for each band that supports width adjustment. + * Bands 1 to N are indexed 0 to N-1. + */ +void audiohw_set_eq_band_width(unsigned int band, int val); +#endif + +#ifdef AUDIOHW_HAVE_DEPTH_3D +/** + * Set new 3-d enhancement (stereo expansion) effect value. + * @param val to set. + * NOTE: AUDIOHW_CAPS need to contain + * DEPTH_3D_CAP + */ +void audiohw_set_depth_3d(int val); +#endif + + void audiohw_set_frequency(int fsel); #ifdef HAVE_RECORDING diff --git a/firmware/export/config/gigabeats.h b/firmware/export/config/gigabeats.h index 2bc56ec..73eb79c 100644 --- a/firmware/export/config/gigabeats.h +++ b/firmware/export/config/gigabeats.h @@ -90,9 +90,6 @@ /* Define this if you have the WM8978 audio codec */ #define HAVE_WM8978 -/* Tone controls for WM8978 have not been implemented yet */ -#define HAVE_SW_TONE_CONTROLS - /* Define bitmask of input sources - recordable bitmask can be defined explicitly if different */ #define INPUT_SRC_CAPS SRC_CAP_FMRADIO diff --git a/firmware/export/sound.h b/firmware/export/sound.h index e68ae23..7243f48 100644 --- a/firmware/export/sound.h +++ b/firmware/export/sound.h @@ -55,10 +55,70 @@ void sound_set_bass(int value); void sound_set_treble(int value); void sound_set_channels(int value); void sound_set_stereo_width(int value); -#if defined(HAVE_WM8758) || defined(HAVE_WM8985) +#if defined(AUDIOHW_HAVE_BASS_CUTOFF) void sound_set_bass_cutoff(int value); +#endif +#if defined(AUDIOHW_HAVE_TREBLE_CUTOFF) void sound_set_treble_cutoff(int value); #endif + +#if defined(AUDIOHW_HAVE_DEPTH_3D) +void sound_set_depth_3d(int value); +#endif + +#ifdef AUDIOHW_HAVE_EQ +/* + * band = SOUND_EQ_BANDb + * band_setting = AUDIOHW_EQ_s + * + * Returns SOUND_EQ_BANDb_s or -1 if it doesn't exist. + * + * b: band number + * s: one of GAIN, FREQUENCY, WIDTH + */ +int sound_enum_hw_eq_band_setting(unsigned int band, + unsigned int band_setting); +/* Band1 implied */ +void sound_set_hw_eq_band1_gain(int value); +#ifdef AUDIOHW_HAVE_EQ_BAND1_FREQUENCY +void sound_set_hw_eq_band1_frequency(int value); +#endif +#ifdef AUDIOHW_HAVE_EQ_BAND2 +void sound_set_hw_eq_band2_gain(int value); +#ifdef AUDIOHW_HAVE_EQ_BAND2_FREQUENCY +void sound_set_hw_eq_band2_frequency(int value); +#endif +#ifdef AUDIOHW_HAVE_EQ_BAND2_WIDTH +void sound_set_hw_eq_band2_width(int value); +#endif +#endif /* AUDIOHW_HAVE_EQ_BAND2 */ +#ifdef AUDIOHW_HAVE_EQ_BAND3 +/* Band 3 */ +void sound_set_hw_eq_band3_gain(int value); +#ifdef AUDIOHW_HAVE_EQ_BAND3_FREQUENCY +void sound_set_hw_eq_band3_frequency(int value); +#endif +#if defined(AUDIOHW_HAVE_EQ_BAND3_WIDTH) +void sound_set_hw_eq_band3_width(int value); +#endif +#endif /* AUDIOHW_HAVE_EQ_BAND3 */ +#ifdef AUDIOHW_HAVE_EQ_BAND4 +void sound_set_hw_eq_band4_gain(int value); +#ifdef AUDIOHW_HAVE_EQ_BAND4_FREQUENCY +void sound_set_hw_eq_band4_frequency(int value); +#endif +#ifdef AUDIOHW_HAVE_EQ_BAND4_WIDTH +void sound_set_hw_eq_band4_width(int value); +#endif +#endif /* AUDIOHW_HAVE_EQ_BAND4 */ +#ifdef AUDIOHW_HAVE_EQ_BAND5 +void sound_set_hw_eq_band5_gain(int value); +#ifdef AUDIOHW_HAVE_EQ_BAND5_FREQUENCY +void sound_set_hw_eq_band5_frequency(int value); +#endif +#endif /* AUDIOHW_HAVE_EQ_BAND5 */ +#endif /* AUDIOHW_HAVE_EQ */ + #if (CONFIG_CODEC == MAS3587F) || (CONFIG_CODEC == MAS3539F) void sound_set_loudness(int value); void sound_set_avc(int value); diff --git a/firmware/export/wm8978.h b/firmware/export/wm8978.h index 270c666..4081d05 100644 --- a/firmware/export/wm8978.h +++ b/firmware/export/wm8978.h @@ -26,6 +26,19 @@ #define VOLUME_MIN -900 #define VOLUME_MAX 60 +#define AUDIOHW_CAPS (EQ_CAP | PRESCALER_CAP | DEPTH_3D_CAP) +/* Filter bitmask */ +#define AUDIOHW_EQ_BAND_CAPS ((EQ_CAP << 0) | (EQ_CAP << 1) | \ + (EQ_CAP << 2) | (EQ_CAP << 3) | \ + (EQ_CAP << 4)) +/* Filters that can adjust cutoff and center frequency */ +#define AUDIOHW_EQ_FREQUENCY_CAPS ((EQ_CAP << 0) | (EQ_CAP << 1) | \ + (EQ_CAP << 2) | (EQ_CAP << 3) | \ + (EQ_CAP << 4)) +/* Filters that can adjust band width */ +#define AUDIOHW_EQ_WIDTH_CAPS ((EQ_CAP << 1) | (EQ_CAP << 2) | \ + (EQ_CAP << 3)) + int tenthdb2master(int db); void audiohw_set_headphone_vol(int vol_l, int vol_r); void audiohw_set_recsrc(int source, bool recording); |