143 lines
4.9 KiB
C++
143 lines
4.9 KiB
C++
#include "MainWidget.h"
|
|
#include <QAudioRecorder>
|
|
#include <QDebug>
|
|
#include <QFileDialog>
|
|
#include <QVBoxLayout>
|
|
#include <QHBoxLayout>
|
|
#include <QLineEdit>
|
|
#include <QPushButton>
|
|
#include <QComboBox>
|
|
#include <QMediaPlayer>
|
|
#include <QAudioFormat>
|
|
#include "core/AudioPlot.h"
|
|
#include "core/AudioAxis.h"
|
|
#include <QTimer>
|
|
#include <QLabel>
|
|
#include "core/AudioPlotData.h"
|
|
#include "core/AudioPlottable.h"
|
|
#include <QAudioDeviceInfo>
|
|
#include <QAudioOutput>
|
|
|
|
QVBoxLayout* createVBoxLayout(const QVector<QWidget*>& widgets) {
|
|
auto layout = new QVBoxLayout;
|
|
for (auto widget : widgets) {
|
|
layout->addWidget(widget);
|
|
}
|
|
return layout;
|
|
}
|
|
|
|
QHBoxLayout* createHBoxLayout(const QVector<QWidget*>& widgets) {
|
|
auto layout = new QHBoxLayout;
|
|
for (auto widget : widgets) {
|
|
layout->addWidget(widget);
|
|
}
|
|
return layout;
|
|
}
|
|
|
|
MainWidget::MainWidget() {
|
|
auto layout = new QVBoxLayout;
|
|
setLayout(layout);
|
|
QAudioEncoderSettings audioSettings;
|
|
audioSettings.setCodec("audio/pcm"); // 使用PCM编码
|
|
audioSettings.setSampleRate(44100); // 设置采样率
|
|
audioSettings.setChannelCount(1); // 设置为单声道
|
|
audioSettings.setQuality(QMultimedia::HighQuality); // 设置音质
|
|
audioSettings.setEncodingMode(QMultimedia::ConstantBitRateEncoding); // 设置编码模式
|
|
audioSettings.setBitRate(16); // 设置比特率
|
|
QString container = "audio/wav";
|
|
|
|
mAudioPlot = new AudioPlot;
|
|
mAudioPlot->init();
|
|
mAudioPlot->mObjectName = "AudioPlot";
|
|
mAudioPlot->bindRenderThread("AudioPlotThread");
|
|
|
|
|
|
connect(mAudioPlot, &AudioPlot::audioChanged, [this](Audio* oldAudio, Audio* newAudio) {
|
|
if(newAudio) {
|
|
QString filePath = newAudio->fullPath();
|
|
if (!QFileInfo::exists(filePath)) {
|
|
qDebug() << "File does not exist:" << filePath;
|
|
return;
|
|
}
|
|
mPlayer->setMedia(QUrl::fromLocalFile(filePath));
|
|
mPlayer->setVolume(50);
|
|
mPlayer->play();
|
|
}
|
|
if(!newAudio && oldAudio) {
|
|
mPlayer->pause();
|
|
}
|
|
});
|
|
mPlayer = new QMediaPlayer;
|
|
{
|
|
mAudioPlotTimer = new QTimer(this);
|
|
mAudioPlotTimer->setTimerType(Qt::PreciseTimer);
|
|
|
|
auto selectLine = new QHBoxLayout;
|
|
selectLine->addWidget(new QLabel("选择线:"));
|
|
mSelectLineIndex = new QComboBox;
|
|
int n = mAudioPlot->mAudioPlotData->mLines.size();
|
|
for(int i = 0; i < n; ++i) {
|
|
mSelectLineIndex->addItem(QString::number(i));
|
|
}
|
|
selectLine->addWidget(mSelectLineIndex);
|
|
|
|
layout->addLayout(selectLine);
|
|
auto back = new QPushButton("回到起点");
|
|
selectLine->addWidget(back);
|
|
connect(back, &QPushButton::clicked, [this]() {
|
|
mAudioPlot->xAxis->setAX(mAudioPlot->mAudioPlotData->startPixel() -mAudioPlot->width());
|
|
mAudioPlot->update();
|
|
});
|
|
|
|
|
|
auto play = new QPushButton("播放");
|
|
selectLine->addWidget(play);
|
|
connect(play, &QPushButton::clicked, [this]() {
|
|
mAudioPlot->mAudioPlotData->curLine = mAudioPlot->mAudioPlotData->mLines[mSelectLineIndex->currentText().toInt()];
|
|
mAudioPlot->mAudioPlottable->setInit();
|
|
mAudioPlotTimer->start(30);
|
|
});
|
|
QObject::connect(mAudioPlotTimer, &QTimer::timeout, [this]() {
|
|
mAudioPlot->mAudioPlottable->move(mAudioPlotTimer->interval());
|
|
mAudioPlot->update();
|
|
if(mAudioPlot->mAudioPlottable->isStop()) {
|
|
mAudioPlotTimer->stop();
|
|
}
|
|
});
|
|
auto pause = new QPushButton("暂停");
|
|
selectLine->addWidget(pause);
|
|
connect(pause, &QPushButton::clicked, [this]() {
|
|
mAudioPlotTimer->stop();
|
|
});
|
|
}
|
|
|
|
{
|
|
auto selectTime = new QHBoxLayout;
|
|
selectTime->addWidget(new QLabel("输入返回的时间:"));
|
|
auto inputBackTime = new QLineEdit;
|
|
selectTime->addWidget(inputBackTime);
|
|
auto confirm = new QPushButton("确定");
|
|
selectTime->addWidget(confirm);
|
|
layout->addLayout(selectTime);
|
|
connect(confirm, &QPushButton::clicked, [this, inputBackTime]() {
|
|
int milliseconds = inputBackTime->text().toInt();
|
|
int pixel = mAudioPlot->xAxis->millisecondToPixel(milliseconds, YSG::SRC::Cache);
|
|
mAudioPlot->xAxis->setAX(pixel);
|
|
mAudioPlot->update();
|
|
});
|
|
}
|
|
layout->addWidget(mAudioPlot);
|
|
|
|
|
|
connect(mPlayer, &QMediaPlayer::durationChanged, [this](qint64 duration) {
|
|
if (mPlayer->error() != QMediaPlayer::NoError || duration < 1000)
|
|
return;
|
|
setWindowTitle(tr("Recorded %1 sec").arg(duration / 1000));
|
|
});
|
|
|
|
connect(mPlayer, QOverload<QMediaPlayer::Error>::of(&QMediaPlayer::error),
|
|
[this](QMediaPlayer::Error error) {
|
|
qDebug() << "Error occurred:" << mPlayer->errorString();
|
|
|
|
});
|
|
} |