Rockbox.org home
release
dev builds
extras
themes manual
wiki
device status forums
mailing lists
IRC bugs
patches
dev guide
translations



Rockbox Logo

Rockbox is a free replacement firmware for digital music players. It runs on a wide range of players:

Stable ports

Rockbox runs well on these players, has installation instructions, and most are supported by the Rockbox Utility:

  • AIGO: Eros Q / Eros K (aka HIFI WALKER H2, AGPTek H3, and Surfans F20)
  • Apple: iPod 1g through 6g (Classic), iPod Mini, iPod Nano 1g, iPod Nano 2g
  • Agptek: Rocker (aka Benjie T6)
  • Archos: Jukebox 5000, 6000, Studio, Recorder, FM Recorder, Recorder V2 and Ondio
  • Cowon: iAudio X5, X5V, X5L, M5, M5L, M3 and M3L
  • Creative: Zen Mozaic, Zen X-Fi, Zen X-Fi 3 and Zen X-Fi Style
  • FiiO: M3K
  • iriver: iHP100 series, H100 series, H300 series and H10 series
  • MPIO: HD300
  • Olympus: M:Robe 100
  • Packard Bell: Vibe 500
  • Philips: GoGear SA9200, GoGear HDD16x0 and HDD63x0
  • Samsung: YH-820, YH-920 and YH-925
  • SanDisk: Sansa c200, e200 and e200R series, Fuze and Fuze+, Clip, Clip+ and Clip Zip
  • Shanling: Q1
  • Toshiba: Gigabeat X and F series
  • xDuoo: X3, X3ii, and X20

Unstable ports

Rockbox runs on these players, but is incomplete, less usable or has problems that limit it to advanced users:

Unusable ports

Work has begun on porting Rockbox to these players, but much remains before they are usable:

  • Creative: Zen V
  • Onda: VX747, VX767 and VX777
  • Nintendo: 3DS
  • iHIFI: 760 and 960
  • Google: Android (4.4 and older only)
  • Rockchip: rk27xx (generic)
  • Surfans: F28

Click here for a status summary of unstable and unusable ports.

Quick links: Why should you run Rockbox? · Change log · Contribute to Rockbox

If your player is not listed above, then Rockbox does not run on it.

Recent activity:

Project news

Recent news
whenwhat
2025-12-28An "unstable" port to the Hiby R1 and R3ProII is now available!
2025-10-23An experimental port to the Nintendo 3DS is now available!
2025-09-25An unofficial port to Portmaster for retro gaming handhelds is now available!
2025-07-30An "unstable" port to the Anbernic RG Nano is available!
2025-07-29An unofficial port to the Innioasis Y1 is now available!
Older news

Wiki

whenwhatwho
Today 14:58RockboxUtilityDevelopmentSolomonPeachy
17th Jun 15:10MajorChangesWilliamWilgus

Code changes

whenwhatwherewho
Today 18:32 d9b1819e0b: FS #13942 - Lua strftime os.date("%C")
apps/plugins/lua/include_lua/strftime.lua [diff]
William Wilgus
Today 18:24 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()
apps/buffering.c [diff]
apps/gui/skin_engine/skin_tokens.c [diff]
apps/playlist_viewer.c [diff]
apps/tagcache.c [diff]
lib/rbcodec/metadata/metadata.c [diff]
lib/rbcodec/metadata/metadata.h [diff]
William Wilgus
Yesterday 18:14 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
apps/buffering.c [diff]
apps/gui/skin_engine/skin_tokens.c [diff]
apps/playlist_viewer.c [diff]
apps/tagcache.c [diff]
lib/rbcodec/metadata/metadata.c [diff]
lib/rbcodec/metadata/metadata.h [diff]
William Wilgus
Yesterday 17:27 3e08b86e4b: FixRed a824085 skin: add %pX tag checkwps, ATA builds

ata_disk_isssd() return 0 for SIMULATOR
apps/gui/skin_engine/skin_parser.c [diff]
apps/gui/skin_engine/skin_tokens.c [diff]
firmware/export/ata.h [diff]
William Wilgus
Yesterday 16:29 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.
apps/gui/skin_engine/skin_display.c [diff]
apps/gui/skin_engine/skin_parser.c [diff]
apps/gui/skin_engine/skin_render.c [diff]
apps/gui/skin_engine/skin_tokens.c [diff]
apps/gui/skin_engine/wps_internals.h [diff]
apps/playlist.c [diff]
apps/playlist.h [diff]
lib/skin_parser/tag_table.c [diff]
lib/skin_parser/tag_table.h [diff]
manual/appendix/wps_tags.tex [diff]
Adam N. Burke
All commits since last release, last four weeks,

Mail

Recent Threads on the Mailing Lists
when what who
Today 17:403DS improvements preview Olivier Senn via rockbox-dev
14th May 10:46rockbox ipod dock detection, and where to post suggestions for new/improved features? benkshao––– via rockbox
30th Mar 19:26rockbox and ipod classic? Andrew Hart via rockbox
30th Mar 13:15[SPAM] Re: rockbox and ipod classic? Solomon Peachy via rockbox
10th Feb 14:35About iPod 30-pin UART Use Solomon Peachy via rockbox

Page template was last modified "Tue Sep 7 00:00:02 2021" The Rockbox Crew -- Privacy Policy