mirror of
https://github.com/barry-ran/QtScrcpy.git
synced 2025-10-03 22:59:40 +00:00
615 lines
18 KiB
C++
615 lines
18 KiB
C++
#include <QDebug>
|
|
#include <QFile>
|
|
#include <QFileDialog>
|
|
#include <QKeyEvent>
|
|
#include <QTime>
|
|
#include <QTimer>
|
|
|
|
#include "config.h"
|
|
#include "device.h"
|
|
#include "dialog.h"
|
|
#include "keymap.h"
|
|
#include "ui_dialog.h"
|
|
#include "videoform.h"
|
|
|
|
Dialog::Dialog(QWidget *parent) : QDialog(parent), ui(new Ui::Dialog)
|
|
{
|
|
ui->setupUi(this);
|
|
initUI();
|
|
|
|
connect(&m_adb, &AdbProcess::adbProcessResult, this, [this](AdbProcess::ADB_EXEC_RESULT processResult) {
|
|
QString log = "";
|
|
bool newLine = true;
|
|
QStringList args = m_adb.arguments();
|
|
|
|
switch (processResult) {
|
|
case AdbProcess::AER_ERROR_START:
|
|
break;
|
|
case AdbProcess::AER_SUCCESS_START:
|
|
log = "adb run";
|
|
newLine = false;
|
|
break;
|
|
case AdbProcess::AER_ERROR_EXEC:
|
|
//log = m_adb.getErrorOut();
|
|
if (args.contains("ifconfig") && args.contains("wlan0")) {
|
|
getIPbyIp();
|
|
}
|
|
break;
|
|
case AdbProcess::AER_ERROR_MISSING_BINARY:
|
|
log = "adb not found";
|
|
break;
|
|
case AdbProcess::AER_SUCCESS_EXEC:
|
|
//log = m_adb.getStdOut();
|
|
if (args.contains("devices")) {
|
|
QStringList devices = m_adb.getDevicesSerialFromStdOut();
|
|
ui->serialBox->clear();
|
|
ui->connectedPhoneList->clear();
|
|
for (auto &item : devices) {
|
|
ui->serialBox->addItem(item);
|
|
ui->connectedPhoneList->addItem(Config::getInstance().getNickName(item) + "-" + item);
|
|
}
|
|
} else if (args.contains("show") && args.contains("wlan0")) {
|
|
QString ip = m_adb.getDeviceIPFromStdOut();
|
|
if (ip.isEmpty()) {
|
|
log = "ip not find, connect to wifi?";
|
|
break;
|
|
}
|
|
ui->deviceIpEdt->setText(ip);
|
|
} else if (args.contains("ifconfig") && args.contains("wlan0")) {
|
|
QString ip = m_adb.getDeviceIPFromStdOut();
|
|
if (ip.isEmpty()) {
|
|
log = "ip not find, connect to wifi?";
|
|
break;
|
|
}
|
|
ui->deviceIpEdt->setText(ip);
|
|
} else if (args.contains("ip -o a")) {
|
|
QString ip = m_adb.getDeviceIPByIpFromStdOut();
|
|
if (ip.isEmpty()) {
|
|
log = "ip not find, connect to wifi?";
|
|
break;
|
|
}
|
|
ui->deviceIpEdt->setText(ip);
|
|
}
|
|
break;
|
|
}
|
|
if (!log.isEmpty()) {
|
|
outLog(log, newLine);
|
|
}
|
|
});
|
|
|
|
m_hideIcon = new QSystemTrayIcon(this);
|
|
m_hideIcon->setIcon(QIcon(":/image/tray/logo.png"));
|
|
m_menu = new QMenu(this);
|
|
m_quit = new QAction(this);
|
|
m_showWindow = new QAction(this);
|
|
m_showWindow->setText(tr("show"));
|
|
m_quit->setText(tr("quit"));
|
|
m_menu->addAction(m_showWindow);
|
|
m_menu->addAction(m_quit);
|
|
m_hideIcon->setContextMenu(m_menu);
|
|
m_hideIcon->show();
|
|
connect(m_showWindow, &QAction::triggered, this, &Dialog::slotShow);
|
|
connect(m_quit, &QAction::triggered, this, [this]() {
|
|
m_hideIcon->hide();
|
|
qApp->quit();
|
|
});
|
|
connect(m_hideIcon, &QSystemTrayIcon::activated, this, &Dialog::slotActivated);
|
|
}
|
|
|
|
Dialog::~Dialog()
|
|
{
|
|
qDebug() << "~Dialog()";
|
|
updateBootConfig(false);
|
|
m_deviceManage.disconnectAllDevice();
|
|
delete ui;
|
|
}
|
|
|
|
void Dialog::initUI()
|
|
{
|
|
setAttribute(Qt::WA_DeleteOnClose);
|
|
setWindowFlags(windowFlags() | Qt::WindowMinimizeButtonHint | Qt::WindowCloseButtonHint | Qt::CustomizeWindowHint);
|
|
|
|
setWindowTitle(Config::getInstance().getTitle());
|
|
|
|
ui->bitRateEdit->setValidator(new QIntValidator(1, 99999, this));
|
|
|
|
ui->maxSizeBox->addItem("640");
|
|
ui->maxSizeBox->addItem("720");
|
|
ui->maxSizeBox->addItem("1080");
|
|
ui->maxSizeBox->addItem("1280");
|
|
ui->maxSizeBox->addItem("1920");
|
|
ui->maxSizeBox->addItem(tr("original"));
|
|
|
|
ui->formatBox->addItem("mp4");
|
|
ui->formatBox->addItem("mkv");
|
|
|
|
ui->lockOrientationBox->addItem(tr("no lock"));
|
|
ui->lockOrientationBox->addItem("0");
|
|
ui->lockOrientationBox->addItem("90");
|
|
ui->lockOrientationBox->addItem("180");
|
|
ui->lockOrientationBox->addItem("270");
|
|
ui->lockOrientationBox->setCurrentIndex(0);
|
|
|
|
updateBootConfig(true);
|
|
|
|
on_useSingleModeCheck_clicked();
|
|
|
|
on_updateDevice_clicked();
|
|
}
|
|
|
|
void Dialog::updateBootConfig(bool toView)
|
|
{
|
|
if (toView) {
|
|
UserBootConfig config = Config::getInstance().getUserBootConfig();
|
|
|
|
if (config.bitRate == 0) {
|
|
ui->bitRateBox->setCurrentText("Mbps");
|
|
} else if (config.bitRate % 1000000 == 0) {
|
|
ui->bitRateEdit->setText(QString::number(config.bitRate / 1000000));
|
|
ui->bitRateBox->setCurrentText("Mbps");
|
|
} else {
|
|
ui->bitRateEdit->setText(QString::number(config.bitRate / 1000));
|
|
ui->bitRateBox->setCurrentText("Kbps");
|
|
}
|
|
|
|
ui->maxSizeBox->setCurrentIndex(config.maxSizeIndex);
|
|
ui->formatBox->setCurrentIndex(config.recordFormatIndex);
|
|
ui->recordPathEdt->setText(config.recordPath);
|
|
ui->lockOrientationBox->setCurrentIndex(config.lockOrientationIndex);
|
|
ui->framelessCheck->setChecked(config.framelessWindow);
|
|
ui->recordScreenCheck->setChecked(config.recordScreen);
|
|
ui->notDisplayCheck->setChecked(config.recordBackground);
|
|
ui->useReverseCheck->setChecked(config.reverseConnect);
|
|
ui->fpsCheck->setChecked(config.showFPS);
|
|
ui->alwaysTopCheck->setChecked(config.windowOnTop);
|
|
ui->closeScreenCheck->setChecked(config.autoOffScreen);
|
|
ui->stayAwakeCheck->setChecked(config.keepAlive);
|
|
ui->useSingleModeCheck->setChecked(config.simpleMode);
|
|
} else {
|
|
UserBootConfig config;
|
|
|
|
config.bitRate = getBitRate();
|
|
config.maxSizeIndex = ui->maxSizeBox->currentIndex();
|
|
config.recordFormatIndex = ui->formatBox->currentIndex();
|
|
config.recordPath = ui->recordPathEdt->text();
|
|
config.lockOrientationIndex = ui->lockOrientationBox->currentIndex();
|
|
config.recordScreen = ui->recordScreenCheck->isChecked();
|
|
config.recordBackground = ui->notDisplayCheck->isChecked();
|
|
config.reverseConnect = ui->useReverseCheck->isChecked();
|
|
config.showFPS = ui->fpsCheck->isChecked();
|
|
config.windowOnTop = ui->alwaysTopCheck->isChecked();
|
|
config.autoOffScreen = ui->closeScreenCheck->isChecked();
|
|
config.framelessWindow = ui->framelessCheck->isChecked();
|
|
config.keepAlive = ui->stayAwakeCheck->isChecked();
|
|
config.simpleMode = ui->useSingleModeCheck->isChecked();
|
|
Config::getInstance().setUserBootConfig(config);
|
|
}
|
|
}
|
|
|
|
void Dialog::execAdbCmd()
|
|
{
|
|
if (checkAdbRun()) {
|
|
return;
|
|
}
|
|
QString cmd = ui->adbCommandEdt->text().trimmed();
|
|
outLog("adb " + cmd, false);
|
|
#if QT_VERSION >= QT_VERSION_CHECK(5, 15, 0)
|
|
m_adb.execute(ui->serialBox->currentText().trimmed(), cmd.split(" ", Qt::SkipEmptyParts));
|
|
#else
|
|
m_adb.execute(ui->serialBox->currentText().trimmed(), cmd.split(" ", QString::SkipEmptyParts));
|
|
#endif
|
|
}
|
|
|
|
void Dialog::delayMs(int ms)
|
|
{
|
|
QTime dieTime = QTime::currentTime().addMSecs(ms);
|
|
|
|
while (QTime::currentTime() < dieTime) {
|
|
QCoreApplication::processEvents(QEventLoop::AllEvents, 100);
|
|
}
|
|
}
|
|
|
|
QString Dialog::getGameScript(const QString &fileName)
|
|
{
|
|
QFile loadFile(KeyMap::getKeyMapPath() + "/" + fileName);
|
|
if (!loadFile.open(QIODevice::ReadOnly)) {
|
|
outLog("open file failed:" + fileName, true);
|
|
return "";
|
|
}
|
|
|
|
QString ret = loadFile.readAll();
|
|
loadFile.close();
|
|
return ret;
|
|
}
|
|
|
|
void Dialog::slotShow()
|
|
{
|
|
this->show();
|
|
m_hideIcon->hide();
|
|
}
|
|
|
|
void Dialog::slotActivated(QSystemTrayIcon::ActivationReason reason)
|
|
{
|
|
switch (reason) {
|
|
case QSystemTrayIcon::Trigger:
|
|
this->show();
|
|
break;
|
|
default:
|
|
break;
|
|
}
|
|
}
|
|
|
|
void Dialog::closeEvent(QCloseEvent *event)
|
|
{
|
|
this->hide();
|
|
m_hideIcon->showMessage(tr("Notice"),
|
|
tr("Hidden here!"),
|
|
QSystemTrayIcon::Information,
|
|
3000);
|
|
event->ignore();
|
|
}
|
|
|
|
void Dialog::on_updateDevice_clicked()
|
|
{
|
|
if (checkAdbRun()) {
|
|
return;
|
|
}
|
|
outLog("update devices...", false);
|
|
m_adb.execute("", QStringList() << "devices");
|
|
}
|
|
|
|
void Dialog::on_startServerBtn_clicked()
|
|
{
|
|
outLog("start server...", false);
|
|
|
|
QString absFilePath;
|
|
if (ui->recordScreenCheck->isChecked()) {
|
|
QString fileDir(ui->recordPathEdt->text().trimmed());
|
|
if (!fileDir.isEmpty()) {
|
|
QDateTime dateTime = QDateTime::currentDateTime();
|
|
QString fileName = dateTime.toString("_yyyyMMdd_hhmmss_zzz");
|
|
QString ext = ui->formatBox->currentText().trimmed();
|
|
fileName = windowTitle() + fileName + "." + ext;
|
|
QDir dir(fileDir);
|
|
absFilePath = dir.absoluteFilePath(fileName);
|
|
}
|
|
}
|
|
|
|
// this is ok that "native" toUshort is 0
|
|
quint16 videoSize = ui->maxSizeBox->currentText().trimmed().toUShort();
|
|
Device::DeviceParams params;
|
|
params.serial = ui->serialBox->currentText().trimmed();
|
|
params.maxSize = videoSize;
|
|
params.bitRate = getBitRate();
|
|
// on devices with Android >= 10, the capture frame rate can be limited
|
|
params.maxFps = static_cast<quint32>(Config::getInstance().getMaxFps());
|
|
params.recordFileName = absFilePath;
|
|
params.closeScreen = ui->closeScreenCheck->isChecked();
|
|
params.useReverse = ui->useReverseCheck->isChecked();
|
|
params.display = !ui->notDisplayCheck->isChecked();
|
|
params.renderExpiredFrames = Config::getInstance().getRenderExpiredFrames();
|
|
params.lockVideoOrientation = ui->lockOrientationBox->currentIndex() - 1;
|
|
params.stayAwake = ui->stayAwakeCheck->isChecked();
|
|
params.framelessWindow = ui->framelessCheck->isChecked();
|
|
params.recordPath = ui->recordPathEdt->text().trimmed();
|
|
|
|
m_deviceManage.connectDevice(params);
|
|
|
|
if (ui->alwaysTopCheck->isChecked()) {
|
|
m_deviceManage.staysOnTop(params.serial);
|
|
}
|
|
m_deviceManage.showFPS(params.serial, ui->fpsCheck->isChecked());
|
|
}
|
|
|
|
void Dialog::on_stopServerBtn_clicked()
|
|
{
|
|
if (m_deviceManage.disconnectDevice(ui->serialBox->currentText().trimmed())) {
|
|
outLog("stop server");
|
|
}
|
|
}
|
|
|
|
void Dialog::on_wirelessConnectBtn_clicked()
|
|
{
|
|
if (checkAdbRun()) {
|
|
return;
|
|
}
|
|
QString addr = ui->deviceIpEdt->text().trimmed();
|
|
if (!ui->devicePortEdt->text().isEmpty()) {
|
|
addr += ":";
|
|
addr += ui->devicePortEdt->text().trimmed();
|
|
} else if (!ui->devicePortEdt->placeholderText().isEmpty()) {
|
|
addr += ":";
|
|
addr += ui->devicePortEdt->placeholderText().trimmed();
|
|
} else {
|
|
outLog("error: device port is null", false);
|
|
return;
|
|
}
|
|
|
|
outLog("wireless connect...", false);
|
|
QStringList adbArgs;
|
|
adbArgs << "connect";
|
|
adbArgs << addr;
|
|
m_adb.execute("", adbArgs);
|
|
}
|
|
|
|
void Dialog::on_startAdbdBtn_clicked()
|
|
{
|
|
if (checkAdbRun()) {
|
|
return;
|
|
}
|
|
outLog("start devices adbd...", false);
|
|
// adb tcpip 5555
|
|
QStringList adbArgs;
|
|
adbArgs << "tcpip";
|
|
adbArgs << "5555";
|
|
m_adb.execute(ui->serialBox->currentText().trimmed(), adbArgs);
|
|
}
|
|
|
|
void Dialog::outLog(const QString &log, bool newLine)
|
|
{
|
|
// avoid sub thread update ui
|
|
QString backLog = log;
|
|
QTimer::singleShot(0, this, [this, backLog, newLine]() {
|
|
ui->outEdit->append(backLog);
|
|
if (newLine) {
|
|
ui->outEdit->append("<br/>");
|
|
}
|
|
});
|
|
}
|
|
|
|
bool Dialog::filterLog(const QString &log)
|
|
{
|
|
if (log.contains("app_proces")) {
|
|
return true;
|
|
}
|
|
if (log.contains("Unable to set geometry")) {
|
|
return true;
|
|
}
|
|
return false;
|
|
}
|
|
|
|
bool Dialog::checkAdbRun()
|
|
{
|
|
if (m_adb.isRuning()) {
|
|
outLog("wait for the end of the current command to run");
|
|
}
|
|
return m_adb.isRuning();
|
|
}
|
|
|
|
void Dialog::on_getIPBtn_clicked()
|
|
{
|
|
if (checkAdbRun()) {
|
|
return;
|
|
}
|
|
|
|
outLog("get ip...", false);
|
|
// adb -s P7C0218510000537 shell ifconfig wlan0
|
|
// or
|
|
// adb -s P7C0218510000537 shell ip -f inet addr show wlan0
|
|
QStringList adbArgs;
|
|
#if 0
|
|
adbArgs << "shell";
|
|
adbArgs << "ip";
|
|
adbArgs << "-f";
|
|
adbArgs << "inet";
|
|
adbArgs << "addr";
|
|
adbArgs << "show";
|
|
adbArgs << "wlan0";
|
|
#else
|
|
adbArgs << "shell";
|
|
adbArgs << "ifconfig";
|
|
adbArgs << "wlan0";
|
|
#endif
|
|
m_adb.execute(ui->serialBox->currentText().trimmed(), adbArgs);
|
|
}
|
|
|
|
void Dialog::getIPbyIp()
|
|
{
|
|
if (checkAdbRun()) {
|
|
return;
|
|
}
|
|
|
|
QStringList adbArgs;
|
|
adbArgs << "shell";
|
|
adbArgs << "ip -o a";
|
|
|
|
m_adb.execute(ui->serialBox->currentText().trimmed(), adbArgs);
|
|
}
|
|
|
|
void Dialog::on_wirelessDisConnectBtn_clicked()
|
|
{
|
|
if (checkAdbRun()) {
|
|
return;
|
|
}
|
|
QString addr = ui->deviceIpEdt->text().trimmed();
|
|
outLog("wireless disconnect...", false);
|
|
QStringList adbArgs;
|
|
adbArgs << "disconnect";
|
|
adbArgs << addr;
|
|
m_adb.execute("", adbArgs);
|
|
}
|
|
|
|
void Dialog::on_selectRecordPathBtn_clicked()
|
|
{
|
|
QFileDialog::Options options = QFileDialog::DontResolveSymlinks | QFileDialog::ShowDirsOnly;
|
|
QString directory = QFileDialog::getExistingDirectory(this, tr("select path"), "", options);
|
|
ui->recordPathEdt->setText(directory);
|
|
}
|
|
|
|
void Dialog::on_recordPathEdt_textChanged(const QString &arg1)
|
|
{
|
|
ui->recordPathEdt->setToolTip(arg1.trimmed());
|
|
ui->notDisplayCheck->setCheckable(!arg1.trimmed().isEmpty());
|
|
}
|
|
|
|
void Dialog::on_adbCommandBtn_clicked()
|
|
{
|
|
execAdbCmd();
|
|
}
|
|
|
|
void Dialog::on_stopAdbBtn_clicked()
|
|
{
|
|
m_adb.kill();
|
|
}
|
|
|
|
void Dialog::on_clearOut_clicked()
|
|
{
|
|
ui->outEdit->clear();
|
|
}
|
|
|
|
void Dialog::on_stopAllServerBtn_clicked()
|
|
{
|
|
m_deviceManage.disconnectAllDevice();
|
|
}
|
|
|
|
void Dialog::on_refreshGameScriptBtn_clicked()
|
|
{
|
|
ui->gameBox->clear();
|
|
QDir dir(KeyMap::getKeyMapPath());
|
|
if (!dir.exists()) {
|
|
outLog("keymap directory not find", true);
|
|
return;
|
|
}
|
|
dir.setFilter(QDir::Files | QDir::NoSymLinks);
|
|
QFileInfoList list = dir.entryInfoList();
|
|
QFileInfo fileInfo;
|
|
int size = list.size();
|
|
for (int i = 0; i < size; ++i) {
|
|
fileInfo = list.at(i);
|
|
ui->gameBox->addItem(fileInfo.fileName());
|
|
}
|
|
}
|
|
|
|
void Dialog::on_applyScriptBtn_clicked()
|
|
{
|
|
m_deviceManage.updateScript(getGameScript(ui->gameBox->currentText()));
|
|
}
|
|
|
|
void Dialog::on_recordScreenCheck_clicked(bool checked)
|
|
{
|
|
if (!checked) {
|
|
return;
|
|
}
|
|
|
|
QString fileDir(ui->recordPathEdt->text().trimmed());
|
|
if (fileDir.isEmpty()) {
|
|
qWarning() << "please select record save path!!!";
|
|
ui->recordScreenCheck->setChecked(false);
|
|
}
|
|
}
|
|
|
|
void Dialog::on_usbConnectBtn_clicked()
|
|
{
|
|
on_stopAllServerBtn_clicked();
|
|
delayMs(200);
|
|
on_updateDevice_clicked();
|
|
delayMs(200);
|
|
|
|
int firstUsbDevice = findDeviceFromeSerialBox(false);
|
|
if (-1 == firstUsbDevice) {
|
|
qWarning() << "No use device is found!";
|
|
return;
|
|
}
|
|
ui->serialBox->setCurrentIndex(firstUsbDevice);
|
|
|
|
on_startServerBtn_clicked();
|
|
}
|
|
|
|
int Dialog::findDeviceFromeSerialBox(bool wifi)
|
|
{
|
|
QRegExp regIP("\\b(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\\:([0-9]|[1-9]\\d|[1-9]\\d{2}|[1-9]\\d{3}|[1-5]\\d{4}|6[0-4]\\d{3}|65[0-4]\\d{2}|655[0-2]\\d|6553[0-5])\\b");
|
|
for (int i = 0; i < ui->serialBox->count(); ++i) {
|
|
bool isWifi = regIP.exactMatch(ui->serialBox->itemText(i));
|
|
bool found = wifi ? isWifi : !isWifi;
|
|
if (found) {
|
|
return i;
|
|
}
|
|
}
|
|
|
|
return -1;
|
|
}
|
|
|
|
void Dialog::on_wifiConnectBtn_clicked()
|
|
{
|
|
on_stopAllServerBtn_clicked();
|
|
delayMs(200);
|
|
|
|
on_updateDevice_clicked();
|
|
delayMs(200);
|
|
|
|
int firstUsbDevice = findDeviceFromeSerialBox(false);
|
|
if (-1 == firstUsbDevice) {
|
|
qWarning() << "No use device is found!";
|
|
return;
|
|
}
|
|
ui->serialBox->setCurrentIndex(firstUsbDevice);
|
|
|
|
on_getIPBtn_clicked();
|
|
delayMs(200);
|
|
|
|
on_startAdbdBtn_clicked();
|
|
delayMs(1000);
|
|
|
|
on_wirelessConnectBtn_clicked();
|
|
delayMs(2000);
|
|
|
|
on_updateDevice_clicked();
|
|
delayMs(200);
|
|
|
|
int firstWifiDevice = findDeviceFromeSerialBox(true);
|
|
if (-1 == firstWifiDevice) {
|
|
qWarning() << "No wifi device is found!";
|
|
return;
|
|
}
|
|
ui->serialBox->setCurrentIndex(firstWifiDevice);
|
|
|
|
on_startServerBtn_clicked();
|
|
}
|
|
|
|
void Dialog::on_connectedPhoneList_itemDoubleClicked(QListWidgetItem *item)
|
|
{
|
|
Q_UNUSED(item);
|
|
ui->serialBox->setCurrentIndex(ui->connectedPhoneList->currentRow());
|
|
on_startServerBtn_clicked();
|
|
}
|
|
|
|
void Dialog::on_updateNameBtn_clicked()
|
|
{
|
|
if (ui->serialBox->count() != 0) {
|
|
if (ui->userNameEdt->text().isEmpty()) {
|
|
Config::getInstance().setNickName(ui->serialBox->currentText(), "Phone");
|
|
} else {
|
|
Config::getInstance().setNickName(ui->serialBox->currentText(), ui->userNameEdt->text());
|
|
}
|
|
|
|
on_updateDevice_clicked();
|
|
|
|
qDebug() << "Update OK!";
|
|
} else {
|
|
qWarning() << "No device is connected!";
|
|
}
|
|
}
|
|
|
|
void Dialog::on_useSingleModeCheck_clicked()
|
|
{
|
|
if (ui->useSingleModeCheck->isChecked()) {
|
|
ui->rightWidget->hide();
|
|
} else {
|
|
ui->rightWidget->show();
|
|
}
|
|
|
|
QTimer::singleShot(0, this, [this]() {
|
|
resize(layout()->sizeHint().width(), height());
|
|
});
|
|
}
|
|
|
|
void Dialog::on_serialBox_currentIndexChanged(const QString &arg1)
|
|
{
|
|
ui->userNameEdt->setText(Config::getInstance().getNickName(arg1));
|
|
}
|
|
|
|
quint32 Dialog::getBitRate()
|
|
{
|
|
return ui->bitRateEdit->text().trimmed().toUInt() *
|
|
(ui->bitRateBox->currentText() == QString("Mbps") ? 1000000 : 1000);
|
|
}
|