Commit graph

734 commits

Author SHA1 Message Date
Michael Giacomelli
b18f5d6d65 opus: ARMv4 assembly FFT butterflies, and an exact radix-5 rewrite
Cuts realtime Opus decode on the Sansa e200v1 (PP502x, ARM7TDMI) from
55.55 MHz to 52.1 MHz.

Two exact changes to celt/kiss_fft.c first:

 - kf_bfly5 folds the four cosine products into a shift and a single
   multiply.  cos(2*pi/5) + cos(4*pi/5) is exactly -1/2, and the Q15
   constants satisfy that identity exactly (10126 - 26510 == -16384), so
   the substitution gives up no accuracy.
 - kf_bfly3, kf_bfly4 and kf_bfly5 peel the pass that twiddles by
   twiddles[0], which is 1, by rotating the loop rather than duplicating
   the body.  In fixed point twiddles[0] is 32767 rather than 32768, so
   skipping it also drops a small systematic gain error.

Then celt/arm/kiss_fft_armv4_asm.S replaces the radix-3, radix-4 and
radix-5 bodies, reached through OVERRIDE_kf_bfly3/4/5.  The compiled
kernels spill their loop-invariant pointers and reload them every pass,
and gcc will not form ldm/stm from contiguous C accesses: it reorders the
loads while scheduling and does not hand out ascending register pairs.
The assembly keeps the bookkeeping resident and sends the transient
butterfly values to the frame instead, in bursts.

Over 160 ms of stereo music, traced under qemu and costed with an
ARM7TDMI model:

  FFT cycles    1,876,926 -> 1,430,748   -23.8%
  whole decode  8,142,054 -> 7,695,876    -5.5%
  loads           769,935 ->   650,157   -15.6%
  stores          409,999 ->   350,605   -14.5%
  multiplies      350,909 ->   337,493    -3.8%
  text              3,368 ->     2,656 bytes

The radix-5 fold accounts for the whole multiply reduction.  The assembly
leaves the count untouched and wins purely on memory traffic.

Accuracy improves by up to 2.9 dB rather than degrading, because the
assembly keeps all 32 bits of each Q15 product where MULT16_32_Q15_armv4
drops the low bit.  Decoded output differs from the C build in 27 of
15,360 samples, each by one LSB.

Build with OPUS_ARM_NO_FFT_ASM to select the C butterflies instead.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Change-Id: I2e8a0904da8a85b654ff648a01234348977a0edc
2026-09-22 07:26:29 -04:00
Solomon Peachy
305acca1f0 dsp: Add missing .type <symbol>, %function to arm asm
Several symbols were missing these annotations so the compiler wasn't
handling thumb interworking correctly.

Should resolve tone control crashes seen on clipv1 and our handful of
other 2MB armv5 targets that we build (mostly) in thumb mode.

Change-Id: If8c533a5f10b6592a2d2bec519f2c4d6539d7a66
2026-09-19 21:18:30 -04:00
Aidan MacDonald
3a57f2f721 Add "rbfs" prefix to native filesystem functions
Most of the churn here occurs because 'filesize' is one of
the redefined filesystem functions, but some of the structs
used by the native FS code also include a 'filesize' member
variable which gets renamed by the macro in some but not all
source files.

It's easier to rename 'filesize()' to 'ffilesize()' rather
than try to clean up the macro mess or renaming the struct
members.

There is weirdness with root_realpath() which now breaks on
native builds because it was assumed to be unprefixed there.
dir_get_info() was unprefixed everywhere but this just seems
inconsistent; make it follow the FS_PREFIX() convention too.

Change-Id: Ic3700c6234ea45f32679c1a8429d70fdb8f4088a
2026-09-17 16:22:31 -04:00
David Cormier
064c165367 libm4a: handle sparse chunk maps and video-first MP4
Size the reduced stco lookup with ceiling division. The table stores
chunk entries 0, divider, 2 * divider, and so on, so floor division
allocated one entry too few whenever the original count had a
remainder.

Treat a valid media-information atom whose first child is not smhd as
a non-audio track and skip the remainder. Continue scanning subsequent
tracks so AAC decoding works when an MP4 places its video track before
the audio track, while still rejecting malformed atom sizes and
malformed sound headers.

Keep these container fixes independent of the H.264 player and target
driver so they can be reviewed and applied to libm4a on their own.

Build-tested as part of the normal and isolated-runtime iPod 6G
configurations and hardware-tested with AAC audio in M4V playback.

Change-Id: I8c711525932f54ecbdad982c7f7ddc9490c5668d
2026-09-07 09:17:27 -04:00
Mauricio Garrido
e498c0171a 3ds: Port refactor.
This commit does the following changes to the 3ds port:

- Rename the target from ctru to 3ds.
- Rename all files and functions with the ctru naming convention to 3ds.
- Created a new file and folder structure that will better integrate future console ports that share the same codebase.
- Fixed a buffer overflow bug in pcm code.

Change-Id: I17c6f86df64eb99dd2b653485d70832ff46b2ba8
2026-09-01 08:39:07 -04:00
Michael Giacomelli
7fef95dc08 warble: fix build on targets with HAVE_RECORDING
Change-Id: Ic04392da41177f51dd5f392b288e078a76298839
2026-08-25 08:01:09 -04:00
Skye
e764656ab7 Allow customizing EQ filter types
Allows any EQ band to be set to any of Low Shelf, Peak, or High Shelf, instead of hardcoding the types per band.

Change-Id: I470ab916359092ba465e7b6331baed3bf11b2fc9
2026-07-30 07:48:45 -04:00
Roman Artiukhin
958e84c042 codec: flac: fix playback of certain files
Use flac_seek by time even when elapsedtime is 0, and apply it as a fallback for failed offset seeks since it provides more robust error recovery.

Change-Id: I438888fba02bda38137f3f1347bb1f657ef9c166
2026-07-23 20:27:57 +03:00
Solomon Peachy
6c4107d1ad libspeex: Silence a spurious warning under Clang
Change-Id: I9790e92dd9120afff83114925b8e6eb482d6e7df
2026-07-15 16:22:18 -04:00
Solomon Peachy
b9c7b0e910 fix: new yellow
for #pragma GCC diagnostic, GCC must be capitalized.

Change-Id: I1d760dd83b4dc29590454f4f4e09c5dface2c48f
2026-07-11 08:52:12 -04:00
Solomon Peachy
9ebe34d570 speex: Silence spurious build warning when building under rbutil
Change-Id: Ida23a960c54de1a46d0787795efb7b28b6427939
2026-07-11 08:04:10 -04:00
Solomon Peachy
ebf42dae68 skin_parser: Fix regression in 0d5afa6d
Typo in the #ifdef, accidently didn't get committed.

Change-Id: If74de478ed8f236b78e16cd3cb3957ecde3339b3
2026-07-05 19:12:25 -04:00
Solomon Peachy
0d5afa6d66 skin_parser: Fix build warnings when included in the theme editor
skin_buffer_to_offset() call can never return a "negative" pointer
(since it just returns the pointer as-is) so don't bother to check.

Change-Id: Id86d53abd7ab1fb071ca54421ebe3b5ff2981c02
2026-07-05 13:57:10 -04:00
Vencislav Atanasov
3ba63d667e libspeex: Fix compile warnings on Apple Clang 21
- unused function parameters
- signed/unsigned comparisons
- unused local variable

Co-authored-by: ChatGPT (GPT-5.3 Mini) <chatgpt@openai.com>
Change-Id: I64e9e2573174377465b10e5912d10ca2a22da0e1
2026-06-30 10:28:55 -04:00
William Wilgus
24b0254d96 metadata.c small cleanup
add get_metadata_afmt function so we don't have to extra functions
remove unneeded bounds check on audio_format in rbcodec_format_is_atomic()
add bounds check on audio_format in get_metadata_afmt()

Change-Id: I76bd869100b000579c6546f0670ba4ba2c541f22
2026-06-28 14:24:02 -04:00
William Wilgus
3cd286d8f8 metadata add audio_fmt to get_metadata_ex
tagcache.c add_tagcache() and potentially
skin_tokens.c wps_playlist_percent_prepare()

make calls to probe_file_format() prior to calling get_metadata_ex
resulting in some small amout of duplicated work
especially in the case of add_tagcache this can add
up to a lot of duplicated work

breaks out audio_fmt so these can supply the afmt other callers just
supply probe_file_format(trackname) in the function call

Change-Id: I8084213b8ee7e04d76dce0986beb83d443ac804b
2026-06-27 14:14:01 -04:00
Adam N. Burke
a824085057 skin: add %pX tag for time-based playlist progress
%pP reports playlist progress by position index, which treats every
track as equally long. For playlists with tracks of unequal length --
audiobooks with chapters anywhere from two minutes to an hour are the
motivating case -- position is a poor proxy for listening progress.

%pX reports the played percentage of the whole playlist by time: the
summed length of all preceding tracks plus the elapsed time in the
current one, relative to the playlist's total duration. It can be
used as a value, in a conditional, with %if(), or as a bar tag like
%pb.

If a playlist contains more than 500 tracks or the scan is taking too
long and the user aborts the tag will fallback to the behavior of %pP
except the progress through the current track will be included in the
returned percentage

--------------------------------------
Computing this needs every track's length, and reading metadata for
every track is too slow and disk-heavy for a tag that refreshes on the
WPS. Instead each track's length is estimated from its file size: the
skin engine scans the playlist in the background, a batch of files each
skin refresh, opening each file only to read its size (directory
metadata, no header parse). Size is turned into time by calibrating one
file of each type -- the first file of each extension is parsed once
with get_metadata to learn its bytes-per-second, and every later file
of that type reuses it. A single-format playlist, the usual audiobook
case, parses exactly one file and stat's the rest.

The result is an estimate -- bitrate varies within a type, especially
for VBR -- but it is cheap and accurate enough for a progress
indicator, and the playing track always contributes its exact elapsed
time. Per-track lengths are stored as two bytes of minutes each in a
movable buffer sized to the track count and allocated only while the
tag is in use; the cache is keyed on the track count and a crc of the
first, middle and last filenames, so a playlist swap or reshuffle is
caught. If the buffer cannot be allocated (a very large playlist on a
low-memory target) the tag falls back to position-based progress.

The buffer is allocated when playback starts (and when the now-playing
screen is opened with playback already active) rather than lazily on the
first WPS refresh, so the one-time allocation happens at a playback
boundary instead of during steady-state playback; it falls back to
allocating on first use if that point is missed.

Until the scan finishes the tag does not blank: it returns an instant
equal-weight estimate -- (completed tracks + fraction through the
current one) / track count -- which sharpens into the size-based value
as the scan fills in. So a theme can just use %pX and it is correct
from the first frame, and %?pX is true whenever a playlist is loaded.

Tested on a Sansa Clip Zip and in the simulator. On a 216-track,
~745 MB single-format audiobook playlist the length scan dropped from
~4150 ms (get_metadata on every track) to ~174 ms (one parse plus 215
file-size stats), roughly 24x lighter.

Change-Id: I6e572e78a10444bd513ddc77e30da04aa5153ef2
2026-06-27 12:29:31 -04:00
William Wilgus
22b4cd3232 metadata.c get_metadata_ex add flag METADATA_EXCLUDE_NORMALIZE
no need to normalize data you don't intend to use

Change-Id: Ieef5474fef47b2f96db3d02875db95a1de02eb5e
2026-06-25 13:43:20 -04:00
Solomon Peachy
d54b9e6f8d chore: Get rid of *all* vestigal CVS '$Id:$' tags
Change-Id: I35c13a9768c582e4851aa252dd3ea5c89f760c8c
2026-06-01 16:01:18 -04:00
mojyack
fa67d29909 rbcodec: flac: cleanup around LOGF
Change-Id: I0c3798b8f09e1365712c6173bc5d587f9ea728a8
2026-05-28 17:28:07 +09:00
mojyack
543c8de861 rbcodec: enable logf only when LOGF_ENABLE is defined
currently logf() in codec are printed unconditionally when
ROCKBOX_HAS_LOGF, which is confusing.
Gate them behind LOGF_ENABLE to align with the main binary.

Change-Id: I4eb44604000acded55d0af8869145c4f3d77efcb
2026-05-28 17:28:07 +09:00
mojyack
e6b62b0dbb unwarminder: safe_read.S: hide data_abort_handler for non-classic arms
"subs pc, lr, #4" is invalid on cortex-m

Change-Id: I3809691ee3a9e3864c592316216178d32ab278fc
2026-05-26 11:42:42 -04:00
mojyack
a019f19b1c rbcodec: libgme: fix byte-order detection for mips with clang
clang defines both of __LITTLE_ENDIAN__ and __mips__, causing
confusion in the byte order detection.

Change-Id: If95255974e9e3e5d0554410bbab65bc2af1bb1c7
2026-05-26 06:54:48 -04:00
Solomon Peachy
bf8328fbe0 rbcodec: Fix build failure with DEBUG but without LOGF
Regression from 39497d1c74

Change-Id: I09ae974b56cd94753caa8bd4630d7ffcfe057846
2026-05-19 19:48:41 -04:00
Roman Artiukhin
69b6c97e58 Codecs: mp4: Improve support for long files
Load stts (time to sample) table on demand if it doesn't fit in RAM.

Fixes FS#13889 (in most cases I've seen files with single element in this table and problematic one has 111200 elements)

Change-Id: I719f92a4512a45472739587e81861b9bc545f349
2026-05-19 16:28:50 -04:00
Solomon Peachy
39497d1c74 build: Silence a pile of set-but-not-used warnings in codecs
GCC16 is stricter about reporting these, and while we can rely on
the compiler to optimize away dead stores, we're better off eliminating
them from the source code.

Change-Id: I14570a986811a77ca656c60d792593ff8c458571
2026-05-17 16:39:06 -04:00
Solomon Peachy
81fcb10f8f metadata: Normalize all metadata to Unicode NFC form
* Standalone database tool
 * Simulator builds
 * Target firmware (Hosted and Native, for all >2MB targets)

Change-Id: Ia7361affc2fc6a08e73c31ecc9ef3a4008c2415d
2026-05-03 07:07:07 -04:00
Solomon Peachy
8768266d27 Simpler const fix for fill_metadata_from_path()
Make sure the output of strchr(const*) is assinged to a const*

This way the filename argument can stay const

Change-Id: Ie46be936491eb62ba2a7e729b8cd7881e205bba7
2026-05-02 23:01:21 -04:00
Solomon Peachy
026ce110f2 Revert "fill_metadata_from_path modifies a "const" argument"
This reverts commit 3eba3ecd17.
2026-05-02 22:58:45 -04:00
Solomon Peachy
3eba3ecd17 fill_metadata_from_path modifies a "const" argument
...so convert the argument to non-const

Change-Id: I9e04d817e8674facae7c3be234fd9756f1a4f8ad
2026-05-02 20:41:28 -04:00
Solomon Peachy
f886bfc572 misc: Address issues uncovered with GCC 16 + binutils 2.46 (1/N)
* Funky macro-based definitions for memchr and strstr
   which require an #undef before we use our own in codecs & plugins
 * Return value of of strstr is const

Still have several more warnings and link failure with some plugins
but this is a good start.

Change-Id: Ife1f2d3e6f0e0629e3125a9058abc39c6102f452
2026-05-01 22:50:14 -04:00
Aidan MacDonald
d815053360 Add support for -fstack-protector in native builds
-fstack-protector only needs a small amount of runtime
support to work on native builds. It increases code size
by ~1.5% on ARM/MIPS; -fstack-protector-strong adds 3-4%.
This is disabled by default and must be enabled by passing
'--with-stack-protector' to configure.

Change-Id: If952e711d3673c9b469895f08c7bff70b3d95df6
2026-04-21 21:16:28 -04:00
Aidan MacDonald
9ac6edf750 Add panicf to plugin and codec API
Change-Id: I0e11ecaf8e18233f682f572f479cfdd141c99bd5
2026-04-21 19:04:25 -04:00
Christian Soffke
cc7418dd8b dsp: add option to swap left and right channels
Change-Id: Id4b518638436576cfb5e747548f10ece6e58eba0
2026-04-16 21:08:53 -04:00
Vencislav Atanasov
a77c5d2219 3ds: Various fixes, mostly for compiler warnings
- Move all devkitpro includes before the Rockbox ones so that the macros which are both conflicting and unused can be undef'd
- Remove unused result variables
- Exclude an unused function from being compiled for this target
- Fix hex number formatting
- Fix the return value of dummy functions
- Fix macro redefinition in the plugins keypad config
- Remove duplicate button mapping
- Turn off -Wchar-subscripts as it's already handled in Rockbox's ctype.h

Change-Id: I3f5a3d492c585f233277a380feaea5fe877a044f
2026-03-13 10:24:36 -04:00
Aidan MacDonald
a80911a0ce plugins: clean up IRAM memory region definitions
Check for USE_IRAM to determine if IRAM should be used.
SoCs that don't define USE_IRAM no longer need to define
IRAMSIZE to 0 either.

When IRAM is not used, any symbols bound for IRAM will
be discarded instead of linking them in DRAM. In theory
these symbols shouldn't exist, since nothing should be
placed into IRAM sections to begin with for !USE_IRAM.
If an IRAM section attribute leaks into the plugin/codec
anyway, it should now cause a link time error.

Change-Id: I55c1854cfe8beb5cb09b865336906f9945084b33
2026-03-06 16:26:35 -05:00
Aidan MacDonald
7eeb4e4302 firmware: refactor CACHEALIGN_BITS/SIZE defines
Mostly motivated by PP needing CACHEALIGN_SIZE in linker
scripts, which can't include system.h, so move these to
cpu.h instead. Also gets rid of the default 32 byte line
size that was used if the target didn't define alignment
itself. RK24xx, DM320, and JZ4740 were missing this but
have been confirmed (from datasheets) to use 32-byte cache
lines.

Add checks to make sure the macros are appropriately
(un)defined based on the HAVE_CPU_CACHE_ALIGN define,
and make sure their values are consistent when they
are defined.

Disable HAVE_CPU_CACHE_ALIGN for hosted targets since it
arguably doesn't matter if there's a cache, if we aren't
responsible for cache maintenance.

A few files in rbcodec use CACHEALIGN_SIZE, but these
can be converted to MEM_ALIGN_SIZE, which is identical
to CACHEALIGN_SIZE if the latter is defined. On other
targets, it aligns to at least sizeof(intptr_t).

Change-Id: If8cf8f6ec327dc3732f4cd5022a858546b9e63d6
2026-03-06 14:49:00 +00:00
Solomon Peachy
4209170cb7 utf8proc: Add utf8proc for normalizing UTF-8 strings
Due to the unicode data tables, this is a pretty large library,
adding ~340K to the binary size (ie a 50% increase on some targets)

Note that nothing in-tree actually _uses_ utf8proc yet.  The plan:

 1) In the metadata parser, fully normalize+compose all strings.
 2) When looking up font glyphs, if we do not find an exact
    match for the codepoint, try to decompose and render the result.
 3) Normalize all filenames as we read them, ie before we store them
    in lists or compare filenames/pathnames.
 4) Use utf8proc for casefolding-aware sorting (on native devices)

Change-Id: I2252cee3e7891d12ff37867231aa2c20353f857b
2026-03-01 08:26:00 -05:00
Solomon Peachy
6f302083b5 cleanup: Get rid of erroneous execututable bit on various source files
Change-Id: I6382ba56dc6d99189c8647b010208c33fc2da7ca
2026-02-19 07:54:35 -05:00
Aidan MacDonald
653bca7ff4 make: allow building flat binary plugins on USE_ELF targets (attempt 2)
Looks like I forgot to test the hosted builds and for some
reason thought that make would expand objcopy recursively...

Change-Id: I61264eadcb1235660566f6a9f19f8718ebe14583
2026-02-04 16:45:25 +00:00
Solomon Peachy
1e2950cc6c Revert "make: allow building flat binary plugins on USE_ELF targets"
This reverts commit 91ec6f1e1e.

Reason for revert: Massive sea of red, looks like hosted + sim builds.

Change-Id: I98a3954d68ad2cc521e13c3683bf4a6f45f88b36
2026-02-04 08:49:19 -05:00
Aidan MacDonald
91ec6f1e1e make: allow building flat binary plugins on USE_ELF targets
From what I can see the Creative Zen Vision ports, which
were the only ones to set USE_ELF prior to the Echo R1 port,
do not work except for a bootloader and never even got to
the point of booting Rockbox. This explains why they build
codecs and plugins as ELF binaries, yet there is no code to
load ELF format codecs or plugins.

Anyhow, add a new setting, PLUGIN_USE_ELF, which controls
whether plugins & codecs are left as ELF or converted to
flat binaries. This makes it possible for the Echo R1 to
use the flat binary .rock format, and makes it possible to
have ELF plugins/codecs on targets with non-ELF main binaries.

Seeing as nothing needs ELF plugins/codecs right now, the
new default is to generate them as flat binaries unless
the target requests otherwise.

Change-Id: I9ffae669978de5cc7ad214cd50d97ad6e8938394
2026-02-04 07:32:43 -05:00
Christian Soffke
4541c94292 metadata: vorbis: fix warning when building sim on aarch64 linux
b64_codes is unsigned on some systems unless explicitly
declared as signed.

"b64_codes[index] < 0 comparison is always false due
to limited range of data type [-Werror=type-limits]"

Introduced in 849e8ab

Change-Id: I6a86e898c2ed8995f7346060f9b9b58ea6ab1e95
2026-01-14 15:11:34 +01:00
Arin Kim
41d5ca3c48 skin: add new %pP tag (playlist progress as percentage)
This new tag returns the position in the playlist as a percent. The main usecase for this is to use it as a bar tag, allowing themes to visually present playlist progress.

Change-Id: I0eb001e7458d97b8a0db39f3980d9c283bc8806b
2026-01-13 16:59:00 -05:00
Aidan MacDonald
1f39ae52e3 codecs: fix compile error on ARM Cortex-M DEBUG app builds
Some of the inline assembly generates "impossible constraint"
errors in this function, but only when DEBUG is enabled.

Change-Id: I3b1135a8a55436bd3068ef560ebcef64a5184a05
2026-01-05 15:33:16 -05:00
Aidan MacDonald
3d281c2ea3 apps: cleanly disable codec buffering when not supported
Move HAVE_CODEC_BUFFERING to config.h, and disable all
related code on targets that don't support the feature,
ie. hosted targets that can't implement lc_open_from_mem().

Change-Id: I0d2a43900cd05b1a80c3cee519f8ad7b26e39fe7
2026-01-05 13:15:49 -05:00
Solomon Peachy
70e9ae0996 metadata: Explicitly use base 10 when parsing track numbers
Otherwise stuff with a leading 0 gets parsed as octal, leading to failures
to parse '08' and '09'

Change-Id: I997c505617104733793c6c113d4915bd4fd912e5
2025-12-16 15:08:54 -05:00
Solomon Peachy
b9ca4ba456 metadata: MPEG4 'trkn' field is actually numeric
So accept whatever value is supplied as correct.

Change-Id: Ic5ba6909f036957bceeaf7e79ad24273dac2e677
2025-12-13 19:19:52 -05:00
Solomon Peachy
bc627659ec FS13713: Fix null ponter deref with mp4 files with a tracknum of 0
mp4 metadata doesn't use strtol, so needs to handle things differently.

Change-Id: Idb54fae845b08222ea6b79870f6b99390af9c684
2025-12-13 17:54:29 -05:00
Roman Artiukhin
4e655be473 dsp: Optimize fractional multiplication in audio processing
Removed duplicated multiplications

Change-Id: Iafe1030cd96f16664d6b136ebbe429313b6e6448
2025-12-08 16:14:06 +02:00