Scratching now also works when stopped
This commit is contained in:
@ -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)
|
||||
|
@ -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;
|
||||
|
@ -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();
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -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;
|
||||
|
@ -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("▶"));
|
||||
}
|
||||
|
@ -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;
|
||||
};
|
||||
|
Reference in New Issue
Block a user