solucionado el glich de verdad...

los loop points y range points no funcionan al final de l loop, es igual
que seektoPCMFrame en su estado actual.
cambios cosméticos
This commit is contained in:
snt 2024-05-24 19:48:45 +02:00
parent 0d29dda4c1
commit 6a22534686
7 changed files with 87 additions and 35 deletions

View file

@ -40,3 +40,5 @@ v 0.3.0
- Hardening: check return errors, try/catch exceptions, i'm too happy.... - Hardening: check return errors, try/catch exceptions, i'm too happy....
- Tests: errors on wrong conf file. - Tests: errors on wrong conf file.
- ampliar writer para recibir un número n de entradas y escribirlas cada una en un buffer - ampliar writer para recibir un número n de entradas y escribirlas cada una en un buffer
- aislar miniaudio del callback dmx tal como hemos hecho con la Ui, al menos las operaciones lentas como cargar medios.
- en load media usar un fence para actualizar mediaLoaded.

View file

@ -39,9 +39,8 @@ SOURCES += src/main.cpp \
src/settings.cpp \ src/settings.cpp \
src/slidergroup.cpp src/slidergroup.cpp
FORMS += src/libremediaserver-audio-gui.ui FORMS += src/libremediaserver-audio-gui.ui
CCFLAG += -msse2 -mavx2 #-fsanitize=address -g3 -O0 CCFLAG += -msse2 -mavx2
QMAKE_CXXFLAGS += $$(CXXFLAG) QMAKE_CXXFLAGS += $$(CXXFLAG)
#QMAKE_CXXFLAGS += -fsanitize=address -g3 -O0
QMAKE_CFLAGS += $$(CCFLAG) QMAKE_CFLAGS += $$(CCFLAG)
QMAKE_LFLAGS += $$(LDFLAG) QMAKE_LFLAGS += $$(LDFLAG)
LIBS += -lola -lolacommon -ldl -lpthread -lm LIBS += -lola -lolacommon -ldl -lpthread -lm

View file

@ -93,33 +93,35 @@ AudioLayerWidget::AudioLayerWidget(QWidget *parent, int layer):
layout->addLayout(volumeBox); layout->addLayout(volumeBox);
QHBoxLayout *labelsBox = new QHBoxLayout; QHBoxLayout *labelsBox = new QHBoxLayout;
m_level = new QLabel("-inf"); m_level = new QLabel("-inf");
m_level->setStyleSheet("border: 1px solid #5a4855;" m_level->setStyleSheet("border: 1px solid #CFB0C9;"
"margin: 0px;" "margin: 0px;"
"background-color: #180014;" "margin-right: 5px;"
"margin-left: 5px;"
"background-color: black;"
"color: white;" "color: white;"
"width:70px;" "width:80px;"
"text-align: center;" "text-align: center;"
); );
m_level->setMinimumWidth(70); m_level->setMinimumWidth(80);
m_level->setMaximumWidth(80);
m_level->setMinimumHeight(20);
m_level->setAlignment(Qt::AlignHCenter); m_level->setAlignment(Qt::AlignHCenter);
labelsBox->addWidget(m_level); labelsBox->addWidget(m_level);
m_bus1Label = new QLabel("dummy"); m_bus1Label = new QLabel("dummy");
m_bus1Label->setMinimumWidth(80); m_bus1Label->setMinimumWidth(80);
m_bus1Label->setStyleSheet("border: 1px solid #5a4855;" m_bus1Label->setStyleSheet("border: 1px solid #CFB0C9;"
"margin: 0px;" "margin: 0px;"
"background-color: #383034;" "background-color: black;"
"width:70px;" "color: white;"
); "font-size: 11px;");
m_bus1Label->setAlignment(Qt::AlignHCenter);
labelsBox->addWidget(m_bus1Label); labelsBox->addWidget(m_bus1Label);
m_bus2Label = new QLabel("dummy"); m_bus2Label = new QLabel("dummy");
m_bus2Label->setMinimumWidth(80); m_bus2Label->setMinimumWidth(80);
m_bus2Label->setStyleSheet("border: 1px solid #5a4855;" m_bus2Label->setStyleSheet("border: 1px solid #CFB0C9;"
"margin: 0px;" "margin: 0px;"
"background-color: #383034;" "background-color: black;"
"width: 70px;" "color: white;"
); "font-size: 11px;");
m_bus2Label->setAlignment(Qt::AlignHCenter);
labelsBox->addWidget(m_bus2Label); labelsBox->addWidget(m_bus2Label);
labelsBox->setSpacing(0); labelsBox->setSpacing(0);
labelsBox->setContentsMargins(0, 0, 0, 0); labelsBox->setContentsMargins(0, 0, 0, 0);

View file

@ -10,8 +10,8 @@
#define FORMAT ma_format_f32 /* Must always be f32. */ #define FORMAT ma_format_f32 /* Must always be f32. */
#define CHANNELS 2 #define CHANNELS 2
#define SAMPLE_RATE 48000 #define SAMPLE_RATE 48000
#define UI_REFRESH_TIME 97 #define UI_REFRESH_TIME 123
#define FADE_TIME 25 // DMX Frame time, 40 fps, avoid clicks #define FADE_TIME 20
#define FILTER_CHANNELS 16 // number of dmx channels dedicated to filters by layer #define FILTER_CHANNELS 16 // number of dmx channels dedicated to filters by layer
struct dmxSetting { struct dmxSetting {

View file

@ -129,6 +129,7 @@ void libreMediaServerAudio::dmxInput(int layer, int channel, int value)
#ifndef NOGUI #ifndef NOGUI
if (m_ui) { if (m_ui) {
m_lmsUi->m_aw->playbackChanged(layer, s); m_lmsUi->m_aw->playbackChanged(layer, s);
m_updateUi[layer][3] = 1;
m_played.clear(); m_played.clear();
m_played.append(m_ola->getValue(layer, DMX_FILE)); m_played.append(m_ola->getValue(layer, DMX_FILE));
} }
@ -173,6 +174,7 @@ void libreMediaServerAudio::refreshUi() {
if (m_mae.getAtEnd(i)) { if (m_mae.getAtEnd(i)) {
if (m_currentStatus[i] == Status::PlayingOnce) { if (m_currentStatus[i] == Status::PlayingOnce) {
m_currentStatus[i] = Status::Stopped; m_currentStatus[i] = Status::Stopped;
m_lmsUi->m_aw->playbackChanged(i, Status::Stopped);
} }
if (m_currentStatus[i] == Status::PlayingFolder) { if (m_currentStatus[i] == Status::PlayingFolder) {
uint last = m_played.last(); uint last = m_played.last();
@ -187,7 +189,7 @@ void libreMediaServerAudio::refreshUi() {
m_lmsUi->m_aw->playbackChanged(i, Status::Stopped); m_lmsUi->m_aw->playbackChanged(i, Status::Stopped);
} }
} }
if (m_currentStatus[i] == Status::PlayingFolderLoop) { else if (m_currentStatus[i] == Status::PlayingFolderLoop) {
uint last = m_played.last(); uint last = m_played.last();
int folder = m_ola->getValue(i, DMX_FOLDER); int folder = m_ola->getValue(i, DMX_FOLDER);
last++; last++;
@ -199,7 +201,7 @@ void libreMediaServerAudio::refreshUi() {
m_mae.playbackChanged(i, Status::PlayingFolder); m_mae.playbackChanged(i, Status::PlayingFolder);
} }
} }
if (m_currentStatus[i] == Status::PlayingFolderRandom) { else if (m_currentStatus[i] == Status::PlayingFolderRandom) {
int last = -1; int last = -1;
int folder = m_ola->getValue(i, DMX_FOLDER); int folder = m_ola->getValue(i, DMX_FOLDER);
if (uint(abs(m_played.size())) >= m_mediaLibrary->getMediaFolderCount(folder)) if (uint(abs(m_played.size())) >= m_mediaLibrary->getMediaFolderCount(folder))

View file

@ -278,7 +278,7 @@ ma_result MiniAudioEngine::startDevices()
deviceConfig.dataCallback = audioDataCallback; deviceConfig.dataCallback = audioDataCallback;
engineConfig = ma_engine_config_init(); engineConfig = ma_engine_config_init();
engineConfig.pResourceManager = &m_mae.resourceManager; engineConfig.pResourceManager = &m_mae.resourceManager;
engineConfig.defaultVolumeSmoothTimeInPCMFrames = SAMPLE_RATE / 20; //engineConfig.defaultVolumeSmoothTimeInPCMFrames = SAMPLE_RATE / 20;
engineConfig.noAutoStart = MA_TRUE; engineConfig.noAutoStart = MA_TRUE;
for (uint internalId = 0; internalId < m_mae.audioDevicesQty; internalId++) { for (uint internalId = 0; internalId < m_mae.audioDevicesQty; internalId++) {
@ -482,38 +482,85 @@ ma_result MiniAudioEngine::playbackChanged(int layer, Status status)
case Status::PlayingLoop: case Status::PlayingLoop:
loop = true; loop = true;
case Status::PlayingOnce: case Status::PlayingOnce:
ma_sound_set_looping(&m_mae.sounds[layer], loop);
if (m_mae.currentStatus[layer].cursor > 0) {
this->setRangePoint(layer, m_mae.currentStatus[layer].cursor);
this->setLoopPoint(layer, m_mae.currentStatus[layer].cursor);
}
case Status::PlayingFolder: case Status::PlayingFolder:
case Status::PlayingFolderLoop: case Status::PlayingFolderLoop:
case Status::PlayingFolderRandom: case Status::PlayingFolderRandom:
ma_sound_set_stop_time_in_milliseconds(&m_mae.sounds[layer], ~(ma_uint64)0); ma_sound_set_stop_time_in_milliseconds(&m_mae.sounds[layer], ~(ma_uint64)0);
ma_sound_set_looping(&m_mae.sounds[layer], loop);
result = ma_sound_start(&m_mae.sounds[layer]);
//this->volChanged(layer, m_mae.currentStatus[layer].vol);
float db = (m_mae.currentStatus[layer].vol / 771.0f) - 85.0f; float db = (m_mae.currentStatus[layer].vol / 771.0f) - 85.0f;
if (db <= -85.0f) { if (db <= -85.0f) {
db = 0; db = 0;
} else } else
db = ma_volume_db_to_linear(db); db = ma_volume_db_to_linear(db);
ma_sound_set_fade_in_milliseconds(&m_mae.sounds[layer], -1, db, 0); result = ma_sound_start(&m_mae.sounds[layer]);
ma_sound_group_set_volume(&m_mae.sounds[layer], 0.0f);
ma_sound_set_fade_in_milliseconds(&m_mae.sounds[layer], 0, db, FADE_TIME);
ma_sound_group_set_volume(&m_mae.sounds[layer], 1.0f);
} }
if (result == MA_SUCCESS) if (result == MA_SUCCESS)
m_mae.currentStatus[layer].status = status; m_mae.currentStatus[layer].status = status;
return result; return result;
} }
ma_result MiniAudioEngine::seekToCursor(int layer, int cursor) ma_result MiniAudioEngine::setRangePoint(int layer, int cursor)
{ {
ma_result result = MA_SUCCESS; ma_result result = MA_SUCCESS;
ma_uint64 end, start; ma_uint64 end = 0, start;
if (m_mae.mediaLoaded[layer] == false) if (m_mae.mediaLoaded[layer] == false)
return MA_DOES_NOT_EXIST; return MA_DOES_NOT_EXIST;
result = ma_sound_get_length_in_pcm_frames(&m_mae.sounds[layer], &end); if (cursor == 0)
if (result != MA_SUCCESS) { return result; } start = 0;
start = (cursor * end) / 65535; else {
Status oldStatus = m_mae.currentStatus[layer].status; result = ma_sound_get_length_in_pcm_frames(&m_mae.sounds[layer], &end);
if (result != MA_SUCCESS) { return result; }
start = (cursor * end) / 65535;
}
result = ma_data_source_set_range_in_pcm_frames(&m_mae.sounds[layer].pDataSource, start, end);
if (result != MA_SUCCESS)
cout << "ERROR " << result << " :set range point" << endl;
return (result);
}
ma_result MiniAudioEngine::setLoopPoint(int layer, int cursor)
{
ma_result result = MA_SUCCESS;
ma_uint64 end = 0, start;
if (m_mae.mediaLoaded[layer] == false)
return MA_DOES_NOT_EXIST;
if (cursor == 0)
start = 0;
else {
result = ma_sound_get_length_in_pcm_frames(&m_mae.sounds[layer], &end);
if (result != MA_SUCCESS) { return result; }
start = (cursor * end) / 65535;
}
result = ma_data_source_set_loop_point_in_pcm_frames(&m_mae.sounds[layer].pDataSource, start + 1, end - 1);
if (result != MA_SUCCESS)
cout << "ERROR " << result << " :set loop point" << endl;
return (result);
}
ma_result MiniAudioEngine::seekToCursor(int layer, int cursor)
{
ma_result result = MA_SUCCESS;
ma_uint64 end = 0, start;
if (m_mae.mediaLoaded[layer] == false)
return MA_DOES_NOT_EXIST;
if (cursor == 0)
start = 0;
else {
result = ma_sound_get_length_in_pcm_frames(&m_mae.sounds[layer], &end);
if (result != MA_SUCCESS) { return result; }
start = (cursor * end) / 65535;
}
result = ma_sound_seek_to_pcm_frame(&m_mae.sounds[layer], start); result = ma_sound_seek_to_pcm_frame(&m_mae.sounds[layer], start);
//result = ma_data_source_set_loop_point_in_pcm_frames(&m_mae.sounds[layer], start, end); // this do nothing here, it must be done after set_looping or start?
return (result); return (result);
} }
@ -533,12 +580,9 @@ Status MiniAudioEngine::getStatus(int layer)
void MiniAudioEngine::refreshValues(int layer) void MiniAudioEngine::refreshValues(int layer)
{ {
this->seekToCursor(layer, m_mae.currentStatus[layer].cursor);
this->panChanged(layer, m_mae.currentStatus[layer].pan); this->panChanged(layer, m_mae.currentStatus[layer].pan);
this->pitchChanged(layer, m_mae.currentStatus[layer].pitch); this->pitchChanged(layer, m_mae.currentStatus[layer].pitch);
ma_sound_group_set_fade_in_milliseconds(&m_mae.sounds[layer], -1, 0, 0.0f);
this->playbackChanged(layer, m_mae.currentStatus[layer].status); this->playbackChanged(layer, m_mae.currentStatus[layer].status);
this->volChanged(layer, m_mae.currentStatus[layer].vol);
} }
ma_result MiniAudioEngine::filterParamChanged(int layer, int channel, int value) ma_result MiniAudioEngine::filterParamChanged(int layer, int channel, int value)

View file

@ -3,6 +3,7 @@
#define MA_ENABLE_ONLY_SPECIFIC_BACKENDS #define MA_ENABLE_ONLY_SPECIFIC_BACKENDS
#define MA_ENABLE_JACK #define MA_ENABLE_JACK
#define MA_DISABLE_PULSE
#define MA_NO_GENERATION #define MA_NO_GENERATION
#define MA_DEBUG_OUTPUT #define MA_DEBUG_OUTPUT
#define MA_LOG_LEVEL_DEBUG DEBUG #define MA_LOG_LEVEL_DEBUG DEBUG
@ -97,6 +98,8 @@ private:
ma_result seekToCursor(int layer, int cursor); ma_result seekToCursor(int layer, int cursor);
ma_result setNodeGraph(); ma_result setNodeGraph();
ma_result createFilterBank(uint layer); ma_result createFilterBank(uint layer);
ma_result setLoopPoint(int layer, int cursor);
ma_result setRangePoint(int layer, int cursor);
}; };
#endif // MINIAUDIOENGINE_H #endif // MINIAUDIOENGINE_H