Files
Radio/old_example/audio/MainWidget.cpp
T
2026-06-16 13:38:08 +08:00

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