add audio player

This commit is contained in:
2026-03-27 15:42:08 +03:00
parent c049455a88
commit 66e1f70141
14 changed files with 98 additions and 52 deletions

View File

@@ -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<std::string, music> m_audio_data;
std::vector<std::string> 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<std::string> 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);
};
}

View File

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

View File

@@ -1,3 +1,4 @@
#include <harmonica.hpp>
#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<VE::event_type>(e.m_type);
@@ -28,6 +27,27 @@ namespace monitor::components
switch (type)
{
case utils::event_type::SET_AUDIO_STATUS:
{
m_status = std::any_cast<utils::var::STATUS>(e.m_data);
break;
}
case utils::event_type::SET_AUDIO_FILE:
{
auto [snapshot_id, file] = std::any_cast<std::pair<std::string, std::filesystem::path>>(e.m_data);
init(snapshot_id, file);
change(snapshot_id);
break;
}
case utils::event_type::CHANGE_AUDIO_FILE:
{
auto snapshot_id = std::any_cast<std::string>(e.m_data);
change(snapshot_id);
break;
}
case utils::event_type::AUDIO_PAUSE:
{
pause();

View File

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

View File

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

View File

@@ -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();
}
}

View File

@@ -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();
}

View File

@@ -4,6 +4,7 @@
#include <harmonica.hpp>
#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;
};
}

View File

@@ -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<std::string, std::filesystem::path>(m_snapshot_id, setup.m_file) };
EMIT(e2);
// HERE
// auto r = hr::run<hr::plugins::raw_data>(m_setup);
// if (fill_raw_data(r))

View File

@@ -3,7 +3,6 @@
#include <VE.hpp>
#include <harmonica.hpp>
#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 };

View File

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

View File

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

View File

@@ -23,6 +23,7 @@ namespace monitor::libs
void set_callback(std::function<void(sf::Time, float)> 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<void(sf::Time, float)> m_callback;
};
}

View File

@@ -8,8 +8,9 @@ namespace monitor::utils
CREATE_SNAPSHOT_COMPLETED,
STATUS_PROCESS,
STATUS_COMPLETED,
SET_AUDIO_STATUS,
SET_AUDIO_FILE,
CHANGE_AUDIO_FILE,
/// делать