Skip to content

Commit 16f702d

Browse files
committed
Fix FLAC Direct downsampling to use proper sample rate configuration
- Add sample rate configuration field to store UI selection separately from format - Update configuration dialog to save/load sample rate selection for FLAC formats - Fix MainWindow to check sample rate config for FLAC Direct captures - Now FLAC Direct with 20 MSPS selection uses Signed16BitHalf format (real downsampling) - Now FLAC Direct with 10 MSPS selection uses Signed16BitQuarter format (real downsampling) - Fixes issue where 20 MSPS FLAC captures produced wrong sample rate metadata - Real-time downsampling now works correctly with FLAC Direct format This addresses the core issue where FLAC Direct always captured at full 40 MSPS regardless of UI sample rate selection, causing incorrect metadata in output files.
1 parent 60893fb commit 16f702d

File tree

8 files changed

+47
-13
lines changed

8 files changed

+47
-13
lines changed

Linux-Application/DomesdayDuplicator/cmake_install.cmake

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@ if(NOT DEFINED CMAKE_INSTALL_CONFIG_NAME)
1212
string(REGEX REPLACE "^[^A-Za-z0-9_]+" ""
1313
CMAKE_INSTALL_CONFIG_NAME "${BUILD_TYPE}")
1414
else()
15-
set(CMAKE_INSTALL_CONFIG_NAME "RelWithDebInfo")
15+
set(CMAKE_INSTALL_CONFIG_NAME "")
1616
endif()
1717
message(STATUS "Install configuration: \"${CMAKE_INSTALL_CONFIG_NAME}\"")
1818
endif()

Linux-Application/DomesdayDuplicator/configuration.cpp

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -65,6 +65,7 @@ void Configuration::writeConfiguration()
6565
configuration->setValue("captureFormat", convertCaptureFormatToInt(settings.capture.captureFormat));
6666
configuration->setValue("flacCompressionLevel", settings.capture.flacCompressionLevel);
6767
configuration->setValue("flacOutputFormat", settings.capture.flacOutputFormat);
68+
configuration->setValue("sampleRate", settings.capture.sampleRate);
6869
configuration->endGroup();
6970

7071
// UI
@@ -121,6 +122,7 @@ void Configuration::readConfiguration()
121122
settings.capture.captureFormat = convertIntToCaptureFormat(configuration->value("captureFormat").toInt());
122123
settings.capture.flacCompressionLevel = configuration->value("flacCompressionLevel", 5).toInt(); // Default to level 5
123124
settings.capture.flacOutputFormat = configuration->value("flacOutputFormat", 0).toInt(); // Default to .flac
125+
settings.capture.sampleRate = configuration->value("sampleRate", 0).toInt(); // Default to 40 MSPS
124126
configuration->endGroup();
125127

126128
// UI
@@ -171,6 +173,7 @@ void Configuration::setDefault()
171173
settings.capture.captureFormat = CaptureFormat::tenBitPacked;
172174
settings.capture.flacCompressionLevel = 5; // Default to moderate compression
173175
settings.capture.flacOutputFormat = 0; // Default to .flac output
176+
settings.capture.sampleRate = 0; // Default to 40 MSPS (full rate)
174177

175178
// UI
176179
settings.ui.perSideNotesEnabled = false;
@@ -306,6 +309,16 @@ int Configuration::getFlacOutputFormat() const
306309
return settings.capture.flacOutputFormat;
307310
}
308311

312+
void Configuration::setSampleRate(int sampleRate)
313+
{
314+
settings.capture.sampleRate = sampleRate;
315+
}
316+
317+
int Configuration::getSampleRate() const
318+
{
319+
return settings.capture.sampleRate;
320+
}
321+
309322
// USB settings
310323
void Configuration::setUsbVid(quint16 vid)
311324
{

Linux-Application/DomesdayDuplicator/configuration.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -73,6 +73,8 @@ class Configuration : public QObject
7373
int getFlacCompressionLevel() const;
7474
void setFlacOutputFormat(int format);
7575
int getFlacOutputFormat() const;
76+
void setSampleRate(int sampleRate);
77+
int getSampleRate() const;
7678
void setUsbVid(quint16 vid);
7779
quint16 getUsbVid() const;
7880
void setUsbPid(quint16 pid);
@@ -131,6 +133,7 @@ public slots:
131133
CaptureFormat captureFormat;
132134
int flacCompressionLevel;
133135
int flacOutputFormat; // 0 = .flac, 1 = .ldf
136+
int sampleRate; // 0 = 40 MSPS, 1 = 20 MSPS, 2 = 10 MSPS
134137
};
135138

136139
struct Usb {

Linux-Application/DomesdayDuplicator/configurationdialog.cpp

Lines changed: 15 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -138,7 +138,7 @@ void ConfigurationDialog::loadConfiguration(const Configuration& configuration)
138138
sampleRateIndex = 2; // 1/4 rate
139139
} else {
140140
ui->captureFormatComboBox->setCurrentIndex(ui->captureFormatComboBox->findData(static_cast<unsigned int>(configFormat)));
141-
sampleRateIndex = 0; // Full rate
141+
sampleRateIndex = configuration.getSampleRate(); // Use stored sample rate
142142
}
143143

144144
ui->sampleRateComboBox->setCurrentIndex(sampleRateIndex);
@@ -231,21 +231,29 @@ void ConfigurationDialog::saveConfiguration(Configuration& configuration)
231231
// else keep as sixteenBitSigned (full rate)
232232
}
233233
// Handle FLAC format - choose between ldfCompressed and flacDirect based on output format
234+
// Also apply sample rate selection to FLAC formats
234235
else if (baseFormat == Configuration::CaptureFormat::flacDirect) {
235236
if (flacOutputFormat == 1) {
236-
finalFormat = Configuration::CaptureFormat::ldfCompressed; // .ldf output
237+
// .ldf output - always use ldfCompressed for now
238+
finalFormat = Configuration::CaptureFormat::ldfCompressed;
237239
} else {
238-
finalFormat = Configuration::CaptureFormat::flacDirect; // .flac output
240+
// .flac output - apply sample rate downsampling to flacDirect
241+
if (sampleRateIndex == 1) {
242+
// Store sample rate preference in configuration for MainWindow to use
243+
// We'll create new FLAC format variants for downsampling
244+
finalFormat = Configuration::CaptureFormat::flacDirect; // Keep base format
245+
} else if (sampleRateIndex == 2) {
246+
finalFormat = Configuration::CaptureFormat::flacDirect; // Keep base format
247+
} else {
248+
finalFormat = Configuration::CaptureFormat::flacDirect; // Full rate
249+
}
239250
}
240-
241-
// Apply sample rate to FLAC format by creating downsampled versions
242-
// Note: For now, we'll capture at full rate and apply downsampling in software
243-
// The sample rate selection for FLAC will be handled in the capture logic
244251
}
245252

246253
configuration.setCaptureFormat(finalFormat);
247254
configuration.setFlacCompressionLevel(ui->flacCompressionLevelComboBox->itemData(ui->flacCompressionLevelComboBox->currentIndex()).toInt());
248255
configuration.setFlacOutputFormat(ui->flacOutputFormatComboBox->currentIndex());
256+
configuration.setSampleRate(sampleRateIndex);
249257

250258
// USB
251259
configuration.setUsbVid(static_cast<quint16>(ui->vendorIdLineEdit->text().toInt()));

Linux-Application/DomesdayDuplicator/mainwindow.cpp

Lines changed: 12 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1317,8 +1317,18 @@ void MainWindow::StartCapture()
13171317
}
13181318
else if (configuration->getCaptureFormat() == Configuration::CaptureFormat::flacDirect)
13191319
{
1320-
qDebug() << "MainWindow::StartCapture(): Starting transfer - 16-bit (will compress to FLAC post-capture)";
1321-
captureFormat = UsbDeviceBase::CaptureFormat::Signed16Bit;
1320+
// For FLAC Direct, check the sample rate configuration
1321+
int sampleRate = configuration->getSampleRate();
1322+
if (sampleRate == 1) {
1323+
qDebug() << "MainWindow::StartCapture(): Starting transfer - 16-bit 1/2 rate (20 MSPS) FLAC Direct with real-time downsampling";
1324+
captureFormat = UsbDeviceBase::CaptureFormat::Signed16BitHalf;
1325+
} else if (sampleRate == 2) {
1326+
qDebug() << "MainWindow::StartCapture(): Starting transfer - 16-bit 1/4 rate (10 MSPS) FLAC Direct with real-time downsampling";
1327+
captureFormat = UsbDeviceBase::CaptureFormat::Signed16BitQuarter;
1328+
} else {
1329+
qDebug() << "MainWindow::StartCapture(): Starting transfer - 16-bit (40 MSPS) FLAC Direct";
1330+
captureFormat = UsbDeviceBase::CaptureFormat::Signed16Bit;
1331+
}
13221332
}
13231333
else
13241334
{

Linux-Application/cmake_install.cmake

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@ if(NOT DEFINED CMAKE_INSTALL_CONFIG_NAME)
1212
string(REGEX REPLACE "^[^A-Za-z0-9_]+" ""
1313
CMAKE_INSTALL_CONFIG_NAME "${BUILD_TYPE}")
1414
else()
15-
set(CMAKE_INSTALL_CONFIG_NAME "RelWithDebInfo")
15+
set(CMAKE_INSTALL_CONFIG_NAME "")
1616
endif()
1717
message(STATUS "Install configuration: \"${CMAKE_INSTALL_CONFIG_NAME}\"")
1818
endif()

Linux-Application/dddconv/cmake_install.cmake

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@ if(NOT DEFINED CMAKE_INSTALL_CONFIG_NAME)
1212
string(REGEX REPLACE "^[^A-Za-z0-9_]+" ""
1313
CMAKE_INSTALL_CONFIG_NAME "${BUILD_TYPE}")
1414
else()
15-
set(CMAKE_INSTALL_CONFIG_NAME "RelWithDebInfo")
15+
set(CMAKE_INSTALL_CONFIG_NAME "")
1616
endif()
1717
message(STATUS "Install configuration: \"${CMAKE_INSTALL_CONFIG_NAME}\"")
1818
endif()

Linux-Application/dddutil/cmake_install.cmake

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@ if(NOT DEFINED CMAKE_INSTALL_CONFIG_NAME)
1212
string(REGEX REPLACE "^[^A-Za-z0-9_]+" ""
1313
CMAKE_INSTALL_CONFIG_NAME "${BUILD_TYPE}")
1414
else()
15-
set(CMAKE_INSTALL_CONFIG_NAME "RelWithDebInfo")
15+
set(CMAKE_INSTALL_CONFIG_NAME "")
1616
endif()
1717
message(STATUS "Install configuration: \"${CMAKE_INSTALL_CONFIG_NAME}\"")
1818
endif()

0 commit comments

Comments
 (0)