add visualizer_sample_multiplier config option
This commit is contained in:
@@ -439,6 +439,9 @@
|
|||||||
#def_key "m"
|
#def_key "m"
|
||||||
# toggle_media_library_sort_mode
|
# toggle_media_library_sort_mode
|
||||||
#
|
#
|
||||||
|
#def_key "m"
|
||||||
|
# set_visualizer_sample_multiplier
|
||||||
|
#
|
||||||
#def_key "n"
|
#def_key "n"
|
||||||
# move_sort_order_down
|
# move_sort_order_down
|
||||||
#
|
#
|
||||||
|
|||||||
@@ -70,6 +70,12 @@
|
|||||||
#visualizer_in_stereo = yes
|
#visualizer_in_stereo = yes
|
||||||
#
|
#
|
||||||
##
|
##
|
||||||
|
## Multiply received samples by given value. Very
|
||||||
|
## useful for proper visualization of quiet music.
|
||||||
|
##
|
||||||
|
#visualizer_sample_multipler = 1
|
||||||
|
#
|
||||||
|
##
|
||||||
## Note: Below parameter defines how often ncmpcpp
|
## Note: Below parameter defines how often ncmpcpp
|
||||||
## has to "synchronize" visualizer and audio outputs.
|
## has to "synchronize" visualizer and audio outputs.
|
||||||
## 30 seconds is optimal value, but if you experience
|
## 30 seconds is optimal value, but if you experience
|
||||||
|
|||||||
@@ -66,6 +66,9 @@ Path to mpd fifo output. This is needed to make music visualizer work (note that
|
|||||||
.B visualizer_output_name = NAME
|
.B visualizer_output_name = NAME
|
||||||
Name of output that provides data for visualizer. Needed to keep sound and visualization in sync.
|
Name of output that provides data for visualizer. Needed to keep sound and visualization in sync.
|
||||||
.TP
|
.TP
|
||||||
|
.B visualizer_sample_multiplier = NUMBER
|
||||||
|
Multiply received samples by given value. Very useful for proper visualization of quiet music.
|
||||||
|
.TP
|
||||||
.B visualizer_sync_interval = SECONDS
|
.B visualizer_sync_interval = SECONDS
|
||||||
Defines interval between syncing visualizer and audio outputs.
|
Defines interval between syncing visualizer and audio outputs.
|
||||||
.TP
|
.TP
|
||||||
|
|||||||
@@ -2184,6 +2184,31 @@ void SetSelectedItemsPriority::run()
|
|||||||
myPlaylist->SetSelectedItemsPriority(prio);
|
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
|
bool FilterPlaylistOnPriorities::canBeRun() const
|
||||||
{
|
{
|
||||||
return myScreen == myPlaylist;
|
return myScreen == myPlaylist;
|
||||||
@@ -2612,6 +2637,7 @@ void populateActions()
|
|||||||
insert_action(new Actions::ToggleMediaLibrarySortMode());
|
insert_action(new Actions::ToggleMediaLibrarySortMode());
|
||||||
insert_action(new Actions::RefetchLyrics());
|
insert_action(new Actions::RefetchLyrics());
|
||||||
insert_action(new Actions::SetSelectedItemsPriority());
|
insert_action(new Actions::SetSelectedItemsPriority());
|
||||||
|
insert_action(new Actions::SetVisualizerSampleMultiplier());
|
||||||
insert_action(new Actions::FilterPlaylistOnPriorities());
|
insert_action(new Actions::FilterPlaylistOnPriorities());
|
||||||
insert_action(new Actions::ShowSongInfo());
|
insert_action(new Actions::ShowSongInfo());
|
||||||
insert_action(new Actions::ShowArtistInfo());
|
insert_action(new Actions::ShowArtistInfo());
|
||||||
|
|||||||
@@ -52,9 +52,9 @@ enum class Type
|
|||||||
ToggleSpaceMode, ToggleAddMode, ToggleMouse, ToggleBitrateVisibility,
|
ToggleSpaceMode, ToggleAddMode, ToggleMouse, ToggleBitrateVisibility,
|
||||||
AddRandomItems, ToggleBrowserSortMode, ToggleLibraryTagType,
|
AddRandomItems, ToggleBrowserSortMode, ToggleLibraryTagType,
|
||||||
ToggleMediaLibrarySortMode, RefetchLyrics,
|
ToggleMediaLibrarySortMode, RefetchLyrics,
|
||||||
SetSelectedItemsPriority, FilterPlaylistOnPriorities, ShowSongInfo,
|
SetSelectedItemsPriority, SetVisualizerSampleMultiplier, FilterPlaylistOnPriorities,
|
||||||
ShowArtistInfo, ShowLyrics, Quit, NextScreen, PreviousScreen, ShowHelp,
|
ShowSongInfo, ShowArtistInfo, ShowLyrics, Quit, NextScreen, PreviousScreen,
|
||||||
ShowPlaylist, ShowBrowser, ChangeBrowseMode, ShowSearchEngine,
|
ShowHelp, ShowPlaylist, ShowBrowser, ChangeBrowseMode, ShowSearchEngine,
|
||||||
ResetSearchEngine, ShowMediaLibrary, ToggleMediaLibraryColumnsMode,
|
ResetSearchEngine, ShowMediaLibrary, ToggleMediaLibraryColumnsMode,
|
||||||
ShowPlaylistEditor, ShowTagEditor, ShowOutputs, ShowVisualizer,
|
ShowPlaylistEditor, ShowTagEditor, ShowOutputs, ShowVisualizer,
|
||||||
ShowClock, ShowServerInfo,
|
ShowClock, ShowServerInfo,
|
||||||
@@ -959,6 +959,16 @@ protected:
|
|||||||
virtual void run();
|
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
|
struct FilterPlaylistOnPriorities : public BaseAction
|
||||||
{
|
{
|
||||||
FilterPlaylistOnPriorities()
|
FilterPlaylistOnPriorities()
|
||||||
|
|||||||
@@ -540,6 +540,7 @@ void BindingsConfiguration::generateDefaults()
|
|||||||
bind(k, Actions::Type::MoveSortOrderUp);
|
bind(k, Actions::Type::MoveSortOrderUp);
|
||||||
bind(k, Actions::Type::MoveSelectedItemsUp);
|
bind(k, Actions::Type::MoveSelectedItemsUp);
|
||||||
bind(k, Actions::Type::ToggleMediaLibrarySortMode);
|
bind(k, Actions::Type::ToggleMediaLibrarySortMode);
|
||||||
|
bind(k, Actions::Type::SetVisualizerSampleMultiplier);
|
||||||
}
|
}
|
||||||
if (notBound(k = stringToKey("n")))
|
if (notBound(k = stringToKey("n")))
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -374,6 +374,7 @@ void write_bindings(NC::Scrollpad &w)
|
|||||||
# if defined(ENABLE_VISUALIZER) && defined(HAVE_FFTW3_H)
|
# if defined(ENABLE_VISUALIZER) && defined(HAVE_FFTW3_H)
|
||||||
key_section(w, "Music visualizer");
|
key_section(w, "Music visualizer");
|
||||||
key(w, Type::PressSpace, "Toggle visualization type");
|
key(w, Type::PressSpace, "Toggle visualization type");
|
||||||
|
key(w, Type::SetVisualizerSampleMultiplier, "Set visualizer sample multiplier");
|
||||||
# endif // ENABLE_VISUALIZER && HAVE_FFTW3_H
|
# endif // ENABLE_VISUALIZER && HAVE_FFTW3_H
|
||||||
|
|
||||||
mouse_section(w, "Global");
|
mouse_section(w, "Global");
|
||||||
|
|||||||
@@ -221,6 +221,11 @@ bool Configuration::read(const std::string &config_path)
|
|||||||
p.add("visualizer_in_stereo", yes_no(
|
p.add("visualizer_in_stereo", yes_no(
|
||||||
visualizer_in_stereo, true
|
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>(
|
p.add("visualizer_sync_interval", assign_default<unsigned>(
|
||||||
visualizer_sync_interval, 30, [](unsigned v) {
|
visualizer_sync_interval, 30, [](unsigned v) {
|
||||||
return boost::posix_time::seconds(v);
|
return boost::posix_time::seconds(v);
|
||||||
|
|||||||
@@ -176,6 +176,7 @@ struct Configuration
|
|||||||
boost::posix_time::seconds playlist_disable_highlight_delay;
|
boost::posix_time::seconds playlist_disable_highlight_delay;
|
||||||
boost::posix_time::seconds visualizer_sync_interval;
|
boost::posix_time::seconds visualizer_sync_interval;
|
||||||
|
|
||||||
|
double visualizer_sample_multiplier;
|
||||||
double locked_screen_width_part;
|
double locked_screen_width_part;
|
||||||
|
|
||||||
size_t selected_item_prefix_length;
|
size_t selected_item_prefix_length;
|
||||||
|
|||||||
@@ -113,9 +113,19 @@ void Visualizer::update()
|
|||||||
else
|
else
|
||||||
# endif // HAVE_FFTW3_H
|
# endif // HAVE_FFTW3_H
|
||||||
draw = &Visualizer::DrawSoundWave;
|
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();
|
w.clear();
|
||||||
ssize_t samples_read = data/sizeof(int16_t);
|
|
||||||
if (Config.visualizer_in_stereo)
|
if (Config.visualizer_in_stereo)
|
||||||
{
|
{
|
||||||
int16_t buf_left[samples_read/2], buf_right[samples_read/2];
|
int16_t buf_left[samples_read/2], buf_right[samples_read/2];
|
||||||
|
|||||||
Reference in New Issue
Block a user