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
# Super Timecode Converter v1.9.3 -- Release Notes
2
+
3
+
**Release date:** TBD
4
+
**Built on:** v1.9.2
5
+
6
+
---
7
+
8
+
## New Feature — On-Air Gate
9
+
10
+
A new **ON-AIR ONLY** toggle in the output panel makes the engine only produce active timecode when the current CDJ is flagged on-air by the DJM mixer. This lets the DJ load, cue and preview tracks on a deck without triggering downstream timecode until they bring the deck in.
11
+
12
+
The on-air flag is computed by the DJM itself from the full mixer state (channel fader, cross-fader, EQ kill, mute), transmitted to each CDJ, and is what lights up the ON AIR indicator on the CDJ display. Using it here means STC follows exactly what the DJ sees — no threshold or channel mapping needed.
13
+
14
+
Only available when the input source is **Pro DJ Link**.
15
+
16
+
---
17
+
18
+
## New Feature — Sortable Track Map Columns
19
+
20
+
The Track Map Editor now has a sortable **#** column showing each track's position in the imported playlist order (or "--" for tracks not in any playlist). Plus **Artist**, **Title**, and **Offset** columns are clickable to sort — just like Finder / Explorer. Click a column header to sort ascending; click again to sort descending.
21
+
22
+
The default view sorts by playlist position ascending, so when you import a playlist the tracks appear in setlist order. To return to that view after sorting by any other column, click the **#** header.
23
+
24
+
Artist sort uses Title as tiebreak. BPM, Trig, Cues and Notes remain non-sortable.
25
+
26
+
---
27
+
28
+
## Bug Fix — Frame rate reset to 30 fps on every restart when using ProDJLink / StageLinQ
29
+
30
+
When using ProDJLink or StageLinQ as the input source, the configured frame rate (e.g. 25 fps) was silently overwritten with 30 fps every time STC started up, or when settings were restored from a backup.
31
+
32
+
The cause was a line in `startProDJLinkInput` / `startStageLinQInput` that set `currentFps = outputFps` on every start. Since `outputFps` defaults to 30 fps and is only updated when the user explicitly enables FPS Conversion, the engine's current frame rate was being reset to 30 every time the input source was started — which happens automatically at boot.
33
+
34
+
The offending line has been removed. `currentFps` now stays at the value loaded from settings (or the user's button selection).
When importing a rekordbox XML playlist located inside a folder whose name contained a space, the import returned no tracks. The path parser used `juce::StringArray::addTokens` which treats its second argument as a set of separator **characters**, not as a substring — so " / " was interpreted as "separate on space OR slash", splitting "My Folder / Saturday" into four tokens instead of two.
41
+
42
+
Replaced the character-based split with a proper substring search using `indexOf(" / ")`. Playlists in folders with spaces in their names now import correctly.
43
+
44
+
---
45
+
46
+
## Bug Fix — Race condition in Pro DJ Link player invalidation
47
+
48
+
Fixed a latent race condition between the ProDJLink thread and the DbServerClient worker thread. When a CDJ disappeared from the network, the `onPlayerLost` callback (running on the ProDJLink thread) would close TCP sockets directly while the DbServerClient worker thread could be in the middle of a `socket->write()` using those same sockets — a classic use-after-free that could cause crashes when players drop off the network during active metadata queries.
49
+
50
+
Invalidation is now deferred: the ProDJLink thread queues the player IP in a lock-protected list, and the DbServerClient worker thread processes the queue between TCP queries (at the start of each worker loop iteration, max ~500ms latency). Since connection close and query execution now happen on the same thread, there is no race.
51
+
52
+
This was a rare bug — it required a CDJ to disconnect at the exact moment of an active TCP query — but when it did happen, it could crash STC. Most users would never have hit it, but it's the kind of bug that manifests during long shows with unstable network hardware.
53
+
54
+
---
55
+
56
+
## Bug Fix — Safer shutdown thread ordering
57
+
58
+
Reordered shutdown sequences (application exit, input source switching, and auto-stop of unused shared inputs) so the packet receiver threads (ProDJLink, StageLinQ) are joined **before** their corresponding database clients are stopped or their callbacks are cleared. Prevents a `std::function` race that could fire when a player disconnect coincided with a shutdown.
When importing a rekordbox XML collection, the "Import Tracks" flow no longer overwrites existing Track Map entries. Previously, if a user manually selected a duplicate track in the Import Preview dialog, the import would reset that track's cues, triggers, offsets, and notes. Now existing entries are preserved — the import only adds new tracks. The summary count reflects only the actual additions.
65
+
66
+
This aligns with the "Apply Playlist Order" behavior introduced in v1.9.2: imports never destroy user configuration.
67
+
68
+
---
69
+
70
+
## Files Changed
71
+
72
+
-`TimecodeEngine.h` — On-air gate state + `isOnAirGateOpen()` helper + hook into `sourceActive`; removed `currentFps = outputFps` overwrite in `startProDJLinkInput` / `startStageLinQInput`
0 commit comments