make sound wave the default visualization and fftw optional dependency

This commit is contained in:
Andrzej Rybczak
2009-09-03 21:45:57 +02:00
parent 82e1ba5a9d
commit 604de32de6
7 changed files with 48 additions and 11 deletions

View File

@@ -14,6 +14,7 @@ AC_ARG_ENABLE(visualizer, AS_HELP_STRING([--enable-visualizer], [Enable music vi
AC_ARG_ENABLE(clock, AS_HELP_STRING([--enable-clock], [Enable clock screen @<:@default=no@:>@]), [clock=$enableval], [clock=no]) AC_ARG_ENABLE(clock, AS_HELP_STRING([--enable-clock], [Enable clock screen @<:@default=no@:>@]), [clock=$enableval], [clock=no])
AC_ARG_ENABLE(unicode, AS_HELP_STRING([--enable-unicode], [Enable utf8 support @<:@default=yes@:>@]), [unicode=$enableval], [unicode=yes]) AC_ARG_ENABLE(unicode, AS_HELP_STRING([--enable-unicode], [Enable utf8 support @<:@default=yes@:>@]), [unicode=$enableval], [unicode=yes])
AC_ARG_WITH(curl, AS_HELP_STRING([--with-curl], [Enable fetching lyrics from the Internet @<:@default=auto@:>@]), [curl=$withval], [curl=auto]) AC_ARG_WITH(curl, AS_HELP_STRING([--with-curl], [Enable fetching lyrics from the Internet @<:@default=auto@:>@]), [curl=$withval], [curl=auto])
AC_ARG_WITH(fftw, AS_HELP_STRING([--with-fftw], [Enable fftw support (required for frequency spectrum vizualization) @<:@default=auto@:>@]), [fftw=$withval], [fftw=auto])
AC_ARG_WITH(iconv, AS_HELP_STRING([--with-iconv], [Enable iconv support (Note: if you use utf-8 system wide, you can disable this) @<:@default=auto@:>@]), [iconv=$withval], [iconv=auto]) AC_ARG_WITH(iconv, AS_HELP_STRING([--with-iconv], [Enable iconv support (Note: if you use utf-8 system wide, you can disable this) @<:@default=auto@:>@]), [iconv=$withval], [iconv=auto])
AC_ARG_WITH(pdcurses, AS_HELP_STRING([--with-pdcurses[=LIBNAME]], [Link against pdcurses instead of ncurses @<:@default=XCurses@:>@]), [pdcurses=$withval], [pdcurses=no]) AC_ARG_WITH(pdcurses, AS_HELP_STRING([--with-pdcurses[=LIBNAME]], [Link against pdcurses instead of ncurses @<:@default=XCurses@:>@]), [pdcurses=$withval], [pdcurses=no])
AC_ARG_WITH(threads, AS_HELP_STRING([--with-threads], [Enable threading support using posix threads @<:@default=auto@:>@]), [threads=$withval], [threads=auto]) AC_ARG_WITH(threads, AS_HELP_STRING([--with-threads], [Enable threading support using posix threads @<:@default=auto@:>@]), [threads=$withval], [threads=auto])
@@ -93,12 +94,24 @@ dnl ======================
dnl = checking for fftw3 = dnl = checking for fftw3 =
dnl ====================== dnl ======================
if test "$visualizer" = "yes" ; then if test "$visualizer" = "yes" ; then
PKG_CHECK_MODULES([fftw3], [fftw3 >= 3], , AC_MSG_ERROR([fftw3 library is required!])) if test "$fftw" != "no" ; then
AC_SUBST(fftw3_LIBS) PKG_CHECK_MODULES([fftw3], [fftw3 >= 3], [
AC_SUBST(fftw3_CFLAGS) AC_SUBST(fftw3_LIBS)
CPPFLAGS="$CPPFLAGS $fftw3_CFLAGS" AC_SUBST(fftw3_CFLAGS)
LDFLAGS="$LDFLAGS $fftw3_LIBS" CPPFLAGS="$CPPFLAGS $fftw3_CFLAGS"
AC_CHECK_HEADERS([fftw3.h], , AC_MSG_ERROR([missing fftw3.h header])) AC_CHECK_HEADERS([fftw3.h],
LDFLAGS="$LDFLAGS $fftw3_LIBS"
,
if test "$fftw" = "yes" ; then
AC_MSG_ERROR([missing fftw3.h header])
fi
)
],
if test "$fftw" = "yes" ; then
AC_MSG_ERROR([fftw3 library is required!])
fi
)
fi
AC_DEFINE([ENABLE_VISUALIZER], [1], [enables music visualizer screen]) AC_DEFINE([ENABLE_VISUALIZER], [1], [enables music visualizer screen])
fi fi

View File

@@ -34,7 +34,12 @@
# #
#visualizer_fifo_path = "" #visualizer_fifo_path = ""
# #
#visualizer_type = "spectrum" (spectrum/wave) ##
## Note: To enable spectrum frequency visualization
## you need to compile ncmpcpp with fftw3 support.
##
#
#visualizer_type = "wave" (spectrum/wave)
# #
##### system encoding ##### ##### system encoding #####
## ##

View File

@@ -70,7 +70,7 @@ Default number of seconds to crossfade, if enabled by ncmpcpp.
Path to mpd fifo output. This is needed to make music visualizer work (note that output sound format of this fifo has to be 44100:16:1) Path to mpd fifo output. This is needed to make music visualizer work (note that output sound format of this fifo has to be 44100:16:1)
.TP .TP
.B visualizer_type = spectrum/wave .B visualizer_type = spectrum/wave
Defines default visualizer type. Defines default visualizer type (spectrum is available only if ncmpcpp was compiled with fftw support).
.TP .TP
.B system_encoding = ENCODING .B system_encoding = ENCODING
If you use encoding other than utf8, set it in order to handle utf8 encoded strings properly. If you use encoding other than utf8, set it in order to handle utf8 encoded strings properly.

View File

@@ -298,10 +298,10 @@ void Help::GetKeybindings()
# endif // ENABLE_OUTPUTS # endif // ENABLE_OUTPUTS
# ifdef ENABLE_VISUALIZER # if defined(ENABLE_VISUALIZER) && defined(HAVE_FFTW3_H)
*w << "\n\n " << fmtBold << "Keys - Music visualizer\n -----------------------------------------\n" << fmtBoldEnd; *w << "\n\n " << fmtBold << "Keys - Music visualizer\n -----------------------------------------\n" << fmtBoldEnd;
*w << DisplayKeys(Key.Space) << "Toggle visualization type\n"; *w << DisplayKeys(Key.Space) << "Toggle visualization type\n";
# endif // ENABLE_VISUALIZER # endif // ENABLE_VISUALIZER && HAVE_FFTW3_H
*w << "\n\n " << fmtBold << "Mouse - Global\n -----------------------------------------\n" << fmtBoldEnd; *w << "\n\n " << fmtBold << "Mouse - Global\n -----------------------------------------\n" << fmtBoldEnd;

View File

@@ -306,7 +306,7 @@ void DefaultConfiguration(ncmpcpp_config &conf)
conf.ask_before_clearing_main_playlist = false; conf.ask_before_clearing_main_playlist = false;
conf.mouse_support = true; conf.mouse_support = true;
conf.new_design = false; conf.new_design = false;
conf.visualizer_use_wave = false; conf.visualizer_use_wave = true;
conf.set_window_title = true; conf.set_window_title = true;
conf.mpd_port = 6600; conf.mpd_port = 6600;
conf.mpd_connection_timeout = 15; conf.mpd_connection_timeout = 15;

View File

@@ -37,7 +37,9 @@ using Global::MainHeight;
Visualizer *myVisualizer = new Visualizer; Visualizer *myVisualizer = new Visualizer;
const unsigned Visualizer::Samples = 2048; const unsigned Visualizer::Samples = 2048;
#ifdef HAVE_FFTW3_H
const unsigned Visualizer::FFTResults = Samples/2+1; const unsigned Visualizer::FFTResults = Samples/2+1;
#endif // HAVE_FFTW3_H
void Visualizer::Init() void Visualizer::Init()
{ {
@@ -45,10 +47,12 @@ void Visualizer::Init()
w->SetTimeout(Config.visualizer_fifo_path.empty() ? ncmpcpp_window_timeout : 40 /* this gives us 25 fps */); w->SetTimeout(Config.visualizer_fifo_path.empty() ? ncmpcpp_window_timeout : 40 /* this gives us 25 fps */);
ResetFD(); ResetFD();
# ifdef HAVE_FFTW3_H
itsFreqsMagnitude = new unsigned[FFTResults]; itsFreqsMagnitude = new unsigned[FFTResults];
itsInput = static_cast<double *>(fftw_malloc(sizeof(double)*Samples)); itsInput = static_cast<double *>(fftw_malloc(sizeof(double)*Samples));
itsOutput = static_cast<fftw_complex *>(fftw_malloc(sizeof(fftw_complex)*FFTResults)); itsOutput = static_cast<fftw_complex *>(fftw_malloc(sizeof(fftw_complex)*FFTResults));
itsPlan = fftw_plan_dft_r2c_1d(Samples, itsInput, itsOutput, FFTW_ESTIMATE); itsPlan = fftw_plan_dft_r2c_1d(Samples, itsInput, itsOutput, FFTW_ESTIMATE);
# endif // HAVE_FFTW3_H
isInitialized = 1; isInitialized = 1;
} }
@@ -103,14 +107,20 @@ void Visualizer::Update()
return; return;
w->Clear(0); w->Clear(0);
# ifdef HAVE_FFTW3_H
Config.visualizer_use_wave ? DrawSoundWave(buf, data) : DrawFrequencySpectrum(buf, data); Config.visualizer_use_wave ? DrawSoundWave(buf, data) : DrawFrequencySpectrum(buf, data);
# else
DrawSoundWave(buf, data);
# endif // HAVE_FFTW3_H
w->Refresh(); w->Refresh();
} }
void Visualizer::SpacePressed() void Visualizer::SpacePressed()
{ {
# ifdef HAVE_FFTW3_H
Config.visualizer_use_wave = !Config.visualizer_use_wave; Config.visualizer_use_wave = !Config.visualizer_use_wave;
ShowMessage("Visualization type: %s", Config.visualizer_use_wave ? "Sound wave" : "Frequency spectrum"); ShowMessage("Visualization type: %s", Config.visualizer_use_wave ? "Sound wave" : "Frequency spectrum");
# endif // HAVE_FFTW3_H
} }
void Visualizer::DrawSoundWave(int16_t *buf, ssize_t data) void Visualizer::DrawSoundWave(int16_t *buf, ssize_t data)
@@ -142,6 +152,7 @@ void Visualizer::DrawSoundWave(int16_t *buf, ssize_t data)
*w << fmtAltCharsetEnd; *w << fmtAltCharsetEnd;
} }
#ifdef HAVE_FFTW3_H
void Visualizer::DrawFrequencySpectrum(int16_t *buf, ssize_t data) void Visualizer::DrawFrequencySpectrum(int16_t *buf, ssize_t data)
{ {
// zero old values // zero old values
@@ -165,6 +176,7 @@ void Visualizer::DrawFrequencySpectrum(int16_t *buf, ssize_t data)
mvwvline(w->Raw(), MainHeight-bar_height, i, 0, bar_height); mvwvline(w->Raw(), MainHeight-bar_height, i, 0, bar_height);
} }
} }
#endif // HAVE_FFTW3_H
void Visualizer::SetFD() void Visualizer::SetFD()
{ {

View File

@@ -59,16 +59,23 @@ class Visualizer : public Screen<Window>
private: private:
void DrawSoundWave(int16_t *, ssize_t); void DrawSoundWave(int16_t *, ssize_t);
# ifdef HAVE_FFTW3_H
void DrawFrequencySpectrum(int16_t *, ssize_t); void DrawFrequencySpectrum(int16_t *, ssize_t);
# endif // HAVE_FFTW3_H
int itsFifo; int itsFifo;
# ifdef HAVE_FFTW3_H
unsigned *itsFreqsMagnitude; unsigned *itsFreqsMagnitude;
double *itsInput; double *itsInput;
fftw_complex *itsOutput; fftw_complex *itsOutput;
fftw_plan itsPlan; fftw_plan itsPlan;
# endif // HAVE_FFTW3_H
static const unsigned Samples; static const unsigned Samples;
# ifdef HAVE_FFTW3_H
static const unsigned FFTResults; static const unsigned FFTResults;
# endif // HAVE_FFTW3_H
}; };
extern Visualizer *myVisualizer; extern Visualizer *myVisualizer;