visualizer: add support for multiple colors

This commit is contained in:
ahoka
2014-09-09 12:19:33 -05:00
committed by Andrzej Rybczak
parent 12dff0ebfd
commit 9bab03e4b2
3 changed files with 37 additions and 9 deletions

View File

@@ -629,9 +629,16 @@ bool Configuration::read(const std::string &config_path)
p.add("active_column_color", assign_default(
active_column_color, NC::Color::Red
));
p.add("visualizer_color", assign_default(
visualizer_color, NC::Color::Yellow
));
p.add("visualizer_colors", option_parser::worker([this](std::string &&v) {
boost::sregex_token_iterator i(v.begin(), v.end(), boost::regex("\\w+")), j;
for (; i != j; ++i)
{
auto color = stringToColor(*i);
visualizer_colors.push_back(color);
}
}, [this] {
visualizer_colors = { NC::Color::Blue, NC::Color::Cyan, NC::Color::Green, NC::Color::Yellow, NC::Color::Red };
}));
p.add("window_border_color", assign_default(
window_border, NC::Border::Green
));

View File

@@ -109,7 +109,7 @@ struct Configuration
NC::Color statusbar_color;
NC::Color alternative_ui_separator_color;
NC::Color active_column_color;
NC::Color visualizer_color;
std::vector<NC::Color> visualizer_colors;
NC::Border window_border;
NC::Border active_window_border;

View File

@@ -50,7 +50,7 @@ const int fps = 25;
}
Visualizer::Visualizer()
: Screen(NC::Window(0, MainStartY, COLS, MainHeight, "", Config.visualizer_color, NC::Border::None))
: Screen(NC::Window(0, MainStartY, COLS, MainHeight, "", NC::Color::Default, NC::Border::None))
{
ResetFD();
m_samples = 44100/fps;
@@ -176,15 +176,26 @@ void Visualizer::DrawSoundWave(int16_t *buf, ssize_t samples, size_t y_offset, s
point_pos /= samples_per_col;
point_pos /= std::numeric_limits<int16_t>::max();
point_pos *= half_height;
w << NC::XY(i, y_offset+half_height+point_pos) << Config.visualizer_chars[0];
if (i && fabs(prev_point_pos-point_pos) > 2)
point_pos = std::round(point_pos);
w << NC::XY(i, y_offset+half_height+point_pos)
<< Config.visualizer_colors[std::min(size_t(std::abs(point_pos) / (double)half_height *
Config.visualizer_colors.size()), Config.visualizer_colors.size() - 1)]
<< Config.visualizer_chars[0]
<< NC::Color::End;
if (i && abs(prev_point_pos-point_pos) > 2)
{
// if gap is too big. intermediate values are needed
// since without them all we see are blinking points
const int breakpoint = std::max(prev_point_pos, point_pos);
const int half = (prev_point_pos+point_pos)/2;
for (int k = std::min(prev_point_pos, point_pos)+1; k < breakpoint; k += 2)
w << NC::XY(i-(k < half), y_offset+half_height+k) << Config.visualizer_chars[0];
w << NC::XY(i-(k < half), y_offset+half_height+k)
<< Config.visualizer_colors[std::min(size_t(std::abs(k) / (double)half_height *
Config.visualizer_colors.size()), Config.visualizer_colors.size() - 1)]
<< Config.visualizer_chars[0]
<< NC::Color::End;
}
prev_point_pos = point_pos;
}
@@ -225,7 +236,17 @@ void Visualizer::DrawFrequencySpectrum(int16_t *buf, ssize_t samples, size_t y_o
const size_t start_y = y_offset > 0 ? y_offset : height-bar_real_height;
const size_t stop_y = std::min(bar_real_height+start_y, w.getHeight());
for (size_t j = start_y; j < stop_y; ++j)
w << NC::XY(i, j) << Config.visualizer_chars[1];
{
w << NC::XY(i, j);
if (Config.visualizer_in_stereo)
w << Config.visualizer_colors[std::abs(int(j - w.getHeight() / 2)) /
((double)w.getHeight() / 2) * Config.visualizer_colors.size()];
else
w << Config.visualizer_colors[std::abs(int((double)j / stop_y * Config.visualizer_colors.size()) -
int(Config.visualizer_colors.size() - 1))];
w << Config.visualizer_chars[1]
<< NC::Color::End;
}
}
}
#endif // HAVE_FFTW3_H