You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Copy file name to clipboardExpand all lines: content/news/2025-08-04-gsoc-2025-report-armaan-chowfin.md
+74-26Lines changed: 74 additions & 26 deletions
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -281,20 +281,20 @@ Mixxx performs real-time manipulation of audio: live mixing, tempo changes, effe
281
281
282
282
Mixxx provides an abstract `EngineBufferScale` class, which is subclassed to implement resamplers using various time-stretching libraries. `EngineBufferScaleST`, `EngineBufferScaleRubberband`, `EngineBufferScaleSRC`, `EngineBufferScaleZita` implement resamplers that use the [SoundTouch](https://www.surina.net/soundtouch/), [Rubberband](https://breakfastquay.com/rubberband/), [SampleRate](https://libsndfile.github.io/libsamplerate/) and [libzita-resampler](https://kokkinizita.linuxaudio.org/linuxaudio/zita-resampler/resampler.html) library APIs respectively.
283
283
284
-
During a live DJ set where the end result is an audio output, the resampling step happens in the player - between the soundsource and the engine. The exact flow is as follows, where T isi the rack sample-rate and E is the Engine (DAC) sample-rate:
284
+
During a live DJ set where the end result is an audio output, the resampling step happens in the player - between the soundsource and the engine. The exact flow is as follows, where T is the rack sample-rate and E is the Engine (DAC) sample-rate:
285
285
286
286
i. Sound source (T)
287
287
ii. Read ahead manager (T)
288
-
iii. Resample #1 (T -> E): `scaleBuffer()`
288
+
iii. Resample #1 (T -> E): `scaleBuffer()`
289
289
iv. Engine buffer (E)
290
290
v. Engine mixer (E)
291
291
292
292
With the new additions from this GSOC project, additional resampling occurs in the sidechains during recording and broadcast, where R is the recording/broadcast sample-rate:
293
293
294
294
vi. Sidechain (E)
295
295
vii. Record/Broadcast (E)
296
-
viii. Resample #2 (E -> R): `scaleBufferOneShot()`
297
-
ix. Encoding (R): `encodeBuffer()`
296
+
viii. Resample #2 (E -> R): `scaleBufferOneShot()`
297
+
ix. Encoding (R): `encodeBuffer()`
298
298
299
299
<!-- Mixxx exposes two important parameters in the *Sound Hardware Preferences* panel:
300
300
@@ -341,58 +341,106 @@ This GSOC project was derived from reports suggesting sub-par audio quality duri
341
341
342
342
A scratch can triggered by spinning the jog wheels of a MIDI controller. The architecture of Mixx ensures that the associated change in tempo ratio is made available to the resampler between DAC callbacks at the earliest. Mixxx acts on buffer chunks, for example 20 ms. The scratch control command is taken into account between these buffers. To have a steady tempo without clicks and pops, a ramp is applied. For example, if a user changes tempo from 1x to 2x, one additional buffer is used to slowly change the tempo from 1x to 2x.
343
343
344
-
The scratch control command directs the chosen resampler to adjust the quantity of input frames it requests from the Read-Ahead Manager and then interpolate to the desired output frame count. This emulates the effect of scratching - i.e. an interval of high/low-frequency output due to sudden tempo change. Our empirical tests have revealed the following per-buffer resample latencies for each resampler:
344
+
The scratch control command directs the chosen resampler to adjust the quantity of input frames it requests from the Read-Ahead Manager and then interpolate to the desired output frame count. This emulates scratching - i.e. playback of high/low-frequency output due to sudden tempo change. Our empirical tests have revealed the following per-buffer resample latencies for each resampler:
**[mixxxPR#15081](https://github.com/mixxxdj/mixxx/pull/15081): Custom samplerates setting for recording.**
356
+
**[mixxxPR#15081](https://github.com/mixxxdj/mixxx/pull/15081): Custom samplerates setting for recording.**
357
+
Status: *Merged*
350
358
351
-
This PR introduces an improved user experience in the recording preferences page. No more error messages for incompatible formats. The GUI maintains the necessary format invariants. This PR also introduces `libsamplerate` to the build system along with a base resampler class using the libsamplerate `src_process` API.
359
+
This PR introduces an improved user experience in the recording preferences page. No more error messages for incompatible formats. The GUI maintains the necessary format+sample-rate invariants. This PR also introduces `libsamplerate` to the build system along with a base resampler class using the libsamplerate `src_process` API.
**[mixxxPR#15005](https://github.com/mixxxdj/mixxx/pull/15005): Support for low-latency scratching using the libsamplerate callback API**
413
+
Status: *Unmerged*
376
414
377
415
This PR implements a resampler class using the libsamplerate Callback API. We observed a reduction in per-buffer resampling latency from 20us to 10us - a 2x improvement over the handcrafted linear interpolator.
I thank Daniel Schürmann, Evelynne Veys, Ronny, and Jörg Wartenberg, who have spent considerable time reviewing my PRs and offering assistance anytime I needed it.
0 commit comments