Skip to content

Commit 082acbf

Browse files
committed
Allow setting backend samplerate/buffer size independent of device configuration
For cases when no Mixxx device is configured, like when using PipeWire patchbay mode
1 parent c36da7c commit 082acbf

5 files changed

Lines changed: 25 additions & 31 deletions

File tree

src/soundio/pipewireenumerator.cpp

Lines changed: 11 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -87,6 +87,7 @@ PipewireEnumerator::PipewireEnumerator(UserSettingsPointer, SoundManager* pManag
8787
m_sampleRate(48000),
8888
m_audioLatencyUsage(kAppGroup, QStringLiteral("audio_latency_usage")),
8989
m_coPipewirePatchbaySync(ConfigKey(kAppGroup, QStringLiteral("pipewire_patchbay_sync"))),
90+
m_coOutputLatencyMs(kAppGroup, QStringLiteral("output_latency_ms")),
9091
m_framesPerBuffer(0) {
9192
connect(m_pSoundManager,
9293
&SoundManager::inputRegistered,
@@ -558,9 +559,7 @@ bool PipewireEnumerator::isOpen(uint32_t id) {
558559
}
559560

560561
std::string PipewireEnumerator::openDeviceInput(uint32_t deviceId,
561-
const AudioInput& input,
562-
mixxx::audio::SampleRate sampleRate,
563-
SINT framesPerBuffer) {
562+
const AudioInput& input) {
564563
std::string result;
565564
VERIFY_OR_DEBUG_ASSERT(m_initialized) {
566565
qDebug() << "PipewireEnumerator::openDevice called when "
@@ -572,10 +571,6 @@ std::string PipewireEnumerator::openDeviceInput(uint32_t deviceId,
572571
return {};
573572
}
574573

575-
if (sampleRate != m_sampleRate || framesPerBuffer != m_framesPerBuffer) {
576-
updateFilterLatency(sampleRate, framesPerBuffer);
577-
}
578-
579574
PortPair& ports = m_inputs.at(input);
580575
ports.activeDevice = deviceId;
581576

@@ -605,10 +600,7 @@ std::string PipewireEnumerator::openDeviceInput(uint32_t deviceId,
605600
return result;
606601
}
607602

608-
std::string PipewireEnumerator::openDeviceOutput(uint32_t deviceId,
609-
const AudioOutput& output,
610-
mixxx::audio::SampleRate sampleRate,
611-
SINT framesPerBuffer) {
603+
std::string PipewireEnumerator::openDeviceOutput(uint32_t deviceId, const AudioOutput& output) {
612604
std::string result;
613605
VERIFY_OR_DEBUG_ASSERT(m_initialized) {
614606
qDebug() << "PipewireEnumerator::openDevice called when "
@@ -620,10 +612,6 @@ std::string PipewireEnumerator::openDeviceOutput(uint32_t deviceId,
620612
return {};
621613
}
622614

623-
if (sampleRate != m_sampleRate || framesPerBuffer != m_framesPerBuffer) {
624-
updateFilterLatency(sampleRate, framesPerBuffer);
625-
}
626-
627615
PortPair& ports = m_outputs.at(output);
628616
ports.activeDevice = deviceId;
629617

@@ -1031,3 +1019,11 @@ bool PipewireEnumerator::nodeHasPorts(const Node& node) {
10311019

10321020
return false;
10331021
}
1022+
1023+
void PipewireEnumerator::setLatencyParams(
1024+
mixxx::audio::SampleRate sampleRate, SINT framesPerBuffer) {
1025+
qDebug() << "PipewireEnumerator::setLatencyParams" << sampleRate << framesPerBuffer;
1026+
if (sampleRate != m_sampleRate || framesPerBuffer != m_framesPerBuffer) {
1027+
updateFilterLatency(sampleRate, framesPerBuffer);
1028+
}
1029+
}

src/soundio/pipewireenumerator.h

Lines changed: 6 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@
99

1010
#include "audio/types.h"
1111
#include "control/controlobject.h"
12+
#include "control/controlproxy.h"
1213
#include "preferences/usersettings.h"
1314
#include "soundio/sounddevice.h"
1415
#include "soundio/sounddeviceenumerator.h"
@@ -35,16 +36,12 @@ class PipewireEnumerator : public SoundDeviceEnumerator {
3536
void deinitialize() override;
3637

3738
bool isOpen(uint32_t id);
38-
std::string openDeviceInput(uint32_t id,
39-
const AudioInput& input,
40-
mixxx::audio::SampleRate sampleRate,
41-
SINT framesPerBuffer);
42-
std::string openDeviceOutput(uint32_t id,
43-
const AudioOutput& output,
44-
mixxx::audio::SampleRate sampleRate,
45-
SINT framesPerBuffer);
39+
std::string openDeviceInput(uint32_t id, const AudioInput& input);
40+
std::string openDeviceOutput(uint32_t id, const AudioOutput& output);
4641
void closeDevices();
4742

43+
void setLatencyParams(mixxx::audio::SampleRate sampleRate, SINT framesPerBuffer) override;
44+
4845
mixxx::audio::SampleRate getDefaultSampleRate() const {
4946
return m_defaultSampleRate;
5047
}
@@ -244,6 +241,7 @@ class PipewireEnumerator : public SoundDeviceEnumerator {
244241

245242
PollingControlProxy m_audioLatencyUsage;
246243
ControlObject m_coPipewirePatchbaySync;
244+
ControlProxy m_coOutputLatencyMs;
247245
mixxx::Duration m_timeInAudioCallback;
248246
int m_framesSinceAudioLatencyUsageUpdate;
249247
uint32_t m_filterId;

src/soundio/sounddeviceenumerator.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,9 @@ class SoundDeviceEnumerator : public QObject {
1515
virtual QList<QString> getAPIs() const = 0;
1616
virtual void initialize() = 0;
1717
virtual void deinitialize() = 0;
18+
virtual void setLatencyParams(
19+
[[maybe_unused]] mixxx::audio::SampleRate sampleRate,
20+
[[maybe_unused]] SINT framesPerBuffer) {};
1821

1922
bool initialized() const {
2023
return m_initialized;

src/soundio/sounddevicepipewire.cpp

Lines changed: 2 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -38,17 +38,11 @@ SoundDevicePipewire::~SoundDevicePipewire() {
3838
SoundDeviceStatus SoundDevicePipewire::open(bool, int) {
3939
std::string error;
4040
for (auto& input : m_audioInputs) {
41-
error += m_pEnumerator->openDeviceInput(m_deviceId.deviceIndex,
42-
input,
43-
m_sampleRate,
44-
m_configFramesPerBuffer);
41+
error += m_pEnumerator->openDeviceInput(m_deviceId.deviceIndex, input);
4542
}
4643

4744
for (auto& output : m_audioOutputs) {
48-
error += m_pEnumerator->openDeviceOutput(m_deviceId.deviceIndex,
49-
output,
50-
m_sampleRate,
51-
m_configFramesPerBuffer);
45+
error += m_pEnumerator->openDeviceOutput(m_deviceId.deviceIndex, output);
5246
}
5347

5448
if (error.empty()) {

src/soundio/soundmanager.cpp

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -334,6 +334,9 @@ SoundDeviceStatus SoundManager::setupDevices() {
334334
// loop over all available devices
335335

336336
std::vector<SoundDevicePointer> devices = m_pEnumerator->queryDevices();
337+
338+
m_pEnumerator->setLatencyParams(m_config.getSampleRate(), m_config.getFramesPerBuffer());
339+
337340
// here some network device conditions can be separated, currently simply
338341
// add it to the list of other devices
339342
devices.push_back(m_pNetworkDevice);

0 commit comments

Comments
 (0)