I just released Ocarina 6.4.3! My main project over the last several months has been converting Ocarina over to C, and as of this release one quarter of my Ocarina codebase has been converted.
I have several reasons for this conversion, the first being that my natural coding style tends towards writing very C-ish code. I don’t use a large number of classes or inheritance, and I find it easier to write a global function instead. This can work in C++ or Python, but sufficiently large projects tend to get messy.
Switching over to C also makes it easier to make an interface in GTK. Glade, the GTK interface designer, lets me assign callback functions in xml, cutting out a lot of code to wire everything up. This works great in C, but breaks in C++ due to how C++ code is compiled.
Converting everything from C++ to C is surprisingly easy thanks to the extern keyword in C++, which I use to include C files in my remaining C++ code:
I officially released Ocarina 6.3 this morning! Changes include:
Improve unit tests.
Finish up Doxygen documentation for core/.
Separate tag database into multiple files.
Move Gstreamer from core/ to gui/.
Various gui code cleanups.
The most interesting change this release is probably the gstreamer move. Ocarina 6.2 added an audio “driver” interface to allow for faking playback when running unit tests. This release takes the concept one step farther and moves all of gstreamer into the gui, simplifying many things. My hope is that this will make it easier to port Ocarina to Android or OS X in the future.
Another month, another Ocarina release. And we didn’t have to wait a whole year this time! My main focus for this release was finishing the backend code cleanups that I started before releasing 6.0. I’m much happier with how the code looks and I now have unit tests for every file in core/.
This release removes support for importing an Ocarina 5 library.
I have not had an Ocarina release in almost a year and a half. The last year has been busy (more on that later), but I haven’t forgotten about my pet-project!
I started working on a new rewrite of Ocarina in May 2013. I created previous versions by writing whatever features I felt like implementing at the time. There was no plan, and it didn’t take too long to transition into an ugly hackjob. I felt like the code would have been almost impossible to update without breaking everything, so I started fresh.
For the first few weeks I only worked on a design document. This allowed me to stay focused during development and gave me a chance to think out features before writing a lot of code. I really like this approach, and I recommend it to everybody before starting off on a project. I plan to keep this document updated as much as possible.
This is also the first version of Ocarina to have unit tests. I like these so far, since I can now focus on testing a single component without needing to have a functional GUI. I plan to keep these updated as much as possible, too.
Ocarina 6.0 is still Linux only and I don’t have the time, resources, knowledge or interest to support a Windows or OSX port. I am willing to work with anybody ambitious enough to attempt a port! Let me know …
Other notable changes:
I continued to refine the UI (compared to Ocarina 5.10)
I made the switch to GTK-MM and GStreamer 1.2
I added support for “banned” and “favorites” playlists
I created a .desktop file so Ocarina will show up in your “applications menu”
Ocarina started in April 2009 as an experiment in writing my own music player. I used to use one of the big players included as an option in most Linux distributions, but they released a major update that happened to remove most of the features I relied on. Clearly the only reasonable solution was to write my own, and so Ocarina was born!
I started working in Python, and wrote mostly experimental code that provided me with an opportunity to learn about both GTK+ and GStreamer.
A rewrite soon followed, adding many new features. This was the first version to support a feature I can’t live without: the ability to queue up songs to play later.
I never got very far with Ocarina 3. The goal was to create a generic Python framework that I could share with other projects, but I never got very far. The code I wrote was too complicated to use, and I eventually tossed it out.
Ocarina 4 was when I really began to innovate. I quickly decided that I should emphasize the “currently playing” song list, and the rest of the UI flowed from there.
I rewrote Ocarina 5 in C++ so I could take advantage of the syntax checking that compilers offer. I also added in several new features including AutoPause, a visual history tab, and multiple rearrangeable queues.