diff --git a/audioplayer.cpp b/audioplayer.cpp index 764fb5a..7232365 100644 --- a/audioplayer.cpp +++ b/audioplayer.cpp @@ -65,8 +65,11 @@ void AudioPlayer::writeSamples(frame_t *begin, frame_t *end) m_lastPositionUpdate = now; } - if (ended) - emit playingChanged(m_playing = false); + if (ended && m_stopOnEnd) + { + m_playing = false; + emit playingChanged(m_playing); + } } void AudioPlayer::setPlaying(bool playing) diff --git a/audioplayer.h b/audioplayer.h index f9f82a4..ca50d46 100644 --- a/audioplayer.h +++ b/audioplayer.h @@ -31,6 +31,9 @@ public: float volume() const { return m_volume; } void setVolume(float volume); + bool stopOnEnd() { return m_stopOnEnd; } + void setStopOnEnd(bool stopOnEnd) { m_stopOnEnd = stopOnEnd; emit stopOnEndChanged(m_stopOnEnd); } + const QAudioBuffer &buffer() const { return m_buffer; } void setBuffer(const QAudioBuffer &buffer); @@ -43,6 +46,7 @@ signals: void positionChanged(double position); void speedChanged(float speed); void volumeChanged(float volume); + void stopOnEndChanged(bool stopOnEnd); void bufferChanged(const QAudioBuffer &buffer); private: @@ -50,6 +54,7 @@ private: double m_position{}; float m_speed{1.f}; float m_volume{1.f}; + bool m_stopOnEnd{true}; QAudioBuffer m_buffer; QDateTime m_lastPositionUpdate; diff --git a/scratchwidget.cpp b/scratchwidget.cpp index 4245620..5344d02 100644 --- a/scratchwidget.cpp +++ b/scratchwidget.cpp @@ -68,6 +68,7 @@ void ScratchWidget::mousePressEvent(QMouseEvent *event) m_mouseX = event->x(); m_timestamp = QDateTime::currentDateTime(); setMouseTracking(true); + emit scratchBegin(); } } @@ -79,6 +80,7 @@ void ScratchWidget::mouseReleaseEvent(QMouseEvent *event) emit scratchSpeed(1.f); m_scratching = false; setMouseTracking(false); + emit scratchEnd(); } } diff --git a/scratchwidget.h b/scratchwidget.h index fcae5d9..06a3ca8 100644 --- a/scratchwidget.h +++ b/scratchwidget.h @@ -20,7 +20,9 @@ public: void setPosition(std::size_t position) { m_position = position; repaint(); } signals: + void scratchBegin(); void scratchSpeed(float speed); + void scratchEnd(); protected: void paintEvent(QPaintEvent *event) override; @@ -39,6 +41,7 @@ private: QCache m_graphCache; bool m_scratching{}; + bool m_dragging{}; int m_mouseX; QDateTime m_timestamp; QTimer m_timer; diff --git a/trackdeck.cpp b/trackdeck.cpp index ac33a28..047b4c9 100644 --- a/trackdeck.cpp +++ b/trackdeck.cpp @@ -25,13 +25,14 @@ TrackDeck::TrackDeck(QWidget *parent) : connect(m_ui->verticalSliderVolume, &QAbstractSlider::valueChanged, &m_player, [&player=m_player](int value){ player.setVolume(float(value)/100.f); }); - connect(m_ui->horizontalSliderSpeed, &QAbstractSlider::valueChanged, &m_player, [&player=m_player](int value){ player.setSpeed(float(value)/100.f); }); + connect(m_ui->horizontalSliderSpeed, &QAbstractSlider::valueChanged, this, &TrackDeck::speedChanged); connect(m_ui->previewWidget, &PreviewWidget::positionSelected, &m_player, &AudioPlayer::setPosition); connect(&m_player, &AudioPlayer::positionChanged, m_ui->previewWidget, &PreviewWidget::setPosition); - connect(m_ui->scratchWidget, &ScratchWidget::scratchSpeed, &m_player, &AudioPlayer::setSpeed); + connect(m_ui->scratchWidget, &ScratchWidget::scratchBegin, this, &TrackDeck::scratchBegin); + connect(m_ui->scratchWidget, &ScratchWidget::scratchEnd, this, &TrackDeck::scratchEnd); connect(&m_player, &AudioPlayer::positionChanged, m_ui->scratchWidget, &ScratchWidget::setPosition); - connect(&m_player, &AudioPlayer::playingChanged, m_ui->pushButtonPlay, [&button=*m_ui->pushButtonPlay](bool playing){ button.setText(playing ? tr("▮▮") : tr("▶")); }); + connect(&m_player, &AudioPlayer::playingChanged, this, &TrackDeck::updatePlayButtonText); } TrackDeck::~TrackDeck() = default; @@ -144,3 +145,41 @@ void TrackDeck::decodingFinished(const QAudioBuffer &buffer) m_ui->scratchWidget->setBuffer(buffer); m_ui->progressBar->hide(); } + +void TrackDeck::scratchBegin() +{ + disconnect(m_ui->horizontalSliderSpeed, &QAbstractSlider::valueChanged, this, &TrackDeck::speedChanged); + m_ui->horizontalSliderSpeed->setEnabled(false); + connect(m_ui->scratchWidget, &ScratchWidget::scratchSpeed, &m_player, &AudioPlayer::setSpeed); + disconnect(&m_player, &AudioPlayer::playingChanged, this, &TrackDeck::updatePlayButtonText); + + m_playingBeforeScratch = m_player.playing(); + m_player.setPlaying(true); + + m_speedBeforeScratch = m_player.speed(); + + m_stopOnEndBeforeScratch = m_player.stopOnEnd(); + m_player.setStopOnEnd(false); +} + +void TrackDeck::scratchEnd() +{ + m_player.setPlaying(m_playingBeforeScratch); + m_player.setSpeed(m_speedBeforeScratch); + m_player.setStopOnEnd(m_stopOnEndBeforeScratch); + + disconnect(m_ui->scratchWidget, &ScratchWidget::scratchSpeed, &m_player, &AudioPlayer::setSpeed); + m_ui->horizontalSliderSpeed->setEnabled(true); + connect(m_ui->horizontalSliderSpeed, &QAbstractSlider::valueChanged, this, &TrackDeck::speedChanged); + connect(&m_player, &AudioPlayer::playingChanged, this, &TrackDeck::updatePlayButtonText); +} + +void TrackDeck::speedChanged(int value) +{ + m_player.setSpeed(float(value)/100.f); +} + +void TrackDeck::updatePlayButtonText(bool playing) +{ + m_ui->pushButtonPlay->setText(playing ? tr("▮▮") : tr("▶")); +} diff --git a/trackdeck.h b/trackdeck.h index d7e8db7..5547067 100644 --- a/trackdeck.h +++ b/trackdeck.h @@ -36,6 +36,10 @@ protected: private slots: void decodingProgress(int progress, int total); void decodingFinished(const QAudioBuffer &buffer); + void scratchBegin(); + void scratchEnd(); + void speedChanged(int value); + void updatePlayButtonText(bool playing); private: const std::unique_ptr m_ui; @@ -45,4 +49,8 @@ private: AudioPlayer m_player; QString m_filename; + + bool m_playingBeforeScratch; + float m_speedBeforeScratch; + bool m_stopOnEndBeforeScratch; };