Lemuroid 1.7.1 with fast-forward and quality

This last month I’ve been very busy drafting the release of 1.7.0, and later 1.7.1 for bonus bug fixing.

The biggest work went towards redesigning audio, which now runs on a separate thread and reduces glitches by imperceptibly accelerating and decelerating playback speed. This can’t make up for weak hardware running modern consoles, but it surely improves one of the biggest issues affecting Lemuroid. I’ll probably write a separate blog post about this. It was a very interesting and challenging problem.

The second most important change is fast-forward support. The most requested feature is here, and you can finally farm at double speed.

Something else happened in this release. It’s the first time Lemuroid (and LibretroDroid) received non-trivial external contributions, so a big thank you goes to Roberto and Tyler for their efforts.

And now for dessert, a lengthy changelog:

  • Add fast-forward option
  • Add mute option
  • Reimplemented audio from scratch to be more robust to glitches
  • Fix potential crash when loading PSP games
  • Fix screen flickering with some PSP games
  • Fix crash while playing Drill Dozer on GBA
  • Change n64 resolution to the original 320x240
  • Exposed dynamic recompiler option for PSX (Enable it for better performances)
  • Updated games database
  • Fix issues with some PSP games running too fast
  • Fix missing trigger events with some gamepads
  • Fix missing gamepads events in some scenarios
  • Fix wrong aspect ratio with Genesis games
  • Improved error handling with clearer messages
  • Small fixes and improvements

A big thank you to the people who are supporting Lemuroid with code, donations, and testing. You’ve been amazing.

Enjoy!

Lemuroid 1.6.0 with many improvements

Finally! I’m very happy to announce Lemuroid 1.6.0, with nothing particularly shiny but many many quality of life improvement, especially for PSX and Android TV:

  • Added support for chd and cue/bin format (PSX)
  • Added support for multi-disk games with m3u playlists (PSX)
  • Added support for favorites on Android TV
  • Improved LCD filter which now looks sharper
  • Allow changing display filter (Smooth, Sharp, LCD or CRT)
  • Improved scanning performances (on my directory it’s around 3 times faster)
  • Cores are now bundled within the application (read afterwards for details)
  • Many small tweaks and improvements

You’ll find the update on Google Play or Github.

A lot of work went into the scanner, which is now able to handle bin/cue files and m3u playlists for multi-disk games. This should make the majority of PSX ROMs compatible with Lemuroid.

Another heavily requested feature by the community was a sharper image filtering. The default bilinear filtering doesn’t always look good, especially on TVs when using the LCD shader. The nearest neighbour filtering has its own set of issues when scaling by non integer factors, causing inconsistent pixel sizes throughout the image. The best solution I found is a sharper bilinear filtering by sampling pixels in a smarter way. Try it out and let me know what you think!

Why are cores now bundled within Lemuroid? Because Google Play blocked updates for Retroarch for downloading untrusted executable code. Lemuroid did the same and it’s a real security concern, so after a few failed attempts with Dynamic Features, I decided to bundle cores with Lemuroid. This increased the download size from 6Mb to around 25Mb but should make it compliant.

And that’s all the news this month, excluding that Lemuroid was removed and reinstantiated on Google Play for an mysterious policy violation, the hacker attack to the Libretro servers and the guy who tried to sell GBA games using a Lemuroid clone.

Yeah. It was a quiet month…

If you are enjoying Lemuroid and appreciating my work, you can support my endeavours here.

Cheers!

Lemuroid 1.5.0 brand new touch controls

layouts

This post is going to be a little bit longer and technical than usual, so if you want to take a shortcut, here’s the kicker: Lemuroid 1.5.0 is out with completely new touch controls!

You’re free to go, but if you want to know how we got there, sit tight!

This journey starts back in September 2019, when I thought it was a good idea to implement each virtual key as a separate Android View. Android was managing touch events for me and everything just worked… Kind of.

After a few months the first issues started to surface. Some people were complaining about missing touches or improper multi-touch handling while others wanted some form of customization. Adding new consoles was also becoming a bit of a chore, with many similar but different xml layouts and Kotlin classes.

It was time to go back to the blackboard.

After a few days of thinking and prototyping I decided to design everything around a simple principle: putting primary controls directly under your thumb, and secondary controls radially around them. The implementation was done by drawing everything inside a single Android View on an accelerated Canvas and manually managing touch events.

This had its own set of challenges such as optimal positioning and sizing, and making sense of touch inputs, but in the end, I’m quite proud of the result.

So what can you expect from these new touch controls?

  • They are automatically sized to optimize the available space
  • Touch targets are much bigger and no longer related to the draw area
  • They can be customized in size and vertical position
  • The most complex layouts (n64, psx, psp…) can rotate up to 45 degrees, making them more comfortable at the expense of screen estate
  • Multitouch works as you’d expect
  • It is possible to slide your finger from one control to another (while thumbsticks and d-pads still lock on your finger)
  • The diagonal in d-pad now has a smaller activation area
  • You can press thumbsticks in the PlayStation layout by double tapping and holding
  • Tilt to Stick can be activated with a triple tap on any Stick

As before, the game pad View is split in the middle to accommodate both portrait and landscape orientations.

Everything was developed with Lemuroid in mind, but I decided to publish it as a separate Android library which you can integrate into your emulator, game or app. Say hello to RadialGamePad!

Another big news for today, if you wish to support the continuing development of this project, I launched my very own Patreon page.

Feel free to take the new controls out for a spin and let me know what you think!

Lemuroid 1.3.0 and tilt support

In the last few weeks I’ve come to realize a very hard truth: two thumbs are sometimes not enough to play games on a touchscreen. The first attempts to artificially manipulate my genome failed, so I decided to opt for a different strategy: leveraging hardware sensors.

This sounds nice on paper, but the real challenge is defining a good UX which solves all the usability problem sensors have (many implementations out there fail here).

  • How do we make sure sensors are both accurate and fast?
  • How do we guarantee they are used only when actually needed?
  • Which retro control are we going map to sensors?
  • How do we determine a good rest position?
  • How can we avoid forcing the user into an uncomfortable position to please the gyroscope?

Luckily Google answers the first question with virtual sensors (TYPE_GAME_ROTATION_VECTOR), providing a nice fusion algorithm on data coming from accelerometer and gyroscope, with great results on a modern device.

Users are given complete control, they can just enable it by double tapping on an analog stick which will start moving on its own following the device tilt. The rest position is computed from the first measurements and the difference with the following ones is used to drive motion.

To disable sensors, a single tap on the active stick is enough and it will go back to being a simple touch control. You can now lie on the couch and start again.

With just a bit of practice I found the accuracy of the inputs methods comparable, but with a bonus finger at your disposal and maybe a bit more of fun! You can check the video if you don’t believe my words.

This feature is already available in Lemuroid 1.3.0 (out on GooglePlay) along with improved layouts for every console. Try it out and feel free to let me know what you think!

Ok, this is great, but what about $FEATURE? A sneak peek: Lemuroid 1.4.0 is in beta with game pad bindings and external PlayStation BIOS support.

Cheers!

Lemuroid 1.1.1

screenshot

The first stable version of Lemuroid was released about a month ago, but I’m not done with it just yet. You guys have been amazing and provided a lot of feedback, which was distilled into version 1.1.1, released just a few days ago.

For starters we have a few new systems:

  • Sony PlayStation (PSX) (with multidisk support in .pbp format)
  • Atari 2600 (A26)
  • Sega Game Gear (GG)

Then we have some new features:

  • Labels on buttons (this was probably the most wanted feature :D)
  • Improved detection for iso/pbp files
  • Virtual buttons no longer overlap with touchscreen on NDS
  • Added a virtual button which simulates microphone noise on NDS

And to finish, I also exposed a few core options such as:

  • Game Boy colorization palette and LCD blur
  • Video filters and color correction for various systems
  • Frameskip for PSX and NDS

As always, you can find the source code on Github or grab it from Google Play.

Enjoy!