fix player

This commit is contained in:
2026-03-31 09:57:31 +03:00
parent 29ff210adb
commit 29287712b5
16 changed files with 50 additions and 67 deletions

View File

@@ -2,5 +2,6 @@
auto main(int argc, char* args[]) -> int auto main(int argc, char* args[]) -> int
{ {
// test sshd
run(); run();
} }

View File

@@ -31,11 +31,10 @@ namespace monitor::components
// делать // делать
void drop(); void drop();
void set_pos(double pos); void set_pos(double pos);
void set_step(std::size_t step);
private: private:
void init(std::string snapshot_id, std::filesystem::path file); void init(std::string snapshot_id, std::filesystem::path file);
void change(std::string snapshot_id); void change(std::string snapshot_id);
void callback(sf::Time time, double pos); void callback(sf::Time time);
}; };
} }

View File

@@ -6,7 +6,7 @@ namespace monitor::components
void audio::on_attach() void audio::on_attach()
{ {
CONNECT(this); CONNECT(this);
m_player.set_callback(std::bind(&audio::callback, this, std::placeholders::_1, std::placeholders::_2)); m_player.set_callback(std::bind(&audio::callback, this, std::placeholders::_1));
m_player.set_device(); m_player.set_device();
} }
@@ -39,7 +39,6 @@ namespace monitor::components
void audio::change(std::string snapshot_id) void audio::change(std::string snapshot_id)
{ {
hack::log()(m_current_audio.m_current_time.asSeconds());
m_audio_data[m_current_audio.m_id].m_current_time = m_current_audio.m_current_time; m_audio_data[m_current_audio.m_id].m_current_time = m_current_audio.m_current_time;
m_player.stop(); m_player.stop();
m_current_audio = m_audio_data[snapshot_id]; m_current_audio = m_audio_data[snapshot_id];
@@ -47,12 +46,10 @@ namespace monitor::components
m_player.set_audio_pos(m_current_audio.m_current_time); m_player.set_audio_pos(m_current_audio.m_current_time);
} }
void audio::callback(sf::Time time, double pos) void audio::callback(sf::Time time)
{ {
m_current_audio.m_current_time = time; m_current_audio.m_current_time = time;
// HERE VE::event e { utils::event_type::INCREMENT_MARKER_AUDIO_POSITION, time };
// начинаем тут, делаем установку маркера проигрывания
VE::event e { utils::event_type::INCREMENT_MARKER_AUDIO_POSITION, pos };
EMIT(e); EMIT(e);
} }
@@ -68,10 +65,4 @@ namespace monitor::components
{ {
m_player.set_audio_pos(pos); m_player.set_audio_pos(pos);
} }
// step - шаг отправки сигнала на смещение маркера. он же кол-во block_size-ов на все произведение
void audio::set_step(std::size_t step)
{
m_player.set_step(step);
}
} }

View File

@@ -30,8 +30,8 @@ namespace monitor::components
case utils::event_type::INIT_AUDIO: case utils::event_type::INIT_AUDIO:
{ {
auto [snapshot_id, file] = std::any_cast<std::pair<std::string, std::filesystem::path>>(e.m_data); auto [snapshot_id, file] = std::any_cast<std::pair<std::string, std::filesystem::path>>(e.m_data);
m_status = utils::var::STATUS::ACTIVE;
init(snapshot_id, file); init(snapshot_id, file);
m_status = utils::var::STATUS::ACTIVE;
break; break;
} }

View File

@@ -1,6 +1,7 @@
#include "monitor/gui/components/base_plugins/base_plugins.hpp" #include "monitor/gui/components/base_plugins/base_plugins.hpp"
#include "monitor/utils/plugins/raw_data.hpp" #include "monitor/utils/plugins/raw_data.hpp"
#include "monitor/utils/plugins/magnitude.hpp" #include "monitor/utils/plugins/magnitude.hpp"
#include "monitor/utils/event_type.hpp"
namespace monitor::components namespace monitor::components
{ {
@@ -37,7 +38,10 @@ namespace monitor::components
m_setup = setup; m_setup = setup;
m_graph.init(m_snapshot_id, m_setup); m_graph.init(m_snapshot_id, m_setup);
m_graph.set_plugin(m_base_plugins[0]); m_graph.set_plugin(m_base_plugins[0]);
// m_fft_scaled.init(m_snapshot_id, m_setup); // m_fft_scaled.init(m_snapshot_id, m_setup);
// send to: components/audio
VE::event e { utils::event_type::INIT_AUDIO, std::pair<std::string, std::filesystem::path>(m_snapshot_id, setup.m_file) };
EMIT(e);
} }
} }

View File

@@ -39,6 +39,7 @@ namespace monitor::components
{ {
m_setup.m_domain = hr::DOMAIN_PLUGIN::TIME; m_setup.m_domain = hr::DOMAIN_PLUGIN::TIME;
m_plugin->m_result = hr::run<hr::plugins::raw_data>(m_setup); m_plugin->m_result = hr::run<hr::plugins::raw_data>(m_setup);
hack::log()(m_plugin->m_result.m_size);
break; break;
} }
case utils::plugin::TYPE::MAGNITUDE: case utils::plugin::TYPE::MAGNITUDE:
@@ -59,4 +60,9 @@ namespace monitor::components
} }
} }
} }
std::size_t graph::get_plugin_size() noexcept
{
return m_plugin->m_size;
}
} }

View File

@@ -21,6 +21,7 @@ namespace monitor::components
public: public:
void init(std::string snapshot_id, hr::setup setup); void init(std::string snapshot_id, hr::setup setup);
void set_plugin(std::shared_ptr<utils::plugin> plugin) noexcept; void set_plugin(std::shared_ptr<utils::plugin> plugin) noexcept;
std::size_t get_plugin_size() noexcept;
private: private:
std::shared_ptr<utils::plugin> m_plugin; std::shared_ptr<utils::plugin> m_plugin;

View File

@@ -1,5 +1,6 @@
#include "monitor/gui/components/markers/markers.hpp" #include "monitor/gui/components/markers/markers.hpp"
#include "monitor/utils/event_type.hpp" #include "monitor/utils/event_type.hpp"
#include <SFML/Audio.hpp>
namespace monitor::components namespace monitor::components
{ {
@@ -35,8 +36,10 @@ namespace monitor::components
{ {
case utils::event_type::INCREMENT_MARKER_AUDIO_POSITION: case utils::event_type::INCREMENT_MARKER_AUDIO_POSITION:
{ {
auto pos = std::any_cast<double>(e.m_data); auto t = std::any_cast<sf::Time>(e.m_data);
m_marker_audio_position += pos; static int index = 0;
if (index%16 == 0) ++m_marker_audio_position;
++index;
break; break;
} }

View File

@@ -5,9 +5,9 @@ namespace monitor::components
{ {
void markers::render() void markers::render()
{ {
// -1 это индекс т.к. там внизу тоже они индексируются // 0 это индекс т.к. там внизу тоже они индексируются
// ImPlotDragToolFlags_NoInputs - не дает передвинуть маркер // ImPlotDragToolFlags_NoInputs - не дает передвинуть маркер
ImPlot::DragLineX(-1, &m_marker_audio_position, m_marker_audio_color, 0.1f, ImPlotDragToolFlags_NoCursors | ImPlotDragToolFlags_NoInputs); ImPlot::DragLineX(0, &m_marker_audio_position, m_marker_audio_color, 0.1f, ImPlotDragToolFlags_NoCursors | ImPlotDragToolFlags_NoInputs);
// кликаем для установки маркера аудио (зеленый) // кликаем для установки маркера аудио (зеленый)
if (ImGui::IsMouseClicked(ImGuiMouseButton_Middle)) if (ImGui::IsMouseClicked(ImGuiMouseButton_Middle))
@@ -21,7 +21,7 @@ namespace monitor::components
if (m_shift_press && ImPlot::IsPlotHovered()) if (m_shift_press && ImPlot::IsPlotHovered())
{ {
m_marker_mouse_position = ImPlot::GetPlotMousePos().x; m_marker_mouse_position = ImPlot::GetPlotMousePos().x;
ImPlot::DragLineX(1000, &m_marker_mouse_position, m_marker_mouse_color, 0.1f, ImPlotDragToolFlags_NoCursors | ImPlotDragToolFlags_NoInputs); ImPlot::DragLineX(1, &m_marker_mouse_position, m_marker_mouse_color, 0.1f, ImPlotDragToolFlags_NoCursors | ImPlotDragToolFlags_NoInputs);
} }
} }
} }

View File

@@ -15,7 +15,7 @@ namespace monitor::components
private: private:
ImVec4 m_marker_audio_color; ImVec4 m_marker_audio_color;
ImVec4 m_marker_mouse_color; ImVec4 m_marker_mouse_color;
double m_marker_audio_position = 100.0; double m_marker_audio_position = 0.0;
double m_marker_mouse_position = 100.0; double m_marker_mouse_position = 100.0;
bool m_shift_press = false; bool m_shift_press = false;
}; };

View File

@@ -1,6 +1,5 @@
#include "monitor/gui/components/snapshot/snapshot.hpp" #include "monitor/gui/components/snapshot/snapshot.hpp"
#include "monitor/utils/var.hpp" #include "monitor/utils/var.hpp"
#include "monitor/utils/event_type.hpp"
namespace monitor::components namespace monitor::components
{ {
@@ -32,8 +31,5 @@ namespace monitor::components
m_snapshot_id = hack::security::generate_uuid(); m_snapshot_id = hack::security::generate_uuid();
m_setup = setup; m_setup = setup;
m_base_plugins.init(m_snapshot_id, m_setup); m_base_plugins.init(m_snapshot_id, m_setup);
VE::event e { utils::event_type::INIT_AUDIO, std::pair<std::string, std::filesystem::path>(m_snapshot_id, setup.m_file) };
EMIT(e);
} }
} }

View File

@@ -29,8 +29,8 @@ namespace monitor::components
s->init(setup); s->init(setup);
m_snapshots.push_back(s); m_snapshots.push_back(s);
VE::event e0 { utils::event_type::CREATE_SNAPSHOT_COMPLETED, nullptr }; VE::event e { utils::event_type::CREATE_SNAPSHOT_COMPLETED, nullptr };
EMIT(e0); EMIT(e);
change_tab(m_snapshots.size() - 1); change_tab(m_snapshots.size() - 1);
} }

View File

@@ -15,7 +15,7 @@ namespace monitor::libs
// сделать выбор устройства из интерфейса // сделать выбор устройства из интерфейса
// поставь, то которое есть в списке устройств // поставь, то которое есть в списке устройств
for (auto& d : devices) std::cout << d << std::endl; for (auto& d : devices) std::cout << d << std::endl;
std::string target_device = devices[1]; std::string target_device = devices[2];
if (sf::PlaybackDevice::setDevice(target_device)) if (sf::PlaybackDevice::setDevice(target_device))
hack::log()("Устройство успешно установлено: ", target_device); hack::log()("Устройство успешно установлено: ", target_device);
else else
@@ -25,12 +25,10 @@ namespace monitor::libs
void audio::set_file(std::filesystem::path p) void audio::set_file(std::filesystem::path p)
{ {
if (!m_music.openFromFile(p)) hack::error()("dont open file:", p.string()); if (!m_music.openFromFile(p)) hack::error()("dont open file:", p.string());
hack::log()("0", m_music.getDuration().asMicroseconds());
std::vector<std::string> devices = sf::PlaybackDevice::getAvailableDevices();
std::string targetDevice = devices[1];
} }
void audio::set_callback(std::function<void(sf::Time, float)> c) void audio::set_callback(std::function<void(sf::Time)> c)
{ {
m_callback = c; m_callback = c;
} }
@@ -40,11 +38,6 @@ namespace monitor::libs
m_music.setPlayingOffset(t); m_music.setPlayingOffset(t);
} }
void audio::set_step(std::size_t step)
{
// m_step = sf::microseconds(m_music.getDuration().asMicroseconds() / step);
}
void audio::set_audio_pos(double s) void audio::set_audio_pos(double s)
{ {
// m_ct = sf::microseconds(s * m_step.asMicroseconds()); // m_ct = sf::microseconds(s * m_step.asMicroseconds());
@@ -65,11 +58,7 @@ namespace monitor::libs
void audio::emit() void audio::emit()
{ {
while (is_playing()) while (is_playing()) m_callback(m_music.getPlayingOffset());
{
m_callback(m_music.getPlayingOffset(), 1.0);
sf::sleep(m_step);
}
} }
bool audio::is_playing() bool audio::is_playing()

View File

@@ -20,8 +20,7 @@ namespace monitor::libs
void pause(); void pause();
void toggle_play(); void toggle_play();
bool is_playing(); bool is_playing();
void set_callback(std::function<void(sf::Time, float)> c); void set_callback(std::function<void(sf::Time)> c);
void set_step(std::size_t step);
void set_audio_pos(double s); void set_audio_pos(double s);
void set_audio_pos(sf::Time t); void set_audio_pos(sf::Time t);
@@ -33,7 +32,7 @@ namespace monitor::libs
sf::Music m_music; sf::Music m_music;
sf::Time m_ct = sf::Time::Zero; sf::Time m_ct = sf::Time::Zero;
sf::Time m_step = sf::Time::Zero; sf::Time m_step = sf::Time::Zero;
std::function<void(sf::Time, float)> m_callback; std::function<void(sf::Time)> m_callback;
}; };
} }

View File

@@ -31,8 +31,8 @@ namespace monitor::utils
// градуировка осьи X // градуировка осьи X
hr::fvec_t m_ox; hr::fvec_t m_ox;
// размер данных для отрисовки. уситанавливает размер графика // размер данных для отрисовки. устанавливает размер графика
// штука плавающая в зависимости от масштаба // и он меняется в зависимости от компересии
std::size_t m_size = utils::var::MAX_RENDER_SIZE; std::size_t m_size = utils::var::MAX_RENDER_SIZE;
// кол-во линий графика // кол-во линий графика
@@ -44,12 +44,10 @@ namespace monitor::utils
std::vector<hr::fvec_t> m_line_data; std::vector<hr::fvec_t> m_line_data;
// говорит нужно ли делать сжатие графика ли нет // говорит нужно ли делать сжатие графика ли нет
bool m_is_scale = false; bool m_comporession = false;
std::size_t m_step = 0; // шаг сжатия
std::size_t m_comporession_step = 0;
// это кол-во точек, которые нужно отрисовать с учетом текущего масштаба но в прошлом шаге
std::size_t m_past_k2 = 0;
public: public:
virtual bool empty() { return m_result.empty(); } virtual bool empty() { return m_result.empty(); }
@@ -58,16 +56,13 @@ namespace monitor::utils
{ {
try try
{ {
auto raw_data_size = m_result.m_size; m_comporession = m_result.m_size > m_size;
if (raw_data_size == 0) throw std::invalid_argument("Error set data in plugin: empty data"); if (!m_comporession) m_size = m_result.m_size;
m_is_scale = raw_data_size > m_size;
m_line_count = m_result.m_data.size(); m_line_count = m_result.m_data.size();
m_line_data.reserve(m_line_count); m_line_data.reserve(m_line_count);
for (std::size_t i = 0; i < m_line_count; ++i) m_line_data.push_back(hr::fvec_t(m_size, 0.f)); for (std::size_t i = 0; i < m_line_count; ++i) m_line_data.push_back(hr::fvec_t(m_size, 0.f));
m_ox.reserve(m_size);
fill_ox(); fill_ox();
} }
catch(std::exception& e) catch(std::exception& e)
@@ -78,17 +73,15 @@ namespace monitor::utils
virtual void fill_ox(std::size_t start_pos = 0) virtual void fill_ox(std::size_t start_pos = 0)
{ {
m_ox.clear(); m_ox.reserve(m_size);
for (std::size_t i = start_pos; i < m_size + start_pos; ++i) m_ox.push_back(i); for (std::size_t i = start_pos; i < m_size + start_pos; ++i) m_ox.push_back(i);
} }
// этот метод запускается один раз при первом рендеринге
// для заполнения начальными данными
virtual void fill() virtual void fill()
{ {
if (m_is_scale) if (m_comporession)
{ {
m_step = m_result.m_size / m_size + 1; m_comporession_step = m_result.m_size / m_size;
std::size_t line_count = 0; std::size_t line_count = 0;
for (auto& gd : m_line_data) for (auto& gd : m_line_data)
@@ -97,21 +90,22 @@ namespace monitor::utils
for (auto& g : gd) for (auto& g : gd)
{ {
float tmp_e = 0.f; float tmp_e = 0.f;
for (std::size_t j = bin_index - m_step; j < bin_index; ++j) for (std::size_t j = bin_index - m_comporession_step; j < bin_index; ++j)
{ {
auto e = m_result.m_data[line_count][j].m_value; auto e = m_result.m_data[line_count][j].m_value;
tmp_e = hack::math::max_abs(e, tmp_e); tmp_e = hack::math::max_abs(e, tmp_e);
} }
g = tmp_e; g = tmp_e;
bin_index += m_step; bin_index += m_comporession_step;
if (bin_index > m_result.m_size) bin_index = m_result.m_size; if (bin_index > m_result.m_size) bin_index = m_result.m_size;
} }
m_size = bin_index / m_comporession_step;
hack::log()(m_comporession_step, m_size);
++line_count; ++line_count;
} }
} }
else else
{ {
// заполняется, когда данных пришло меньше чем нужно для полного рендеринга
std::size_t line_count = 0; std::size_t line_count = 0;
for (auto el : m_result.m_data) for (auto el : m_result.m_data)
{ {

View File

@@ -43,7 +43,7 @@ namespace monitor::utils::plugins
// для заполнения начальными данными // для заполнения начальными данными
virtual void fill() virtual void fill()
{ {
if (m_is_scale) hack::error()("ДАнных больше чем можем отрисовать на экране, см. что-то с масштабированием..."); if (m_comporession) hack::error()("Данных больше чем можем отрисовать на экране, см. что-то с масштабированием...");
std::size_t line_count = 0; std::size_t line_count = 0;
for (auto el : m_result.m_data) for (auto el : m_result.m_data)