soundboard/src/editsample.cpp

83 lines
2.5 KiB
C++

#include "editsample.h"
#include "ui_editsample.h"
#include "sound.h"
#include <Log.h>
#include <iomanip>
#include <sstream>
EditSample::EditSample(const std::string& audioFile_, QWidget *parent) : QDialog(parent), ui(new Ui::EditSample), audioFile(audioFile_) {
ui->setupUi(this);
std::vector<std::string> sounddevices = Sound::instance().getOutputs();
for(const std::string& dev : sounddevices) {
QString qdeviceName = QString::fromStdString(dev);
ui->soundOutputselect->addItem(qdeviceName, qdeviceName);
}
QObject::connect(ui->playButton, SIGNAL( clicked() ), this, SLOT( play() ));
QObject::connect(ui->stopButton, SIGNAL( clicked() ), this, SLOT( stop() ));
setCurrentPosition(0);
}
EditSample::~EditSample() {
delete ui;
}
void EditSample::play() {
// get audio device
std::string devicename = ui->soundOutputselect->currentText().toStdString();
// get timing info
uint64_t startTime = getTimeInfo(ui->startTime);
uint64_t lengthTime = getTimeInfo(ui->lengthTime);
// convert relative time to absolute
if(lengthTime != 0) {
lengthTime = startTime + lengthTime;
}
Log::info << "play audio: " << std::quoted(audioFile) << " on " << std::quoted(devicename) << " with " << startTime << " and " << lengthTime;
Sound::instance().addPlayback(devicename, audioFile, 1.0, startTime, lengthTime, std::bind(&EditSample::setCurrentPosition, this, std::placeholders::_1));
}
void EditSample::stop() {
Sound::instance().stopAll();
}
uint64_t EditSample::getTimeInfo(const QTimeEdit* time) const {
QTime timedata = time->time();
return (((((
(timedata.hour() * 60)
+ timedata.minute()) * 60)
+ timedata.second()) * 1000)
+ timedata.msec());
}
QTime EditSample::timeFromMS(uint64_t ms) const {
// return QTime().addMSecs(ms);
// return QTime(0, 0, 0, ms);
return QTime::fromMSecsSinceStartOfDay(ms);
}
std::string EditSample::formatTime(const QTime& time) const {
std::ostringstream str;
str << std::setw(2) << std::setfill('0')
<< time.minute() << ':' << std::setw(2)
<< time.second() << '.' << std::setw(3)
<< time.msec();
return str.str();
}
void EditSample::setCurrentPosition(uint64_t cp) {
currentposition = cp;
QTime time = timeFromMS(cp);
std::string formatedTime = formatTime(time);
// ui->currentPosLabel->setText(QString::fromStdString("Current: " + formatedTime));
// set text async
QString input = QString::fromStdString("Current: " + formatedTime);
QMetaObject::invokeMethod(ui->currentPosLabel, "setText", Qt::QueuedConnection, Q_ARG(QString, input));
}