Aixa is a multiplatform audio player. It can reproduce wav
and mp3
files, and displays a spectrogram of what is being played.
I do not own any rights of the sound displayed in this image
The whole project has been written from scratch, using C++17. Qt is the main dependency, but its usage has been restricted to provide a cross-platform compatibility layer.
So, within Aixa you can find:
- Usage of modern C++ features
- A MP3 decoder, written entirely from scratch
- Two Fourier Transform implementations, one of them being an FFT
- Shared data structures (From minute zero, Aixa was conceived as a multithreading application)
- OpenGL shaders for drawing basic shapes and text, with minimal external libraries required
In case you're working on a project which requires any of those, feel free to navigate the source, and take from it those parts that might help you. See license for further details.
There is already plenty of applications which do the same than this one. Why another audio player?
Basically, I use it as an excuse for learning and sharpening my skills on several topics I'm heavily interested on:
- Modern, real-time, C++
- Digital Signal Processing, and more specifically, audio processing
- Graphics programming
And also, because doing it is really fun!
Aixa has been tested on GNU/Linux (ubuntu) and Windows. Refer to the /doc
directory for instructions about building for your specific platform:
It hasn't been tested on macOS, but it should work on it with very minor tweaks.
Once you have the application compiled and running, simply drag'n'drop a wav
or mp3
file on it, and it will start playing. Use keyboard's up/down arrows to change the volume.
Despite this can hardly be called a product, there is a list of changes pending to be implemented:
- Upgrade to C++20. Start using concepts and compile-time polymorphism when applicable
- Migrate to Vulkan
- Upgrade to Qt 6
- Apply video filters to the visualization
- Synthesize some instruments' sounds
- Implement matrix multiplication and FFT in CUDA or OpenCL. Let the final implementation be decided at runtime.
- Detect invalid matrices operations at compile time, instead of runtime (Isn't that cool?)
In last Ubuntu releases, drag and drop behavior seems to be broken. I strongly suggest following the instructions on this post in order to install a GNOME extension that fixes it.
Some media converters embed in the generated file thinks like thumbnails. Aixa hasn't the functionality to skip this meta-information, so it will reject the file. Please, use another converter which only generates pure audio data.
When encoding a stereo file, the encoder can choose to use an extension called intensity stereo. The usage of this extension turns decoding quite more complex, so I haven't implemented it (yet) since it doesn't appear to be used very often in practice. As a workaround, generate a single channel file from the one you're using (or just try another song!)
Keep in mind I've been working on this on my own and mostly for fun. Bugs may appear here and there. If you'd like to report a bug, open an issue or contact me
Distributed under the MIT License. See LICENSE.txt
Pedro Riera - [email protected]
Project: Aixa