#include "audioplayer.h"
#include<QIcon>
#include<QLabel>
#include<QToolButton>
#include<QSlider>
#include<QHBoxLayout>
#include<QVBoxLayout>
#include<QFileDialog>
#include<QMediaPlayer>
#include<QStandardPaths>
#include<QTime>
#include"denoiser/denoiser.h"
#include<QLineEdit>
#include<QFile>
audioplayer::audioplayer(QWidget *parent) : QWidget(parent)
{
createWidgets();
QString style;
style = Uiload();
setStyleSheet(style);
}
void audioplayer::createWidgets()
{
saveAudio =new QToolButton(this);
saveAudio->setToolTip(tr("Save Audio"));
saveAudio->setIcon(QIcon(":/images/save.png"));
saveAudio->setStyleSheet("background:transparent");
connect(saveAudio,SIGNAL(clicked(bool)),this,SLOT(saveAudioFile()));
playButton = new QToolButton(this);
playButton->setEnabled(false);
playButton->setToolTip(tr("Play"));
playButton->setIcon(QIcon(":/images/play.png"));
connect(playButton,SIGNAL(clicked(bool)), this, SLOT(togglePlayback()));
forwardToolButton =new QToolButton(this);
forwardToolButton->setToolTip(tr("next"));
forwardToolButton->setIcon(QIcon(":/images/skipForward.png"));
connect(forwardToolButton,SIGNAL(clicked(bool)),this,SLOT(seekForward()));
backwardToolButton =new QToolButton(this);
backwardToolButton->setToolTip(tr("Back"));
backwardToolButton->setIcon(QIcon(":/images/skipBackward.png"));
connect(backwardToolButton,SIGNAL(clicked(bool)),this,SLOT(seekBackward()));
openfileButton = new QToolButton(this);
openfileButton->setIcon(QIcon(":/images/open.png"));
openfileButton->setIconSize(QSize(24,24));
openfileButton->setStyleSheet("background:transparent");
openfileButton->setToolTip(tr("Open a file..."));
openfileButton->setFixedSize(playButton->sizeHint());
connect(openfileButton,SIGNAL(clicked(bool)), this, SLOT(openFile()));
positionSlider = new QSlider(Qt::Horizontal, this);
positionSlider->setEnabled(false);
positionSlider->setToolTip(tr("Seek"));
connect(positionSlider, SIGNAL(valueChanged(int)), this, SLOT(setPosition(int)));
infoLabel = new QLabel(this);
positionLabel = new QLabel(tr("00:00"), this);
positionLabel->setMinimumWidth(positionLabel->sizeHint().width());
denoiserWidget =new denoiser(this);
connect(denoiserWidget,SIGNAL(ListenEmited()),this,SLOT(onStartListened()));
QHBoxLayout *controlLayout = new QHBoxLayout;
controlLayout->setMargin(0);
controlLayout->addWidget(openfileButton);
controlLayout->addWidget(saveAudio);
controlLayout->addWidget(positionSlider);
controlLayout->addWidget(positionLabel);
controlLayout->addWidget(playButton);
controlLayout->addWidget(forwardToolButton);
controlLayout->addWidget(backwardToolButton);
//QLineEdit *test = new QLineEdit(this);
QVBoxLayout *mainLayout = new QVBoxLayout(this);
mainLayout->addWidget(infoLabel);
mainLayout->addLayout(controlLayout);
mainLayout->addStretch();
mainLayout->addWidget(denoiserWidget);
//mainLayout->addWidget(test);
//control the progressbar
connect(&mediaPlayer, &QMediaPlayer::positionChanged, this, &audioplayer::updatePosition);
connect(&mediaPlayer, &QMediaPlayer::durationChanged, this, &audioplayer::updateDuration);
connect(&mediaPlayer, &QMediaObject::metaDataAvailableChanged, this, &audioplayer::updateInfo);
connect(&mediaPlayer,&QMediaPlayer::stateChanged,this,&audioplayer::updateState);
}
void audioplayer::openFile()
{
const QStringList musicPaths = QStandardPaths::standardLocations(QStandardPaths::MusicLocation);
const QString filePath =
QFileDialog::getOpenFileName(this, tr("Open File"),
musicPaths.isEmpty() ? QDir::homePath() : musicPaths.first(),
tr("MP3 files (*.mp3);;All files (*.*)"));
if (!filePath.isEmpty())
playFile(filePath);
}
void audioplayer::playFile(const QString &filePath)
{
playButton->setEnabled(true);
infoLabel->setText(QFileInfo(filePath).fileName());
mediaPlayer.setMedia(QUrl::fromLocalFile(filePath));
mediaPlayer.play();
}
void audioplayer::togglePlayback()
{
if (mediaPlayer.mediaStatus() == QMediaPlayer::NoMedia)
openFile();
else if (mediaPlayer.state() == QMediaPlayer::PlayingState)
mediaPlayer.pause();
else
mediaPlayer.play();
}
void audioplayer::seekForward()
{
positionSlider->triggerAction(QSlider::SliderPageStepAdd);
}
void audioplayer::seekBackward()
{
positionSlider->triggerAction(QSlider::SliderPageStepSub);
}
void audioplayer::updateState(QMediaPlayer::State state)
{
if (state == QMediaPlayer::PlayingState) {
playButton->setToolTip(tr("Pause"));
playButton->setIcon(QIcon(":/images/pause.png"));
} else {
playButton->setToolTip(tr("Play"));
playButton->setIcon(QIcon(":/images/play.png"));
}
}
void audioplayer::updateDuration(qint64 duration)
{
positionSlider->setRange(0,duration);
positionSlider->setEnabled(duration>0);
positionSlider->setPageStep(duration/10);
}
void audioplayer::updatePosition(qint64 position)
{
positionSlider->setValue(position);
QTime duration(0, position / 60000, qRound((position % 60000) / 1000.0));
positionLabel->setText(duration.toString(tr("mm:ss")));
}
void audioplayer::setPosition(int position)
{
if (qAbs(mediaPlayer.position() - position) > 99)
mediaPlayer.setPosition(position);
}
void audioplayer::updateInfo()
{
QStringList info;
QString author = mediaPlayer.metaData("Author").toString();
if (!author.isEmpty())
info += author;
QString title = mediaPlayer.metaData("Title").toString();
if (!title.isEmpty())
info += title;
if (!info.isEmpty())
infoLabel->setText(info.join(tr(" - ")));
}
void audioplayer::saveAudioFile()
{
//add the method for solving the binary data and generating the audio files
}
void audioplayer::onStartListened()
{
positionSlider->triggerAction(QSlider::SliderPageStepAdd);
}
QString audioplayer::Uiload()
{
QFile file(":/images/uistyle.qss");
file.open(QFile::ReadOnly);
QString strStyle = QString::fromLatin1(file.readAll());
return strStyle;
}
评论7