mirror of
https://github.com/tuxbox-neutrino/neutrino.git
synced 2025-08-28 16:01:20 +02:00
290 lines
10 KiB
C++
290 lines
10 KiB
C++
/*
|
|
$port: audio_setup.cpp,v 1.6 2010/12/06 21:00:15 tuxbox-cvs Exp $
|
|
|
|
audio setup implementation - Neutrino-GUI
|
|
|
|
Copyright (C) 2001 Steffen Hehn 'McClean'
|
|
and some other guys
|
|
Homepage: http://dbox.cyberphoria.org/
|
|
|
|
Copyright (C) 2009 T. Graf 'dbt'
|
|
Homepage: http://www.dbox2-tuning.net/
|
|
|
|
License: GPL
|
|
|
|
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 program is distributed in the hope that it will be useful,
|
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
GNU General Public License for more details.
|
|
|
|
You should have received a copy of the GNU General Public License
|
|
along with this program; if not, write to the Free Software
|
|
Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
|
|
|
|
*/
|
|
|
|
#ifdef HAVE_CONFIG_H
|
|
#include <config.h>
|
|
#endif
|
|
|
|
|
|
#include "audio_setup.h"
|
|
|
|
#include <global.h>
|
|
#include <neutrino.h>
|
|
#include <mymenu.h>
|
|
|
|
#include <gui/widget/icons.h>
|
|
#include <gui/widget/stringinput.h>
|
|
|
|
#include <driver/screen_max.h>
|
|
|
|
#include <audio.h>
|
|
#include <zapit/zapit.h>
|
|
|
|
#include <system/debug.h>
|
|
|
|
extern CAudioSetupNotifier * audioSetupNotifier;
|
|
extern cAudio *audioDecoder;
|
|
|
|
CAudioSetup::CAudioSetup(int wizard_mode)
|
|
{
|
|
is_wizard = wizard_mode;
|
|
|
|
width = 40;
|
|
selected = -1;
|
|
}
|
|
|
|
CAudioSetup::~CAudioSetup()
|
|
{
|
|
|
|
}
|
|
|
|
int CAudioSetup::exec(CMenuTarget* parent, const std::string &actionKey)
|
|
{
|
|
if (actionKey == "clear_vol_map") {
|
|
CZapit::getInstance()->ClearVolumeMap();
|
|
CZapit::getInstance()->SetVolumePercent(g_settings.audio_volume_percent_ac3, g_settings.audio_volume_percent_pcm);
|
|
return menu_return::RETURN_NONE;
|
|
}
|
|
|
|
dprintf(DEBUG_DEBUG, "init audio setup\n");
|
|
int res = menu_return::RETURN_REPAINT;
|
|
|
|
if (parent)
|
|
{
|
|
parent->hide();
|
|
}
|
|
|
|
res = showAudioSetup();
|
|
|
|
return res;
|
|
}
|
|
|
|
#define AUDIOMENU_ANALOGOUT_OPTION_COUNT 3
|
|
const CMenuOptionChooser::keyval AUDIOMENU_ANALOGOUT_OPTIONS[AUDIOMENU_ANALOGOUT_OPTION_COUNT] =
|
|
{
|
|
{ 0, LOCALE_AUDIOMENU_STEREO },
|
|
{ 1, LOCALE_AUDIOMENU_MONOLEFT },
|
|
{ 2, LOCALE_AUDIOMENU_MONORIGHT }
|
|
};
|
|
#if HAVE_COOL_HARDWARE
|
|
#ifdef BOXMODEL_CS_HD2
|
|
#define AUDIOMENU_SRS_OPTION_COUNT 3
|
|
#else
|
|
#define AUDIOMENU_SRS_OPTION_COUNT 2
|
|
#endif
|
|
const CMenuOptionChooser::keyval AUDIOMENU_SRS_OPTIONS[AUDIOMENU_SRS_OPTION_COUNT] =
|
|
{
|
|
{ 0 , LOCALE_AUDIO_SRS_ALGO_LIGHT },
|
|
{ 1 , LOCALE_AUDIO_SRS_ALGO_NORMAL },
|
|
#ifdef BOXMODEL_CS_HD2
|
|
{ 2 , LOCALE_AUDIO_SRS_ALGO_HEAVY }
|
|
#endif
|
|
};
|
|
#endif
|
|
|
|
#define AUDIOMENU_AVSYNC_OPTION_COUNT 3
|
|
const CMenuOptionChooser::keyval AUDIOMENU_AVSYNC_OPTIONS[AUDIOMENU_AVSYNC_OPTION_COUNT] =
|
|
{
|
|
{ 0, LOCALE_OPTIONS_OFF },
|
|
{ 1, LOCALE_OPTIONS_ON },
|
|
{ 2, LOCALE_AUDIOMENU_AVSYNC_AM }
|
|
};
|
|
|
|
#ifdef HAVE_SPARK_HARDWARE
|
|
#define AUDIOMENU_HDMI_DD_OPTION_COUNT 2
|
|
#else
|
|
#define AUDIOMENU_HDMI_DD_OPTION_COUNT 3
|
|
#endif
|
|
const CMenuOptionChooser::keyval AUDIOMENU_HDMI_DD_OPTIONS[AUDIOMENU_HDMI_DD_OPTION_COUNT] =
|
|
{
|
|
{ HDMI_ENCODED_OFF, LOCALE_OPTIONS_OFF },
|
|
#ifndef HAVE_SPARK_HARDWARE
|
|
{ HDMI_ENCODED_AUTO, LOCALE_AUDIOMENU_HDMI_DD_AUTO },
|
|
#endif
|
|
{ HDMI_ENCODED_FORCED, LOCALE_AUDIOMENU_HDMI_DD_FORCE }
|
|
};
|
|
|
|
// #define AUDIOMENU_CLOCKREC_OPTION_COUNT 2
|
|
// const CMenuOptionChooser::keyval AUDIOMENU_CLOCKREC_OPTIONS[AUDIOMENU_CLOCKREC_OPTION_COUNT] =
|
|
// {
|
|
// { 0, LOCALE_OPTIONS_OFF },
|
|
// { 1, LOCALE_OPTIONS_ON },
|
|
// };
|
|
|
|
/* audio settings menu */
|
|
int CAudioSetup::showAudioSetup()
|
|
{
|
|
//menue init
|
|
CMenuWidget* audioSettings = new CMenuWidget(LOCALE_MAINSETTINGS_HEAD, NEUTRINO_ICON_SETTINGS, width);
|
|
audioSettings->setSelected(selected);
|
|
audioSettings->setWizardMode(is_wizard);
|
|
|
|
//analog modes (stereo, mono l/r...)
|
|
CMenuOptionChooser * as_oj_analogmode = new CMenuOptionChooser(LOCALE_AUDIOMENU_ANALOG_MODE, &g_settings.audio_AnalogMode, AUDIOMENU_ANALOGOUT_OPTIONS, AUDIOMENU_ANALOGOUT_OPTION_COUNT, true, audioSetupNotifier);
|
|
as_oj_analogmode->setHint("", LOCALE_MENU_HINT_AUDIO_ANALOG_MODE);
|
|
|
|
//dd subchannel auto on/off
|
|
CMenuOptionChooser * as_oj_ddsubchn = new CMenuOptionChooser(LOCALE_AUDIOMENU_DOLBYDIGITAL, &g_settings.audio_DolbyDigital, OPTIONS_OFF0_ON1_OPTIONS, OPTIONS_OFF0_ON1_OPTION_COUNT, true, audioSetupNotifier);
|
|
as_oj_ddsubchn->setHint("", LOCALE_MENU_HINT_AUDIO_DD);
|
|
|
|
//dd via hdmi
|
|
CMenuOptionChooser *as_oj_dd_hdmi = NULL;
|
|
if (g_info.hw_caps->has_HDMI) {
|
|
as_oj_dd_hdmi = new CMenuOptionChooser(LOCALE_AUDIOMENU_HDMI_DD, &g_settings.hdmi_dd, AUDIOMENU_HDMI_DD_OPTIONS, AUDIOMENU_HDMI_DD_OPTION_COUNT, true, audioSetupNotifier);
|
|
as_oj_dd_hdmi->setHint("", LOCALE_MENU_HINT_AUDIO_HDMI_DD);
|
|
}
|
|
|
|
//dd via spdif
|
|
CMenuOptionChooser * as_oj_dd_spdif = new CMenuOptionChooser(LOCALE_AUDIOMENU_SPDIF_DD, &g_settings.spdif_dd, OPTIONS_OFF0_ON1_OPTIONS, OPTIONS_OFF0_ON1_OPTION_COUNT, true, audioSetupNotifier);
|
|
as_oj_dd_spdif->setHint("", LOCALE_MENU_HINT_AUDIO_SPDIF_DD);
|
|
|
|
CMenuOptionChooser * as_oj_avsync = NULL;
|
|
CMenuOptionNumberChooser * as_oj_vsteps = NULL;
|
|
CMenuOptionNumberChooser * st = NULL;
|
|
|
|
//av synch
|
|
as_oj_avsync = new CMenuOptionChooser(LOCALE_AUDIOMENU_AVSYNC, &g_settings.avsync, AUDIOMENU_AVSYNC_OPTIONS, AUDIOMENU_AVSYNC_OPTION_COUNT, true, audioSetupNotifier);
|
|
as_oj_avsync->setHint("", LOCALE_MENU_HINT_AUDIO_AVSYNC);
|
|
|
|
//volume steps
|
|
as_oj_vsteps = new CMenuOptionNumberChooser(LOCALE_AUDIOMENU_VOLUME_STEP, (int *)&g_settings.current_volume_step, true, 1, 25, NULL);
|
|
as_oj_vsteps->setHint("", LOCALE_MENU_HINT_AUDIO_VOLSTEP);
|
|
|
|
//volume after start
|
|
st = new CMenuOptionNumberChooser(LOCALE_AUDIOMENU_VOLUME_START, &g_settings.start_volume, true, -1, 100, NULL, CRCInput::RC_nokey, NULL, 0, -1, LOCALE_AUDIOMENU_VOLUME_LAST_USED);
|
|
st->setHint("", LOCALE_MENU_HINT_AUDIO_VOLSTART);
|
|
//clock rec
|
|
//CMenuOptionChooser * as_oj_clockrec new CMenuOptionChooser(LOCALE_AUDIOMENU_CLOCKREC, &g_settings.clockrec, AUDIOMENU_CLOCKREC_OPTIONS, AUDIOMENU_CLOCKREC_OPTION_COUNT, true, audioSetupNotifier);
|
|
|
|
#if HAVE_COOL_HARDWARE
|
|
/* only coolstream has SRS stuff, so only compile it there */
|
|
//SRS
|
|
//SRS algo
|
|
CMenuOptionChooser * as_oj_algo = new CMenuOptionChooser(LOCALE_AUDIO_SRS_ALGO, &g_settings.srs_algo, AUDIOMENU_SRS_OPTIONS, AUDIOMENU_SRS_OPTION_COUNT, g_settings.srs_enable, audioSetupNotifier);
|
|
as_oj_algo->setHint("", LOCALE_MENU_HINT_AUDIO_SRS_ALGO);
|
|
|
|
//SRS noise manage
|
|
CMenuOptionChooser * as_oj_noise = new CMenuOptionChooser(LOCALE_AUDIO_SRS_NMGR, &g_settings.srs_nmgr_enable, OPTIONS_OFF0_ON1_OPTIONS, OPTIONS_OFF0_ON1_OPTION_COUNT, g_settings.srs_enable, audioSetupNotifier);
|
|
as_oj_noise->setHint("", LOCALE_MENU_HINT_AUDIO_SRS_NMGR);
|
|
|
|
//SRS reverence volume
|
|
CMenuOptionNumberChooser * as_oj_volrev = new CMenuOptionNumberChooser(LOCALE_AUDIO_SRS_VOLUME, &g_settings.srs_ref_volume, g_settings.srs_enable, 1, 100, audioSetupNotifier);
|
|
as_oj_volrev->setHint("", LOCALE_MENU_HINT_AUDIO_SRS_VOLUME);
|
|
|
|
//SRS on/off
|
|
CTruVolumeNotifier truevolSetupNotifier(as_oj_algo, as_oj_noise, as_oj_volrev);
|
|
CMenuOptionChooser * as_oj_srsonoff = new CMenuOptionChooser(LOCALE_AUDIO_SRS_IQ, &g_settings.srs_enable, OPTIONS_OFF0_ON1_OPTIONS, OPTIONS_OFF0_ON1_OPTION_COUNT, true, &truevolSetupNotifier);
|
|
as_oj_srsonoff->setHint("", LOCALE_MENU_HINT_AUDIO_SRS);
|
|
#endif
|
|
|
|
// ac3,pcm and clear volume adjustment
|
|
CMenuOptionNumberChooser *adj_ac3 = NULL, *adj_pcm = NULL;
|
|
CMenuForwarder *adj_clear = NULL;
|
|
|
|
adj_ac3 = new CMenuOptionNumberChooser(LOCALE_AUDIOMENU_VOLUME_ADJUSTMENT_AC3,
|
|
(int *)&g_settings.audio_volume_percent_ac3, true, 0, 100, audioSetupNotifier);
|
|
adj_ac3->setNumberFormat("%d%%");
|
|
adj_ac3->setHint("", LOCALE_MENU_HINT_AUDIO_ADJUST_VOL_AC3);
|
|
|
|
adj_pcm = new CMenuOptionNumberChooser(LOCALE_AUDIOMENU_VOLUME_ADJUSTMENT_PCM,
|
|
(int *)&g_settings.audio_volume_percent_pcm, true, 0, 100, audioSetupNotifier);
|
|
adj_pcm->setNumberFormat("%d%%");
|
|
adj_pcm->setHint("", LOCALE_MENU_HINT_AUDIO_ADJUST_VOL_PCM);
|
|
|
|
adj_clear = new CMenuForwarder(LOCALE_AUDIOMENU_VOLUME_ADJUSTMENT_CLEAR, true, NULL, this, "clear_vol_map");
|
|
adj_clear->setHint("", LOCALE_MENU_HINT_AUDIO_ADJUST_VOL_CLEAR);
|
|
|
|
//paint items
|
|
audioSettings->addIntroItems(LOCALE_MAINSETTINGS_AUDIO);
|
|
//---------------------------------------------------------
|
|
audioSettings->addItem(as_oj_analogmode);
|
|
audioSettings->addItem(GenericMenuSeparatorLine);
|
|
//---------------------------------------------------------
|
|
if (g_info.hw_caps->has_HDMI)
|
|
audioSettings->addItem(as_oj_dd_hdmi);
|
|
audioSettings->addItem(as_oj_dd_spdif);
|
|
audioSettings->addItem(as_oj_ddsubchn);
|
|
//---------------------------------------------------------
|
|
audioSettings->addItem(GenericMenuSeparatorLine);
|
|
audioSettings->addItem(as_oj_avsync);
|
|
audioSettings->addItem(as_oj_vsteps);
|
|
audioSettings->addItem(st);
|
|
//audioSettings->addItem(as_clockrec);
|
|
//---------------------------------------------------------
|
|
#if HAVE_COOL_HARDWARE
|
|
/* only coolstream has SRS stuff, so only compile it there */
|
|
audioSettings->addItem(GenericMenuSeparatorLine);
|
|
audioSettings->addItem(as_oj_srsonoff);
|
|
audioSettings->addItem(as_oj_algo);
|
|
#ifndef BOXMODEL_CS_HD2
|
|
audioSettings->addItem(as_oj_noise);
|
|
#endif
|
|
audioSettings->addItem(as_oj_volrev);
|
|
#endif
|
|
#if 0
|
|
audioSettings->addItem(mf);
|
|
#endif
|
|
audioSettings->addItem(new CMenuSeparator(CMenuSeparator::LINE | CMenuSeparator::STRING, LOCALE_AUDIOMENU_VOLUME_ADJUSTMENT));
|
|
audioSettings->addItem(adj_ac3);
|
|
audioSettings->addItem(adj_pcm);
|
|
audioSettings->addItem(adj_clear);
|
|
|
|
int res = audioSettings->exec(NULL, "");
|
|
selected = audioSettings->getSelected();
|
|
delete audioSettings;
|
|
#ifdef BOXMODEL_CS_HD2
|
|
delete as_oj_noise;
|
|
#endif
|
|
CZapit::getInstance()->SetVolumePercent(g_settings.audio_volume_percent_ac3, g_settings.audio_volume_percent_pcm);
|
|
|
|
return res;
|
|
}
|
|
|
|
CTruVolumeNotifier::CTruVolumeNotifier(CMenuOptionChooser* o1, CMenuOptionChooser* o2, CMenuOptionNumberChooser *n1)
|
|
{
|
|
toDisable_oj[0]=o1;
|
|
toDisable_oj[1]=o2;
|
|
toDisable_nj=n1;
|
|
}
|
|
|
|
bool CTruVolumeNotifier::changeNotify(const neutrino_locale_t, void * data)
|
|
{
|
|
int active = (*(int *)data);
|
|
|
|
for (int i = 0; i < 2; i++)
|
|
toDisable_oj[i]->setActive(active);
|
|
|
|
toDisable_nj->setActive(active);
|
|
|
|
audioDecoder->SetSRS(g_settings.srs_enable, g_settings.srs_nmgr_enable, g_settings.srs_algo, g_settings.srs_ref_volume);
|
|
|
|
return false;
|
|
}
|