Commit graph

18580 commits

Author SHA1 Message Date
Aidan MacDonald
a8f8aa40b9 lastfm_scrobbler: fetch rbversion from plugin API
This prevents needlessly rebuilding the plugin whenever
RBVERSION changes. (This was introduced by the removal
of CVS $Revision$ tags.)

Change-Id: Ic981c86319edb9c7eb7f0c1de71d4fbaba8989ac
2026-08-25 13:17:08 -04:00
Solomon Peachy
3f1ec2385f FS#13988 - Hungarian translation update (Gyúróczki Norbert)
Change-Id: Ic9f376f01b03d2564dbcb348a29e23569a2ebdd3
2026-08-25 10:11:41 -04:00
Michael McAllister
ec59f570dd keyboard: point-mode virtual keyboard for touchscreens
On large touchscreens the software keyboard can now run in "point mode". Keys are laid out finger-sized and tapped directly instead of being navigated with a cursor. Targets opt in with HAVE_KBD_POINT_MODE.

Key size is derived from LCD_DPI so a key is about 5mm across whatever the panel density, falling back to a fixed size where DPI is unknown.

A phone-style default layout in the UI font, across three flip pages of eight lines. Page two is page one shifted (i.e caps). Page three completes Latin-1 and adds additional accented letters common to the other European locales.

Space is drawn as an icon, since the UI font has no glyph for it.

Change-Id: Ibe2e305b3c22b1f9152358cf3864b9445b67b463
Co-Author: Claude Opus 4.8
2026-08-25 09:56:46 -04:00
Solomon Peachy
c04c2c3e0b FS13892: Voice feedback in Cuesheet browser
Voices the index, performer, and title of each cuesheet entry.  Uses
talkclips if any are available.

Change-Id: If54931cb5bbeb698f23146479192c1d6fe387657
2026-08-25 07:54:03 -04:00
Aidan MacDonald
1f1db58d44 sdmmc: add optional SCR register to tCardInfo struct
The SCR register is needed for detecting if the card
supports certain commands like SET_BLOCK_COUNT.

Change-Id: I48cbf8fff497b71fb831ba546a462b27bb30851f
2026-08-25 07:49:05 -04:00
Christian Soffke
789d796120 quickscreen: make %QT hide built-in UI
When an SBS uses the new %QT tag (added in 96f42a5)
to retrieve the name of the top Quickscreen setting
(thus likely wants to draw its own QS UI), we disable
the built-in interface until a new SBS file is applied.

Fixes lag encountered in Themify 2 due to invisible
built-in Quickscreen UI that kept being re-drawn.

Change-Id: Id4f295f959c2d16d1650f6fc066c3ceca6685405
2026-08-22 20:23:07 +02:00
Christian Soffke
50b13493d2 skin_engine: make skin file type available to parser
Keep track of the type of skin file being parsed,
in case a tag needs this info.

E.g. %Lt should be ignored in any skin other than
SBS files.

Change-Id: Ib7e52c3e6810196cb566adb65619a1b847cf20ef
2026-08-22 19:52:43 +02:00
Christian Soffke
9cd4352256 quickscreen: fix missing redraw for QS_VOL action
If volume was set as one of the Quickscreen items,
the value wasn't updated when pressing ACTION_QS_VOLUP
or -DOWN.

Change-Id: Ie6531535745592d7b53006560f1db8c5b7dbfb97
2026-08-22 13:30:54 -04:00
Christian Soffke
30a5f1d858 quickscreen: redraw only the relevant viewports
For each setting adjustment, the whole QS was
redrawn, including icons that never change at
all. Only redraw the viewports that contain a
setting that has been adjusted.

Change-Id: I74188fbf382a92c6e8bf517d9518c3a96bdd21ef
2026-08-22 13:14:29 -04:00
Christian Soffke
3d44fe94f3 skin_display: simplify skin_wait_for_action
Reduces GNU Complexity score from 6 to 2.

Slightly adjusts behavior:

1) With TIMEOUT_NOBLOCK and peak meters enabled,
   skin_wait_for_action always returned BUTTON_NONE,
   and did nothing else. Presumably unintentional.

   WPS was not affected, since it always uses HZ/5 for the
   timeout. The FM screen uses TIMEOUT_NOBLOCK only when
   fms_do_button_loop is called with update_screen == true.

   skin_wait_for_action now returns the result of get_action
   in any given scenario.

2) fixes incorrect next_refresh calculation when peak_meters
   are enabled on multiple screens

3) button loop now refreshes peak meters when
   current_tick >= next_refresh, instead of when
   current_tick > next_refresh

Change-Id: Iaca37dbdde6057f593659b2feb97b61ac4cc4b02
2026-08-22 15:35:10 +02:00
Aidan MacDonald
e3f622a851 Fix red in 2c5482cab9
The error is caused by grayscale >1bpp targets which do not
define LCD_RGBPACK().

Change-Id: Ifc995d720f11fe3df8ac534bd0777e162541dc54
2026-08-20 14:34:59 +01:00
neofright
2c5482cab9 splash: make iPod reFresh colour workaround pixel-format independent
The splash contrast workaround for the iPod reFresh themes compares
foreground and background colours against hard-coded RGB565 values.

This prevents the workaround from being applied on targets using other
pixel formats, such as XRGB8888 hosted targets.

Use LCD_RGBPACK() and SCREEN_COLOR_TO_NATIVE() to obtain the equivalent
colours for the active screen instead.

Code change and commit message generated by GPT-5.6 Sol. Compiled on
my hosted Eros Q build and confirmed working correctly.

Change-Id: Id15669bc7b8cec11bd4ee645c0b671db4499d2cd
2026-08-19 18:30:48 +01:00
Christian Soffke
8cfa4bfd8c quickscreen: update SBS after each button press
Quickscreen will ignore update_delay so that the SBS
is updated after each button press, without any lag.

The SBS may display settings that are adjusted by the
Quickscreen (e.g. cabbiev2's Shuffle and Repeat icons,
or the brightness slider included in themes like
Adwaitapod and Themify).

Change-Id: I28716e81cb77e235eb009bff91c96f510365f435
2026-08-16 16:33:38 +02:00
Christian Soffke
be62759005 quickscreen: fix MIN_LINES off-by-one
Appears to be a regression introduced in e454a39, where
MIN_LINES was increased from 4 to 5, along with changing
nb_lines <= MIN_LINES to nb_lines < MIN_LINES

The top and bottom sections are supposed to switch
from 2 to 1 lines if there are fewer available lines
than MIN_LINES.

Each of the three vertical section uses two lines,
resulting in overlapping viewports, if there are exactly
5 available lines.

Icons mentioned in the comment don't really play into
that.

Change-Id: I3a0e921d9f53a490fece0ce59457feaf84a80d3b
2026-08-16 16:33:37 +02:00
Christian Soffke
cacbd9aad2 skin_engine/quickscreen: get rid of unused code, update comment, naming
- remove quickscreen_set_option prototype left
  behind from commit a22749b
- make skin_load internal to the skin_engine
- remove skin_load's isfile parameter, since
  it's always true
- update comment for skin_data_load
- slight naming adjustments
- replace MAX_PATH with sizeof

Change-Id: I6fcbcf0d3e36730c5096f38d31f8e44b92498068
2026-08-16 14:39:43 +02:00
Jerry Shen
51d7d56803 ap80max: New hosted port
HibyOS-based target: keymaps, LED, powermgmt, bootloader and sim support,
plus cabbiev2 for the new 360x640x16 screen. Opus 5 helped w/ debugging
and the initial scaffolding.

Updated name to FB_STRIDE_MISMATCH, added simulator bmp and specs.

Change-Id: If797ac6581cf75d9d1fcf36e615ee03cf6f905d6
2026-08-13 17:55:06 -07:00
Solomon Peachy
0db3308e43 FS#13981 - Updated Russian Translation (Ivan Romaniuk-Mikhailovsky)
Change-Id: Ife14860048062922ac7b4eaffc42f9debe5a6ea2
2026-08-13 12:35:55 -04:00
Solomon Peachy
9641d54fee Fix remaining red from c93c7bfdcb -- dbtool and warble builds
Change-Id: I164aac856b821b9e7a96d807521912cb791e2152
2026-08-13 09:59:52 -04:00
Solomon Peachy
7e53e85cb2 Fix red in c93c7bfdcb -- Checkwps builds were failing
Change-Id: I5d81c35d4d31036954e094d6430ef31daa34642b
2026-08-13 09:36:46 -04:00
Aidan MacDonald
0e0982cb29 touchscreen: Kinetic scrolling v3
Tune accel/decel/press coefficients and add a braking force which
kicks in when swiping in the opposite direction of scrolling. This
is instead of the usual acceleration force.

Change-Id: I2b220c98674933a6957d6982020406342cd019bd
2026-08-13 08:24:51 -04:00
Aidan MacDonald
c93c7bfdcb touchscreen: Kinetic scrolling v2
Add configurable acceleration settings. There are 3 settings which
are applied at different times during scrolling. "accel" is used to
calculate the acceleration applied to the list based on the swipe
speed. "decel" determines the deceleration force applied based on
the list scroll speed, and "press" is an additional deceleration
force applied if you are pressing on the screen.

All settings have the general form:

    kinetic scroll accel: <a0> <a1> <delay>
    kinetic scroll decel: <a0> <a1> <delay>
    kinetic scroll press: <a0> <a1> <delay>

where the formula for the acceleration is "accel = a0 + a1*vel" and
"vel" is the input velocity (swipe speed for accel, list scroll speed
for decel/press).

The delay parameter is a value in milliseconds which acts as a grace
period where the acceleration will *not* be applied. For example, if
you specify 250ms for decel, then deceleration will not kick in until
250ms after scrolling starts. For press, the delay is based on the
duration of the touchscreen press.

All settings have sane default values and don't need to be configured
to enable kinetic scrolling; it is always enabled. But the settings are
there for those who want to tweak the behavior.

Change-Id: I9723b496b2b5d3fb3643af60b169754fdba497f0
2026-08-13 08:24:28 -04:00
Aidan MacDonald
a89e1f999d touchscreen: Add flick detector to touchscreen test
Change-Id: I9b41881e3e9a271f0532cc9c500e0511c606e895
2026-08-13 08:04:01 -04:00
Aidan MacDonald
814747492c touchscreen: Add flick gesture detector
Add a low-overhead detector for flick gestures, which are quick
swiping motions from the screen edges.

Change-Id: I3ef2dad328fdf566923575d437376e100a2ab8df
2026-08-13 08:03:37 -04:00
Aidan MacDonald
0ca22b9a71 touchscreen: Improved kinetic scrolling in lists
Kinetic scrolling now accelerates when repeatedly swiping over
the screen, so you can scroll through large lists easily without
using the scrollbar. Press & hold to slow down and stop.

Menu items can no longer be selected during a kinetic scroll
event, to reduce the chance of accidental selections.

Change-Id: I05b7d5fe6681a9edf53096b1fa265442fb31bf33
2026-08-13 08:02:29 -04:00
Michael McAllister
ef20bc4c78 usb: keep the USB Serial setting across connects
Debug -> USB Serial calls usb_core_enable_driver(USB_DRIVER_SERIAL, ...), which sets a flag inside usb_core. usb_core_init() clears every driver's enabled flag on each connect and runs after the toggle, so the choice is gone before any descriptor is built: the menu reports the new state and nothing changes.

Hold the setting in firmware/usb.c and reapply it from usb_configure_drivers() on each connect, which is where the other drivers are already configured. usb_set_serial()/usb_get_serial() sit alongside usb_set_hid(), which works this way for the same reason.

toggle_usb_core_driver() goes with it: toggle_usb_serial() was its only
caller, and a generic wrapper around a call that cannot persist is not worth keeping.

Affects any target building USB_ENABLE_SERIAL.

Change-Id: I171a532d23cc9cf0efe0a01c2836b69846333a4d
Co-Authored-By: Claude Opus 4.8
2026-08-10 15:32:36 -04:00
Skye
85c1ff8667 change build scripts to make reproducible builds possible
- makes SOURCE_DATE_EPOCH affect BUILDDATE and version string
- makes wpsbuild.pl output deterministic
- omits unnecessary extended metadata from zip files
- runs strip-nondeterminism on zip files if REPRODUCIBLE_ZIP is set

Change-Id: I1617e3f5233b2bc356fcfa6457be1a7785c303f9
2026-08-09 10:29:48 -04:00
William Wilgus
49600dd77c filebrowse.lua add sort by type, add .bmp, .mod to known filetypes
also extends date and size examples to show the size and timestamp
respectively

Change-Id: Ife2b74a8a60a6da097f1f714ebaf68a60d504287
2026-08-07 09:05:59 -04:00
Solomon Peachy
f44bf5c66d FS#13974 - Updated Russian translation (Ivan Romaniuk-Mikhailovsky)
Change-Id: Ie5d42c11e1811beb486ee12c0b7cd2cdf2703d38
2026-08-07 08:48:05 -04:00
Solomon Peachy
21d48d5ae3 iap: Improve IAPGeneralCommandID_RequestIPodName
iap-serial was hardcoded to return "ROCKBOX", and it was
not implemented at all in iap-usb.

Extend the iap-serial implementation to return the contents of
<ROCKBOX_DIR>/playername.txt, or "Rockbox" if there is an error
opening/reading that file.

And cut-n-paste this into the iap-usb side of things

Change-Id: I9d328be390b4cc8bd92237f996c41ef1e5e19724
2026-08-07 08:48:05 -04:00
Skye
290b06c869 plugins/fft: do not starve other threads
Change-Id: If8149086ed6e946d300ecdecf1f47dcf294822cb
2026-08-05 16:18:03 -04:00
Hemant Kumar
b217a55059 ipod6g: Add inline earphone remote support
Decode the jack remote's play/pause and volume buttons via the
"Mikey" controller (I2C 0x72) and report them as multimedia keys so
they work on every screen, like the OF. Protocol reverse engineered
on-device, notes in mikey-6g.c.

Change-Id: If5f3d3abf043c0ce0d8ca7beb0f4b591e41c5c43
2026-08-05 08:40:24 -04:00
Solomon Peachy
b4db6ffbff FS#13971 - Updated Italian translation (Alessio Lenzi)
Change-Id: I97feb3f5558b6ba1b241c1f402bdd963ce8da273
2026-08-04 09:29:07 -04:00
Solomon Peachy
ab863dc40c iap: Clean up use of logf.h
Change-Id: I4f4a0faca42345cb8f9c8018a662377df9f58776
2026-08-02 13:57:03 -04:00
Solomon Peachy
aa99dc51c1 Translation updates:
* Moldavian (Mihai Alexandru Vasiliu)
 * Romanian (Mihai Alexandru Vasiliu)
 * Simplified Chinese (Wang Ji)

Change-Id: I586102fc47999667dec959f9f846ddd10061ad5f
2026-08-02 09:34:25 -04:00
Solomon Peachy
104f57252b iap: Increase the IAP thread's stack size from 6K to 8K.
iAP accessories that query the track information via mode3/mode4 result
in a call to get_metatada(). This routinely overlows the current 6KB
thread stack into the iAP RX buffer, possibly corrupting the current iAP
packet being received/processed.  Bumping this to 8K should yield over
1K of headroom.

(The tagcache scanning thread uses a 16KB stack in comparison)

Inspired by commit 99b21cd6c on the rockpod fork. (Nux Li)

Change-Id: Ibe997f3ae9dab2dcc2d9947f0b49d206a5b006b6
2026-08-02 08:52:52 -04:00
Solomon Peachy
94ce143e06 Translation updates
* Polish (Adam Rak)
 * Slovak (Matej Golian)
 * US English (myself)

Change-Id: Ic74865b833189df091be97fd0e286c63bb2de36b
2026-07-31 09:15:32 -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
William Wilgus
1007216fc4 FS#13961 - Add audio status, file_attr constants to lua
use require "audio_status" to use the new AUDIO_STATUS_ defines
use require "file_attrs" to use the new FILE_ATTR_ defines

Change-Id: If0b3b612e92e9e5b361a9487ccca2d40f79a953e
2026-07-30 07:07:39 -04:00
Christian Soffke
db87622e7d fix yellow in 3af4e20
Change-Id: Ia0963934176ff4759a94af5bfe33fc61c95226fc
2026-07-30 12:53:00 +02:00
Christian Soffke
3af4e20792 skin_engine: fix div by 0 for %pP tag
Fixes possible crash during playback with
'Auto-Change Directory' setting enabled.

When the currently playing directory changes, the
skin may be updated on the main thread while the
playback thread is executing create_and_play_dir
and has yet to add any indices to the newly created
playlist.

Introduced in commit 41d5ca3.

Change-Id: I6e930f2db546c7690b362ba8c1a4907d0348ff52
2026-07-30 06:18:09 -04:00
Christian Soffke
c54dddc2ac playback: fix Playlist Single Mode pause behavior (31dfd5da2e)
Don't pause after every track when playlist hasn't changed

Change-Id: Ic4f0261bb96ac1883c8d5857d0dd9db47b2e2c69
2026-07-28 19:54:59 +02:00
Roman Artiukhin
31dfd5da2e playback: add Playlist Single Mode option
Change-Id: I27c782ad246135fa6c98b52ed1491e86a7dfd456
2026-07-27 22:22:46 -04:00
William Wilgus
24c3779146 rbsettings.lua add routines to write settings
supports most settings and status items allows writing
rockbox settings from lua

Change-Id: I852489fd9819c8f7147c922e1d03c4ed9ebafa53
2026-07-24 12:45:20 -04:00
Michael McAllister
ea775fa501 hibyr1: add USB DAC scaffolding
Introduce the generic, target-agnostic pieces for a gadget-driven USB
Audio Class DAC, gated by the HAVE_HOST_USB_AUDIO target flag so they stay
inert unless a target opts in.

Rather than adding a new USB mode, reuse the existing usb_audio setting
(never / always / while charge-only / while mass-storage) with its
LANG_USB_DAC string, usb_set_audio() callback and the
PCM_MIXER_CHAN_USBAUDIO mixer channel. HAVE_HOST_USB_AUDIO becomes the
umbrella capability flag for this common code; USB_ENABLE_AUDIO stays the
native usbstack class-driver contract (which needs HAVE_USBSTACK and so
cannot be used by hosted ports whose kernel owns the USB controller).

usb_set_audio() is declared here and implemented by the target (natively
by the usbstack driver, or in the hosted port for gadget targets, as with
usb_audio_get_active()), and applied at settings load. The playback
interlock in wps.c/playback.c keeps local playback from mixing with host
audio while the DAC is active. Simulator stubs for usb_set_audio() and
usb_audio_get_active() keep sim builds linking.

Co-Authored-By: Claude Opus 4.8
Change-Id: I5b7738508c24721d91d4c32379102a1ac7c6228b
2026-07-22 15:22:46 -04:00
Aidan MacDonald
943b73851e playback: prevent crossfade of new track after pause (FS#13958)
Wipe the PCM buffer when starting playback from a paused state.
This prevents unwanted crossfade when manually pausing and then
selecting a new track.

Change-Id: I55e21004c12a2cd67417b627d471e3da115b7077
2026-07-18 14:08:27 -04:00
William Wilgus
f58038b687 luadir small cleanuo
luadir stores if a file was closed, we can get this by checking for a NULL
file handle instead

Change-Id: I95b8cc84afcdfc8515af8012afb1df64d0987fc4
2026-07-17 10:54:38 -04:00
William Wilgus
3ad3fba68e filebrowse.lua don't display parent path for files
when browsing the filename gets cut off due to the
length of the parent path

Instead strip the parent from the beginning for files

Change-Id: Ib9dadffabced89b5895420cb696227ca8cc444a2
2026-07-17 10:54:38 -04:00
William Wilgus
b481c4536e FS#13954 - Extra semicolon in file paths in get_files module
date and size still have them to separate the filename from attribs

Change-Id: I3fcaa7061d14493dab178d68398bea25f8ca67d6
2026-07-17 10:54:38 -04:00
Aidan MacDonald
7e6ae1e0d8 echoplayer: enable plugins
First pass at enabling plugins and setting up keymaps.

Change-Id: I3140160bcc3044850416904840b35065f86ac32d
2026-07-12 08:56:44 -04:00
William Wilgus
ca7399821f FS#13953 - lua add get_files() to its own module
get_files(path, recurse, finddir, findfile, sort_by, cancel_fn, f_t, d_t)

get_files returns a sorted tables of directories and (another) of files

path is the starting path; recurse == false.. only that path will be searched

findfile & finddir are definable search functions
 if not defined all files/dirs are returned if false is passed.. none
  or you can provide your own function

sort_by can be by "name" "size" "date" or "none" to perform no sorting
 note: for "size" and "date" you may need to strip the attribute data to use
 the returned filename

cancel_fn if not defined or not a function no user cancel otherwise supply
    your own cancel function which returns true to cancel searching for files

f_t and d_t allow you to pass your own tables for re-use but isn't necessary

Change-Id: Ic4c2ad9c9b5abeeeeaf572880edbc8873d52066b
2026-07-09 12:45:05 -04:00