Skip to content

Releases: SchulzCode/Y2Player

Y2Player 2.0 Complete Media Engine Rewrite

Choose a tag to compare

@SchulzCode SchulzCode released this 27 Jul 20:14

Small update!

I fixed a race condition that could prevent the SD card from mounting correctly after the update. Please download Version 2.0 again to get the fix.

After installing the updated V2.0, please do the following:

  1. Settings → System → Diagnostics → Reset Library
  2. Settings → Library → Storage → Rescan Library

Due to the underlying FFmpeg update, the library database schema has changed. As a result, your media library needs to be reindexed.

Reporting bugs

For future bug reports, please enable Verbose Diagnostics first:

Settings → System → Diagnostics → Verbose Diagnostics

Then use the device until the bug occurs. After that, export the diagnostics:

Settings → System → Diagnostics → Export Diagnostics

Connect your Y2 to your computer and obtain the log. The framework logs almost everything happening on the device, and these logs help me identify and fix issues much more quickly.

If you'd like to report a bug, please create a GitHub issue (many people already do!). Including the diagnostics ZIP with your report makes it much easier to track down the problem.

Y2Player 2.0 - Complete Media Engine Rewrite

Y2Player 2.0 is by far the biggest update since the project started.

Over the last two nights, I completely tore out the old media engine and rebuilt it from scratch.

When I originally started Y2Player, I chose to use Android's stock MediaPlayer API. At the time, I underestimated how limited it actually is. The stock media framework is heavily dependent on the device manufacturer and whatever codecs they decided to include. On the Innioasis Y2, that meant limited format support, inconsistent playback behavior, and a lot of restrictions that made adding new features increasingly difficult.

So I decided to stop using the stock player and replace it entirely.

Fortunately, one thing worked in my favor. From the beginning, I designed Y2Player with a relatively modular architecture that kept the playback engine separated from the rest of the application. That meant I could swap out the entire media backend with surprisingly few changes to the rest of the codebase. What could have turned into a complete rewrite of the app ended up being almost a plug-and-play replacement of the playback engine.

Y2Player 2.0 now uses the latest stable release of FFmpeg as its decoding backend. Instead of relying on Android's outdated media framework, Y2Player now ships with its own modern media engine, providing far better compatibility, stability, and room for future improvements.

What's New

  • ✅ Completely rewritten media engine
  • ✅ Powered by the latest stable version of FFmpeg
  • ✅ No longer dependent on Android's stock MediaPlayer
  • ✅ Improved playback stability
  • ✅ Much broader codec and container support
  • ✅ Better compatibility with modern audio files
  • ✅ Foundation for future playback improvements

Supported Audio Formats

Y2Player 2.0 now supports the most commonly used audio formats, including:

  • MP3
  • FLAC
  • WAV
  • AAC / M4A
  • OGG Vorbis
  • Opus
  • WMA
  • AIFF
  • And many more

Supported Containers

Audio can now be played from containers such as:

  • MP3
  • WAV
  • FLAC
  • ALAC
  • M4A
  • MP4
  • OGG
  • MKV
  • WebM
  • And many more

Why FFmpeg?

Moving to FFmpeg means Y2Player is no longer limited by the firmware's built-in codec support. Instead, it uses one of the most widely used multimedia libraries available, giving the player a much more capable and reliable playback engine.

This rewrite also lays the foundation for future features such as:

  • Real gapless playback
  • Real ReplayGain support
  • Better metadata handling
  • High-resolution audio improvements
  • Additional playback enhancements

This update took a lot more work than I originally expected, but it was absolutely the right decision.

It should also resolve the vast majority of issues users experienced with unsupported audio files. Looking back, the original media engine quickly became the biggest limitation of the project - it was simply a consequence of my inexperience and not fully understanding the limitations of Android's stock media framework.

With FFmpeg at its core, Y2Player now has a modern, future-proof media foundation that I can continue building on without being constrained by the original Android media stack. This rewrite also makes future features significantly easier to implement, rather than having to fight against the limitations of the stock player every step of the way.

Y2Player V1.2

Choose a tag to compare

@SchulzCode SchulzCode released this 26 Jul 11:09

Changelog

1.2

Mostly things people asked for. The menu has been reorganised, so a few settings
have moved. You might need to rescan your library, since i made some changes to the underlying database schema!

New

  • Artists now open that artist's albums instead of jumping straight to every
    track, so browsing goes Artists → album → songs. "All Songs" is still the first
    row, which is what pressing an artist used to do.
  • Light theme, under Settings → Display → Theme. The dark design is unchanged
    and remains the default. On a transflective LCD like the Y2's, a light theme is
    also the more readable choice outdoors, because a pale background lets the
    backlight through instead of blocking it.
  • Left/right balance, under Sound Effects, for asymmetric hearing loss.
    Centred by default. It attenuates the far channel rather than boosting the near
    one, so total loudness drops as you move off centre.
  • Wheel When Screen Off, under Controls, off by default. With it on, the click
    wheel and its buttons keep working with the display asleep which also means
    they can be pressed in a pocket, which is why it is off unless you ask for it.

Changed

  • Settings is reordered by how often each entry is actually opened. Bluetooth
    is first, because connecting a headset is a recurring task rather than a setting.
    Sound Effects is now a top-level entry rather than living inside Playback, so the
    equalizer and balance are three presses away instead of four. Sort Order sits
    next to Storage, since both concern the library.
  • Haptics and System UI Sounds moved off Display onto a new Controls screen,
    together with the setting above. They are feedback for input, not display
    settings.
  • Playback's settings are grouped by what they do: what plays next, transitions,
    seeking, volume, then interruptions.
  • Sound Effects lists the things you can change before the things you can only
    read.
  • Track info states whether the file carries a track number.

Fixed

  • Choppy playback during a library scan should be much rarer. The scan already
    paused for audio, but only once per 64 files, which left roughly three seconds
    of uninterrupted work between pauses long enough to starve the playback
    buffer. It now yields every 8 files, for a share of what those files actually
    cost.
  • A Bluetooth headset reported as "not connected" on every screen except the
    Bluetooth screen.
  • The DAC and output rows were hidden when the device's effect framework was
    missing which is exactly the firmware whose behaviour those rows explain.
  • Two artists with an identically named album (a Greatest Hits each) opened
    one merged track list. An album reached through an artist is now scoped to that
    artist. The global Albums list still merges shared names on purpose, so a
    compilation stays one album.
  • ALAC files in an .m4a were reported as AAC. They still cannot be played
    see below but they are now identified correctly and labelled, instead of
    failing silently when you press play.

Why ALAC still does not play

Apple Lossless needs a decoder, and the Y2 runs Android 4.4. ALAC decoding was
added to Android in version 12, eight years later. An app cannot supply the
missing decoder: MediaPlayer and MediaCodec can only use codecs the operating
system already has, so there is no setting or update to this app that would make
an ALAC file play on this hardware.

What 1.2 does instead is stop pretending. The codec is now read out of the file
itself rather than guessed from the container, so an ALAC track is labelled
not playable in the list rather than appearing normal and then failing.

For Now

If you have ALAC files, convert them to FLAC. Both are lossless, so the
conversion is bit-exact for the audio you lose nothing but Apple's container
and FLAC plays natively on the Y2:

ffmpeg -i input.m4a -c:a flac -compression_level 5 output.flac

Supporting ALAC properly would mean bundling a decoder and building a second
playback path to feed it, duplicating seeking, gapless and crossfade. That is a
large amount of machinery for one format that converts losslessly in one command,
so it is not planned.

Also still true

  • Formats some firmware adds, such as WMA and APE, are deliberately left
    unlabelled rather than guessed at, because they may well play on your device.

Release V1.1

Choose a tag to compare

@SchulzCode SchulzCode released this 25 Jul 17:07

Changelog

1.1

Fixed

  • Albums copied from a Mac appeared twice. macOS writes a hidden ._Track.flac companion beside every file it copies to the player. These were indexed as tracks, so you got a second copy of the album with no metadata that skipped silently when played — and could not be deleted, because both the desktop and the player hide dot-files. Hidden files are now skipped. One rescan removes the leftovers.
  • Albums listed out of order when only some files carried a track number, for example 5, 1, 2, 6, 3, 4. Track numbers are now trusted only when every track on the album has one; otherwise the filenames decide the order. Browsing a folder follows album order too, instead of sorting by title.
  • "Library needs attention" could not be cleared. A single unreadable or zero-byte file on the card made every rescan report a problem, permanently. The same fault also stopped deleted files from disappearing from the library, and stopped the last-scan time from updating. The alert now names its cause, and a scan you cancel yourself raises nothing.
  • Bluetooth stem controls needed playback to be started on the player first. Media-button ownership is now re-taken whenever a headset connects. The first press after connecting is also no longer swallowed.
  • Triple press to skip back did not start playback when nothing was playing.
  • A connected Bluetooth headset was reported as "not connected" on every screen except the Bluetooth screen.
  • Pressing the track that is already playing restarted it and rebuilt the queue from whatever list you were looking at, losing your position and your album or queue order. It now just opens Now Playing.
  • ALAC files in an .m4a were reported as AAC. The codec is now read from the container itself, so the format shown is the real one.
  • The on-device log only ever showed the last 12 lines. It now shows considerably more, and reads them from the end of the file instead of loading the whole thing.

New

  • Tracks in a format this device cannot decode are labelled "not playable" before you press play. A file that fails to play once is remembered, and the note is withdrawn if it ever does play or if you replace the file.
  • Technical metadata is now read directly for MP3, M4A, AAC, OGG, Opus and AMR as well, alongside the existing WAV, FLAC, AIFF, WavPack and DSD support.
  • Battery percentage is always shown, not only while charging or when low.
  • Track info states whether the file carries a track number.

Performance

  • Playback stutters far less while the library is scanning. Scanning now yields briefly to audio and runs at background priority.
  • Less repeated work during playback: audio route, DAC status and progress updates no longer rebuild themselves on every tick.

Known limitations

  • ALAC still cannot be played. Android 4.4 has no ALAC decoder and one cannot be added from an app. Converting to FLAC is lossless and plays natively — ffmpeg -i input.m4a -c:a flac output.flac.
  • Formats some firmware adds, such as WMA and APE, are deliberately left unlabelled rather than guessed at, since they may well play on your device.

1.1

Y2Player V1.0

Choose a tag to compare

@SchulzCode SchulzCode released this 24 Jul 09:59

Y2Player v1.0

This is the first public release of Y2Player.

Y2Player is an offline music player and launcher replacement for the Innioasis Y2, designed to provide a fast, reliable, and iPod-like music experience while preserving the device's original hardware controls.

Installation

Please follow the installation instructions in the repository README.

Y2Player is installed by building and flashing a modified system.img. Do not simply install the APK manually, as this will not replace the stock launcher or provide the intended experience.

The README includes:

  • required files
  • build instructions
  • flashing instructions
  • important safety warnings
  • known limitations

Please read the instructions carefully before flashing your device.

Feedback

As this is the first release, bug reports and feedback are greatly appreciated. If you encounter any issues, please open a GitHub issue and include as much information as possible, along with an exported diagnostic log if available.

Thank you for trying Y2Player!