#include <QList>
#include <QMessageBox>
#include <QPushButton>
+#include <QSpinBox>
#include <QTableWidget>
#include <QVariant>
#include <functional>
#include "alsa_pool.h"
#include "defs.h"
-#include "post_to_main_thread.h"
+#include "shared/post_to_main_thread.h"
#include "ui_input_mapping.h"
using namespace std;
: ui(new Ui::InputMappingDialog),
mapping(global_audio_mixer->get_input_mapping()),
old_mapping(mapping),
- devices(global_audio_mixer->get_devices())
+ devices(global_audio_mixer->get_devices(AudioMixer::HOLD_ALSA_DEVICES))
{
for (unsigned bus_index = 0; bus_index < mapping.buses.size(); ++bus_index) {
bus_settings.push_back(global_audio_mixer->get_bus_settings(bus_index));
ui->setupUi(this);
ui->table->setSelectionBehavior(QAbstractItemView::SelectRows);
ui->table->setSelectionMode(QAbstractItemView::SingleSelection); // Makes implementing moving easier for now.
+ ui->table->setColumnWidth(4, 200);
fill_ui_from_mapping(mapping);
connect(ui->table, &QTableWidget::cellChanged, this, &InputMappingDialog::cell_changed);
saved_callback = global_audio_mixer->get_state_changed_callback();
global_audio_mixer->set_state_changed_callback([this]{
post_to_main_thread([this]{
- devices = global_audio_mixer->get_devices();
+ devices = global_audio_mixer->get_devices(AudioMixer::HOLD_ALSA_DEVICES);
for (unsigned row = 0; row < mapping.buses.size(); ++row) {
- fill_row_from_bus(row, mapping.buses[row]);
+ fill_row_from_bus(row, mapping.buses[row], mapping);
}
});
});
ui->table->setRowCount(mapping.buses.size());
for (unsigned row = 0; row < mapping.buses.size(); ++row) {
- fill_row_from_bus(row, mapping.buses[row]);
+ fill_row_from_bus(row, mapping.buses[row], mapping);
}
}
-void InputMappingDialog::fill_row_from_bus(unsigned row, const InputMapping::Bus &bus)
+void InputMappingDialog::fill_row_from_bus(unsigned row, const InputMapping::Bus &bus, const InputMapping &mapping)
{
QString name(QString::fromStdString(bus.name));
ui->table->setItem(row, 0, new QTableWidgetItem(name));
bind(&InputMappingDialog::card_selected, this, card_combo, row, _1));
ui->table->setCellWidget(row, 1, card_combo);
+ fill_delay_from_bus(row, bus, mapping);
setup_channel_choices_from_bus(row, bus);
}
}
}
+void InputMappingDialog::fill_delay_from_bus(unsigned row, const InputMapping::Bus &bus, const InputMapping &mapping)
+{
+ QDoubleSpinBox *delay_spinner = static_cast<QDoubleSpinBox *>(ui->table->cellWidget(row, 4));
+ if (delay_spinner == nullptr) {
+ delay_spinner = new QDoubleSpinBox;
+ delay_spinner->setDecimals(1);
+ delay_spinner->setMinimum(-50.0);
+ delay_spinner->setMaximum(500.0);
+ connect(delay_spinner, static_cast<void(QDoubleSpinBox::*)(double)>(&QDoubleSpinBox::valueChanged),
+ bind(&InputMappingDialog::delay_changed, this, row, _1));
+ }
+ delay_spinner->blockSignals(true);
+ if (bus.device.type == InputSourceType::SILENCE) {
+ delay_spinner->setEnabled(false);
+ delay_spinner->setValue(0.0);
+ } else {
+ delay_spinner->setEnabled(true);
+ const auto delay_it = mapping.extra_delay_ms.find(bus.device);
+ if (delay_it != mapping.extra_delay_ms.end()) {
+ delay_spinner->setValue(delay_it->second);
+ } else {
+ delay_spinner->setValue(0.0);
+ }
+ }
+ delay_spinner->blockSignals(false);
+ ui->table->setCellWidget(row, 4, delay_spinner);
+}
+
void InputMappingDialog::ok_clicked()
{
global_audio_mixer->set_state_changed_callback(saved_callback);
{
uint64_t key = card_combo->itemData(index).toULongLong();
mapping.buses[row].device = key_to_DeviceSpec(key);
+ fill_delay_from_bus(row, mapping.buses[row], mapping);
setup_channel_choices_from_bus(row, mapping.buses[row]);
}
mapping.buses[row].source_channel[channel] = index - 1;
}
+void InputMappingDialog::delay_changed(unsigned row, double value)
+{
+ mapping.extra_delay_ms[mapping.buses[row].device] = value;
+
+ for (unsigned other_row = 0; other_row < mapping.buses.size(); ++other_row) {
+ if (row != other_row && mapping.buses[row].device == mapping.buses[other_row].device) {
+ fill_delay_from_bus(other_row, mapping.buses[other_row], mapping);
+ }
+ }
+}
+
void InputMappingDialog::add_clicked()
{
QTableWidgetSelectionRange all(0, 0, ui->table->rowCount() - 1, ui->table->columnCount() - 1);
ui->table->setRowCount(mapping.buses.size());
unsigned row = mapping.buses.size() - 1;
- fill_row_from_bus(row, new_bus);
+ fill_row_from_bus(row, new_bus, mapping);
ui->table->editItem(ui->table->item(row, 0)); // Start editing the name.
update_button_state();
}
swap(mapping.buses[a_row], mapping.buses[b_row]);
swap(bus_settings[a_row], bus_settings[b_row]);
- fill_row_from_bus(a_row, mapping.buses[a_row]);
- fill_row_from_bus(b_row, mapping.buses[b_row]);
+ fill_row_from_bus(a_row, mapping.buses[a_row], mapping);
+ fill_row_from_bus(b_row, mapping.buses[b_row], mapping);
QTableWidgetSelectionRange a_sel(a_row, 0, a_row, ui->table->columnCount() - 1);
QTableWidgetSelectionRange b_sel(b_row, 0, b_row, ui->table->columnCount() - 1);
for (unsigned bus_index = 0; bus_index < mapping.buses.size(); ++bus_index) {
bus_settings.push_back(global_audio_mixer->get_bus_settings(bus_index));
}
- devices = global_audio_mixer->get_devices(); // New dead cards may have been made.
+ devices = global_audio_mixer->get_devices(AudioMixer::HOLD_ALSA_DEVICES); // New dead cards may have been made.
fill_ui_from_mapping(mapping);
}