Files
DrumMachine/audioplayer.h

67 lines
1.7 KiB
C
Raw Normal View History

2020-04-26 20:49:20 +02:00
#pragma once
#include <atomic>
2020-04-29 19:48:41 +02:00
#include <optional>
2020-04-26 20:49:20 +02:00
#include <QObject>
#include <QAudioBuffer>
#include <QtGlobal>
#include <QDateTime>
2022-12-27 21:19:21 +01:00
struct frame_t;
2020-04-26 20:49:20 +02:00
class AudioPlayer : public QObject
{
Q_OBJECT
public:
explicit AudioPlayer(QObject *parent = nullptr);
explicit AudioPlayer(const QAudioBuffer &buffer, QObject *parent = nullptr);
void writeSamples(frame_t *begin, frame_t *end);
bool playing() const { return m_playing; }
2020-04-27 22:59:30 +02:00
void setPlaying(bool playing);
2020-04-26 20:49:20 +02:00
2020-04-27 22:59:30 +02:00
double position() const { return m_position; }
void setPosition(double position);
float speed() const { return m_speed; }
void setSpeed(float speed);
float volume() const { return m_volume; }
void setVolume(float volume);
2020-04-26 20:49:20 +02:00
2020-04-28 00:26:40 +02:00
bool stopOnEnd() { return m_stopOnEnd; }
void setStopOnEnd(bool stopOnEnd) { m_stopOnEnd = stopOnEnd; emit stopOnEndChanged(m_stopOnEnd); }
2020-04-26 20:49:20 +02:00
const QAudioBuffer &buffer() const { return m_buffer; }
2020-04-27 22:59:30 +02:00
void setBuffer(const QAudioBuffer &buffer);
2020-04-26 20:49:20 +02:00
2020-04-29 19:48:41 +02:00
const std::optional<std::pair<double, double>> &loop() const { return m_loop; }
void setLoop(const std::optional<std::pair<double, double>> &loop) { m_loop = loop; }
2020-04-27 22:59:30 +02:00
void togglePlaying();
2020-04-26 20:49:20 +02:00
void restart();
void stop();
signals:
void playingChanged(bool playing);
2020-04-27 22:59:30 +02:00
void positionChanged(double position);
void speedChanged(float speed);
void volumeChanged(float volume);
2020-04-28 00:26:40 +02:00
void stopOnEndChanged(bool stopOnEnd);
2020-04-26 20:49:20 +02:00
void bufferChanged(const QAudioBuffer &buffer);
private:
bool m_playing{false};
2020-04-27 22:59:30 +02:00
double m_position{};
float m_speed{1.f};
float m_volume{1.f};
2020-04-28 00:26:40 +02:00
bool m_stopOnEnd{true};
2020-04-26 20:49:20 +02:00
QAudioBuffer m_buffer;
2020-04-29 19:48:41 +02:00
std::optional<std::pair<double, double>> m_loop;
2020-04-26 20:49:20 +02:00
QDateTime m_lastPositionUpdate;
};