Skip to content

Commit ade30f0

Browse files
committed
feat: add lyrics support and enhance track info
- Implemented lyrics loading from `.lrc` files, allowing synced lyrics to be displayed alongside tracks. - Updated `track_info.rs` to include "Lyrics" as a linkable row. - Enhanced rendering tests to accommodate new lyrics functionality. - Introduced a new `search.rs` module for searching songs by title, artist, or album. - Updated UI components to handle lyrics display and search functionality.
1 parent f4e4cc8 commit ade30f0

31 files changed

Lines changed: 1361 additions & 85 deletions

CHANGELOG.md

Lines changed: 50 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -89,6 +89,36 @@ level the commit history supports; from `v0.1.6` onward, entries are written as
8989
device itself ran both for a week. Cinder now looks for the other scrobbler's process and stands
9090
its own down while it runs, including when `/contents` is reclaimed mid-boot.
9191

92+
- **A default install could lift Sony's regional volume restriction.** *Found by decoding the table
93+
files against Wampy's layout; device-unverified — no player from a restricted region has run
94+
either build.* Sony ships every volume table twice, plain and `_cew`, and its boot script loads
95+
the quieter `_cew` one on players sold where volume is restricted (Wampy's jack measurements name
96+
regions CEW2 and KR3). Cinder's launcher re-applied the *plain* table on every boot even with the
97+
wired volume curve left at `stock`, so on those players a default install made every volume step
98+
louder than Sony shipped it. `stock` now applies nothing. `wm1a` and `w1` are plain tables and
99+
still replace Sony's choice; the installer's description of them now says so.
100+
101+
- **The installer offered volume curves a stock player cannot load.** *The missing table and the
102+
logcat-only failure are device-verified 2026-09-13; the new warnings are covered by launcher test
103+
scenarios and are device-unverified.* The `voltable` component's `wm1a`
104+
and `w1` choices load the NW-WM1A's and Walkman One's tables (`ov_127x.tbl`, `ov_1280.tbl`), and
105+
the installer said both were "already present on every stock device". They are not: a stock
106+
NW-A50's `/system/usr/share/audio_dac` holds only its own `1291` tables, which Wampy's notes
107+
confirm. The claim came from a reference device an earlier session had copied the files onto.
108+
Once they were gone, every boot logged `volume curve: cinder-voltable wm1a FAILED — stock curve
109+
stays` — to logcat, where nobody would see it — and the player quietly kept the stock curve.
110+
Cinder does not ship Sony's files, so on a stock player those two choices still do nothing — but
111+
now visibly. The installer's description says so; the install log warns when the chosen table is
112+
missing; and at boot `cinderhome.log` says `volume curve: 'wm1a' needs …/ov_127x.tbl, which is not
113+
part of the stock firmware and is not on this player — stock curve stays` instead of a bare
114+
FAILED in logcat.
115+
116+
- **Withdrawn: "there is no EU volume cap".** `analysis/RE_volume_tables.md` (2026-09-04) compared
117+
the two region tables by sweeping the codec's analogue attenuator and found identical curves.
118+
Decoded field by field, the tables are identical *there* and differ only in the two digital volume
119+
stages — so the result was guaranteed and showed nothing. The document now carries the decode;
120+
the jack measurement that settles it is `docs/DEVICE_CHECKLIST.md` 13.6.
121+
92122
### Added
93123

94124
- **Settings ▸ Storage shows the SD card.** *The label is built on device; the row itself has not
@@ -100,8 +130,26 @@ level the commit history supports; from `v0.1.6` onward, entries are written as
100130
2281, SD 1130, unresolved 0` and `storage: SD card mounted at /contents_ext (vfat)`.* One line per
101131
library open and one per change in the card's mount state, with the filesystem type. "My SD music
102132
is missing" can now be answered from `cinderhome.log`.
103-
- **README: Walkman One is listed as untested.** Walkman One makes the player identify as a different
104-
model, and Cinder's package is packed for the stock NW-A50 model.
133+
- **Lyrics.** *Host-tested (parser, screen, navigation); device-unverified — the reference library
134+
has no `.lrc` files.* Put `Song.lrc` next to `Song.flac`, the same convention Sony's player uses,
135+
and Track information gains a Lyrics row that opens them. Timestamped lyrics follow the song: the
136+
line being sung is highlighted and held a third of the way down the page until you scroll it
137+
yourself. The parser takes what LRC tools actually write — repeated timestamps on one line,
138+
`[offset:]`, per-word stamps, and UTF-8, UTF-16 or Windows-1252 text. The highlight moves on the
139+
shell's position tick, so it can trail a line's start by up to a second. Lyrics embedded in tags
140+
(ID3 `USLT`/`SYLT`, FLAC `LYRICS`) are not read yet.
141+
- **Library search, as an install option.** *Host-tested, plus harness scenarios `search-off` and
142+
`search-on`; device-unverified.* Off by default. When chosen, a magnifier in the Library header
143+
opens a search with the keyboard already up; results update on every key, matching title, artist
144+
or album name exactly as "Add tracks" does, and a tap plays the song. It installs no binary — only
145+
a flag file in `/data/cinder`, written or removed on every install, so an Update that turns it off
146+
really does. Songs only for now: albums and artists do not appear as results.
147+
- **README: Coming from Walkman One.** Walkman One is listed as untested, with the likeliest failure
148+
(it changes the updater's key, so stock packages are refused), and a new section points to
149+
unknown321's write-ups on what Walkman One changes, what actually measures different at the jack,
150+
and SensMe. The README and the installer no longer call the `signature` component the whole of
151+
Walkman One's sound signature: it reproduces the plus modes, and the external tunings are another
152+
model's firmware.
105153

106154
## [0.3.3] — 2026-09-12
107155

README.md

Lines changed: 52 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -122,9 +122,11 @@ artefact that does not exist.
122122

123123
- **One test unit.** Other NW-A50-series models share its firmware and are expected to work; none
124124
has been tried.
125-
- **Not implemented yet:** Bluetooth receiver mode (the Walkman as a Bluetooth speaker), lyrics,
126-
search across the whole library (search exists only when adding songs to a playlist), and FM
125+
- **Not implemented yet:** Bluetooth receiver mode (the Walkman as a Bluetooth speaker) and FM
127126
recording.
127+
- **Lyrics and library search are new and untested on a player.** Lyrics come from a `.lrc` file
128+
next to the song only — lyrics embedded in the file's own tags are not read. Library search is an
129+
install option, off by default, and finds songs, not albums or artists.
128130
- **Boot time and battery life are unmeasured against stock.** Cinder draws its first frame 13.2 s
129131
after the kernel starts; stock has not been timed on the same unit, and there is no battery-drain
130132
figure yet. "Faster and longer-lasting" is the goal, not a measurement — when there are numbers
@@ -137,8 +139,11 @@ artefact that does not exist.
137139
- **The Windows installer is unsigned**, and now asks for administrator — see [Install](#install).
138140
- **Untested on top of Walkman One.** Walkman One makes the player identify as a different model,
139141
and Cinder's install package is packed for the stock NW-A50 model. Nobody has tried the
140-
combination yet; the likeliest failure is the player's updater refusing the package. Make a wbrt
141-
backup first either way, and please open an issue saying what happened.
142+
combination yet; the likeliest failure is the player's updater refusing the package — Walkman One
143+
also changes the updater's decryption key, so that stock packages are refused
144+
([unknown321's notes](https://github.com/unknown321/wampy/blob/master/MAKING_OF.md#walkman-one-compatibility-again)).
145+
Make a wbrt backup first either way, and please open an issue saying what happened. More in
146+
[Coming from Walkman One](#coming-from-walkman-one).
142147

143148
## Install
144149

@@ -203,20 +208,22 @@ instead of the window, which is what works over RDP, in a VM and from a script.
203208
### Choosing components
204209

205210
You can leave parts of Cinder out, and the picker explains each one — but only the parts that are
206-
genuinely a matter of taste. **There are five choices:** the FM register helper (a real signal meter
211+
genuinely a matter of taste. **There are six choices:** the FM register helper (a real signal meter
207212
and a one-second band scan), the charger-detail reader on the battery screen, an experimental GPU
208-
path that is off by default and measures slower than the software one, the wired volume curve, and
209-
the sound signature below.
213+
path that is off by default and measures slower than the software one, library search (new, and
214+
off by default), the wired volume curve, and the sound signature below.
210215

211216
Until 0.3.1 the same picker also offered to leave out the power menu, USB file transfer and the
212217
clock, each with help text admitting the feature was gone without it. Those were not choices, and
213218
they are part of every install now. The four helpers behind them are 60 KB together.
214219

215220
The `signature` option patches **three bytes** of Sony's audio HAL to pick which DAC path the
216-
output stream uses and what CPU clock floor is held while playing. That is the entirety of what
217-
Walkman One's paid "sound signature" does; Cinder reproduces its variants byte-for-byte from your
218-
own stock library with **no firmware flash**, and adds three combinations Walkman One doesn't
219-
ship, splitting its two effects apart so each can be judged separately. Derivation:
221+
output stream uses and what CPU clock floor is held while playing. Those three bytes are Walkman
222+
One's plus modes: Cinder reproduces both byte-for-byte from your own stock library with **no
223+
firmware flash**, and adds three combinations Walkman One doesn't ship, splitting its two effects
224+
apart so each can be judged separately. Walkman One's other "sound signatures", the external
225+
tunings, are not reproducible — each is another model's firmware. Measured at the jack, neither
226+
kind changes the signal ([more](#coming-from-walkman-one)). Derivation:
220227
[`analysis/RE_walkmanone_extract.md`](analysis/RE_walkmanone_extract.md).
221228

222229
### What actually writes the firmware
@@ -353,7 +360,40 @@ Cinder is the wrong answer to:
353360
| [**wbrt**](https://github.com/unknown321/wbrt) (unknown321) | Full eMMC backup and restore over the MediaTek VCOM port. **The brick insurance for every project on this list** — including this one. |
354361
| [**Walkman One**](https://www.mrwalkman.com/) (MrWalkman) | Modified stock firmware: Sony's own player with the region and feature locks removed. If you want stock-but-unlocked rather than a different player, this is it. |
355362
| [**Rockbox `nwztools`**](https://github.com/Rockbox/rockbox/tree/master/utils/nwztools) | The `.UPG` pack/unpack tooling, per-model KAS keys and the NVP slot map that make any of this reachable. |
356-
| [**scrobbler**](https://github.com/unknown321/scrobbler) (unknown321) | Last.fm scrobbling on-device; Cinder writes the same `.scrobbler.log` format. |
363+
| [**scrobbler**](https://github.com/unknown321/scrobbler) (unknown321) | Last.fm scrobbling on-device; Cinder writes the same `.scrobbler.log` format. If it is installed, Cinder's own scrobbler stands down so plays are not counted twice. |
364+
365+
### Coming from Walkman One
366+
367+
The same questions come up in every thread. The best answers are mostly unknown321's, in the Wampy
368+
repository:
369+
370+
- **What does Walkman One actually change?**
371+
[Making of sound settings](https://github.com/unknown321/wampy/blob/master/MAKING_OF_VOLUME_TABLES.md)
372+
takes it apart file by file. The plus modes are an audio library that picks a different output
373+
path and CPU floor; the gain setting is another model's volume table; the external tunings are
374+
another model's nvram and bootloader, not a hand-made tuning. Cinder's own teardown reached the
375+
same place: [`analysis/RE_walkmanone_extract.md`](analysis/RE_walkmanone_extract.md).
376+
- **Does it change the sound?** The same document ends with line-output measurements across all 19
377+
regions and every Walkman One mode
378+
([*There is more!*](https://github.com/unknown321/wampy/blob/master/MAKING_OF_VOLUME_TABLES.md#there-is-more)).
379+
Three settings changed the signal: regions CEW2 and KR3, which load Sony's quieter volume table,
380+
and gain mode 1. The plus modes, the sound signatures and DAC mode measured the same as stock.
381+
- **Can Cinder do the same without flashing?** The plus modes, yes — the
382+
[`signature` component](install.md#the-sound-signature). The other models' volume tables, not
383+
on a stock player: they are not part of the NW-A50's firmware and Cinder does not ship Sony's
384+
files, so the installer's `wm1a` and `w1` volume curves only take effect on a player that
385+
already holds those tables. The external tunings, no.
386+
- **Can I put Cinder on top of Walkman One?** Untested — see [Known limitations](#known-limitations).
387+
- **What about my region's volume limit?** If your player was sold where Sony restricts volume,
388+
Cinder leaves the restriction in place unless you choose a different volume curve, which replaces
389+
it — turn the volume down before the first boot. Cinder's first reading of those tables was
390+
wrong; the [corrected analysis](analysis/RE_volume_tables.md) says how.
391+
- **SensMe channels?** Not yet. The data comes from Sony's PC software, which analyses each song
392+
and stores the result in a tag; the player's scanner copies it into the library database, where
393+
Cinder could read it. No library Cinder has been tested with contains any — if yours does, please
394+
open an issue. The format itself is undocumented; unknown321's
395+
[notes on SensMe](https://github.com/unknown321/wampy/blob/master/MAKING_OF.md#sensme-channels)
396+
cover what is known.
357397

358398
## Contributing
359399

analysis/RE_volume_pop.md

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -13,9 +13,11 @@ zones and coarsens toward the top — 4 attenuator counts per step between volum
1313
is exactly where the pop was loudest, and nothing at all above 100, which is exactly why it stopped
1414
there. Full working in the SOLVED section below.
1515

16-
**A mitigation is written, built and installed — and has never once run on hardware.** Sony ships a
17-
better table on every stock device (`ov_127x.tbl`, the NW-WM1A's own: monotonic, no dead zones,
18-
finer steps at the top). `cinder-home/src/cinder-voltable.c` installs it, `build.sh` step 6g builds
16+
**A mitigation is written, built and installed — and has never once run on hardware.** There is a
17+
better table (`ov_127x.tbl`, the NW-WM1A's own: monotonic, no dead zones, finer steps at the top).
18+
*Corrected 2026-09-13: it is NOT on a stock device — only the A50's own `1291` tables ship; the
19+
reference device had it because an earlier session copied it in. See
20+
`RE_walkmanone_extract.md`.* `cinder-home/src/cinder-voltable.c` installs it, `build.sh` step 6g builds
1921
it, `install_cinderhome.sh` section 1f3 installs it, and the launcher applies it on every boot
2022
because `load_sony_driver` re-applies the stock table each time. But:
2123

analysis/RE_volume_tables.md

Lines changed: 54 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,9 @@
1-
# RE — the region volume tables, and why there is no cap to lift
1+
# RE — the region volume tables
22

33
**Date:** 2026-09-04 · **Status:** measured on hardware, with a control experiment.
4-
**Result: negative.** The region difference is real in the files and does **not** reach the wired
5-
volume curve. There is no EU output cap reachable this way.
4+
**Result: WITHDRAWN 2026-09-13** — see [the amendment](#amended-2026-09-13--the-sweep-could-not-see-the-difference)
5+
at the end. The sweep below reads the one register the two files agree on, so its "identical"
6+
rows say nothing about the region difference. The original text is kept as it was written.
67

78
## The hypothesis
89

@@ -82,6 +83,56 @@ which removes both dead zones and makes the whole range usable — and that was
8283
Not established: what the `_cew` bytes *do* control, and which of the two files this device boots
8384
with. Both are now moot for output level, which is why neither was chased further.
8485

86+
## Amended 2026-09-13 — the sweep could not see the difference
87+
88+
Wampy's [`MAKING_OF_VOLUME_TABLES.md`](https://github.com/unknown321/wampy/blob/master/MAKING_OF_VOLUME_TABLES.md)
89+
measured an NW-A50's line output at the jack across all 19 regions (REW, 28 runs, effects off) and
90+
found exactly three settings that change the signal: regions **CEW2** and **KR3**, which boot the
91+
`_cew` table, and gain mode 1. That contradicts the conclusion above, so the two files were decoded
92+
field by field instead of compared as bytes.
93+
94+
**Layout.** Wampy's `src/dac/cxd3778gf_table.h`, taken from Sony's kernel source: sound effect
95+
off/on × 27 output tables × volume 0..120 × 13 one-byte register values, then a sum/xor checksum.
96+
That is `2 × 27 × 121 × 13 + 8` = **84950 bytes, exactly the file size.** The "repeating 13-byte
97+
record" above is one volume step.
98+
99+
**What `_cew` changes.** 7569 data bytes, all inside tables 1–9 (the S-Master single-ended, BTL and
100+
class-AB headphone tables, with their noise-cancel and ambient variants). Line out and every DSD
101+
table are identical. In the two tables this model's headphone path uses — `SMASTER_SE_LG` and
102+
`SMASTER_SE_HG`**only `play` and `sdin2` differ. `hpout` is identical in both files.**
103+
104+
| table 1, sound effect off | vol 0 | 40 | 60 | 80 | 120 |
105+
|---|---|---|---|---|---|
106+
| `hpout` (the PHV attenuator) | same | same | same | same | same |
107+
| `play`, plain → `_cew` | 179 → 162 | 216 → 199 | 236 → 219 | 0 → 239 | 0 → 239 |
108+
| `sdin2`, plain → `_cew` | 239 → 0 | 239 → 0 | 219 → 236 | 199 → 216 | 167 → 184 |
109+
110+
**So the 2026-09-04 sweep read the one field the two files agree on.** `cinder-probe --volcurve`
111+
reads `PHV_L`/`PHV_R`, which is `hpout`. Identical rows were guaranteed whatever the tables do to the
112+
signal. The control experiment proved the writes land; it could not prove the instrument sees this
113+
kind of difference, because the WM1A table differs in `hpout` and the region pair does not. **"There
114+
is no EU volume cap to lift here" is withdrawn.**
115+
116+
What is and is not established now:
117+
118+
- **Established:** `_cew` moves `play` and `sdin2` by 17 codes at every step, in opposite
119+
directions, and leaves the analogue attenuator alone.
120+
- **Not established:** what a code is in dB, and how the two digital stages combine. That needs
121+
Sony's driver (`cxd3778gf_volume.c` in the kernel source), which has not been read. Wampy's jack
122+
measurement says the net effect on a CEW2/KR3 unit is quieter.
123+
- **Inferred, from one register read:** this unit boots the **plain** table.
124+
`RE_headphone_amp_modes.md` read `CODEC_SDIN2VOL` (`0x29`) = `0xC7` (199) at master volume 60;
125+
that is `ov_1291`'s sound-effect-on value at that step, and `_cew`'s is 216. A European unit
126+
(`shp` 0x6) is therefore probably not a restricted one, and the curve work in `RE_volume_pop.md`
127+
stands.
128+
- **The consequence that matters:** `cinder-voltable`'s `stock`, `w1` and `wm1a` are all **plain**
129+
tables. On a CEW2 or KR3 unit, loading any of them removes the region restriction, so the same
130+
volume number is louder than its owner is used to.
131+
132+
**To settle it:** the jack rig from `RE_headphone_amp_modes.md` — line input, the fixed tone file,
133+
volume pinned — with `eu` against `stock`, nothing on anyone's head. Not `--volcurve`. Tracked as
134+
`docs/DEVICE_CHECKLIST.md` 13.6.
135+
85136
## What was wired
86137

87138
`cinder-voltable` gained:

analysis/RE_walkmanone_extract.md

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -272,6 +272,16 @@ it holds — with one finding that makes item 3 considerably better than it read
272272

273273
### Every volume table W1 uses ALREADY SHIPS IN STOCK FIRMWARE
274274

275+
> **WRONG — corrected 2026-09-13.** A stock NW-A50's `/system/usr/share/audio_dac/` holds **55**
276+
> files and only the A50's own set: `ov_1291`, `ov_1291_cew`, `ov_dsd_1291`, `ov_dsd_1291_cew`,
277+
> `tc_1291`. That is the device listing on 2026-09-13, the extracted stock rootfs
278+
> (`artifacts/rootfs_mnt`), and the listing in Wampy's `MAKING_OF_VOLUME_TABLES.md`. The six extra
279+
> files below were on the reference device because an earlier session had copied them in from the
280+
> Walkman One image — `ov_127x`'s md5 `39a60adc…` is W1's `gain_l/ov_127x.tbl` — and a copy that
281+
> keeps the source's mtime makes "dated 2019-07-31" prove nothing. By 2026-09-13 they were gone, and
282+
> `cinder-voltable wm1a` failed on every boot. The md5 and equality notes below still describe the
283+
> files themselves; what is wrong is that a stock player has them.
284+
275285
`/system/usr/share/audio_dac/` on the stock device, 61 files, **all dated 2019-07-31 — Sony's own
276286
build stamp, not anything staged by us**:
277287

0 commit comments

Comments
 (0)