doubleclick sample to play
This commit is contained in:
parent
0d4f585d41
commit
a13f57f4a8
|
@ -34,6 +34,7 @@ private slots:
|
||||||
|
|
||||||
void itemSelected();
|
void itemSelected();
|
||||||
void itemChanged(QTreeWidgetItem* item, int column);
|
void itemChanged(QTreeWidgetItem* item, int column);
|
||||||
|
void itemDoubleClicked(QTreeWidgetItem* item);
|
||||||
void dialogButtonPressed(QAbstractButton* btn);
|
void dialogButtonPressed(QAbstractButton* btn);
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
|
|
@ -55,6 +55,11 @@ public:
|
||||||
|
|
||||||
const static int TYPE = 1001;
|
const static int TYPE = 1001;
|
||||||
|
|
||||||
|
virtual bool hasRemove() const override;
|
||||||
|
|
||||||
|
virtual void remove() override;
|
||||||
|
|
||||||
|
|
||||||
// triggered from the view when the name was changed
|
// triggered from the view when the name was changed
|
||||||
void nameWasChanged();
|
void nameWasChanged();
|
||||||
|
|
||||||
|
@ -71,9 +76,16 @@ public:
|
||||||
|
|
||||||
const static int TYPE = 1002;
|
const static int TYPE = 1002;
|
||||||
|
|
||||||
|
virtual bool hasRemove() const override;
|
||||||
|
|
||||||
|
virtual void remove() override;
|
||||||
|
|
||||||
Config::SampleConfig& getConfig();
|
Config::SampleConfig& getConfig();
|
||||||
private:
|
private:
|
||||||
Config::RootConfig& conf;
|
Config::RootConfig& conf;
|
||||||
uint8_t samplenr = 0;
|
uint8_t samplenr = 0;
|
||||||
ButtonItem* button = nullptr;
|
ButtonItem* button = nullptr;
|
||||||
|
|
||||||
|
//called when a sample was moved
|
||||||
|
void updatePosition();
|
||||||
};
|
};
|
|
@ -21,8 +21,8 @@ public:
|
||||||
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 length = 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 = {});
|
void addPlayback(const std::string& audioDeviceName, const std::string& name, float volume = 1.f, uint64_t beginms = 0, uint64_t length = 0, sndcb_func callback = {});
|
||||||
bool addDefaultDevice();
|
bool addDefaultDevice();
|
||||||
bool addDeviceWithName(const std::string& name);
|
bool addDeviceWithName(const std::string& name);
|
||||||
void stopAll();
|
void stopAll();
|
||||||
|
|
|
@ -17,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, std::function<void(uint64_t)> callback = {});
|
void addPlayback(const std::string& name, float volume = 1.f, uint64_t beginms = 0, uint64_t length = 0, std::function<void(uint64_t)> callback = {});
|
||||||
|
|
||||||
void startDevice();
|
void startDevice();
|
||||||
void cleanupDecoders(); //fertige decoder löschen
|
void cleanupDecoders(); //fertige decoder löschen
|
||||||
|
|
|
@ -3,6 +3,7 @@
|
||||||
|
|
||||||
#include "addnewwhat.h"
|
#include "addnewwhat.h"
|
||||||
#include "editsample.h"
|
#include "editsample.h"
|
||||||
|
#include "sound.h"
|
||||||
|
|
||||||
#include <QFileDialog>
|
#include <QFileDialog>
|
||||||
|
|
||||||
|
@ -189,6 +190,14 @@ void ButtonManager::itemChanged(QTreeWidgetItem* item, int column) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void ButtonManager::itemDoubleClicked(QTreeWidgetItem* item) {
|
||||||
|
if(SampleItem* sample = dynamic_cast<SampleItem*>(item)) {
|
||||||
|
const Config::SampleConfig& sampleconf = sample->getConfig();
|
||||||
|
Sound::instance().addPlayback(sampleconf.file, sampleconf.volume, sampleconf.offset, sampleconf.length);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
void ButtonManager::dialogButtonPressed(QAbstractButton* btn) {
|
void ButtonManager::dialogButtonPressed(QAbstractButton* btn) {
|
||||||
QDialogButtonBox::ButtonRole role = ui->buttonBox->buttonRole(btn);
|
QDialogButtonBox::ButtonRole role = ui->buttonBox->buttonRole(btn);
|
||||||
if(role == QDialogButtonBox::ButtonRole::ResetRole) {
|
if(role == QDialogButtonBox::ButtonRole::ResetRole) {
|
||||||
|
|
|
@ -134,6 +134,22 @@ ButtonItem::ButtonItem(RowItem* parent, uint8_t buttonnr, Config::RootConfig& co
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool ButtonItem::hasRemove() const {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
void ButtonItem::remove() {
|
||||||
|
auto& rowconf = row->getConfig();
|
||||||
|
rowconf.erase(rowconf.begin() + buttonnr);
|
||||||
|
|
||||||
|
for(uint8_t i = buttonnr+1; i <= rowconf.size(); ++i) {
|
||||||
|
ButtonItem* item = dynamic_cast<ButtonItem*>(mparent->child(i));
|
||||||
|
if(item) {
|
||||||
|
item->buttonnr--;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
void ButtonItem::nameWasChanged() {
|
void ButtonItem::nameWasChanged() {
|
||||||
std::string newName = data(1, Qt::ItemDataRole::DisplayRole).toString().toStdString();
|
std::string newName = data(1, Qt::ItemDataRole::DisplayRole).toString().toStdString();
|
||||||
getConfig().name = newName;
|
getConfig().name = newName;
|
||||||
|
@ -147,10 +163,31 @@ Config::ButtonConfig& ButtonItem::getConfig() {
|
||||||
|
|
||||||
SampleItem::SampleItem(ButtonItem* parent, uint8_t samplenr, Config::RootConfig& conf) : ButtonManagerItem(parent, TYPE), conf(conf), samplenr(samplenr), button(parent) {
|
SampleItem::SampleItem(ButtonItem* parent, uint8_t samplenr, Config::RootConfig& conf) : ButtonManagerItem(parent, TYPE), conf(conf), samplenr(samplenr), button(parent) {
|
||||||
const Config::SampleConfig& sample = getConfig();
|
const Config::SampleConfig& sample = getConfig();
|
||||||
setData(2, Qt::ItemDataRole::DisplayRole, QVariant((int) samplenr+1));
|
updatePosition();
|
||||||
setData(3, Qt::ItemDataRole::DisplayRole, QVariant(QString::fromStdString(sample.file)));
|
setData(3, Qt::ItemDataRole::DisplayRole, QVariant(QString::fromStdString(sample.file)));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool SampleItem::hasRemove() const {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
void SampleItem::remove() {
|
||||||
|
auto& btnconf = button->getConfig().samples;
|
||||||
|
btnconf.erase(btnconf.begin() + samplenr);
|
||||||
|
|
||||||
|
for(uint8_t i = samplenr+1; i <= btnconf.size(); ++i) {
|
||||||
|
SampleItem* item = dynamic_cast<SampleItem*>(mparent->child(i));
|
||||||
|
if(item) {
|
||||||
|
item->samplenr--;
|
||||||
|
item->updatePosition();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
Config::SampleConfig& SampleItem::getConfig() {
|
Config::SampleConfig& SampleItem::getConfig() {
|
||||||
return button->getConfig().samples.at(samplenr);
|
return button->getConfig().samples.at(samplenr);
|
||||||
|
}
|
||||||
|
|
||||||
|
void SampleItem::updatePosition() {
|
||||||
|
setData(2, Qt::ItemDataRole::DisplayRole, QVariant((int) samplenr+1));
|
||||||
}
|
}
|
|
@ -49,11 +49,6 @@ void EditSample::play() {
|
||||||
uint64_t startTime = getStartTime();
|
uint64_t startTime = getStartTime();
|
||||||
uint64_t lengthTime = getLength();
|
uint64_t lengthTime = getLength();
|
||||||
|
|
||||||
// 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;
|
Log::info << "play audio: " << std::quoted(audioFile) << " on " << std::quoted(devicename) << " with " << startTime << " and " << lengthTime;
|
||||||
// stop all other sounds first
|
// stop all other sounds first
|
||||||
Sound::instance().stopAll();
|
Sound::instance().stopAll();
|
||||||
|
|
|
@ -64,24 +64,24 @@ void Sound::deinitInstance() {
|
||||||
Log::info << "Sound deinited";
|
Log::info << "Sound deinited";
|
||||||
}
|
}
|
||||||
|
|
||||||
void Sound::addPlayback(const std::string& name, float volume, uint64_t beginms, uint64_t endms) {
|
void Sound::addPlayback(const std::string& name, float volume, uint64_t beginms, uint64_t length) {
|
||||||
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) {
|
||||||
sd->addPlayback(name, volume, beginms, endms);
|
sd->addPlayback(name, volume, beginms, length);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void Sound::addPlayback(const std::string& audioDeviceName, const std::string& name, float volume, uint64_t beginms, uint64_t endms, sndcb_func callback) {
|
void Sound::addPlayback(const std::string& audioDeviceName, const std::string& name, float volume, uint64_t beginms, uint64_t length, 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, callback);
|
sd->addPlayback(name, volume, beginms, length, callback);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -80,9 +80,8 @@ void SoundButton::play() {
|
||||||
if(currentSample >= samples.size())
|
if(currentSample >= samples.size())
|
||||||
currentSample = 0;
|
currentSample = 0;
|
||||||
|
|
||||||
uint64_t endms = (sample.lengthms == 0 ? 0 : sample.startms + sample.lengthms);
|
|
||||||
try {
|
try {
|
||||||
Sound::instance().addPlayback(sample.file, sample.volume, sample.startms, endms);
|
Sound::instance().addPlayback(sample.file, sample.volume, sample.startms, sample.lengthms);
|
||||||
} catch(const std::exception& e) {
|
} catch(const std::exception& e) {
|
||||||
Log::error << "Catched Exception when plaing Audio File: " << sample.file;
|
Log::error << "Catched Exception when plaing Audio File: " << sample.file;
|
||||||
setDisabled();
|
setDisabled();
|
||||||
|
|
|
@ -170,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, std::function<void(uint64_t)> callback) {
|
void SoundDevice::addPlayback(const std::string& name, float volume, uint64_t beginms, uint64_t length, std::function<void(uint64_t)> callback) {
|
||||||
cleanupDecoders();
|
cleanupDecoders();
|
||||||
|
|
||||||
Playback* pb = new Playback();
|
Playback* pb = new Playback();
|
||||||
|
@ -193,7 +193,9 @@ void SoundDevice::addPlayback(const std::string& name, float volume, uint64_t be
|
||||||
Log::trace << "skip to frame: " << pb->currentFrame;
|
Log::trace << "skip to frame: " << pb->currentFrame;
|
||||||
}
|
}
|
||||||
|
|
||||||
if(endms != 0) {
|
if(length != 0) {
|
||||||
|
uint64_t endms = beginms + length;
|
||||||
|
|
||||||
pb->endFrame = (pb->decoder.outputSampleRate * endms) / 1000;
|
pb->endFrame = (pb->decoder.outputSampleRate * endms) / 1000;
|
||||||
Log::trace << "skip endframe: " << pb->endFrame;
|
Log::trace << "skip endframe: " << pb->endFrame;
|
||||||
}
|
}
|
||||||
|
|
|
@ -230,6 +230,22 @@
|
||||||
</hint>
|
</hint>
|
||||||
</hints>
|
</hints>
|
||||||
</connection>
|
</connection>
|
||||||
|
<connection>
|
||||||
|
<sender>buttonTreeWidget</sender>
|
||||||
|
<signal>itemDoubleClicked(QTreeWidgetItem*,int)</signal>
|
||||||
|
<receiver>ButtonManager</receiver>
|
||||||
|
<slot>itemDoubleClicked(QTreeWidgetItem*)</slot>
|
||||||
|
<hints>
|
||||||
|
<hint type="sourcelabel">
|
||||||
|
<x>55</x>
|
||||||
|
<y>33</y>
|
||||||
|
</hint>
|
||||||
|
<hint type="destinationlabel">
|
||||||
|
<x>62</x>
|
||||||
|
<y>2</y>
|
||||||
|
</hint>
|
||||||
|
</hints>
|
||||||
|
</connection>
|
||||||
</connections>
|
</connections>
|
||||||
<slots>
|
<slots>
|
||||||
<slot>addButton()</slot>
|
<slot>addButton()</slot>
|
||||||
|
@ -240,5 +256,6 @@
|
||||||
<slot>itemSelected()</slot>
|
<slot>itemSelected()</slot>
|
||||||
<slot>dialogButtonPressed(QAbstractButton*)</slot>
|
<slot>dialogButtonPressed(QAbstractButton*)</slot>
|
||||||
<slot>itemChanged(QTreeWidgetItem*,int)</slot>
|
<slot>itemChanged(QTreeWidgetItem*,int)</slot>
|
||||||
|
<slot>itemDoubleClicked(QTreeWidgetItem*)</slot>
|
||||||
</slots>
|
</slots>
|
||||||
</ui>
|
</ui>
|
||||||
|
|
Loading…
Reference in New Issue