Skip to content

Commit 9321901

Browse files
committed
Connect single SoundDevice port to Mixxx port and internally make channel stereo
1 parent 31e2f57 commit 9321901

1 file changed

Lines changed: 43 additions & 28 deletions

File tree

src/soundio/pipewireenumerator.cpp

Lines changed: 43 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -523,27 +523,31 @@ void PipewireEnumerator::callback(const spa_io_position* pos) {
523523

524524
std::pair<uint32_t*, uint32_t*> ports = m_inputs.value(input);
525525

526-
const float* bufferFL = static_cast<const float*>(
527-
pw_filter_get_dsp_buffer(ports.first, framesPerBuffer));
528-
if (bufferFL) {
529-
for (uint64_t i = 0; i < framesPerBuffer; i++) {
530-
pInputBuffer[iChannelBase + i * iChannelCount] = bufferFL[i];
526+
if (iChannelCount == 1) {
527+
void* portData = iChannelBase % 2 ? ports.second : ports.first;
528+
const float* buffer = static_cast<const float*>(
529+
pw_filter_get_dsp_buffer(portData, framesPerBuffer));
530+
if (buffer) {
531+
for (uint64_t i = 0; i < framesPerBuffer; i++) {
532+
pInputBuffer[i * 2] = buffer[i];
533+
pInputBuffer[i * 2 + 1] = buffer[i];
534+
}
531535
}
532536
} else {
533-
for (uint64_t i = 0; i < framesPerBuffer; i++) {
534-
pInputBuffer[iChannelBase + i * iChannelCount] = 0;
537+
const float* bufferFL = static_cast<const float*>(
538+
pw_filter_get_dsp_buffer(ports.first, framesPerBuffer));
539+
if (bufferFL) {
540+
for (uint64_t i = 0; i < framesPerBuffer; i++) {
541+
pInputBuffer[iChannelBase + i * 2] = bufferFL[i];
542+
}
535543
}
536-
}
537544

538-
const float* bufferFR = static_cast<const float*>(
539-
pw_filter_get_dsp_buffer(ports.second, framesPerBuffer));
540-
if (bufferFR) {
541-
for (uint64_t i = 0; i < framesPerBuffer; i++) {
542-
pInputBuffer[iChannelBase + 1 + i * iChannelCount] = bufferFR[i];
543-
}
544-
} else {
545-
for (uint64_t i = 0; i < framesPerBuffer; i++) {
546-
pInputBuffer[iChannelBase + 1 + i * iChannelCount] = 0;
545+
const float* bufferFR = static_cast<const float*>(
546+
pw_filter_get_dsp_buffer(ports.second, framesPerBuffer));
547+
if (bufferFR) {
548+
for (uint64_t i = 0; i < framesPerBuffer; i++) {
549+
pInputBuffer[iChannelBase + 1 + i * 2] = bufferFR[i];
550+
}
547551
}
548552
}
549553
}
@@ -562,19 +566,30 @@ void PipewireEnumerator::callback(const spa_io_position* pos) {
562566

563567
std::pair<uint32_t*, uint32_t*> ports = m_outputs.value(output);
564568

565-
float* bufferFL = static_cast<float*>(
566-
pw_filter_get_dsp_buffer(ports.first, framesPerBuffer));
567-
if (bufferFL) {
568-
for (uint64_t i = 0; i < framesPerBuffer; i++) {
569-
bufferFL[i] = pOutputBuffer[iChannelBase + i * iChannelCount];
569+
if (iChannelCount == 1) {
570+
void* portData = iChannelBase % 2 ? ports.second : ports.first;
571+
float* buffer = static_cast<float*>(
572+
pw_filter_get_dsp_buffer(portData, framesPerBuffer));
573+
if (buffer) {
574+
for (uint64_t i = 0; i < framesPerBuffer; i++) {
575+
buffer[i] = pOutputBuffer[iChannelBase + i * 2];
576+
}
577+
}
578+
} else {
579+
float* bufferFL = static_cast<float*>(
580+
pw_filter_get_dsp_buffer(ports.first, framesPerBuffer));
581+
if (bufferFL) {
582+
for (uint64_t i = 0; i < framesPerBuffer; i++) {
583+
bufferFL[i] = pOutputBuffer[iChannelBase + i * 2];
584+
}
570585
}
571-
}
572586

573-
float* bufferFR = static_cast<float*>(
574-
pw_filter_get_dsp_buffer(ports.second, framesPerBuffer));
575-
if (bufferFR) {
576-
for (uint64_t i = 0; i < framesPerBuffer; i++) {
577-
bufferFR[i] = pOutputBuffer[iChannelBase + 1 + i * iChannelCount];
587+
float* bufferFR = static_cast<float*>(
588+
pw_filter_get_dsp_buffer(ports.second, framesPerBuffer));
589+
if (bufferFR) {
590+
for (uint64_t i = 0; i < framesPerBuffer; i++) {
591+
bufferFR[i] = pOutputBuffer[iChannelBase + 1 + i * 2];
592+
}
578593
}
579594
}
580595
}

0 commit comments

Comments
 (0)