/*** Olive - Non-Linear Video Editor Copyright (C) 2022 Olive Team Modifications Copyright (C) 2025 mikesolar This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see . ***/ #ifndef OAK_AUDIOMONITORWIDGET_H #define OAK_AUDIOMONITORWIDGET_H #include #include #include #include #include "oakutil/define.h" namespace olive { // Same namespace bridge the engine audio headers used to provide // (unqualified Rational/AudioParams/SampleBuffer inside namespace olive). using namespace core; class AudioMonitor : public QOpenGLWidget { Q_OBJECT public: AudioMonitor(QWidget *parent = nullptr); virtual ~AudioMonitor() override; bool is_playing() const { return waveform_; } static void start_waveform_on_all(const void *waveform, const Rational &start, int playback_speed) { foreach (AudioMonitor *m, instances) { m->start_waveform(waveform, start, playback_speed); } } static void stop_on_all() { foreach (AudioMonitor *m, instances) { m->stop(); } } static void push_sample_buffer_on_all(const SampleBuffer &d) { foreach (AudioMonitor *m, instances) { m->push_sample_buffer(d); } } public slots: void set_params(const AudioParams ¶ms); void stop(); void push_sample_buffer(const SampleBuffer &samples); void start_waveform(const void *waveform, const Rational &start, int playback_speed); protected: virtual void paintGL() override; virtual void mousePressEvent(QMouseEvent *event) override; private: void set_update_loop(bool e); void update_values_from_waveform(QVector &v, qint64 delta_time); /** * @brief Fold a per-channel min/max summary (POD arrays from * oakengine_waveform_cache_get_summary()) into the internal values. */ void audio_visual_waveform_sample_to_internal_values( const double *min_vals, const double *max_vals, int channels, QVector &out); void push_value(const QVector &v); void bytes_to_sample_summary(const QByteArray &bytes, QVector &v); QVector get_averages() const; AudioParams params_; qint64 last_time_; const void *waveform_; Rational waveform_time_; Rational waveform_length_; int playback_speed_; QVector> values_; QVector peaked_; QPixmap cached_background_; int cached_channels_; static QVector instances; }; } #endif // OAK_AUDIOMONITORWIDGET_H