Scratching now also works when stopped

This commit is contained in:
2020-04-28 00:26:40 +02:00
parent 5bdf60fc82
commit 2919ca2db6
6 changed files with 65 additions and 5 deletions

View File

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

View File

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

View File

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

View File

@ -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<int, QPixmap> m_graphCache;
bool m_scratching{};
bool m_dragging{};
int m_mouseX;
QDateTime m_timestamp;
QTimer m_timer;

View File

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

View File

@ -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<Ui::TrackDeck> m_ui;
@ -45,4 +49,8 @@ private:
AudioPlayer m_player;
QString m_filename;
bool m_playingBeforeScratch;
float m_speedBeforeScratch;
bool m_stopOnEndBeforeScratch;
};