add visualizer_sample_multiplier config option

This commit is contained in:
Andrzej Rybczak
2014-09-02 19:59:31 +02:00
parent 64b85d5d4f
commit 84c90868a1
10 changed files with 71 additions and 5 deletions

View File

@@ -2184,6 +2184,31 @@ void SetSelectedItemsPriority::run()
myPlaylist->SetSelectedItemsPriority(prio);
}
bool SetVisualizerSampleMultiplier::canBeRun() const
{
# ifdef ENABLE_VISUALIZER
return myScreen == myVisualizer;
# else
return false;
# endif // ENABLE_VISUALIZER
}
void SetVisualizerSampleMultiplier::run()
{
# ifdef ENABLE_VISUALIZER
using Global::wFooter;
Statusbar::lock();
Statusbar::put() << "Set visualizer sample multiplier: ";
std::string smultiplier = wFooter->getString();
Statusbar::unlock();
double multiplier = fromString<double>(smultiplier);
lowerBoundCheck(multiplier, 1.0);
Config.visualizer_sample_multiplier = multiplier;
# endif // ENABLE_VISUALIZER
}
bool FilterPlaylistOnPriorities::canBeRun() const
{
return myScreen == myPlaylist;
@@ -2612,6 +2637,7 @@ void populateActions()
insert_action(new Actions::ToggleMediaLibrarySortMode());
insert_action(new Actions::RefetchLyrics());
insert_action(new Actions::SetSelectedItemsPriority());
insert_action(new Actions::SetVisualizerSampleMultiplier());
insert_action(new Actions::FilterPlaylistOnPriorities());
insert_action(new Actions::ShowSongInfo());
insert_action(new Actions::ShowArtistInfo());

View File

@@ -52,9 +52,9 @@ enum class Type
ToggleSpaceMode, ToggleAddMode, ToggleMouse, ToggleBitrateVisibility,
AddRandomItems, ToggleBrowserSortMode, ToggleLibraryTagType,
ToggleMediaLibrarySortMode, RefetchLyrics,
SetSelectedItemsPriority, FilterPlaylistOnPriorities, ShowSongInfo,
ShowArtistInfo, ShowLyrics, Quit, NextScreen, PreviousScreen, ShowHelp,
ShowPlaylist, ShowBrowser, ChangeBrowseMode, ShowSearchEngine,
SetSelectedItemsPriority, SetVisualizerSampleMultiplier, FilterPlaylistOnPriorities,
ShowSongInfo, ShowArtistInfo, ShowLyrics, Quit, NextScreen, PreviousScreen,
ShowHelp, ShowPlaylist, ShowBrowser, ChangeBrowseMode, ShowSearchEngine,
ResetSearchEngine, ShowMediaLibrary, ToggleMediaLibraryColumnsMode,
ShowPlaylistEditor, ShowTagEditor, ShowOutputs, ShowVisualizer,
ShowClock, ShowServerInfo,
@@ -959,6 +959,16 @@ protected:
virtual void run();
};
struct SetVisualizerSampleMultiplier : public BaseAction
{
SetVisualizerSampleMultiplier()
: BaseAction(Type::SetVisualizerSampleMultiplier, "set_visualizer_sample_multiplier") { }
protected:
virtual bool canBeRun() const;
virtual void run();
};
struct FilterPlaylistOnPriorities : public BaseAction
{
FilterPlaylistOnPriorities()

View File

@@ -540,6 +540,7 @@ void BindingsConfiguration::generateDefaults()
bind(k, Actions::Type::MoveSortOrderUp);
bind(k, Actions::Type::MoveSelectedItemsUp);
bind(k, Actions::Type::ToggleMediaLibrarySortMode);
bind(k, Actions::Type::SetVisualizerSampleMultiplier);
}
if (notBound(k = stringToKey("n")))
{

View File

@@ -374,6 +374,7 @@ void write_bindings(NC::Scrollpad &w)
# if defined(ENABLE_VISUALIZER) && defined(HAVE_FFTW3_H)
key_section(w, "Music visualizer");
key(w, Type::PressSpace, "Toggle visualization type");
key(w, Type::SetVisualizerSampleMultiplier, "Set visualizer sample multiplier");
# endif // ENABLE_VISUALIZER && HAVE_FFTW3_H
mouse_section(w, "Global");

View File

@@ -221,6 +221,11 @@ bool Configuration::read(const std::string &config_path)
p.add("visualizer_in_stereo", yes_no(
visualizer_in_stereo, true
));
p.add("visualizer_sample_multiplier", assign_default<double>(
visualizer_sample_multiplier, 1.0, [](double v) {
lowerBoundCheck(v, 1.0);
return v;
}));
p.add("visualizer_sync_interval", assign_default<unsigned>(
visualizer_sync_interval, 30, [](unsigned v) {
return boost::posix_time::seconds(v);

View File

@@ -176,6 +176,7 @@ struct Configuration
boost::posix_time::seconds playlist_disable_highlight_delay;
boost::posix_time::seconds visualizer_sync_interval;
double visualizer_sample_multiplier;
double locked_screen_width_part;
size_t selected_item_prefix_length;

View File

@@ -113,9 +113,19 @@ void Visualizer::update()
else
# endif // HAVE_FFTW3_H
draw = &Visualizer::DrawSoundWave;
const ssize_t samples_read = data/sizeof(int16_t);
std::for_each(buf, buf+samples_read, [](int16_t &sample) {
int32_t tmp = sample * Config.visualizer_sample_multiplier;
if (tmp < std::numeric_limits<int16_t>::min())
sample = std::numeric_limits<int16_t>::min();
else if (tmp > std::numeric_limits<int16_t>::max())
sample = std::numeric_limits<int16_t>::max();
else
sample = tmp;
});
w.clear();
ssize_t samples_read = data/sizeof(int16_t);
if (Config.visualizer_in_stereo)
{
int16_t buf_left[samples_read/2], buf_right[samples_read/2];