Aurélien Gâteau

Bluetooth Speaker - Part 3 - Using an existing Bluetooth speaker

written on Monday, January 13, 2020

This article is part of a series on creating a Bluetooth speaker from an old vacuum tube radio and spare parts I had lying around in the house.

So after the failure of part 2, I decided to try a seemingly safer approach: buy a small Bluetooth speaker, tear it down and use its guts to power my radio.

I bought a small portable Grundig GSB 710 Bluetooth speaker. It's a mono speaker, but since the radio I am working was also mono, as was common by the time it was created, it felt like a good fit. I checked it worked and started to tear it down:

  • Opening the box
  • Main circuit is out, unplugged from its speaker
  • Control board removed
  • Soldering wires to the ribbon cable, ghetto-style, because I didn't have any connector handy
  • Covering the mess with thermoretractable tube

Bluetooth Speaker - Part 2 - Attempting to update the audio hardware

written on Monday, December 30, 2019

This article is part of a series on creating a Bluetooth speaker from an old vacuum tube radio and spare parts I had lying around in the house.

As I explained in part 1, the electronics looked too old so I decided to replace it with a small Bluetooth audio amplifier board and two loud speakers.

I ordered a TPA3116D2-based Bluetooth amplifier from Nobsound and a pair of MTX TX450C, 4 Ohms loud speakers.

  • The Bluetooth amplifier
  • The loud speakers

Bluetooth speaker - Part 1 - Introduction

written on Wednesday, December 25, 2019

This article is the first of a series on creating a Bluetooth speaker from an old vacuum tube radio and spare parts I had lying around in the house.

At the time I am writing this, the speaker is not done yet, so there is still a chance that I never finish it... As you will see, the journey so far as not been straight, I hit a few roadblocks and changed my mind while working on this project.

Let's start with the reason I started this project. When we moved in our house, more than a decade ago, I found this old vacuum tube radio left around by the previous owner:

  • The radio

I have always wanted to make something out of it, but never took the time to do so, until last month.

Pixel Wheels 0.14.1

written on Monday, November 18, 2019

Last week I released version 0.14.1 of Pixel Wheels (I am a bit late with the announcement, it has been a busy week).

The "Side buttons" input mode

I am happy to say this is the first release to include changes from other contributors, thanks to Tim Schumacher and Julien Bolard!

Here are the most important changes:

Inktober 2019, cats!

written on Sunday, November 3, 2019

I participated again to Inktober, the yearly challenge where you draw and ink one drawing a day each day of October. The Inktober web site provides a "prompt list": a list of words for each day, which you can (but are not forced to) follow.

Inktober 2019 prompt list

I followed it as it helps me come up with drawing ideas, and I also picked "cats" as a recurring theme, so all my drawings are filled with kittens. This makes them very Internet friendly, since as we all know, the Internet was created to share cat pictures, right?

SFXR Qt 1.3.0

written on Monday, September 16, 2019

I just released version 1.3.0 of SFXR Qt, my Qt port of the SFXR sound effect generator.


There aren't that many new features for end users:

  • A new wave form: Triangle.
  • A new file format: SFXJ.

The new file format opens the road to adding new features. I have a few ideas in mind, will see how it goes.

Nevertheless, this release brings several under the hood changes:

Pixel Wheels 0.13.0

written on Monday, August 12, 2019

Fixes, fixes, fixes

I just released Pixel Wheels 0.13.0. This new release contains mostly fixes, small improvements and polishing. One of the most visible of these changes is the new "Championship finished" screen which appears if you finish a championship in the top 3:

Harvester reached the first place!

I am also happy to report that an annoying bug causing white vertical lines to randomly appear on the road has finally been fixed. It turned out to be a "classic" case of texture bleeding. The white vertical lines were caused by the first column of the "crossroad" tile sometimes being drawn next to the "road" tile...

Bleeding tiles

libGDX provides a tool called TiledMapPacker to repack tilesets and add padding around individual tiles to avoid tile bleeding. Unfortunately this tool uses some libGDX classes, so it requires an OpenGL display to run. This is a blocker for automated builds, so I wrote a simple script: pad-map-tiles. It only does tileset padding, but for Pixel Wheels I don't need the other features provided by TiledMapPacker.

Some behind the scene changes happened too: the code base now uses Java 1.8 (was about time!), a more recent version of Gradle and the APK contains 64 bit binaries, as required by Google Play nowadays.

Pixel Wheels 0.12.0

written on Thursday, June 20, 2019

I knew it had been a long time since the last Pixel Wheels release but I was surprised when I opened the changelog and realized version 0.11.0 was released in 2018... It's high time to get 0.12.0 out!

So what are the main changes in 0.12.0?

3 new vehicles

The 2-Deuch:


It is inspired from an car which was very popular in France in the second part of the 20th century.

The Harvester:


It comes from the country side, as you may have guessed. If you have ever watched or drove an harvester, you know the steering wheels are on the back. This makes this vehicle a bit special to handle, give it a try...

The Rocket:


A joint production from my son and me. This one is faaast!

Using std::unique_ptr with Qt

written on Thursday, May 30, 2019

Qt memory handling

Qt has a well established way to handle memory management: any QObject-based instance can be made a child of another QObject instance. When the parent instance is deleted it deletes all its children. Simple and efficient.

When a Qt method takes a QObject pointer one can rely on the documentation to know if the function takes ownership of the pointer. Same thing for functions returning a QObject pointer.

What the rest of the world does

This is very Qt specific. In the rest of the C++ world, object ownership is more often managed through smart pointers like std::unique_ptr and std::shared_ptr.

I am used to the Qt way, but I like the harder to misuse and self documenting aspect of the unique_ptr way. Look at this simple function:

Engine* createEngine();

With this signature we have no way to know if you are expected to delete the new engine. And the compiler cannot help us. This code builds:

    Engine* engine = createEngine();
    // Memory leak!

With this signature, on the other hand:

std::unique_ptr<Engine> createEngine();

It is clear and hard to ignore that ownership is passed to the caller. This won't build:

    Engine* engine = createEngine();

But this builds and does not leak:

    std::unique_ptr<Engine> engine = createEngine();
    // No leak, Engine instance is deleted when going out of scope

(And we can use auto to replace the lengthy std::unique_ptr<Engine> declaration)

Nanonote 1.2.0

written on Sunday, May 12, 2019

Time for a new Nanonote release!


This new version comes with several changes from Daniel Laidig: you can now use Ctrl+mouse wheel to make the text bigger or smaller and Ctrl+0 to reset the font to its default size.

He also fixed the way links are displayed: they now use the theme color instead of being hard-coded to blue. If you use a dark theme, this should make Nanonote more usable for you.

Nanonote now speaks German, thanks to Vinzenz Vietzke.