#pragma once #include #include #include #include #include #include #include #include #include "utf8_sfml_redefinitions.hpp" #include "variant_visitor.hpp" namespace waveform { struct DataPoint { using value_type = std::int16_t; value_type min = 0; value_type max = 0; }; using DataFrame = std::vector; using Channels = std::vector; struct ChunkSizes { unsigned int reference; float fractional; float frac_to_ref_ratio; }; struct Waveform { std::map channels_per_chunk_size; std::vector chunk_sizes; // for fast nth chunk size access std::size_t sample_rate; std::size_t channel_count; ChunkSizes zoom_to_params(int zoom) const; }; Channels load_initial_summary( feis::InputSoundFile& sound_file, const unsigned int window_size ); Channels downsample_to_half(const Channels& summary); std::optional compute_waveform(const std::filesystem::path& audio); namespace status { struct NoAudioFile {}; struct Loading {}; struct ErrorDuringLoading {}; struct Loaded { Waveform& waveform; }; } using Status = std::variant< status::NoAudioFile, status::Loading, status::ErrorDuringLoading, status::Loaded >; const auto status_message = VariantVisitor { [](status::NoAudioFile) -> std::optional {return "No Audio File";}, [](status::Loading) -> std::optional {return "Loading ...";}, [](status::ErrorDuringLoading) -> std::optional {return "Error while loading waveform";}, [](status::Loaded) -> std::optional {return {};}, }; }