diff --git a/src/monitor/gui/components/audio/audio.hpp b/src/monitor/gui/components/audio/audio.hpp index f11bdae..9cf944e 100755 --- a/src/monitor/gui/components/audio/audio.hpp +++ b/src/monitor/gui/components/audio/audio.hpp @@ -11,23 +11,29 @@ namespace monitor::components VE_OVERIDE(); VE_EVENT_OVERIDE(); + private: + utils::var::STATUS m_status = utils::var::STATUS::EMPTY; + libs::audio m_player; + struct music + { + std::string m_id; + sf::Time m_current_time; + std::filesystem::path m_file; + } m_current_audio; + std::map m_audio_data; + + std::vector m_domains = { "time", "frequensy"}; + public: - void init(std::filesystem::path file); - void set_step(std::size_t step); - void set_pos(double pos); - void set_bs(std::string type, std::size_t bs); void toggle(); void pause(); void drop(); - void set_status(utils::var::STATUS s); - - private: - utils::var::STATUS m_status; - libs::audio m_player; - std::filesystem::path m_file; - std::vector m_domains = { "time", "frequensy"}; + void set_pos(double pos); + void set_step(std::size_t step); private: + void init(std::string snapshot_id, std::filesystem::path file); + void change(std::string snapshot_id); void callback(sf::Time time, double pos); }; } diff --git a/src/monitor/gui/components/audio/cpp/base.cpp b/src/monitor/gui/components/audio/cpp/base.cpp index 97d7756..2c4ec4c 100755 --- a/src/monitor/gui/components/audio/cpp/base.cpp +++ b/src/monitor/gui/components/audio/cpp/base.cpp @@ -31,25 +31,25 @@ namespace monitor::components m_player.pause(); } - void audio::init(std::filesystem::path file) + void audio::init(std::string snapshot_id, std::filesystem::path file) { - m_file = file; - m_player.set_file(m_file); + m_player.stop(); + m_current_audio = music{ .m_id = snapshot_id, .m_current_time = sf::Time(), .m_file = file }; + m_audio_data[snapshot_id] = m_current_audio; } - void audio::set_status(utils::var::STATUS s) + void audio::change(std::string snapshot_id) { - m_status = s; - } - - // step - шаг отправки сигнала на смещение маркера. он же кол-во block_size-ов на все произведение - void audio::set_step(std::size_t step) - { - m_player.set_step(step); + m_audio_data[m_current_audio.m_id].m_current_time = m_current_audio.m_current_time; + m_player.stop(); + m_current_audio = m_audio_data[snapshot_id]; + m_player.set_file(m_current_audio.m_file); + m_player.set_audio_pos(m_current_audio.m_current_time); } void audio::callback(sf::Time time, double pos) { + m_current_audio.m_current_time = time; VE::event e { utils::event_type::INCREMENT_MARKER_AUDIO_POSITION, pos }; EMIT(e); } @@ -65,4 +65,10 @@ namespace monitor::components { m_player.set_audio_pos(pos); } + + // step - шаг отправки сигнала на смещение маркера. он же кол-во block_size-ов на все произведение + void audio::set_step(std::size_t step) + { + m_player.set_step(step); + } } diff --git a/src/monitor/gui/components/audio/cpp/on_event.cpp b/src/monitor/gui/components/audio/cpp/on_event.cpp index e67c79a..96f7aa5 100755 --- a/src/monitor/gui/components/audio/cpp/on_event.cpp +++ b/src/monitor/gui/components/audio/cpp/on_event.cpp @@ -1,3 +1,4 @@ +#include #include "monitor/gui/components/audio/audio.hpp" #include "monitor/utils/event_type.hpp" @@ -5,8 +6,6 @@ namespace monitor::components { void audio::on_event(VE::event& e) { - if (m_status != utils::var::STATUS::ACTIVE) return; - if (e.m_type.type() == typeid(VE::event_type)) { auto type = std::any_cast(e.m_type); @@ -28,6 +27,27 @@ namespace monitor::components switch (type) { + case utils::event_type::SET_AUDIO_STATUS: + { + m_status = std::any_cast(e.m_data); + break; + } + + case utils::event_type::SET_AUDIO_FILE: + { + auto [snapshot_id, file] = std::any_cast>(e.m_data); + init(snapshot_id, file); + change(snapshot_id); + break; + } + + case utils::event_type::CHANGE_AUDIO_FILE: + { + auto snapshot_id = std::any_cast(e.m_data); + change(snapshot_id); + break; + } + case utils::event_type::AUDIO_PAUSE: { pause(); diff --git a/src/monitor/gui/components/audio/cpp/render.cpp b/src/monitor/gui/components/audio/cpp/render.cpp index 8cc3343..6aae600 100755 --- a/src/monitor/gui/components/audio/cpp/render.cpp +++ b/src/monitor/gui/components/audio/cpp/render.cpp @@ -5,6 +5,10 @@ namespace monitor::components { void audio::render() { + if (m_status != utils::var::STATUS::ACTIVE) return; + + ImGui::SameLine( ImGui::GetWindowSize().x / 2.2f ); + bool is_play = m_player.is_playing(); if (is_play) { @@ -27,7 +31,7 @@ namespace monitor::components } ImGui::PopStyleColor(3); - ImGui::SameLine(80.f); + ImGui::SameLine(); if (ImGui::Button("<<<")) { diff --git a/src/monitor/gui/components/creator/cpp/base.cpp b/src/monitor/gui/components/creator/cpp/base.cpp index d313a34..c4151b6 100644 --- a/src/monitor/gui/components/creator/cpp/base.cpp +++ b/src/monitor/gui/components/creator/cpp/base.cpp @@ -33,7 +33,7 @@ namespace monitor::components { m_status = utils::var::STATUS::COMPLETED; auto future = std::async(std::launch::async, [this]() { - std::this_thread::sleep_for(std::chrono::seconds(3)); + std::this_thread::sleep_for(std::chrono::seconds(1)); m_file_path.clear(); m_status = utils::var::STATUS::EMPTY; }); diff --git a/src/monitor/gui/components/panel/cpp/base.cpp b/src/monitor/gui/components/panel/cpp/base.cpp index a13c76d..1b0da23 100755 --- a/src/monitor/gui/components/panel/cpp/base.cpp +++ b/src/monitor/gui/components/panel/cpp/base.cpp @@ -6,6 +6,7 @@ namespace monitor::components { CONNECT(this); m_creator.on_attach(); + m_audio.on_attach(); m_helpers.on_attach(); } @@ -13,16 +14,16 @@ namespace monitor::components { DISCONNECT(); m_creator.on_detach(); + m_audio.on_detach(); m_helpers.on_detach(); } void panel::update() { m_size.x = VE::application::get()->get_glfw()->width(); - auto ctx = ImGui::GetCurrentContext(); - // m_size.x -= ctx->Style.FramePadding.x * 2.f; m_creator.update(); + m_audio.update(); m_helpers.update(); } } diff --git a/src/monitor/gui/components/panel/cpp/render.cpp b/src/monitor/gui/components/panel/cpp/render.cpp index f75fc4e..ce81848 100755 --- a/src/monitor/gui/components/panel/cpp/render.cpp +++ b/src/monitor/gui/components/panel/cpp/render.cpp @@ -9,6 +9,7 @@ namespace monitor::components ImGui::SetNextWindowSize(m_size); if (!ImGui::Begin(VE_NO_NAME("panel"), &m_open, m_win_flags)) ImGui::End(); m_creator.render(); + m_audio.render(); m_helpers.render(); ImGui::End(); } diff --git a/src/monitor/gui/components/panel/panel.hpp b/src/monitor/gui/components/panel/panel.hpp index 98391a9..22d2661 100755 --- a/src/monitor/gui/components/panel/panel.hpp +++ b/src/monitor/gui/components/panel/panel.hpp @@ -4,6 +4,7 @@ #include #include "monitor/gui/components/creator/creator.hpp" #include "monitor/gui/components/helpers/helpers.hpp" +#include "monitor/gui/components/audio/audio.hpp" namespace monitor::components { @@ -14,7 +15,8 @@ namespace monitor::components private: ImVec2 m_size = { 950.f, 37.f }; - components::creator m_creator; - components::helpers m_helpers; + creator m_creator; + audio m_audio; + helpers m_helpers; }; } diff --git a/src/monitor/gui/components/snapshot/cpp/base.cpp b/src/monitor/gui/components/snapshot/cpp/base.cpp index fd40fce..ad757d8 100755 --- a/src/monitor/gui/components/snapshot/cpp/base.cpp +++ b/src/monitor/gui/components/snapshot/cpp/base.cpp @@ -1,5 +1,6 @@ #include "monitor/gui/components/snapshot/snapshot.hpp" #include "monitor/utils/var.hpp" +#include "monitor/utils/event_type.hpp" namespace monitor::components { @@ -12,7 +13,6 @@ namespace monitor::components // HERE // то что ниже будем убирать - m_audio.on_attach(); m_markers.on_attach(); // m_plugins.emplace_back(combo{ .m_id = 0, .m_name = "Magnitude", .m_type = utils::var::PLUGIN_TYPE::MAGNITUDE }); // m_plugins.emplace_back(combo{ .m_id = 1, .m_name = "Energy", .m_type = utils::var::PLUGIN_TYPE::ENERGY }); @@ -22,16 +22,12 @@ namespace monitor::components { DISCONNECT(); m_base_plugins.on_detach(); - - m_audio.on_detach(); m_markers.on_detach(); } void snapshot::update() { m_base_plugins.update(); - - m_audio.update(); m_markers.update(); } @@ -39,14 +35,20 @@ namespace monitor::components { m_status = s; m_markers.set_status(m_status); - m_audio.set_status(m_status); } void snapshot::init(hr::setup setup) { + m_snapshot_id = hack::security::generate_uuid(); m_setup = setup; m_base_plugins.init(m_snapshot_id, m_setup); + VE::event e1 { utils::event_type::SET_AUDIO_STATUS, utils::var::STATUS::ACTIVE }; + EMIT(e1); + + VE::event e2 { utils::event_type::SET_AUDIO_FILE, std::pair(m_snapshot_id, setup.m_file) }; + EMIT(e2); + // HERE // auto r = hr::run(m_setup); // if (fill_raw_data(r)) diff --git a/src/monitor/gui/components/snapshot/snapshot.hpp b/src/monitor/gui/components/snapshot/snapshot.hpp index f4d4dad..635abe7 100755 --- a/src/monitor/gui/components/snapshot/snapshot.hpp +++ b/src/monitor/gui/components/snapshot/snapshot.hpp @@ -3,7 +3,6 @@ #include #include #include "monitor/utils/var.hpp" -#include "monitor/gui/components/audio/audio.hpp" #include "monitor/gui/components/markers/markers.hpp" #include "monitor/gui/components/base_plugins/base_plugins.hpp" #include "monitor/gui/components/base_controls/base_controls.hpp" @@ -23,7 +22,6 @@ namespace monitor::components std::string m_snapshot_id; utils::var::STATUS m_status; hr::setup m_setup; - audio m_audio; private: ImVec2 m_size = { 0.f, 0.f }; diff --git a/src/monitor/gui/components/tabs/cpp/base.cpp b/src/monitor/gui/components/tabs/cpp/base.cpp index 174ac0b..41a8344 100755 --- a/src/monitor/gui/components/tabs/cpp/base.cpp +++ b/src/monitor/gui/components/tabs/cpp/base.cpp @@ -29,17 +29,17 @@ namespace monitor::components s->init(setup); m_snapshots.push_back(s); - VE::event e { utils::event_type::CREATE_SNAPSHOT_COMPLETED, nullptr }; - EMIT(e); + VE::event e0 { utils::event_type::CREATE_SNAPSHOT_COMPLETED, nullptr }; + EMIT(e0); } void tabs::change_tab(std::size_t i) { - VE::event e { utils::event_type::AUDIO_PAUSE, m_current_open_index }; - EMIT(e); - m_snapshots[m_current_open_index]->set_status(utils::var::STATUS::INACTIVE); m_snapshots[i]->set_status(utils::var::STATUS::ACTIVE); m_current_open_index = i; + + VE::event e { utils::event_type::CHANGE_AUDIO_FILE, m_snapshots[i]->m_snapshot_id }; + EMIT(e); }; } diff --git a/src/monitor/libs/audio/audio.cpp b/src/monitor/libs/audio/audio.cpp index b46de53..4554779 100644 --- a/src/monitor/libs/audio/audio.cpp +++ b/src/monitor/libs/audio/audio.cpp @@ -35,15 +35,20 @@ namespace monitor::libs m_callback = c; } + void audio::set_audio_pos(sf::Time t) + { + m_music.setPlayingOffset(t); + } + void audio::set_step(std::size_t step) { - m_step = sf::microseconds(m_music.getDuration().asMicroseconds() / step); + // m_step = sf::microseconds(m_music.getDuration().asMicroseconds() / step); } void audio::set_audio_pos(double s) { - m_ct = sf::microseconds(s * m_step.asMicroseconds()); - m_music.setPlayingOffset(m_ct); + // m_ct = sf::microseconds(s * m_step.asMicroseconds()); + // m_music.setPlayingOffset(m_ct); } void audio::toggle_play() @@ -59,7 +64,7 @@ namespace monitor::libs // ATTENTION: это нужно делать тут именно ПОСЛЕ начала воспроизведения // а НЕ перед воспроизведением. т.к. установка времени перед проигрыванием не работает // см. https://www.sfml-dev.org/documentation/2.6.1/classsf_1_1SoundStream.php#af416a5f84c8750d2acb9821d78bc8646 - m_music.setPlayingOffset(m_ct); + // m_music.setPlayingOffset(m_ct); emit(); } @@ -68,8 +73,7 @@ namespace monitor::libs { while (is_playing()) { - m_ct = m_music.getPlayingOffset(); - m_callback(sf::Time(), 1.0); + m_callback(m_music.getPlayingOffset(), 1.0); sf::sleep(m_step); } } diff --git a/src/monitor/libs/audio/audio.hpp b/src/monitor/libs/audio/audio.hpp index c3071b6..6c11df6 100644 --- a/src/monitor/libs/audio/audio.hpp +++ b/src/monitor/libs/audio/audio.hpp @@ -23,6 +23,7 @@ namespace monitor::libs void set_callback(std::function c); void set_step(std::size_t step); void set_audio_pos(double s); + void set_audio_pos(sf::Time t); private: void emit(); @@ -31,7 +32,7 @@ namespace monitor::libs std::filesystem::path m_file; sf::Music m_music; sf::Time m_ct = sf::Time::Zero; - sf::Time m_step; + sf::Time m_step = sf::Time::Zero; std::function m_callback; }; } diff --git a/src/monitor/utils/event_type.hpp b/src/monitor/utils/event_type.hpp index b17f692..4326ce4 100644 --- a/src/monitor/utils/event_type.hpp +++ b/src/monitor/utils/event_type.hpp @@ -8,8 +8,9 @@ namespace monitor::utils CREATE_SNAPSHOT_COMPLETED, STATUS_PROCESS, STATUS_COMPLETED, - - + SET_AUDIO_STATUS, + SET_AUDIO_FILE, + CHANGE_AUDIO_FILE, /// делать