1245c5fe61
The implementation is not very complicated but there are a few things worth noting. There was a previous "speaker enable" setting but it was a boolean. I decided to replace it with a choice setting that has 2 options (on, off) if headphones cannot be detect on this target, or 3 options (on, off, auto) if we can detect headphones. This will break the old setting on target that cannot detect jack but it makes the code more uniform and avoid maintaining two settings with more #ifdef. The third option (auto) uses the LANG_AUTO text, which I think is clear enough (disable speaker on jack plug). In order to avoid code duplication (both in apps and firmware), I decided to keep the audiohw_enable_speaker function as-is: it takes a boolean and doesn't care about the speaker policy. I introduced a new audio_enable_speaker that takes directly the mode (which follows the setting encoding): 0=off, 1=on and 2=auto. This way one calls audio_enable_speaker and it changes the speaker once to reflect the request mode. The apps code then uses this function in the places where it makes sense: on setting load, setting change and jack (un)plug event. Change-Id: I027873f698eb4bc365d7c02b515297806355d9e2
275 lines
9.5 KiB
C
275 lines
9.5 KiB
C
/***************************************************************************
|
|
* __________ __ ___.
|
|
* Open \______ \ ____ ____ | | _\_ |__ _______ ___
|
|
* Source | _// _ \_/ ___\| |/ /| __ \ / _ \ \/ /
|
|
* Jukebox | | ( <_> ) \___| < | \_\ ( <_> > < <
|
|
* Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \
|
|
* \/ \/ \/ \/ \/
|
|
* $Id$
|
|
*
|
|
* Copyright (C) 2007 Jonathan Gordon
|
|
*
|
|
* This program is free software; you can redistribute it and/or
|
|
* modify it under the terms of the GNU General Public License
|
|
* as published by the Free Software Foundation; either version 2
|
|
* of the License, or (at your option) any later version.
|
|
*
|
|
* This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
|
|
* KIND, either express or implied.
|
|
*
|
|
****************************************************************************/
|
|
|
|
#include <stdbool.h>
|
|
#include <stddef.h>
|
|
#include <limits.h>
|
|
#include "config.h"
|
|
#include "sound.h"
|
|
#include "lang.h"
|
|
#include "action.h"
|
|
#include "settings.h"
|
|
#include "menu.h"
|
|
#include "sound_menu.h"
|
|
#include "eq_menu.h"
|
|
#include "exported_menus.h"
|
|
#include "menu_common.h"
|
|
#include "splash.h"
|
|
#include "kernel.h"
|
|
#include "talk.h"
|
|
#include "option_select.h"
|
|
#include "misc.h"
|
|
|
|
static int32_t get_dec_talkid(int value, int unit)
|
|
{
|
|
return TALK_ID_DECIMAL(value, 1, unit);
|
|
}
|
|
|
|
static int volume_limit_callback(int action,const struct menu_item_ex *this_item)
|
|
{
|
|
(void)this_item;
|
|
|
|
static struct int_setting volume_limit_int_setting;
|
|
volume_limit_int_setting.option_callback = NULL;
|
|
volume_limit_int_setting.unit = UNIT_DB;
|
|
volume_limit_int_setting.min = sound_min(SOUND_VOLUME);
|
|
volume_limit_int_setting.max = sound_max(SOUND_VOLUME);
|
|
volume_limit_int_setting.step = sound_steps(SOUND_VOLUME);
|
|
volume_limit_int_setting.formatter = NULL;
|
|
volume_limit_int_setting.get_talk_id = get_dec_talkid;
|
|
|
|
struct settings_list setting;
|
|
setting.flags = F_BANFROMQS|F_INT_SETTING|F_T_INT|F_NO_WRAP;
|
|
setting.lang_id = LANG_VOLUME_LIMIT;
|
|
setting.default_val.int_ = sound_max(SOUND_VOLUME);
|
|
setting.int_setting = &volume_limit_int_setting;
|
|
|
|
switch (action)
|
|
{
|
|
case ACTION_ENTER_MENUITEM:
|
|
setting.setting = &global_settings.volume_limit;
|
|
option_screen(&setting, NULL, false, ID2P(LANG_VOLUME_LIMIT));
|
|
case ACTION_EXIT_MENUITEM: /* on exit */
|
|
setvol();
|
|
break;
|
|
}
|
|
return action;
|
|
}
|
|
|
|
/***********************************/
|
|
/* SOUND MENU */
|
|
MENUITEM_SETTING(volume, &global_settings.volume, NULL);
|
|
MENUITEM_SETTING(volume_limit, &global_settings.volume_limit, volume_limit_callback);
|
|
#ifdef AUDIOHW_HAVE_BASS
|
|
MENUITEM_SETTING(bass, &global_settings.bass,
|
|
#ifdef HAVE_SW_TONE_CONTROLS
|
|
lowlatency_callback
|
|
#else
|
|
NULL
|
|
#endif
|
|
);
|
|
|
|
#ifdef AUDIOHW_HAVE_BASS_CUTOFF
|
|
MENUITEM_SETTING(bass_cutoff, &global_settings.bass_cutoff, NULL);
|
|
#endif
|
|
#endif /* AUDIOHW_HAVE_BASS */
|
|
|
|
|
|
#ifdef AUDIOHW_HAVE_TREBLE
|
|
MENUITEM_SETTING(treble, &global_settings.treble,
|
|
#ifdef HAVE_SW_TONE_CONTROLS
|
|
lowlatency_callback
|
|
#else
|
|
NULL
|
|
#endif
|
|
);
|
|
|
|
#ifdef AUDIOHW_HAVE_TREBLE_CUTOFF
|
|
MENUITEM_SETTING(treble_cutoff, &global_settings.treble_cutoff, NULL);
|
|
#endif
|
|
#endif /* AUDIOHW_HAVE_TREBLE */
|
|
|
|
|
|
MENUITEM_SETTING(balance, &global_settings.balance, NULL);
|
|
MENUITEM_SETTING(channel_config, &global_settings.channel_config,
|
|
#if CONFIG_CODEC == SWCODEC
|
|
lowlatency_callback
|
|
#else
|
|
NULL
|
|
#endif
|
|
);
|
|
MENUITEM_SETTING(stereo_width, &global_settings.stereo_width,
|
|
#if CONFIG_CODEC == SWCODEC
|
|
lowlatency_callback
|
|
#else
|
|
NULL
|
|
#endif
|
|
);
|
|
|
|
#ifdef AUDIOHW_HAVE_DEPTH_3D
|
|
MENUITEM_SETTING(depth_3d, &global_settings.depth_3d, NULL);
|
|
#endif
|
|
|
|
#ifdef AUDIOHW_HAVE_FILTER_ROLL_OFF
|
|
MENUITEM_SETTING(roll_off, &global_settings.roll_off, NULL);
|
|
#endif
|
|
|
|
#if CONFIG_CODEC == SWCODEC
|
|
/* Crossfeed Submenu */
|
|
MENUITEM_SETTING(crossfeed, &global_settings.crossfeed, lowlatency_callback);
|
|
MENUITEM_SETTING(crossfeed_direct_gain,
|
|
&global_settings.crossfeed_direct_gain, lowlatency_callback);
|
|
MENUITEM_SETTING(crossfeed_cross_gain,
|
|
&global_settings.crossfeed_cross_gain, lowlatency_callback);
|
|
MENUITEM_SETTING(crossfeed_hf_attenuation,
|
|
&global_settings.crossfeed_hf_attenuation, lowlatency_callback);
|
|
MENUITEM_SETTING(crossfeed_hf_cutoff,
|
|
&global_settings.crossfeed_hf_cutoff, lowlatency_callback);
|
|
MAKE_MENU(crossfeed_menu,ID2P(LANG_CROSSFEED), NULL, Icon_NOICON,
|
|
&crossfeed, &crossfeed_direct_gain, &crossfeed_cross_gain,
|
|
&crossfeed_hf_attenuation, &crossfeed_hf_cutoff);
|
|
|
|
#ifdef HAVE_PITCHCONTROL
|
|
static int timestretch_callback(int action,const struct menu_item_ex *this_item)
|
|
{
|
|
switch (action)
|
|
{
|
|
case ACTION_EXIT_MENUITEM: /* on exit */
|
|
if (global_settings.timestretch_enabled && !dsp_timestretch_available())
|
|
splash(HZ*2, ID2P(LANG_PLEASE_REBOOT));
|
|
break;
|
|
}
|
|
lowlatency_callback(action, this_item);
|
|
return action;
|
|
}
|
|
MENUITEM_SETTING(timestretch_enabled,
|
|
&global_settings.timestretch_enabled, timestretch_callback);
|
|
#endif
|
|
|
|
MENUITEM_SETTING(dithering_enabled,
|
|
&global_settings.dithering_enabled, lowlatency_callback);
|
|
MENUITEM_SETTING(afr_enabled,
|
|
&global_settings.afr_enabled, lowlatency_callback);
|
|
MENUITEM_SETTING(pbe,
|
|
&global_settings.pbe, lowlatency_callback);
|
|
MENUITEM_SETTING(pbe_precut,
|
|
&global_settings.pbe_precut, lowlatency_callback);
|
|
MAKE_MENU(pbe_menu,ID2P(LANG_PBE), NULL, Icon_NOICON,
|
|
&pbe,&pbe_precut);
|
|
MENUITEM_SETTING(surround_enabled,
|
|
&global_settings.surround_enabled, lowlatency_callback);
|
|
MENUITEM_SETTING(surround_balance,
|
|
&global_settings.surround_balance, lowlatency_callback);
|
|
MENUITEM_SETTING(surround_fx1,
|
|
&global_settings.surround_fx1, lowlatency_callback);
|
|
MENUITEM_SETTING(surround_fx2,
|
|
&global_settings.surround_fx2, lowlatency_callback);
|
|
MENUITEM_SETTING(surround_method2,
|
|
&global_settings.surround_method2, lowlatency_callback);
|
|
MENUITEM_SETTING(surround_mix,
|
|
&global_settings.surround_mix, lowlatency_callback);
|
|
MAKE_MENU(surround_menu,ID2P(LANG_SURROUND), NULL, Icon_NOICON,
|
|
&surround_enabled,&surround_balance,&surround_fx1,&surround_fx2,&surround_method2,&surround_mix);
|
|
|
|
/* compressor submenu */
|
|
MENUITEM_SETTING(compressor_threshold,
|
|
&global_settings.compressor_settings.threshold,
|
|
lowlatency_callback);
|
|
MENUITEM_SETTING(compressor_gain,
|
|
&global_settings.compressor_settings.makeup_gain,
|
|
lowlatency_callback);
|
|
MENUITEM_SETTING(compressor_ratio,
|
|
&global_settings.compressor_settings.ratio,
|
|
lowlatency_callback);
|
|
MENUITEM_SETTING(compressor_knee,
|
|
&global_settings.compressor_settings.knee,
|
|
lowlatency_callback);
|
|
MENUITEM_SETTING(compressor_attack,
|
|
&global_settings.compressor_settings.attack_time,
|
|
lowlatency_callback);
|
|
MENUITEM_SETTING(compressor_release,
|
|
&global_settings.compressor_settings.release_time,
|
|
lowlatency_callback);
|
|
MAKE_MENU(compressor_menu,ID2P(LANG_COMPRESSOR), NULL, Icon_NOICON,
|
|
&compressor_threshold, &compressor_gain, &compressor_ratio,
|
|
&compressor_knee, &compressor_attack, &compressor_release);
|
|
#endif
|
|
|
|
#if (CONFIG_CODEC == MAS3587F) || (CONFIG_CODEC == MAS3539F)
|
|
MENUITEM_SETTING(loudness, &global_settings.loudness, NULL);
|
|
MENUITEM_SETTING(avc, &global_settings.avc, NULL);
|
|
MENUITEM_SETTING(superbass, &global_settings.superbass, NULL);
|
|
MENUITEM_SETTING(mdb_enable, &global_settings.mdb_enable, NULL);
|
|
MENUITEM_SETTING(mdb_strength, &global_settings.mdb_strength, NULL);
|
|
MENUITEM_SETTING(mdb_harmonics, &global_settings.mdb_harmonics, NULL);
|
|
MENUITEM_SETTING(mdb_center, &global_settings.mdb_center, NULL);
|
|
MENUITEM_SETTING(mdb_shape, &global_settings.mdb_shape, NULL);
|
|
#endif
|
|
|
|
#ifdef HAVE_SPEAKER
|
|
MENUITEM_SETTING(speaker_mode, &global_settings.speaker_mode, NULL);
|
|
#endif
|
|
|
|
#ifdef AUDIOHW_HAVE_EQ
|
|
#endif /* AUDIOHW_HAVE_EQ */
|
|
|
|
MAKE_MENU(sound_settings, ID2P(LANG_SOUND_SETTINGS), NULL, Icon_Audio,
|
|
&volume
|
|
,&volume_limit
|
|
#ifdef AUDIOHW_HAVE_BASS
|
|
,&bass
|
|
#endif
|
|
#ifdef AUDIOHW_HAVE_BASS_CUTOFF
|
|
,&bass_cutoff
|
|
#endif
|
|
#ifdef AUDIOHW_HAVE_TREBLE
|
|
,&treble
|
|
#endif
|
|
#ifdef AUDIOHW_HAVE_TREBLE_CUTOFF
|
|
,&treble_cutoff
|
|
#endif
|
|
#ifdef AUDIOHW_HAVE_EQ
|
|
,&audiohw_eq_tone_controls
|
|
#endif
|
|
,&balance,&channel_config,&stereo_width
|
|
#ifdef AUDIOHW_HAVE_DEPTH_3D
|
|
,&depth_3d
|
|
#endif
|
|
#ifdef AUDIOHW_HAVE_FILTER_ROLL_OFF
|
|
,&roll_off
|
|
#endif
|
|
#if CONFIG_CODEC == SWCODEC
|
|
,&crossfeed_menu, &equalizer_menu, &dithering_enabled
|
|
,&surround_menu, &pbe_menu, &afr_enabled
|
|
#ifdef HAVE_PITCHCONTROL
|
|
,×tretch_enabled
|
|
#endif
|
|
,&compressor_menu
|
|
#endif
|
|
#if (CONFIG_CODEC == MAS3587F) || (CONFIG_CODEC == MAS3539F)
|
|
,&loudness,&avc,&superbass,&mdb_enable,&mdb_strength
|
|
,&mdb_harmonics,&mdb_center,&mdb_shape
|
|
#endif
|
|
#ifdef HAVE_SPEAKER
|
|
,&speaker_mode
|
|
#endif
|
|
);
|
|
|