Wednesday, January 10, 2018

2018 Plans

Now that the holidays are over I thought I would share my plans for this year and discuss the current state of 3.0.  For those not aware, I track all my active development, future development, and feature requests on trello here:  To see my current progress on 3.0, the ones you want to look at are "3.0 - Alpha 1", "3.0 - In Progress", and "3.0 Complete".

Anyway I just finished up rewriting all the Dsp / Audio Effect management code (essentially everything dsp/eq related that was NOT in the audio engine).  There have been some long standing bugs like the equalizer not applying on startup or the bass boost not being applied until you toggled it off and on that I really hope will not be present in this rewrite.  My original intent with 3.0 was to just rewrite the UI, but I ended up rewriting a lot of the backend in the process.  Tons of the old code was written 6-7 years ago back when gingerbread was present so it had a lot of unnecessary and/or deprecated code in it.  I am also a much better engineer than I was back then so being able to completely redo entire systems has led to a much more efficient and easier to maintain baseline.  The downside is that its taking much more time than I originally planned.

If you look on trello, the 3.0 lists show about 15 remaining tasks before I can release the first alpha.  I will try to estimate how long I think they will take so you guys can get an idea when the first alpha might be released.  Keep in mind my estimates are most likely the best case scenario..  I only get around 12-20 hrs a week (depending on how I spend my weekends) to do android dev, so the odds of this taking longer than I estimate is pretty high.  Sometimes I miss the early days of GMMP when I was able to get 40-50 hrs in a week.

Remaining tasks for Alpha 1 (summarized):

  • Equalizer / Effects UI - Most of the hard work was already done with my recent dsp management refactoring so this task is just pure UI development.  ~ 2 weeks
  • Playlists UI - I already rewrote the playlist file handling 2 months ago and the playlists UI is pretty straight forward in general. ~ 1-1.5 weeks
  • Navigation - Nothing has really been done yet with the side navigation drawer and to efficiently handle swapping back and forth between the different views.  I anticipate this being a pretty large task.  ~ 3-4 weeks
  • Landscape Support - Most of the UIs are pretty usable already in landscape, so this will probably be just designing the landscape version of now playing (for alpha 1.. i definitely plan on optimizing all UIs for landscape/tablets before the final release).  ~ 2 weeks
  • Preferences UI - Will be pretty simple to start (will go into more detail on preferences later) ~ 1-2 weeks
  • Action hookup - A lot of the menu options / gestures / etc are not completely set up.  I finished the frameworks and implemented a few actions for demonstration, but thats it.  ~ 1-2 weeks
  • Bug fixes / Testing before release ~ 3 weeks

Remember this is a best case scenario and if I get emails or questions asking for an ETA, my response is going to be "when its done" (this is my typical response anyway since estimating time is very hard to do.. a single bug can consume weeks before finding a resolution).  If we add up my estimates and look at the current date I would guess the first alpha release will be sometime in April.  As mentioned before the Alpha will be ran through a separate google+ community from the beta.  A lot of people in the beta do not actually frequent the g+ page, so I do not want to push an update to the beta channel until I have restored all the features / customizations from 2.x (or well.. all the ones i plan on restoring).

GMMP will most likely be in alpha for awhile.  There are still a huge list of capabilities to readd and new ones I want to add (check trello).  For customizations I think I will be taking a different approach this time around and not just load everything up in the preferences UI.  Almost all the UI based customizations will be accessible from the toolbar menu in the actual UI.  This should make customizing the UI much faster and easier.

Betas will come once all the features and customizations are complete.  It will be strictly for bug fixes and minor tweaks, so depending on how good of a developer I am.. this period may be short.. or long depending on how many bugs pop up. 

In summary, the 3.0 final release is still a long way off, but I think a usable alpha version will be available in a few months.  Also keep in mind that 3.0 isnt just a pure rewrite.  I have been adding new capabilities as well (multi genre / artist support, new loudness enhancer audio effect, grid view, bookmark ui, improved shuffle, and permissions) and more are planned (auto dj mode, true album shuffle mode, artist images, app shortcuts, song details view, and year view).

Wednesday, December 20, 2017

3.0 Work in Progress 13: Cuesheet improvements

Most of the work I've done since the last post has been behind the scenes so there is not too much to show.  I rewrote the audioengine management piece (what handles the interaction with gonemads audioengine, android media player, and chromecast), rewrote the crossfade code, and cuesheet handling.

Cuesheets are something that the majority of gmmp's user base probably does not use, but they are a nice feature.  For those who do not know, a cue sheet allows you to listen to a single large audio file as if it was split up into tracks for each song.  GMMP has always had decent support for CUE files (they would appear as individual tracks in the library views), however in the folder browser they would just appear as a .cue file and the single mp3 / audio file. 

In 3.0, the folder browser will actually extract and list the individual tracks in a CUE instead of the single file.

Below is what the actual folder on disk looks like.  This example is a single cuesheet with 5 separate hour long mp3 files (its a electronic/trance mix i believe).

Folder view from solid explorer

This is how it will now appear in GMMP 3.0

Cuesheets can also be embedded into the tags of files.  GMMP supports that as well

Next up will be the new equalizer / effects UI.  I will most likely also rewrite a lot of the underlying DSP/EQ code as well. 

Friday, December 1, 2017

3.0 Work in Progress 12: File Browser UI

Next up on the new UI list is the file/folder browser.  I also rewrote the file/playlist handling on the backend to be much more streamlined.  A lot used to go on when playing folders and i've greatly simplified that.  As always, the file browser will show anything on the file system and does not care if its in the database or not.  This is great for navigating, but caused a lot of issues when a user went to play a file or folder.  I am sure some were familiar with the issue where songs would "disappear" from the queue after reloading GMMP.  This was because the user played a file that was not scanned into the database.  GMMP would play the file fine in the queue, but when the queue was persisted to the database those files were lost.  In 2.x GMMP would try its best to get everything scanned in by running silent scans of folders as you navigate into them.  While being pretty inefficient, it worked for the most part.  The big issue happened when a user would select a folder to be played and that folders contents were not scanned it.  GMMP did a bunch of stuff to account for this, but in the end it was very hacky/ugly and really bloated the codebase.

This time around for 3.0 I came up with a much better approach.  The new UI / data backend has some nice capabilities like auto updating when its backing data in the database changes.  Now when a file is played, GMMP will look to see if its in the db, if not it creates a placeholder on the spot.  The placeholder just contains the filename and a track id which is all that is needed for putting a song in the queue.  If any placeholders were created, gmmp will then run a scan to populate all the placeholders with the information from the tags.  Any UI that was displaying the placeholder will auto refresh and show the tag metadata.  So now there should never be a case where files are lost from the queue on restart.

New UI (I switched up the theme colors just to add some variety to the screenshots)

At the top is the QuickNav which is scrollable horizontally and each folder is clickable to instantly jump back up a few folders (the video below will show this).  Like every other list item, the metadata shown is customizable.  In this screenshot below the first item is a playlist which is just displaying its filename and the items below that are showing the song name and duration.

I plan on adding the ability to highlight the currently playing track (i also think i can add that ability to the library views. I know this is requested often).

Sunday, November 19, 2017

3.0 Work in Progress 11: Bookmarks, Chrome OS, and Permissions

I recently picked up one of the new Google Pixelbooks and I will say it a pretty awesome development device.  It runs Chrome OS, Android, and Linux all at the same time and has pretty good specs (i5 cpu, 8 gb ram, 128 gb ssd) for running Android Studio.  I am able to code and deploy GMMP right on the same device which makes development really convenient when not at home.   Android apps also run in their own window which can be resized which makes UI testing on different size screens super easy.

Ignore the artifacts around the window containing GMMP.  It is a side effect of taking a screenshot i guess (it appears fine on the device)
In order to support the free form resizing of the app window, I updated the target SDK level to 27 (android 8.1).  GMMP 2.x was still on 21 (android 5.0).  The target SDK update should see some performance improvement in newer devices (although i do not know by how much).  I also added support for the android permission system they added back in 5.1.  GMMP should only ask for storage permission and possibly phone state permission (if you want to use the auto resume after a phone call finishes feature).

Anyway, the main focus of WIP 11 is bookmarks.  In the process of refactoring / rewriting the MusicService, I rewrote the Bookmarker and added a UI to show existing bookmarks.  All of the previous work I spent on creating common, reusable UI components is really paying off.  Adding a functional bookmark list UI only took roughly 15 to 30 minutes.  Similarly the Artist and Genre details UIs I showed in WIP 10 took about the same amount of time.  Since its so quick to add these UIs, I can see myself adding a bunch of optional views for some other fields like year or composer (and making 2 separate UIs for artist / album artist if the user wants to have both easily accessible)

The bookmark list will show all the currently bookmarked tracks and let you play them directly from the list (or delete them).  Like every other view i've shown in 3.0 so far, the metadata will be customizable.  For this post I just had the list items show song name and bookmarked time.  For the video below I set it up to just auto bookmark everything, but the previous bookmark settings will still be there in 3.0 (auto bookmark based of song length, m4b extension, or by folder). The video will show the song auto bookmarking when changing tracks, and then resuming at the same position when returning to the song.  It also shows the manual bookmarking and unbookmarking of the currently playing song.

My focus next will be creating a folder UI.  The folder UI is a bit more complex than the other UIs (besides maybe now playing) so I imagine its going to take awhile

Sunday, November 5, 2017

3.0 Work in Progress 10: Multiple Artists and Genres Per Track

In the last few weeks I've been mostly doing backend work so there arent too many UI changes to show off.  The music service refactor / rewrite has caused me to rewrite a few of the other backend systems (and there will probably be a bunch more that need it to).  Since I was already making so many changes to the data access layer, I decided now would be the best time to basically clean up the whole data model and make the necessary changes to support some of the highest requested features like supporting multiple artists and multiple genres.  These changes led me to rewrite the scanner entirely (I had to do it anyway due to the data access layer changes).  Now the scanner will recognize artists and genres that are delimited by a specific character (";" by default) and set them up in the database accordingly.  Since fields with the ";" in it are a bit ugly.. i do plan on adding some functionality to replace that with "and" or "&" or really whatever phrase you want when displaying the song in now playing / notifications / etc.  That hasnt been implemented yet so these screenshots will show the delimiter. 

In order to show this in app, I quickly coded up a artist and genre details UI.  The plan is to show some sort of artist / genre image at the top similar to the album details view.  Right now its just a solid color background.

Properties of the test file with multiple artists and genres
Song in app

As you might have guessed, there wont be an alpha version ready to test anytime this year.  My first child is expected to be born in a few weeks so it is unclear how much dev time I will be getting in the near future, but I will try my best to continue the WIP posts and get something testable in the early 2018 time frame (hopefully)

Saturday, October 14, 2017

3.0 Work in Progress 9: Shuffle and Notifications

The last update I showed off the new queue ui which did involve a complete rewrite of the underlying queue backend code.  Due to that and switching to the new data model (Room-based), I ended up taking the plunge and rewriting the MusicService.  It seemed like a waste to try to hack it up to use all the new stuff I added when I eventually planned on rewriting it anyway.  Due to that I dont have too much to show UI wise, but I did make some queue improvements and redid how shuffle works.

One of the largest complaints I've gotten over the years was the inability to skip back/forward while shuffled and get a consistent track order.  Once you skipped back, the next track would be chosen at random.  My response was always that I understood the frustration but without rewriting shuffle / music service entirely there was not much i could do.  Since I am rewriting the music service and queue, this seemed like the perfect opportunity to fix this issue.

In the video below, it shows off the new shuffle queue.  It essentially works like the "randomize" option in the queue.  Turning it on will put your current playing song at position 1 and shuffle the order of the rest.  Pressing next track will simply just go to the next track in the queue.  This allows you to go back and forth and maintain the same order.  This also greatly simplifies the code on the backend.  Next track doesnt care if its in shuffle or not.. it just goes to the next track listed in the queue.  When shuffle is turned off it will return to the previous order.  Any new tracks added while in shuffle will just be placed at the end when shuffle is turned off.  Note: For this video and testing i added a shuffle button to the min player at the bottom.  This was just so i could keep the queue up and change the mode back and forth.

Notifications were managed by the MusicService, so I gave them a rewrite as well.  Google has added a lot API since I originally created these notifications, so this time around I will just leverage what they provide instead of doing a custom view for it.  These newer notification apis will also allow album art to play on your lockscreen on devices that it didnt work before (most phones would already show the album art on the lockscreen but a select few would not). 

Plans for the notifications will be 5 customizable button slots (most likely just the common actions like next / prev / play/pause / exit / toggle shuffle) and 2 (maybe 3?) metadata lines that are customizable like the other metadata views I've shown in previous updates.  The images below just show off the standard next play/pause and prev buttons.

Lineage OS 7.1.2
Lineage OS 7.1.2
Galaxy S5 running 6.0.1