Support gstreamer's udpsink as a source of visualizer samples
This commit is contained in:
@@ -84,6 +84,7 @@ Visualizer::Visualizer()
|
|||||||
SMOOTH_CHARS(ToWString("▁▂▃▄▅▆▇█"))
|
SMOOTH_CHARS(ToWString("▁▂▃▄▅▆▇█"))
|
||||||
#endif
|
#endif
|
||||||
{
|
{
|
||||||
|
InitDataSource();
|
||||||
InitVisualization();
|
InitVisualization();
|
||||||
# ifdef HAVE_FFTW3_H
|
# ifdef HAVE_FFTW3_H
|
||||||
m_fftw_results = DFT_TOTAL_SIZE/2+1;
|
m_fftw_results = DFT_TOTAL_SIZE/2+1;
|
||||||
@@ -184,8 +185,8 @@ void Visualizer::update()
|
|||||||
if (Config.visualizer_in_stereo)
|
if (Config.visualizer_in_stereo)
|
||||||
requested_samples *= 2;
|
requested_samples *= 2;
|
||||||
|
|
||||||
Statusbar::printf("Samples: %1%, %2%, %3%", m_buffered_samples.size(),
|
//Statusbar::printf("Samples: %1%, %2%, %3%", m_buffered_samples.size(),
|
||||||
requested_samples, m_sample_consumption_rate);
|
// requested_samples, m_sample_consumption_rate);
|
||||||
|
|
||||||
size_t new_samples = m_buffered_samples.move(requested_samples, m_rendered_samples);
|
size_t new_samples = m_buffered_samples.move(requested_samples, m_rendered_samples);
|
||||||
if (new_samples == 0)
|
if (new_samples == 0)
|
||||||
@@ -621,6 +622,23 @@ void Visualizer::GenLogspace()
|
|||||||
}
|
}
|
||||||
#endif // HAVE_FFTW3_H
|
#endif // HAVE_FFTW3_H
|
||||||
|
|
||||||
|
void Visualizer::InitDataSource()
|
||||||
|
{
|
||||||
|
auto colon = Config.visualizer_fifo_path.rfind(':');
|
||||||
|
if (Config.visualizer_fifo_path[0] != '/' && colon != std::string::npos)
|
||||||
|
{
|
||||||
|
// UDP source
|
||||||
|
m_source_location = Config.visualizer_fifo_path.substr(0, colon);
|
||||||
|
m_source_port = Config.visualizer_fifo_path.substr(colon+1);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
// FIFO source
|
||||||
|
m_source_location = Config.visualizer_fifo_path;
|
||||||
|
m_source_port.clear();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
void Visualizer::InitVisualization()
|
void Visualizer::InitVisualization()
|
||||||
{
|
{
|
||||||
size_t rendered_samples = 0;
|
size_t rendered_samples = 0;
|
||||||
@@ -721,20 +739,20 @@ void Visualizer::OpenDataSource()
|
|||||||
if (m_source_fd >= 0)
|
if (m_source_fd >= 0)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
/*
|
if (!m_source_port.empty())
|
||||||
|
{
|
||||||
addrinfo hints, *res;
|
addrinfo hints, *res;
|
||||||
memset (&hints, 0, sizeof (hints));
|
memset (&hints, 0, sizeof (hints));
|
||||||
hints.ai_family = PF_UNSPEC;
|
hints.ai_family = PF_UNSPEC;
|
||||||
hints.ai_socktype = SOCK_DGRAM;
|
hints.ai_socktype = SOCK_DGRAM;
|
||||||
hints.ai_protocol = IPPROTO_UDP;
|
hints.ai_protocol = IPPROTO_UDP;
|
||||||
|
|
||||||
const char *host = "localhost", *port = "5555";
|
int errcode = getaddrinfo(m_source_location.c_str(), m_source_port.c_str(),
|
||||||
|
&hints, &res);
|
||||||
int errcode = getaddrinfo(host, port, &hints, &res);
|
|
||||||
if (errcode != 0)
|
if (errcode != 0)
|
||||||
{
|
{
|
||||||
Statusbar::printf("Couldn't resolve \"%1%:%2%\": %3%",
|
Statusbar::printf("Couldn't resolve \"%1%:%2%\": %3%",
|
||||||
host, port, gai_strerror(errcode));
|
m_source_location, m_source_port, gai_strerror(errcode));
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -758,14 +776,15 @@ void Visualizer::OpenDataSource()
|
|||||||
}
|
}
|
||||||
|
|
||||||
freeaddrinfo(res);
|
freeaddrinfo(res);
|
||||||
return;
|
}
|
||||||
*/
|
else
|
||||||
|
{
|
||||||
m_source_fd = open(Config.visualizer_fifo_path.c_str(), O_RDONLY | O_NONBLOCK);
|
m_source_fd = open(m_source_location.c_str(), O_RDONLY | O_NONBLOCK);
|
||||||
if (m_source_fd < 0)
|
if (m_source_fd < 0)
|
||||||
Statusbar::printf("Couldn't open \"%1%\" for reading PCM data: %2%",
|
Statusbar::printf("Couldn't open \"%1%\" for reading PCM data: %2%",
|
||||||
Config.visualizer_fifo_path, strerror(errno));
|
Config.visualizer_fifo_path, strerror(errno));
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
void Visualizer::CloseDataSource()
|
void Visualizer::CloseDataSource()
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -80,6 +80,7 @@ private:
|
|||||||
double Interpolate(size_t, size_t);
|
double Interpolate(size_t, size_t);
|
||||||
# endif // HAVE_FFTW3_H
|
# endif // HAVE_FFTW3_H
|
||||||
|
|
||||||
|
void InitDataSource();
|
||||||
void InitVisualization();
|
void InitVisualization();
|
||||||
|
|
||||||
void (Visualizer::*draw)(const int16_t *, ssize_t, size_t, size_t);
|
void (Visualizer::*draw)(const int16_t *, ssize_t, size_t, size_t);
|
||||||
@@ -89,6 +90,8 @@ private:
|
|||||||
boost::posix_time::ptime m_timer;
|
boost::posix_time::ptime m_timer;
|
||||||
|
|
||||||
int m_source_fd;
|
int m_source_fd;
|
||||||
|
std::string m_source_location;
|
||||||
|
std::string m_source_port;
|
||||||
|
|
||||||
std::vector<int16_t> m_rendered_samples;
|
std::vector<int16_t> m_rendered_samples;
|
||||||
std::vector<int16_t> m_incoming_samples;
|
std::vector<int16_t> m_incoming_samples;
|
||||||
|
|||||||
Reference in New Issue
Block a user