diff --git a/docs/roadmap.txt b/docs/roadmap.txt index 154fd78..9e5ec0c 100644 --- a/docs/roadmap.txt +++ b/docs/roadmap.txt @@ -46,6 +46,10 @@ v 0.2.1 - Hardening: check return errors, try/catch exceptions, i'm too happy.... - Tests: errors on wrong conf file. - Ui/Ux: seek cursor playback +- ampliar writer para recibir un número n de entradas y escribirlas cada una en un buffer v0.2.0: - Vumeter or indicator about audio output in layer and master, add to sliderGroup. + --> en master se puede hacer con jack, solo en capas. + --> en las capas, hace falta otro nodo atacado en los buses de input que analice la entrada. +- mostrad información de envíos y dispositivos en ui diff --git a/src/audiolayerwidget.cpp b/src/audiolayerwidget.cpp index 3528f50..f37b67d 100644 --- a/src/audiolayerwidget.cpp +++ b/src/audiolayerwidget.cpp @@ -1,4 +1,5 @@ #include "audiolayerwidget.h" +#include "dmxPersonality.h" #include #include @@ -11,7 +12,6 @@ AudioLayerWidget::AudioLayerWidget(QWidget *parent, int layer): { QVBoxLayout *layout = new QVBoxLayout; - QVBoxLayout *playback = new QVBoxLayout; m_folderValue = new ClickableLabel; m_folderValue->setMaximumWidth(300); m_folderValue->setAlignment(Qt::AlignLeft); @@ -19,7 +19,7 @@ AudioLayerWidget::AudioLayerWidget(QWidget *parent, int layer): "color: white;" "background-color: black;" ); - playback->addWidget(m_folderValue); + layout->addWidget(m_folderValue); m_fileValue = new ClickableLabel; connect(m_fileValue, SIGNAL(clicked()), this, SLOT(openMediaDialog())); connect(m_folderValue, SIGNAL(clicked()), this, SLOT(openMediaDialog())); @@ -29,10 +29,7 @@ AudioLayerWidget::AudioLayerWidget(QWidget *parent, int layer): "color: white;" "background-color: black;" ); - playback->addWidget(m_fileValue); - playback->setSpacing(0); - playback->setContentsMargins(0, 0, 0, 0); - layout->addLayout(playback); + layout->addWidget(m_fileValue); m_suspendResumeButton = new QPushButton(this); m_suspendResumeButton->setText(statusToString(Status::Iddle)); @@ -74,17 +71,23 @@ AudioLayerWidget::AudioLayerWidget(QWidget *parent, int layer): m_filterBank = new FilterBankWidget(this); connect(m_filterBank, SIGNAL(setBypass(bool)), this, SLOT(setBypass(bool))); layout->addWidget(m_filterBank); - - QVBoxLayout *volumeBox = new QVBoxLayout; m_pitch = new SliderGroup("Pitch", 0 , 255, 0, NULL); - volumeBox->addWidget(m_pitch); + layout->addWidget(m_pitch); connect(m_pitch, SIGNAL(valueChanged(int)), this, SLOT(pitchChanged(int))); m_pan = new SliderGroup("Pan", 0 , 255, 0, NULL); - volumeBox->addWidget(m_pan); + layout->addWidget(m_pan); connect(m_pan, SIGNAL(valueChanged(int)), this, SLOT(panChanged(int))); - m_volume = new SliderGroup("Vol", 0, 100, 2, NULL); + + QHBoxLayout *volumeBox = new QHBoxLayout; + m_volume = new SliderGroup("Vol", 0, 65535, 2, NULL); volumeBox->addWidget(m_volume); connect(m_volume, SIGNAL(valueChanged(int)), this, SLOT(volumeChanged(int))); + m_bus1 = new SliderGroup("Bus 1", 0, 65535, 2, NULL); + volumeBox->addWidget(m_bus1); + connect(m_bus1, SIGNAL(valueChanged(int)), this, SLOT(bus1VolumeChanged(int))); + m_bus2 = new SliderGroup("Bus 2", 0, 65535, 2, NULL); + volumeBox->addWidget(m_bus2); + connect(m_bus2, SIGNAL(valueChanged(int)), this, SLOT(bus2VolumeChanged(int))); volumeBox->setSpacing(0); volumeBox->setContentsMargins(0, 0, 0, 0); layout->addLayout(volumeBox); @@ -102,6 +105,16 @@ void AudioLayerWidget::volumeChanged(int value) emit(uiSliderChanged(m_layer, Slider::Volume, value)); } +void AudioLayerWidget::bus1VolumeChanged(int value) +{ + emit(uiSliderChanged(m_layer, Slider::Bus1, value)); +} + +void AudioLayerWidget::bus2VolumeChanged(int value) +{ + emit(uiSliderChanged(m_layer, Slider::Bus2, value)); +} + void AudioLayerWidget::panChanged(int value) { emit(uiSliderChanged(m_layer, Slider::Pan, value)); @@ -157,9 +170,9 @@ void AudioLayerWidget::openMediaDialog() // from DMX signals void AudioLayerWidget::setVol(float vol) { - m_volume->blockSignals(true); - m_volume->setValue(vol); - m_volume->blockSignals(false); + m_volume->blockSignals(true); + m_volume->setValue(vol); + m_volume->blockSignals(false); } void AudioLayerWidget::setPan(int pan) @@ -221,8 +234,17 @@ void AudioLayerWidget::setCurrentTime(float progress) void AudioLayerWidget::setFilterParam(int channel, int value) { - m_filterBank->blockSignals(true); - m_filterBank->setValue(channel, value); - m_filterBank->blockSignals(false); - + if (channel <= FILTER_BANK_GAIN - FILTER_CHANNELS){ + m_filterBank->blockSignals(true); + m_filterBank->setValue(channel, value); + m_filterBank->blockSignals(false); + } else if (channel == SEND1 - HP_FREQ) { + m_bus1->blockSignals(false); + m_bus1->setValue((value * 256) + 255); + m_bus1->blockSignals(true); + } else if (channel == SEND2 - HP_FREQ) { + m_bus2->blockSignals(false); + m_bus2->setValue(value * 256 + 255); + m_bus2->blockSignals(true); + } } diff --git a/src/audiolayerwidget.h b/src/audiolayerwidget.h index f3ba1e4..cb446a9 100644 --- a/src/audiolayerwidget.h +++ b/src/audiolayerwidget.h @@ -39,6 +39,8 @@ private: SliderGroup *m_volume; SliderGroup *m_pan; SliderGroup *m_pitch; + SliderGroup *m_bus1; + SliderGroup *m_bus2; QTimeEdit *m_progressTime; QTimeEdit *m_totalTimeValue; QProgressBar *m_progress; @@ -51,6 +53,8 @@ private slots: void openMediaDialog(); void toggleSuspendResume(); void volumeChanged(int vol); + void bus1VolumeChanged(int vol); + void bus2VolumeChanged(int vol); void panChanged(int pan); void pitchChanged(int pitch); void setBypass(bool value); diff --git a/src/audiowidget.cpp b/src/audiowidget.cpp index 2f3b634..da7c33f 100644 --- a/src/audiowidget.cpp +++ b/src/audiowidget.cpp @@ -1,6 +1,5 @@ #include "audiowidget.h" - -//#include +#include "dmxPersonality.h" AudioWidget::AudioWidget(QWidget *parent) : QWidget(parent) @@ -23,8 +22,8 @@ AudioWidget::AudioWidget(QWidget *parent) : for (int j = 0; j < FILTER_CHANNELS; j++) m_filtersUpdate[i][j] = -1; } - m_layout->setSpacing(0); - m_layout->setContentsMargins(1, 1, 1, 1); + m_layout->setSpacing(2); + m_layout->setContentsMargins(2, 2, 2, 2); setLayout(m_layout); m_refreshUi = new QTimer(this); connect(m_refreshUi, SIGNAL(timeout()), this, SLOT(refreshUi())); @@ -110,6 +109,6 @@ void AudioWidget::refreshUi() void AudioWidget::filterParamChanged(int layer, int channel, int value) { - m_filtersUpdate[layer][channel - 9] = value; + m_filtersUpdate[layer][channel - HP_FREQ] = value; m_layerUpdate[layer].updated = true; } diff --git a/src/defines.h b/src/defines.h index 5f73abe..8d81a59 100644 --- a/src/defines.h +++ b/src/defines.h @@ -10,9 +10,9 @@ #define FORMAT ma_format_f32 /* Must always be f32. */ #define CHANNELS 2 #define SAMPLE_RATE 48000 -#define UI_REFRESH_TIME 100 +#define UI_REFRESH_TIME 97 #define FADE_TIME 25 // DMX Frame time, 40 fps, avoid clicks -#define FILTER_CHANNELS 13 // number of dmx channels dedicated to filters by layer +#define FILTER_CHANNELS 16 // number of dmx channels dedicated to filters by layer struct dmxSetting { int address; @@ -38,7 +38,9 @@ enum Slider Volume, Pan, Pitch, - Bypass + Bypass, + Bus1, + Bus2 }; #ifdef __cplusplus @@ -71,6 +73,8 @@ struct layerData { int address; unsigned int universe; int device; + int bus1Vol; + int bus2Vol; }; #endif // __cplusplus #endif // DEFINES_H diff --git a/src/dmxPersonality.h b/src/dmxPersonality.h index 1da964a..d08671a 100644 --- a/src/dmxPersonality.h +++ b/src/dmxPersonality.h @@ -23,7 +23,7 @@ #define HIGH_FREQ 19 #define HIGH_Q 20 #define HIGH_GAIN 21 -#define FILTER_BANK_GAIN 22 // not implemented yet +#define FILTER_BANK_GAIN 22 #define SEND1 23 #define SEND2 24 #define LAYER_CHANNELS 25 diff --git a/src/filterbankwidget.cpp b/src/filterbankwidget.cpp index c9b107d..4742af2 100644 --- a/src/filterbankwidget.cpp +++ b/src/filterbankwidget.cpp @@ -86,7 +86,8 @@ void FilterBankWidget::setValue(int filter, int value) result = (double)( value / 32.0f) + 0.1f; } else if (channel == HIGH_GAIN) { result = (double)(value / 21.25) - 6.023528412f; - } + } else + result = (double)value; fb[filter]->setValue(result); } diff --git a/src/libremediaserver-audio.cpp b/src/libremediaserver-audio.cpp index 72398ee..07e3b0e 100644 --- a/src/libremediaserver-audio.cpp +++ b/src/libremediaserver-audio.cpp @@ -96,9 +96,8 @@ void libreMediaServerAudio::dmxInput(int layer, int channel, int value) QString mediaFile = NULL; int aux; if (channel == VOLUME_COARSE || channel == VOLUME_FINE) { - float tmp = value / 65025.0f; - m_mae.volChanged(layer, tmp); - m_updateUi[layer][0] = tmp * 100.0f; + m_mae.volChanged(layer, value); + m_updateUi[layer][0] = value; } else if (channel == PAN) { m_mae.panChanged(layer, value); m_updateUi[layer][1] = value; @@ -236,7 +235,7 @@ void libreMediaServerAudio::uiSliderChanged(int layer, Slider s, int value) { switch (s){ case Slider::Volume: - m_mae.volChanged(layer, float((value / 100.0f))); + m_mae.volChanged(layer, value); break; case Slider::Pan: m_mae.panChanged(layer, value); @@ -246,6 +245,13 @@ void libreMediaServerAudio::uiSliderChanged(int layer, Slider s, int value) break; case Slider::Bypass: m_mae.setBypass(m_dmxSettings.at(layer).audioDevice, layer, value); + break; + case Slider::Bus1: + m_mae.filterParamChanged(layer, m_dmxSettings.at(layer).audioDevice, SEND1, value / 255); + break; + case Slider::Bus2: + m_mae.filterParamChanged(layer, m_dmxSettings.at(layer).audioDevice, SEND2, value / 255); + break; } } diff --git a/src/miniaudioengine.cpp b/src/miniaudioengine.cpp index 0599fcc..328e738 100644 --- a/src/miniaudioengine.cpp +++ b/src/miniaudioengine.cpp @@ -413,14 +413,17 @@ ma_result MiniAudioEngine::printFormatInfo(int layer) return result; } -// Expects between 0 and 1 vol value -void MiniAudioEngine::volChanged(int layer, float vol) +// Expects between 0 and 65535 vol value +void MiniAudioEngine::volChanged(int layer, int vol) { if (m_mae.mediaLoaded[layer] == false) return; - if (vol >= 1) - vol = 0.99f; - ma_sound_group_set_fade_in_milliseconds(&m_mae.sounds[layer], -1, pow(vol, 2), FADE_TIME); + float db = ((float)vol / 771.0f) - 85.0f; + if (db <= -85.0f) { + db = 0; + } else + db = ma_volume_db_to_linear(db); + ma_sound_group_set_fade_in_milliseconds(&m_mae.sounds[layer], -1, db, FADE_TIME); m_mae.currentStatus[layer].vol = vol; } @@ -618,13 +621,23 @@ ma_result MiniAudioEngine::filterParamChanged(int layer, int audioDevice, int ch return result; } } else if (channel == SEND1) { - ma_node_set_output_bus_volume(&fb->output, 0, pow((value / 255.0f), 2)); + float db = ((float)value / 3.0f) - 85.0f; + if (db <= -85.0f) { + db = 0; + } else + db = ma_volume_db_to_linear(db); + ma_node_set_output_bus_volume(&fb->output, 0, db); if (result != MA_SUCCESS) { cout << "ERROR " << result << ": Failed set Send 1 Volume." << endl; return result; } } else if (channel == SEND2) { - ma_node_set_output_bus_volume(&fb->output, 1, pow((value / 255.0f), 2)); + float db = ((float)value / 3.0f) - 85.0f; + if (db <= -85.0f) { + db = 0; + } else + db = ma_volume_db_to_linear(db); + ma_node_set_output_bus_volume(&fb->output, 1, db); if (result != MA_SUCCESS) { cout << "ERROR " << result << ": Failed set Send 2 Volume." << endl; } diff --git a/src/miniaudioengine.h b/src/miniaudioengine.h index 308706b..870dc42 100644 --- a/src/miniaudioengine.h +++ b/src/miniaudioengine.h @@ -66,7 +66,7 @@ public: protected: ma_result loadMedia(int layer, char *media, uint audioDevice); - void volChanged(int layer, float vol); + void volChanged(int layer, int vol); void panChanged(int layer, float pan); void pitchChanged(int layer, float pitch); ma_result playbackChanged(int layer, Status status); diff --git a/src/slidergroup.cpp b/src/slidergroup.cpp index 55bfcf7..9eedb70 100644 --- a/src/slidergroup.cpp +++ b/src/slidergroup.cpp @@ -39,9 +39,10 @@ SliderGroup::SliderGroup(QString name, valueBox.setFocusPolicy(Qt::NoFocus); valueBox.setButtonSymbols(QAbstractSpinBox::NoButtons); valueBox.setMinimumWidth(50); - if (decimals) - valueBox.setRange(-100, 100); - else + if (decimals) { + valueBox.setRange(-84.0f, 0.0f); + valueBox.setSpecialValueText("-inf"); + } else valueBox.setRange(min, max); valueBox.setValue(0); valueBox.setDecimals(decimals); @@ -66,20 +67,27 @@ SliderGroup::SliderGroup(QString name, void SliderGroup::sliderValueChanged(int value) { valueBox.blockSignals(true); - valueBox.setValue(value); + float db = ((float)value / 771.0f) - 85.0f; + if (db <= -84.5f) { + valueBox.setSpecialValueText("-inf"); + } else + valueBox.setValue(db); valueBox.blockSignals(false); emit valueChanged(value); }; void SliderGroup::setValue(float value) { + float db; + slider.blockSignals(true); valueBox.blockSignals(true); if (int(value) != slider.value()) slider.setValue(value); - if (valueBox.decimals()) - valueBox.setValue(value - 100.0f); - else + if (valueBox.decimals()) { + db = (float)(value / 771.0f) - 85.0f; + valueBox.setValue(db); + } else valueBox.setValue(value); slider.blockSignals(false); valueBox.blockSignals(false);