2007-02-12 14:22:35 +00:00
|
|
|
/***************************************************************************
|
|
|
|
* __________ __ ___.
|
|
|
|
* Open \______ \ ____ ____ | | _\_ |__ _______ ___
|
|
|
|
* Source | _// _ \_/ ___\| |/ /| __ \ / _ \ \/ /
|
|
|
|
* Jukebox | | ( <_> ) \___| < | \_\ ( <_> > < <
|
|
|
|
* Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \
|
|
|
|
* \/ \/ \/ \/ \/
|
2007-02-13 00:32:17 +00:00
|
|
|
* $Id$
|
2007-02-12 14:22:35 +00:00
|
|
|
*
|
|
|
|
* Copyright (C) 2007 Jonathan Gordon
|
|
|
|
*
|
2008-06-28 18:10:04 +00:00
|
|
|
* 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.
|
2007-02-12 14:22:35 +00:00
|
|
|
*
|
|
|
|
* 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 "lang.h"
|
|
|
|
#include "action.h"
|
|
|
|
#include "splash.h"
|
|
|
|
#include "settings.h"
|
|
|
|
#include "menu.h"
|
|
|
|
#include "sound_menu.h"
|
|
|
|
#include "kernel.h"
|
|
|
|
#include "playlist.h"
|
|
|
|
#include "dsp.h"
|
|
|
|
#include "scrobbler.h"
|
|
|
|
#include "audio.h"
|
2008-07-14 20:39:30 +00:00
|
|
|
#include "cuesheet.h"
|
|
|
|
#if CONFIG_CODEC == SWCODEC
|
|
|
|
#include "playback.h"
|
|
|
|
#endif
|
2008-03-28 11:24:24 +00:00
|
|
|
|
2007-02-12 14:22:35 +00:00
|
|
|
|
2009-11-10 03:46:08 +00:00
|
|
|
#if (CONFIG_CODEC == SWCODEC) && defined(HAVE_CROSSFADE)
|
2008-04-19 23:29:39 +00:00
|
|
|
static int setcrossfadeonexit_callback(int action,const struct menu_item_ex *this_item)
|
2007-02-12 14:22:35 +00:00
|
|
|
{
|
|
|
|
(void)this_item;
|
|
|
|
switch (action)
|
|
|
|
{
|
|
|
|
case ACTION_EXIT_MENUITEM: /* on exit */
|
|
|
|
audio_set_crossfade(global_settings.crossfade);
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
return action;
|
|
|
|
}
|
|
|
|
|
|
|
|
#endif /* CONFIG_CODEC == SWCODEC */
|
|
|
|
|
|
|
|
/***********************************/
|
|
|
|
/* PLAYBACK MENU */
|
2008-04-19 23:29:39 +00:00
|
|
|
static int playback_callback(int action,const struct menu_item_ex *this_item);
|
2007-02-12 14:22:35 +00:00
|
|
|
|
|
|
|
MENUITEM_SETTING(shuffle_item, &global_settings.playlist_shuffle, playback_callback);
|
|
|
|
MENUITEM_SETTING(repeat_mode, &global_settings.repeat_mode, playback_callback);
|
|
|
|
MENUITEM_SETTING(play_selected, &global_settings.play_selected, NULL);
|
|
|
|
|
|
|
|
MENUITEM_SETTING(ff_rewind_accel, &global_settings.ff_rewind_accel, NULL);
|
|
|
|
MENUITEM_SETTING(ff_rewind_min_step, &global_settings.ff_rewind_min_step, NULL);
|
2007-03-03 13:52:14 +00:00
|
|
|
MAKE_MENU(ff_rewind_settings_menu, ID2P(LANG_WIND_MENU), 0, Icon_NOICON,
|
2007-02-12 14:22:35 +00:00
|
|
|
&ff_rewind_min_step, &ff_rewind_accel);
|
2008-10-07 19:37:33 +00:00
|
|
|
#ifdef HAVE_DISK_STORAGE
|
2007-02-12 14:22:35 +00:00
|
|
|
#if CONFIG_CODEC == SWCODEC
|
2008-04-19 23:29:39 +00:00
|
|
|
static int buffermargin_callback(int action,const struct menu_item_ex *this_item)
|
2007-02-12 14:22:35 +00:00
|
|
|
{
|
|
|
|
(void)this_item;
|
|
|
|
switch (action)
|
|
|
|
{
|
|
|
|
case ACTION_EXIT_MENUITEM: /* on exit */
|
|
|
|
audio_set_buffer_margin(global_settings.buffer_margin);
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
return action;
|
|
|
|
}
|
|
|
|
#else
|
|
|
|
# define buffermargin_callback NULL
|
|
|
|
#endif
|
|
|
|
MENUITEM_SETTING(buffer_margin, &global_settings.buffer_margin,
|
|
|
|
buffermargin_callback);
|
2008-10-07 19:37:33 +00:00
|
|
|
#endif /*HAVE_DISK_STORAGE */
|
2007-02-12 14:22:35 +00:00
|
|
|
MENUITEM_SETTING(fade_on_stop, &global_settings.fade_on_stop, NULL);
|
|
|
|
MENUITEM_SETTING(party_mode, &global_settings.party_mode, NULL);
|
|
|
|
|
|
|
|
#if CONFIG_CODEC == SWCODEC
|
2009-11-10 03:46:08 +00:00
|
|
|
#ifdef HAVE_CROSSFADE
|
2007-02-12 14:22:35 +00:00
|
|
|
/* crossfade submenu */
|
|
|
|
MENUITEM_SETTING(crossfade, &global_settings.crossfade, setcrossfadeonexit_callback);
|
|
|
|
MENUITEM_SETTING(crossfade_fade_in_delay,
|
2009-11-10 03:46:08 +00:00
|
|
|
&global_settings.crossfade_fade_in_delay, NULL);
|
2007-02-12 14:22:35 +00:00
|
|
|
MENUITEM_SETTING(crossfade_fade_in_duration,
|
2009-11-10 03:46:08 +00:00
|
|
|
&global_settings.crossfade_fade_in_duration, NULL);
|
2007-02-12 14:22:35 +00:00
|
|
|
MENUITEM_SETTING(crossfade_fade_out_delay,
|
|
|
|
&global_settings.crossfade_fade_out_delay, setcrossfadeonexit_callback);
|
|
|
|
MENUITEM_SETTING(crossfade_fade_out_duration,
|
|
|
|
&global_settings.crossfade_fade_out_duration, setcrossfadeonexit_callback);
|
|
|
|
MENUITEM_SETTING(crossfade_fade_out_mixmode,
|
|
|
|
&global_settings.crossfade_fade_out_mixmode,NULL);
|
2007-03-03 13:52:14 +00:00
|
|
|
MAKE_MENU(crossfade_settings_menu,ID2P(LANG_CROSSFADE),0, Icon_NOICON,
|
2007-02-12 14:22:35 +00:00
|
|
|
&crossfade, &crossfade_fade_in_delay, &crossfade_fade_in_duration,
|
|
|
|
&crossfade_fade_out_delay, &crossfade_fade_out_duration,
|
|
|
|
&crossfade_fade_out_mixmode);
|
2009-08-11 01:09:05 +00:00
|
|
|
#endif
|
2007-02-12 14:22:35 +00:00
|
|
|
|
|
|
|
/* replay gain submenu */
|
|
|
|
|
2008-04-19 23:29:39 +00:00
|
|
|
static int replaygain_callback(int action,const struct menu_item_ex *this_item)
|
2007-02-12 14:22:35 +00:00
|
|
|
{
|
|
|
|
(void)this_item;
|
|
|
|
switch (action)
|
|
|
|
{
|
2007-03-01 11:14:46 +00:00
|
|
|
case ACTION_EXIT_MENUITEM: /* on exit */
|
2007-02-24 17:06:36 +00:00
|
|
|
dsp_set_replaygain();
|
2007-02-12 14:22:35 +00:00
|
|
|
break;
|
|
|
|
}
|
|
|
|
return action;
|
|
|
|
}
|
|
|
|
MENUITEM_SETTING(replaygain_noclip, &global_settings.replaygain_noclip ,replaygain_callback);
|
|
|
|
MENUITEM_SETTING(replaygain_type, &global_settings.replaygain_type ,replaygain_callback);
|
|
|
|
MENUITEM_SETTING(replaygain_preamp, &global_settings.replaygain_preamp ,replaygain_callback);
|
2007-03-03 13:52:14 +00:00
|
|
|
MAKE_MENU(replaygain_settings_menu,ID2P(LANG_REPLAYGAIN),0, Icon_NOICON,
|
2009-06-20 21:13:24 +00:00
|
|
|
&replaygain_type, &replaygain_noclip, &replaygain_preamp);
|
2007-02-12 14:22:35 +00:00
|
|
|
|
|
|
|
MENUITEM_SETTING(beep, &global_settings.beep ,NULL);
|
|
|
|
#endif /* CONFIG_CODEC == SWCODEC */
|
|
|
|
|
|
|
|
#ifdef HAVE_SPDIF_POWER
|
|
|
|
MENUITEM_SETTING(spdif_enable, &global_settings.spdif_enable, NULL);
|
|
|
|
#endif
|
|
|
|
MENUITEM_SETTING(next_folder, &global_settings.next_folder, NULL);
|
2008-04-19 23:29:39 +00:00
|
|
|
static int audioscrobbler_callback(int action,const struct menu_item_ex *this_item)
|
2007-02-12 14:22:35 +00:00
|
|
|
{
|
|
|
|
(void)this_item;
|
|
|
|
switch (action)
|
|
|
|
{
|
|
|
|
case ACTION_EXIT_MENUITEM: /* on exit */
|
|
|
|
if (!scrobbler_is_enabled() && global_settings.audioscrobbler)
|
2011-08-30 14:01:45 +00:00
|
|
|
scrobbler_init();
|
2007-02-12 14:22:35 +00:00
|
|
|
|
|
|
|
if(scrobbler_is_enabled() && !global_settings.audioscrobbler)
|
|
|
|
scrobbler_shutdown();
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
return action;
|
|
|
|
}
|
|
|
|
MENUITEM_SETTING(audioscrobbler, &global_settings.audioscrobbler, audioscrobbler_callback);
|
|
|
|
|
2007-02-14 14:40:24 +00:00
|
|
|
|
2008-04-19 23:29:39 +00:00
|
|
|
static int cuesheet_callback(int action,const struct menu_item_ex *this_item)
|
2007-02-14 14:40:24 +00:00
|
|
|
{
|
|
|
|
(void)this_item;
|
|
|
|
switch (action)
|
|
|
|
{
|
|
|
|
case ACTION_EXIT_MENUITEM: /* on exit */
|
2011-04-27 03:08:23 +00:00
|
|
|
#if CONFIG_CODEC == SWCODEC
|
|
|
|
audio_set_cuesheet(global_settings.cuesheet);
|
|
|
|
#else
|
2009-07-20 05:18:18 +00:00
|
|
|
if (global_settings.cuesheet)
|
2008-08-15 08:27:39 +00:00
|
|
|
splash(HZ*2, ID2P(LANG_PLEASE_REBOOT));
|
2007-02-14 14:40:24 +00:00
|
|
|
break;
|
2011-04-27 03:08:23 +00:00
|
|
|
#endif
|
2007-02-14 14:40:24 +00:00
|
|
|
}
|
|
|
|
return action;
|
|
|
|
}
|
|
|
|
MENUITEM_SETTING(cuesheet, &global_settings.cuesheet, cuesheet_callback);
|
|
|
|
|
2007-02-12 14:22:35 +00:00
|
|
|
#ifdef HAVE_HEADPHONE_DETECTION
|
|
|
|
MENUITEM_SETTING(unplug_mode, &global_settings.unplug_mode, NULL);
|
|
|
|
MENUITEM_SETTING(unplug_autoresume, &global_settings.unplug_autoresume, NULL);
|
2007-08-05 19:19:39 +00:00
|
|
|
MAKE_MENU(unplug_menu, ID2P(LANG_HEADPHONE_UNPLUG), 0, Icon_NOICON,
|
2011-05-13 22:28:47 +00:00
|
|
|
&unplug_mode, &unplug_autoresume);
|
2007-02-12 14:22:35 +00:00
|
|
|
#endif
|
|
|
|
|
2008-07-14 20:39:30 +00:00
|
|
|
MENUITEM_SETTING(skip_length, &global_settings.skip_length, NULL);
|
2009-03-27 13:53:29 +00:00
|
|
|
MENUITEM_SETTING(prevent_skip, &global_settings.prevent_skip, NULL);
|
2010-04-24 14:19:04 +00:00
|
|
|
#if CONFIG_CODEC == SWCODEC
|
2010-04-24 14:10:28 +00:00
|
|
|
MENUITEM_SETTING(resume_rewind, &global_settings.resume_rewind, NULL);
|
2010-04-24 14:19:04 +00:00
|
|
|
#endif
|
2011-05-13 22:28:47 +00:00
|
|
|
MENUITEM_SETTING(pause_rewind, &global_settings.pause_rewind, NULL);
|
2008-05-04 13:47:58 +00:00
|
|
|
|
2008-05-22 08:02:48 +00:00
|
|
|
MAKE_MENU(playback_settings,ID2P(LANG_PLAYBACK),0,
|
2007-03-03 13:52:14 +00:00
|
|
|
Icon_Playback_menu,
|
2007-03-01 11:14:46 +00:00
|
|
|
&shuffle_item, &repeat_mode, &play_selected,
|
2007-08-01 08:50:44 +00:00
|
|
|
&ff_rewind_settings_menu,
|
2008-10-07 19:37:33 +00:00
|
|
|
#ifdef HAVE_DISK_STORAGE
|
2007-08-01 08:50:44 +00:00
|
|
|
&buffer_margin,
|
|
|
|
#endif
|
|
|
|
&fade_on_stop, &party_mode,
|
2007-02-12 14:22:35 +00:00
|
|
|
|
2009-11-10 03:46:08 +00:00
|
|
|
#if (CONFIG_CODEC == SWCODEC) && defined(HAVE_CROSSFADE)
|
2009-08-11 02:18:22 +00:00
|
|
|
&crossfade_settings_menu,
|
|
|
|
#endif
|
|
|
|
|
|
|
|
#if CONFIG_CODEC == SWCODEC
|
|
|
|
&replaygain_settings_menu, &beep,
|
2007-02-12 14:22:35 +00:00
|
|
|
#endif
|
|
|
|
|
|
|
|
#ifdef HAVE_SPDIF_POWER
|
|
|
|
&spdif_enable,
|
|
|
|
#endif
|
2007-09-19 10:40:55 +00:00
|
|
|
&next_folder, &audioscrobbler, &cuesheet
|
2007-02-12 14:22:35 +00:00
|
|
|
#ifdef HAVE_HEADPHONE_DETECTION
|
|
|
|
,&unplug_menu
|
|
|
|
#endif
|
2009-03-27 13:53:29 +00:00
|
|
|
,&skip_length, &prevent_skip,
|
2010-04-24 14:10:28 +00:00
|
|
|
|
|
|
|
#if CONFIG_CODEC == SWCODEC
|
|
|
|
&resume_rewind,
|
|
|
|
#endif
|
2011-05-13 22:28:47 +00:00
|
|
|
&pause_rewind,
|
2007-02-12 14:22:35 +00:00
|
|
|
);
|
2007-02-17 14:39:02 +00:00
|
|
|
|
2008-04-19 23:29:39 +00:00
|
|
|
static int playback_callback(int action,const struct menu_item_ex *this_item)
|
2007-02-12 14:22:35 +00:00
|
|
|
{
|
|
|
|
static bool old_shuffle = false;
|
2011-10-29 20:41:20 +00:00
|
|
|
static int old_repeat = 0;
|
2007-02-12 14:22:35 +00:00
|
|
|
switch (action)
|
|
|
|
{
|
|
|
|
case ACTION_ENTER_MENUITEM:
|
|
|
|
if (this_item == &shuffle_item)
|
2011-10-29 20:41:20 +00:00
|
|
|
{
|
2007-02-12 14:22:35 +00:00
|
|
|
old_shuffle = global_settings.playlist_shuffle;
|
2011-10-29 20:41:20 +00:00
|
|
|
}
|
|
|
|
else if (this_item == &repeat_mode)
|
|
|
|
{
|
|
|
|
old_repeat = global_settings.repeat_mode;
|
|
|
|
}
|
2007-02-12 14:22:35 +00:00
|
|
|
break;
|
2011-10-29 20:41:20 +00:00
|
|
|
|
2007-02-12 14:22:35 +00:00
|
|
|
case ACTION_EXIT_MENUITEM: /* on exit */
|
2011-10-29 20:41:20 +00:00
|
|
|
if (!(audio_status() & AUDIO_STATUS_PLAY))
|
|
|
|
break;
|
|
|
|
|
|
|
|
if (this_item == &shuffle_item)
|
2007-02-12 14:22:35 +00:00
|
|
|
{
|
2011-10-29 20:41:20 +00:00
|
|
|
if (old_shuffle == global_settings.playlist_shuffle)
|
|
|
|
break;
|
|
|
|
|
2007-02-12 14:22:35 +00:00
|
|
|
#if CONFIG_CODEC == SWCODEC
|
2007-02-24 17:06:36 +00:00
|
|
|
dsp_set_replaygain();
|
2007-02-12 14:22:35 +00:00
|
|
|
#endif
|
|
|
|
if (global_settings.playlist_shuffle)
|
|
|
|
{
|
|
|
|
playlist_randomise(NULL, current_tick, true);
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
playlist_sort(NULL, true);
|
|
|
|
}
|
|
|
|
}
|
2011-10-29 20:41:20 +00:00
|
|
|
else if (this_item == &repeat_mode)
|
|
|
|
{
|
|
|
|
if (old_repeat == global_settings.repeat_mode)
|
|
|
|
break;
|
|
|
|
|
|
|
|
audio_flush_and_reload_tracks();
|
|
|
|
}
|
|
|
|
|
2007-02-12 14:22:35 +00:00
|
|
|
break;
|
|
|
|
}
|
|
|
|
return action;
|
|
|
|
}
|
|
|
|
/* PLAYBACK MENU */
|
|
|
|
/***********************************/
|