Support gstreamer's udpsink as a source of visualizer samples

This commit is contained in:
Andrzej Rybczak
2020-12-17 20:52:24 +01:00
parent 3e6a2af695
commit 519f44e27c
2 changed files with 60 additions and 38 deletions

View File

@@ -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()
{ {

View File

@@ -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;