A user reported that the album/artist text was being covered by the artwork display. It turns out my method for sizing artwork didn’t take into account the screen real estate taken by things like the notification bar, action bar, and soft/virtual buttons on Nexus-style devices. I’ve fixed this.
Archive for the ‘Just Playlists’ Category
Just Playlists 5.2.6—Metadata Passed to Bluetooth Devices Under Android 4.3; Dynamic Artwork Size; Version FreezeSunday, October 13th, 2013
Android 4.3 is now properly passing stream and track metadata via Bluetooth to connected devices. Just Playlist now supports this, as well.
If the device has a display and can handle this metadata, it will be shown. For instance, car stereos with a display and support for the metadata will show track, artist, and album information.
I also am now detecting the actual width and height of the device display and using this to set the artwork size for display. This should mean that any phone or tablet will give the best possible view of album artwork.
The last change I’m making is that, starting with this version of Just Playlists, new features will only be rolled out for devices running Android versions 4.0 and above. Older devices will still be able to run version 5.2.5 of Just Playlists. I don’t like to do this, but there are so many new features only available for the newest versions of Android that it is making it difficult to maintain backward compatibility when I only have a limited amount of time to devote to program development.
I found that after upgrading my phone to Android 4.2.2 that headset button presses were sometimes not being recognized by JP. I’ve added code to better follow the most recent Android SDK rules for handling audio focus—that is, making sure to interact properly with other audio apps. I believe this has helped. If the headset buttons aren’t being recognized by JP, just go into the app and stop and restart play. This will allow JP to acquire audio focus and also start recognizing headset button presses.
And thanks to a person using JP by the name of Joe, I found out M4A audio files are supported by Android, so they can now be added to playlists.
Finally, I’ve had a couple reports from Samsung Galaxy S III users that JP will randomly hang up during track changes. Working with my trusty friend and beta tester Dan, we concluded that it has something to do with the gapless playback code I added a while back. So, if you have this problem, you can now disable gapless playback in the Preferences and it should go away. It’s a workaround and not a fix, but I can’t duplicate and isolate it on my Galaxy Nexus, so this’ll have to do for now.
I fixed two bugs in this release. The first was to fix HTML redirection for hosted playlists—thanks to Peter for catching this! That is, if there is a URL that points to a playlist but ends up being redirected by the web server to another URL, JP wasn’t handling it and would give an error.
The second bug was that album artwork wasn’t being shown for tracks that are stored on an external storage device—most commonly, that would be a microSD card. My Galaxy Nexus doesn’t have external storage, so I didn’t notice it until my friend Dan visited with his Galaxy S3 and we figured out what was going on. This has been fixed, as well.
I decided it was time to upgrade my Galaxy Nexus from Android 4.1.2 to 4.2.2. I’d been holding off due to reports of problems with Bluetooth. All seems well, but, once again, Just Playlists was affected by under-the-hood changes in the Android OS. The first problem was that album artwork wasn’t being found in the media database of such information built by the OS. I appears that Android now stores the artwork keyed by the canonical path name of the media file. I corrected for this, which is backward compatible to Android 2.3, Gingerbread.
Also, Android 4.2.x has introduced multiple user accounts for tablets. This means that each user is given a separate partition on the device’s internal storage. For single-user phones, this means that the partition scheme of internal storage also changes. Though symbolic links are maintained to the new partitions for backward compatibility, the actual partition names are used internally and end up messing with how I store playlist names, leading to names not being found in JP’s history database or duplicate entries being created for the same playlist, coming from the different valid paths to the file from different partition names.
I was able to work around this using some hard-coded look-up tables for known valid internal and external storage paths. It’s a bit of a hack, but I haven’t found a better way to handle it at this point. The upside is that anyone upgrading from an older version of Android should find that all their existing playlists are found in JP’s history database.
In turns out that playlists created on the Galaxy S III still had improper paths on tracks—which I thought I’d fixed in 5.2.1. I really do believe it is fixed now, as confirmed by a friend who owns a Galaxy S III.
When I first wrote JP, Android’s built-in media player service didn’t properly handle streaming music playback. I had to use a proxy server to make things work right. I also used this to allow me to gather metadata embedded in the stream for displaying track information. In more recent versions of Android, the media player does handle streaming, though retrieval of metadata isn’t done very well.
In this version of JP, I’ve switched to using Android’s native streaming. This seems to have made streaming more reliable, as well as allowing fairly reliable playback of Ogg and AAC streams, as well as MP3-based ones. To get the metadata for streams, I am periodically opening a second connection to the streaming server and parsing out the information. Ogg streams don’t use ICY metadata, which required more sophisticated parsing of the stream header based on the Ogg specification.
It also turns out that Samsung has jiggered their internal memory paths again, such that playlist track paths weren’t being created correctly in new playlists for the Galaxy S III. I’ve fixed this.
The last significant change was to how “hosted” playlists are handled—that is, those playlists opened via a web browser on a remote server. Some inconsistent behavior was improved.
I found myself wanting to have a way to switch to my favorite playlists in a hurry. Since they are usually ones I played recently, the best way to do this seemed to be a most recently played option in the menu—like what we’re used to seeing in computer programs like Microsoft Word. I realized that the “Show database” option under the “More” menu was pretty much already fulfilling this need by showing database information on playlists in reverse chronological order. So all I needed to do was add the ability to click on an entry to start playback. I also renamed this option “History” and moved it to the main menu, swapping it with “Reload from scratch.” I thought this made sense, since you can choose to reload the current playlist from scratch via the history.
There were also two bugs I fixed. The first one was introduced in 5.0.0, along with gapless playback. Sometimes, when the next track in a playlist was loaded, the progress time would be displayed as the “–:–“ placeholder. This has been fixed. The second one was found by a friend of mine who purchased a Samsung Galaxy S III and found that JP was prefixing song filenames with the full path to the title, even if it was already there. That is, the Galaxy S III (and possibly older Galaxy phones?) sets the default path to internal storage as “/mnt/extSdCard/Media/Music.” This was getting appended to filenames, even if it was already there when a playlist had been created on the phone. This has been fixed.
I’ve added some pretty significant updates to Just Playlists and am thus increasing the major version number from 4 to 5. The biggest one, at least for my personal music collection, is gapless playback. This means that, for music files that are ripped from consecutive tracks of an album where there was no silence between the tracks, there will be no silence between the music files as played back by JP. This is something that fans of Pink Floyd (including me) should enjoy, since many of their albums are a nearly continuous flow of music.
Gapless playback is only available for devices running Android Jelly Bean/4.1. The necessary tools for enabling it were introduced in this version’s SDK. Before this, any app implementing gapless playback had to have custom music playback code written for it.
Another new feature is automatic stream playback restart after playback is interrupted abnormally by a network traffic glitch. Before, the stream had to be restarted manually. I used to get around this by having a stream as the only track in a playlist and having playlist repeat play enabled. But this is much better, since I don’t generally like my music playlists to loop and it was a hassle to go into Preferences to turn off repeat play.
Google introduced a new visual style to the user interface referred to as “Holo” in Android 3.x and greater. This includes a new “Action Bar” at the top of apps with three vertical dots at the far right as the “menu button” and a menu that is laid out vertically down from the top of the screen rather than horizontally along the bottom of the screen. I’ve adopted this visual style and the Action Bar. But because I didn’t want to have the Action Bar steal screen real estate except when absolutely necessary, tapping on the playlist name at the top of the screen will hide the Action Bar. Tapping it again will bring it back, making the menu icon available again, as well.
With the menu being laid out vertically, it seemed to make more sense to have the “Exit” button at the bottom of the menu list. I moved it there. This also means that, in previous versions of Android, the “Exit” button in the horizontal list at the bottom of the screen will be at the lower right corner of the menu.
I upgraded my Galaxy Nexus from Android Ice Cream Sandwich/4.0.4 to Jelly Bean/4.1.1 and found my playlists not loading and album artwork not being found. It turns out that the preferred external media mount point for Jelly Bean is no longer /mnt/sdcard but was changed to /storage/sdcard0. I’m guessing this is for purposes of being more generic and flexible as devices add more external storage options. The /mnt/sdcard and /sdcard mount points are still there, but JP stores playlist file names and could not find playlists by file name in its database with paths prefixed with this new mount point string.
I’ve updated the program to consider all these strings equivalent. I believe the problem with the inability of JP to find album artwork was related to this. By using the getAbsoluteFile() method instead of getCanonicalFile() when constructing a name to search Android’s media database for album artwork and tag information, this problem seems to have been eliminated.
I’ve also made the minimum version requirement to run this version of JP to be Gingerbread/2.3.3. I hate to do this, but it’s becoming really hard to maintain backward compatibility beyond this. I’m hoping that folks running older versions of JP under the older OS versions will simply not be offered this update. I believe that’s how it works.
Barring Google offering another update soon that causes problems, I hope to do some actual program improvements for my next release. I hear that the Jelly Bean SDK supports gapless playback. That’s something I hope I can get working, since I miss it from my iPod days.