sound callbacks

This commit is contained in:
mrbesen 2021-12-20 02:13:26 +01:00
parent 7f3445de54
commit 77bfc4a59a
Signed by untrusted user: MrBesen
GPG Key ID: 596B2350DCD67504
7 changed files with 65 additions and 7 deletions

View File

@ -25,6 +25,8 @@ private:
const std::string audioFile; const std::string audioFile;
uint64_t getTimeInfo(const QTimeEdit* time) const; uint64_t getTimeInfo(const QTimeEdit* time) const;
QTime timeFromMS(uint64_t ms) const;
std::string formatTime(const QTime& time) const;
uint64_t currentposition = 0; uint64_t currentposition = 0;

View File

@ -2,6 +2,7 @@
#include "miniaudio.h" #include "miniaudio.h"
#include <functional>
#include <string> #include <string>
#include <list> #include <list>
#include <mutex> #include <mutex>
@ -15,11 +16,13 @@
class Sound { class Sound {
public: public:
using sndcb_func = std::function<void(uint64_t)>;
static Sound& instance(); static Sound& instance();
static void deinitInstance(); static void deinitInstance();
void addPlayback(const std::string& name, float volume = 1.f, uint64_t beginms = 0, uint64_t endms = 0); void addPlayback(const std::string& name, float volume = 1.f, uint64_t beginms = 0, uint64_t endms = 0);
void addPlayback(const std::string& audioDeviceName, const std::string& name, float volume = 1.f, uint64_t beginms = 0, uint64_t endms = 0); void addPlayback(const std::string& audioDeviceName, const std::string& name, float volume = 1.f, uint64_t beginms = 0, uint64_t endms = 0, sndcb_func callback = {});
bool addDefaultDevice(); bool addDefaultDevice();
bool addDeviceWithName(const std::string& name); bool addDeviceWithName(const std::string& name);
void stopAll(); void stopAll();
@ -29,6 +32,7 @@ public:
std::vector<std::string> getOutputs(); std::vector<std::string> getOutputs();
static std::string FOLDER; static std::string FOLDER;
private: private:
Sound(); Sound();
~Sound(); ~Sound();

View File

@ -3,6 +3,7 @@
#include "miniaudio.h" #include "miniaudio.h"
#include <functional>
#include <list> #include <list>
#include <limits> #include <limits>
#include <string> #include <string>
@ -16,7 +17,7 @@ public:
static SoundDevice* createDevice(ma_context* ctx, const ma_device_id* did = NULL); static SoundDevice* createDevice(ma_context* ctx, const ma_device_id* did = NULL);
void stop(); void stop();
void addPlayback(const std::string& name, float volume = 1.f, uint64_t beginms = 0, uint64_t endms = 0); void addPlayback(const std::string& name, float volume = 1.f, uint64_t beginms = 0, uint64_t endms = 0, std::function<void(uint64_t)> callback = {});
void startDevice(); void startDevice();
void cleanupDecoders(); //fertige decoder löschen void cleanupDecoders(); //fertige decoder löschen
@ -34,6 +35,7 @@ private:
uint64_t startFrame = 0; uint64_t startFrame = 0;
uint64_t endFrame = std::numeric_limits<uint64_t>::max(); uint64_t endFrame = std::numeric_limits<uint64_t>::max();
bool isDone = false; bool isDone = false;
std::function<void(uint64_t)> callback;
Playback() {} Playback() {}
}; };

View File

@ -4,6 +4,7 @@
#include "sound.h" #include "sound.h"
#include <Log.h> #include <Log.h>
#include <iomanip> #include <iomanip>
#include <sstream>
EditSample::EditSample(const std::string& audioFile_, QWidget *parent) : QDialog(parent), ui(new Ui::EditSample), audioFile(audioFile_) { EditSample::EditSample(const std::string& audioFile_, QWidget *parent) : QDialog(parent), ui(new Ui::EditSample), audioFile(audioFile_) {
ui->setupUi(this); ui->setupUi(this);
@ -16,6 +17,8 @@ EditSample::EditSample(const std::string& audioFile_, QWidget *parent) : QDialog
QObject::connect(ui->playButton, SIGNAL( clicked() ), this, SLOT( play() )); QObject::connect(ui->playButton, SIGNAL( clicked() ), this, SLOT( play() ));
QObject::connect(ui->stopButton, SIGNAL( clicked() ), this, SLOT( stop() )); QObject::connect(ui->stopButton, SIGNAL( clicked() ), this, SLOT( stop() ));
setCurrentPosition(0);
} }
EditSample::~EditSample() { EditSample::~EditSample() {
@ -36,7 +39,7 @@ void EditSample::play() {
} }
Log::info << "play audio: " << std::quoted(audioFile) << " on " << std::quoted(devicename) << " with " << startTime << " and " << 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); Sound::instance().addPlayback(devicename, audioFile, 1.0, startTime, lengthTime, std::bind(&EditSample::setCurrentPosition, this, std::placeholders::_1));
} }
void EditSample::stop() { void EditSample::stop() {
@ -52,7 +55,24 @@ uint64_t EditSample::getTimeInfo(const QTimeEdit* time) const {
+ timedata.msec()); + 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) { void EditSample::setCurrentPosition(uint64_t cp) {
currentposition = cp; currentposition = cp;
QTime time = timeFromMS(cp);
std::string formatedTime = formatTime(time);
// ui->currentPosLabel->setText(QString::fromStdString("Current: " + formatedTime));
} }

View File

@ -74,14 +74,14 @@ void Sound::addPlayback(const std::string& name, float volume, uint64_t beginms,
} }
} }
void Sound::addPlayback(const std::string& audioDeviceName, const std::string& name, float volume, uint64_t beginms, uint64_t endms) { void Sound::addPlayback(const std::string& audioDeviceName, const std::string& name, float volume, uint64_t beginms, uint64_t endms, sndcb_func callback) {
if(volume < 0.00001f) if(volume < 0.00001f)
volume = 0.00001f; volume = 0.00001f;
std::lock_guard<std::mutex> lock(devicesMutex); std::lock_guard<std::mutex> lock(devicesMutex);
for(SoundDevice* sd : devices) { for(SoundDevice* sd : devices) {
if(sd->getName() == audioDeviceName) { if(sd->getName() == audioDeviceName) {
sd->addPlayback(name, volume, beginms, endms); sd->addPlayback(name, volume, beginms, endms, callback);
break; break;
} }
} }

View File

@ -79,6 +79,10 @@ void SoundDevice::sound_callback(void* outbuffer, ma_uint32 frameCount) {
} }
pb->currentFrame += read; pb->currentFrame += read;
if(pb->callback) {
pb->callback(pb->currentFrame / (pDecoder->outputSampleRate / 1000));
}
} }
ma_mutex_unlock(data.mutex); ma_mutex_unlock(data.mutex);
@ -166,7 +170,7 @@ void SoundDevice::stop() {
deviceRunning = false; deviceRunning = false;
} }
void SoundDevice::addPlayback(const std::string& name, float volume, uint64_t beginms, uint64_t endms) { void SoundDevice::addPlayback(const std::string& name, float volume, uint64_t beginms, uint64_t endms, std::function<void(uint64_t)> callback) {
cleanupDecoders(); cleanupDecoders();
Playback* pb = new Playback(); Playback* pb = new Playback();
@ -180,6 +184,7 @@ void SoundDevice::addPlayback(const std::string& name, float volume, uint64_t be
pb->volume = volume; pb->volume = volume;
pb->isDone = false; pb->isDone = false;
pb->callback = callback;
if(beginms != 0) { if(beginms != 0) {
pb->startFrame = (pb->decoder.outputSampleRate * beginms) / 1000; pb->startFrame = (pb->decoder.outputSampleRate * beginms) / 1000;

View File

@ -26,6 +26,31 @@
</property> </property>
</widget> </widget>
</item> </item>
<item>
<layout class="QHBoxLayout" name="currentposLayout">
<item>
<widget class="QLabel" name="currentPosLabel">
<property name="text">
<string>Current: </string>
</property>
</widget>
</item>
<item>
<widget class="QPushButton" name="starttoCurrentButton">
<property name="text">
<string>SetStart</string>
</property>
</widget>
</item>
<item>
<widget class="QPushButton" name="stoptoCurrentButton">
<property name="text">
<string>SetStop</string>
</property>
</widget>
</item>
</layout>
</item>
<item> <item>
<layout class="QHBoxLayout" name="timeRow"> <layout class="QHBoxLayout" name="timeRow">
<item> <item>