[App][Dec 8 2010][V5] Avian Play - A new kind of music player for WM

Search This thread

thx1200

Inactive Recognized Developer
Overview
Avian Play is a new kind of music player for Windows Mobile. Avian Play provides an intuitive, unique, and user customizable user interface, inspired by modern mobile user interface designs and tweaked for a powerful music player, and an audio engine based on the most accurate and blazingly fast portable audio engine available on any platform - the MAD MP3 decoder. Avian Play gives you three completely separate playback control surfaces, depending on the type of file you are playing. You get a separate control surface for music, podcasts, and internet radio. The controls you need for each of those separate audio tasks is not the same, so why should the same buttons be visible, wasting screen real estate? Another unique feature not found on any portable media player I know of is how Avian Play treats online radio stations. A playlist for a single stream is treated as a single unit, remembering the backup servers to try if the server you are listening to goes down. This information is cached and refreshed periodically automatically, so you have to update your stream lists less frequently. To top it all off, an included plugin for Avian Play supports the free SHOUTcast (TM) online radio service, and has an open Library plugin API so that other online services (and anything else you might need in the library) can be added easily. The Avian Play library is one of the other shining features of Avian Play. It is a robust SQL CE database core, with user customizable queries. When you are in any list of query results, you can immediately filter the list by simply typing something in your SIP or physical keyboard. No lag instant search!

If you like a graphically robust user interface, such as that which is used on iPhone, Zune, any many other players, Avian Play may not be for you. The design goals of Avian Play is maximum power and capability, with a robust library, customizable queries, and many other deep features yet to come. Interfaces such as sliding/flipping album covers is probably not going to ever be included. :)

Avian Play has a lot of features, and I know I'm forgetting a lot. If somebody wants to help me document this app, I would be grateful. I'm terrible at documentation. Maybe a series of tutorial YouTubes? :-D

Tip Jar
Like this app? Want more like it or quicker updates? Tip a few bucks (or Euros or Pounds or whatever) or two to help the author out! Click here to make a safe donation via PayPal.

Development
Development is hosted at CodePlex. You can download the source code and more. :) http://avianplay.codeplex.com/

Licensing
Avian Play is licensed under GPL v2. However, Avian Play uses many different libraries which may have different licenses. See the included ReadMe.txt file for more information.

Features
- Intuitive, finger-friendly user interface, with seperate control surfaces for each audio file type (music, podcasts, internet radio) with multiple layout scenes per surface
- Advanced SQL library of music files on your device with customizable queries
- Tag reading/parsing and tag derived information from paths (\Folder\Artist\Album\Track.mp3)
- MAD audio codecs
- Large fonts and titling and large buttons for "car friendliness"
- Playlist editor
- Streams can contain multiple alternate URLs in a single entry
- Immediate list filtering/searching
- Customizable skins and languages
- It's FAST
- Much more!

File Support
Audio: MP3, OGG, Flac, WMA, WAV
Playlist: M3U, PLS, AVPL (this is custom for Avian Play, see posts below)

Future
This project was started a year ago before the announcement of Windows Phone 7 and I'm glad I have seen it through to completion. Although Windows Mobile is a platform on the brink of death, I consider this my magnum opus for Windows Mobile and a fitting tribute to the capabilities of the underrated OS. I will continue to develop on this app as long as I have a Windows Mobile phone... Probably another year or so. I'm waiting for either WP7 to open up, or maybe making the jump to Android. Maybe I'll port it to both if it's popular. Avian Play was designed in a highly modular fashion. I did this intentionally back when everybody thought WP7 would still be based on the same core as WP6, so I could replace the UI components or audio engine easily. If anybody is interested in working an Android port right now, please PM me and let's talk.

Update: I've started porting Avian Play to Android. It's going to be a long process, as Avian Play is VB.Net on Compact Framework and Android uses a custom implementation of Java (it's not a one-to-one conversion; although translating VB.Net to C# first is speeding things up). After surveying the mobile landscape for the past few months, I'm just not all that excited about WP7, whereas Android is very "open" and flexible and the latest handsets make me go "ooooh" so I think that's where I will be heading. I'll reserve my final judgement for February when the "big update" for WP7 comes out that will supposedly relax a lot of the restrictions and open the platform up more.

Album Art
I know somebody is going to ask. How do I get to see Album Art?! Well, in this first release, album art is only viewable as thumbnails in the library. In the future, a new plugin architecture for the playback label/panel will provide customizable playback information, such as album art.

Gapless Playback?
Unfortunately, not yet... I think it should be possible, but I don't know C++ well enough to hack the MAD code. :-( Any volunteers???

Requirements
- Windows Phone (Windows Mobile) 6.0 or newer
- .Net Compact Framework 3.5
- SQL CE 3.5 (this is included in the cab installer)
- ALL resolutions supported! For non-192 DPI devices (aka, non-VGA), skin bitmaps are automatically scaled to resolution

Installation
The compact framework and SQL CE are required for Avian Play. If you do not have SQL CE installed, the installer will install it for you. However, if you have an older version of SQL CE (such as 2.0), the installer may not install SQL CE 3.5. So if Avian Play doesn't work after installation, this is probably the issue. If this happens, download and install the SQL CE 3.5 redistributable attached to this message. In the future, I hope to have a more intelligent installer that will detect older versions.

After installing Avian Play and running it for the first time, please allow 10-15 minutes for all supported audio files to be discovered and entered into the Library. From then on, Avian Play will automatically detect changes in the library contents until you close Avian Play. Each subsequent time you run Avian Play, it will scan for new files again, but it will be much quicker because it is only looking for changes.

Releases
V5: Here
V4: Here
V3: Here
V2: Here
V1: Initial release
New releases will come in small iterative steps, rather than major versions with bugfix sub-releases. Don't feel like you have to update at every version if this release schedule is too fast for you. :)

(scroll down to third post for more screenshots)
 

Attachments

  • AP2.jpg
    AP2.jpg
    33.1 KB · Views: 2,119
  • AP3.png
    AP3.png
    76.8 KB · Views: 1,947
  • AP4.png
    AP4.png
    75 KB · Views: 1,667
  • AP1.png
    AP1.png
    69.9 KB · Views: 3,227
  • AP5.png
    AP5.png
    42.5 KB · Views: 1,345
  • sqlce.ppc.wce5.armv4i.CAB
    745.8 KB · Views: 1,848
  • NETCFv35.wm.armv4i.cab
    2.6 MB · Views: 652
  • AvianPlay.CAB
    2 MB · Views: 1,484
Last edited:

thx1200

Inactive Recognized Developer
Localization
Spanish: http://xdaforums.com/showpost.php?p=8917098&postcount=53

Avian Play is ready to be localized to your native language! I need translators though. In the "Languages" folder under the application folder is where each language will be stored. Avian Play is structured such that all files in the language folder will be loaded for that language. This allows plugins to put their own language files in those folders, without interfering with Avian Play. All language strings are loaded into a single dictionary. To avoid collisions, plugin developers should prefix all their language strings (see shoutcast.ini for example). If a language string is not found in your language (maybe a new plugin or new features have new strings that are not yet translated) it will always default back to the English translation. So the "English" folder is the default language.

Skinning
Avian Play was designed so that the user can customize the layout of the application. Eventually, Avian Play will be fully widgetized (although maybe not on the WM platform). For the time being, the title information is on top, the control surface or list is in the middle, and the menus and tabs are at the bottom. Skin designers can, however, give Avian Play a brand new look by developing new images and editing a skin.ini file. To make a new skin, start in the Skins folder, and copy the contents of Default. Then edit the images and edit the colors in skin.ini to suit your taste. Please upload the results. Users can then extract the skin into your own custom named folder and select the skin from within Avian Play. Get creative! My skin isn't that hot. ;-)

AVPL
I know nobody really wants yet another playlist format, but I had to develop one because no current playlist format supports multiple URL sources for a single stream, despite that being extremely common. To support all of Avian Play's playlist functionality, you should use AVPL formatted files. You can create AVPL files from within the internal playlist editor, or by hand, as it is just a simple INI file. In the future, the AVPL will also support direct queries on the database to populate the list, but this is not supported yet. The intention is for this to be an open format, and I will post the schema later on so it can be used in other applications.

Database Schema
FileLibrary:
Code:
Column Name         Type      Length Nullable Unique Description
Key                 int              No       Yes    Identity Column - Primary Key
AddedDate           datetime         No       No     Date/Time the file was added to the DB
Album               nvarchar  100    No       No     Album Name
AlbumArt            image            No       No     Album Art (scaled to approx 480x480)
AlbumArtist         nvarchar  100    Yes      No     Album Artist Name (for example, a DJ who made the compilation)
AlbumArtThumbnail   image            Yes      No     Thumbnail of Album Art (scaled to approx 64x64)
Artist              nvarchar  100    No       No     Artist Name (artist who performed this track)
Bitrate             int              No       No     Bitrate of media file ** Currently unused **
Comments            nvarchar  200    No       No     Extra comments in media file
Copyright           nvarchar  100    No       No     Copyright string
FileModifyDate      datetime         No       No     Date/Time the file was last modified
FilePath            nvarchar  260    No       Yes    Full path to media file
FileSize            int              No       No     Length of media file in bytes
Format              nvarchar  25     No       No     Format of media file (MP3, OGG, etc.)
Genre               nvarchar  50     No       No     Genre of media file
HasAlbumArt         bit              No       No     Does this file have album art included?
IsFavorite          bit              No       No     Is this file "favorited" by the user?
IsPodcast           bit              No       No     Is this file considered a podcast?
LastFoundDate       datetime         No       No     Date/Time the file was last found in the file system
LastPlayedDate      datetime         No       No     Date/Time the file was last played
LastPlayPosition    int              No       No     If position is tracked of the file, the last position (byte) where the file was paused
LengthSeconds       int              No       No     Length of file in seconds ** Currently unused **
MD5Hash             varbinary 128    Yes      No     MD5 hash of the file, if MD5 hashes are being tracked
NotFound            bit              No       No     Was the file not found when the last library scan ocurred?
Rating              tinyint          No       No     User rating of the file
SkipForMetaPlaylist bit              No       No     Should the file be skipped for embedded queries in AVPL playlists ** Currently unused **
Title               nvarchar  100    No       No     Title of the media file (song name)
TrackNumber         int              No       No     The track number, with respect to album track order
Year                int              No       No     The year the track was released
PlaylistLibrary:
Code:
Column Name     Type     Length Nullable Unique Description
Key             int             No       Yes    Identity Column - Primary Key
ContainsFiles   bit             No       No     Does the playlist contain media files?
ContainsStreams bit             No       No     Does the playlist contain streams?
FileModifyDate  datetime        No       No     Date/Time the file was last modified
FilePath        nvarchar 260    No       Yes    Full path to playlist file
Format          nvarchar 25     No       No     Format of playlist file (M3U, AVPL, etc.)
IsFavorite      bit             No       No     Is this file "favorited" by the user?
LastFoundDate   datetime        No       No     Date/Time the file was last found in the file system
MD5Hash         binary   128    No       No     MD5 hash of the file, if MD5 hashes are being tracked
NotFound        bit             No       No     Was the file not found when the last library scan ocurred?
Title           nvarchar 50     No       No     Title of the playlist file (derived from filename, but AVPL may support)

Architecture
Some people might be interested in the architecture of Avian Play. So I will describe my approach here. Avian Play consists of two processes: AvianPlay.exe and APEngine.exe. AvianPlay.exe is a managed .Net Framework app written in VB.Net. It controls the bulk of your Avian Play experience. Everything from the control surface, library, podcast management, etc., is handled here. AvianPlay.exe spawns a second process, APEngine.exe which is the audio engine. APEngine is a wrapper for the MAD MP3 audio engine. This is the same engine used in MortPlayer, GSPlayer, and many others. It is a super high quality playback engine ported to many platforms. I chose it due to how easy it is to work with and the quality of playback.

Why two processes? I tried to P/Invoke MAD from a DLL, but due to memory management issues that led to freeze-ups, I realized I needed a larger barrier between the managed and unmanaged code. It took me a while, but I finally realized that I could avoid memory management issues by using two processes and using the registry for string-based IPC. The registry is very high performance on Windows Mobile, due to it being used for state notification via SHNAPI. So, by settings up registry callbacks on both processes, the application and audio engine are able to communicate successfully, with no memory management or other issues. The biggest disadvantage to this approach is that WM has a limit of 32 processes, and Avian Play will use two. I'm sorry, but there was no way around this! Attached to this thread is a Visio I made to map out how the application is structured.
 

Attachments

  • AvianPlayArch.jpg
    AvianPlayArch.jpg
    60.4 KB · Views: 282
Last edited:
  • Like
Reactions: powinmo

thx1200

Inactive Recognized Developer
File Feature Matrix
Code:
Audio File = The type of media file, such as MP3 and OGG.
Embedded Tags = Also known as "ID3" tags from the MP3 tag definition.  This contains information like Artist, Album, Title, Track Number, etc.
Playback Attributes = This is information usually only known when open for playback, such as track length (in time).

Audio File   Embedded Tags   Playback Attributes
MP3          Yes             No
Ogg          Yes             Coming Soon
Flac         Yes             Coming Soon
WMA          Yes             Coming Soon
WAV          No              No


Playlist File = The type of playlist file, such as M3U or AVPL
Files = Locations of files
URLs = URLs to internet media
Multiple URLs = URLs to internet media linked together as a single online radio station
Wildcards = Locations that point to folders or multiple files in one line
Recursive = Playlists that point to other playlists
Queries = Queries against the Avian Play database

Playlist File   Files   URLs   Multiple URLs   Wildcards   Recursive   Queries
AVPL            Yes     Yes    Yes             No          No          Coming Soon
M3U             Yes     Yes    No              No          No          No
PLS             Yes     Yes    No              No          No          No

Configuration
Avian Play's configuration is completely stored in INI files under the "INI" folder under the installation folder. In the future, you will be able to configure nearly everything from within the application, but these early versions are missing some configuration capabilities without manual editing.

Settings.INI
This is the main configuration file. Most of these settings are configurable from within Avian Play, but there are a few that are not. First, you can't edit the Avian Play database path. This is intentional because it's a bit advanced to move that around. But if you want to move the database file, you can do so and then edit the DatabasePath option under General. Second, the TagsFromPathRegEx option describes the regular expression used to derive tag information from the path. This is RegEx Pattern for Tags from Path in the application. Although you can edit it from within AvianPlay, it probably isn't optimal, since you might want to tweak the pattern from your PC where you can use an editor with RegEx capabilities.

Controls.INI
This file describes the control surface layout for the three control surfaces (Music, Podcasts, and Radio). It's a bit cryptic because it's designed to be configured and ready by the app, but the control surface editor is not yet ready. :) So if you want to change the control surfaces, you have to edit this file for now. The file starts under the [Main] section. Here there are the three control surfaces (0=music, 1=podcast, 2=radio). The C#L (Control Surface Length) tells Avian Play how much scenes are in each control surface. Minimum is 1. Then there are various sections, in the format of CXSY, where X=surface and Y=scene. So, C0S1 is the music surface and second scene (count starts at 0). Under that, you will see "SL" (Scene Length) which tells Avian Play how many rows the scene has (starting at bottom, going up). There is also R#L (Row Length) which tells Avian Play how many controls per row (1-4). Then you have RXBY, where X=row number (from bottom) and Y=Button (from left). Note that a button is any type fo control in Avian Play parlance, including track slider. The list of controls can be found at the bottom of this post. This is just the initial list and will grow as new features are added.

Events.INI
Avian Play uses events to allow you to execute commands based on occurances. The events currently supported are: OnApplicationStart, OnApplicationEnd, OnPhoneInUseStart, OnPhoneInUseEnd, and then keyboard/SIP events, which are Key_XX, where "XX" is the hex code of the key being pressed. ActiveOnList is a boolean that determines whether the action happens when a list (library, now playing, etc.) is active. Basically, some commands you don't want to work when the list is active. An example is that Avian Play allows lists to be filtered simply by typing. But if you remap "K" to play/stop, you can never use "K" to filter a list. So you would set ActiveOnList to false, in that case. AllowRepeat indicates whether a keypress can be repeated by holding it down. Action# are the steps of the script. The script itself is a super simple crappy thing I made up on the spot. If somebody knows of a script language I can easily include to replace this, that would be awesome. It has to be able to be plugged in easily and should be managed code.

Library.INI
This file defines the Avian Play Library's query results. Execution starts at the MAIN section, then jumps to the next sections based on user input. Most of the options describe the query used to retrieve data from the database. But there are other ways to populate a library list. For example, by using an external plugin. If you want to develop an external plugin, see the MemorizedSong plugin source code. I can't reveal the code for the ShoutCast plugin due to licensing restrictions with ShoutCast. You can also create a section that populates the list directly from a AVPL playlist file.

Podcasts.INI
Avian Play can manage podcast subscriptions and this is where you define your subscriptions. Again, this was designed to be edited by the application, so it's not exactly friendly, but it works well in my tests. Under Main section you set the next index to use to distinguish the subscriptions in the database. Under each SubscriptionX section, you use "Index" to differentiate each entry. Note that the title of the section does NOT differentiate the subscriptions. This is intentional. The rest of the sections are described in the file itself.

RegEx.INI
Online streams present information to the user, such as artist and title, in a single string. Avian Play allows you to use regular expressions to derive this pseudo-tag information to format it on the display easier. Many online radio stations seem to like to include superflous garbage surrounding the title information you care about. With RegEx, it's easy to exclude this crap! A few stations I listen to are included in the default file. Each entry has a "Station" tag which is the actual title of the station (partial or full -- use "ExactMatch" to set this). If multiple matches occur, use Priority to determine which one has precedence (higher number overrides lower number). Then the "RegEx" line is the actual regular expression used to derive title information. Named captures <A> represents Artist and <T> represents Title. The "Default" section is just what it sounds like: the default regular expression used to parse the stations. It follows the format "Artist - Title" which seems to be most common.

Schema.INI
This is used by the settings editor to know the layout of the Settings.INI file. DO NOT EDIT THIS.

State.INI
This file is overwritten every time you exit Avian Play. It stores the last track and some other UI information. DO NOT EDIT THIS.

Control Codes
These are the control codes used in the Controls.INI and Events.INI. Each code corresponds to a logical control (play, pause, stop, next, etc.). Some codes have an argument, which is another integer. Some codes also represent "multi" buttons, where the button may change based on the playback state; An example would be the StartPauseStop button which changes what it does based on whether playback has started or not.
Code:
NONE = 0               ' Do nothing
Stop = 1
Play = 2
Pause = 3
PreviousRewind = 5
NextForward = 6
SkipBack = 7           ' Argument, number of seconds
SkipAhead = 8          ' Argument, number of seconds
MemorizeSong = 9
OpenAudioFile = 10
OpenPlaylistFile = 11
JumpToEntry = 12       ' Argument: which playlist entry in the current list?  1..n
OpenURL = 13
VolToggle = 16         ' Argument, number of volume 'segments' (plus 1); Positive value increments; Negative value decrements. Example: 4 cycles through 0%, 25%, 50%, 75%, 100%, in that order
Close = 29             ' Close the currently open file or stream

ListUp = 201           ' Move up in the current list
ListDown = 202         ' Move Down in the current list
ListSelect = 203       ' Select the item on the list
ScenePrevious = 207    ' Go to previous scene in the collection
SceneNext = 208        ' Go to next scene in the collection

StopPlayPause = 401    ' Depending on playback state, stop, play, or pause
SelectStopPlayPause = 402  ' If in a list, select the list item, otherwise same as StopPlayPause

TrackPositionSlider = 601  ' The slider you can drag to jump around a loaded item
 

Attachments

  • AP8.png
    AP8.png
    31.6 KB · Views: 243
  • AP11.jpg
    AP11.jpg
    38.2 KB · Views: 192
  • AP10.png
    AP10.png
    48.4 KB · Views: 218
  • AP9.png
    AP9.png
    77.9 KB · Views: 248
  • AP12.jpg
    AP12.jpg
    34.5 KB · Views: 181
  • AP13.png
    AP13.png
    46.9 KB · Views: 222
  • AP14.png
    AP14.png
    44.6 KB · Views: 203
  • AP7.jpg
    AP7.jpg
    46.2 KB · Views: 172
Last edited:
  • Like
Reactions: powinmo

thx1200

Inactive Recognized Developer
Tips
- Quickly double tap the song title area to toggle between the large multiline and small single line display modes.
- Press and hold some buttons for additional functionality: hold the volume toggle button to show the full screen volume bar, hold the PlayPauseStop button to stop.
- Don't want or need all three control surfaces (music, podcast, and internet radio)? Since V3, you can disable ones you don't want under Settings->Display

Frequently Asked Questions
None yet. :)
 
Last edited:
  • Like
Reactions: powinmo

m.reza

Member
Jul 4, 2009
23
0
Many Thanks thx1200. Tried it on hd2, miri Elegancia v5.0 Final WWE
on both internal memory and storage card, it says SQL CE 3.5 may not be installed. please install ....
but in the requirements you've mentioned the sql is included in the cab installer!
 

Farmer Ted

Senior Member
Nov 30, 2008
2,373
90
This is a really nice app. I had the sqlce error as well. The problem is that the cab isn't installing the secondary sqlce cab, but it is being deleted from the Avian folder. I unpacked the cab and installed the sqlce cab on my own, and now the app loads. I don't know how the hell to use it yet, lol, but it's really good looking and has cool features. I've uploaded the sqlce cab so anyone with the same problem can load it on their own.
 

Attachments

  • sqlce.ppc.wce5.armv4i.CAB
    745.8 KB · Views: 208

thx1200

Inactive Recognized Developer
This is a really nice app. I had the sqlce error as well. The problem is that the cab isn't installing the secondary sqlce cab, but it is being deleted from the Avian folder. I unpacked the cab and installed the sqlce cab on my own, and now the app loads. I don't know how the hell to use it yet, lol, but it's really good looking and has cool features. I've uploaded the sqlce cab so anyone with the same problem can load it on their own.

I think the problem is that your ROMs have an older SQL CE installed, but the installer isn't smart enough to detect this. I'll try to fix for a future version, but until then, I'm going to move your SQL CE cab to the top post. :)
 

nosedive

Senior Member
This is a really nice app. I had the sqlce error as well. The problem is that the cab isn't installing the secondary sqlce cab, but it is being deleted from the Avian folder. I unpacked the cab and installed the sqlce cab on my own, and now the app loads. I don't know how the hell to use it yet, lol, but it's really good looking and has cool features. I've uploaded the sqlce cab so anyone with the same problem can load it on their own.

i can also confirm, after installing the cab the app loads.

cu,
nosedive
 

eversp01

Member
Aug 8, 2010
36
1
Gent
When I push the END/POWER button in order to save power then the player stops. Any way to avoid this?

Any way to (re)arrange the buttons (music, podcasts, internet radio, library, playlist editor, settings), or even disable some of them? E.g. I would like to have "music" and "library" next to one another.
 

lPatriciaNl

Member
Mar 27, 2009
18
1
can't launch.

When I tried to install, I can't because intallation was interrupt by some cause.So I install it with SKtoos and when launch program I have message that contain next "An error has occurred which caused Avian Play to crush..... Exception: system.componentmodel.win32exception"
Have i710 WM5
 

thx1200

Inactive Recognized Developer
When I push the END/POWER button in order to save power then the player stops. Any way to avoid this?

It must be sending a keystroke that AP doesn't like. In events.ini, try commenting out the entire "[Key_D]" section and see if that helps. that's the enter key assigned to PlayPauseStop.

Any way to (re)arrange the buttons (music, podcasts, internet radio, library, playlist editor, settings), or even disable some of them? E.g. I would like to have "music" and "library" next to one another.

The bottom "sense" style buttons will be editable and rearrangable as a future feature, it is not currently possible. You can edit the control buttons in Controls.INI -- see the third post.
 
Last edited:

thx1200

Inactive Recognized Developer
When I tried to install, I can't because intallation was interrupt by some cause.So I install it with SKtoos and when launch program I have message that contain next "An error has occurred which caused Avian Play to crush..... Exception: system.componentmodel.win32exception"
Have i710 WM5

It may not work as I noticed you said you have WM5. This app was designed specifically for WM6 and some features may not work with WM5.

However, it might still be possible for it to work in a limited fashion. But if the install did not complete, then it definitely won't work. Make sure that .Net CF 3.5 and SQL CE 3.5 are both installed and try launching again. If it doesn't work after that, it might not work for your WM5 device.
 

myracleboi

New member
May 3, 2010
2
0
last.fm support

are you planning support for last.fm scrobbling so every song played in avianplay will be scrobbled?
 

delarente

Member
Apr 20, 2010
10
1
entering urls

I keep getting url is invalid.... when I try to enter a web site... what do I need to do... to set up the streaming audio
 

Top Liked Posts

  • There are no posts matching your filters.
  • 2
    Overview
    Avian Play is a new kind of music player for Windows Mobile. Avian Play provides an intuitive, unique, and user customizable user interface, inspired by modern mobile user interface designs and tweaked for a powerful music player, and an audio engine based on the most accurate and blazingly fast portable audio engine available on any platform - the MAD MP3 decoder. Avian Play gives you three completely separate playback control surfaces, depending on the type of file you are playing. You get a separate control surface for music, podcasts, and internet radio. The controls you need for each of those separate audio tasks is not the same, so why should the same buttons be visible, wasting screen real estate? Another unique feature not found on any portable media player I know of is how Avian Play treats online radio stations. A playlist for a single stream is treated as a single unit, remembering the backup servers to try if the server you are listening to goes down. This information is cached and refreshed periodically automatically, so you have to update your stream lists less frequently. To top it all off, an included plugin for Avian Play supports the free SHOUTcast (TM) online radio service, and has an open Library plugin API so that other online services (and anything else you might need in the library) can be added easily. The Avian Play library is one of the other shining features of Avian Play. It is a robust SQL CE database core, with user customizable queries. When you are in any list of query results, you can immediately filter the list by simply typing something in your SIP or physical keyboard. No lag instant search!

    If you like a graphically robust user interface, such as that which is used on iPhone, Zune, any many other players, Avian Play may not be for you. The design goals of Avian Play is maximum power and capability, with a robust library, customizable queries, and many other deep features yet to come. Interfaces such as sliding/flipping album covers is probably not going to ever be included. :)

    Avian Play has a lot of features, and I know I'm forgetting a lot. If somebody wants to help me document this app, I would be grateful. I'm terrible at documentation. Maybe a series of tutorial YouTubes? :-D

    Tip Jar
    Like this app? Want more like it or quicker updates? Tip a few bucks (or Euros or Pounds or whatever) or two to help the author out! Click here to make a safe donation via PayPal.

    Development
    Development is hosted at CodePlex. You can download the source code and more. :) http://avianplay.codeplex.com/

    Licensing
    Avian Play is licensed under GPL v2. However, Avian Play uses many different libraries which may have different licenses. See the included ReadMe.txt file for more information.

    Features
    - Intuitive, finger-friendly user interface, with seperate control surfaces for each audio file type (music, podcasts, internet radio) with multiple layout scenes per surface
    - Advanced SQL library of music files on your device with customizable queries
    - Tag reading/parsing and tag derived information from paths (\Folder\Artist\Album\Track.mp3)
    - MAD audio codecs
    - Large fonts and titling and large buttons for "car friendliness"
    - Playlist editor
    - Streams can contain multiple alternate URLs in a single entry
    - Immediate list filtering/searching
    - Customizable skins and languages
    - It's FAST
    - Much more!

    File Support
    Audio: MP3, OGG, Flac, WMA, WAV
    Playlist: M3U, PLS, AVPL (this is custom for Avian Play, see posts below)

    Future
    This project was started a year ago before the announcement of Windows Phone 7 and I'm glad I have seen it through to completion. Although Windows Mobile is a platform on the brink of death, I consider this my magnum opus for Windows Mobile and a fitting tribute to the capabilities of the underrated OS. I will continue to develop on this app as long as I have a Windows Mobile phone... Probably another year or so. I'm waiting for either WP7 to open up, or maybe making the jump to Android. Maybe I'll port it to both if it's popular. Avian Play was designed in a highly modular fashion. I did this intentionally back when everybody thought WP7 would still be based on the same core as WP6, so I could replace the UI components or audio engine easily. If anybody is interested in working an Android port right now, please PM me and let's talk.

    Update: I've started porting Avian Play to Android. It's going to be a long process, as Avian Play is VB.Net on Compact Framework and Android uses a custom implementation of Java (it's not a one-to-one conversion; although translating VB.Net to C# first is speeding things up). After surveying the mobile landscape for the past few months, I'm just not all that excited about WP7, whereas Android is very "open" and flexible and the latest handsets make me go "ooooh" so I think that's where I will be heading. I'll reserve my final judgement for February when the "big update" for WP7 comes out that will supposedly relax a lot of the restrictions and open the platform up more.

    Album Art
    I know somebody is going to ask. How do I get to see Album Art?! Well, in this first release, album art is only viewable as thumbnails in the library. In the future, a new plugin architecture for the playback label/panel will provide customizable playback information, such as album art.

    Gapless Playback?
    Unfortunately, not yet... I think it should be possible, but I don't know C++ well enough to hack the MAD code. :-( Any volunteers???

    Requirements
    - Windows Phone (Windows Mobile) 6.0 or newer
    - .Net Compact Framework 3.5
    - SQL CE 3.5 (this is included in the cab installer)
    - ALL resolutions supported! For non-192 DPI devices (aka, non-VGA), skin bitmaps are automatically scaled to resolution

    Installation
    The compact framework and SQL CE are required for Avian Play. If you do not have SQL CE installed, the installer will install it for you. However, if you have an older version of SQL CE (such as 2.0), the installer may not install SQL CE 3.5. So if Avian Play doesn't work after installation, this is probably the issue. If this happens, download and install the SQL CE 3.5 redistributable attached to this message. In the future, I hope to have a more intelligent installer that will detect older versions.

    After installing Avian Play and running it for the first time, please allow 10-15 minutes for all supported audio files to be discovered and entered into the Library. From then on, Avian Play will automatically detect changes in the library contents until you close Avian Play. Each subsequent time you run Avian Play, it will scan for new files again, but it will be much quicker because it is only looking for changes.

    Releases
    V5: Here
    V4: Here
    V3: Here
    V2: Here
    V1: Initial release
    New releases will come in small iterative steps, rather than major versions with bugfix sub-releases. Don't feel like you have to update at every version if this release schedule is too fast for you. :)

    (scroll down to third post for more screenshots)
    1
    Localization
    Spanish: http://xdaforums.com/showpost.php?p=8917098&postcount=53

    Avian Play is ready to be localized to your native language! I need translators though. In the "Languages" folder under the application folder is where each language will be stored. Avian Play is structured such that all files in the language folder will be loaded for that language. This allows plugins to put their own language files in those folders, without interfering with Avian Play. All language strings are loaded into a single dictionary. To avoid collisions, plugin developers should prefix all their language strings (see shoutcast.ini for example). If a language string is not found in your language (maybe a new plugin or new features have new strings that are not yet translated) it will always default back to the English translation. So the "English" folder is the default language.

    Skinning
    Avian Play was designed so that the user can customize the layout of the application. Eventually, Avian Play will be fully widgetized (although maybe not on the WM platform). For the time being, the title information is on top, the control surface or list is in the middle, and the menus and tabs are at the bottom. Skin designers can, however, give Avian Play a brand new look by developing new images and editing a skin.ini file. To make a new skin, start in the Skins folder, and copy the contents of Default. Then edit the images and edit the colors in skin.ini to suit your taste. Please upload the results. Users can then extract the skin into your own custom named folder and select the skin from within Avian Play. Get creative! My skin isn't that hot. ;-)

    AVPL
    I know nobody really wants yet another playlist format, but I had to develop one because no current playlist format supports multiple URL sources for a single stream, despite that being extremely common. To support all of Avian Play's playlist functionality, you should use AVPL formatted files. You can create AVPL files from within the internal playlist editor, or by hand, as it is just a simple INI file. In the future, the AVPL will also support direct queries on the database to populate the list, but this is not supported yet. The intention is for this to be an open format, and I will post the schema later on so it can be used in other applications.

    Database Schema
    FileLibrary:
    Code:
    Column Name         Type      Length Nullable Unique Description
    Key                 int              No       Yes    Identity Column - Primary Key
    AddedDate           datetime         No       No     Date/Time the file was added to the DB
    Album               nvarchar  100    No       No     Album Name
    AlbumArt            image            No       No     Album Art (scaled to approx 480x480)
    AlbumArtist         nvarchar  100    Yes      No     Album Artist Name (for example, a DJ who made the compilation)
    AlbumArtThumbnail   image            Yes      No     Thumbnail of Album Art (scaled to approx 64x64)
    Artist              nvarchar  100    No       No     Artist Name (artist who performed this track)
    Bitrate             int              No       No     Bitrate of media file ** Currently unused **
    Comments            nvarchar  200    No       No     Extra comments in media file
    Copyright           nvarchar  100    No       No     Copyright string
    FileModifyDate      datetime         No       No     Date/Time the file was last modified
    FilePath            nvarchar  260    No       Yes    Full path to media file
    FileSize            int              No       No     Length of media file in bytes
    Format              nvarchar  25     No       No     Format of media file (MP3, OGG, etc.)
    Genre               nvarchar  50     No       No     Genre of media file
    HasAlbumArt         bit              No       No     Does this file have album art included?
    IsFavorite          bit              No       No     Is this file "favorited" by the user?
    IsPodcast           bit              No       No     Is this file considered a podcast?
    LastFoundDate       datetime         No       No     Date/Time the file was last found in the file system
    LastPlayedDate      datetime         No       No     Date/Time the file was last played
    LastPlayPosition    int              No       No     If position is tracked of the file, the last position (byte) where the file was paused
    LengthSeconds       int              No       No     Length of file in seconds ** Currently unused **
    MD5Hash             varbinary 128    Yes      No     MD5 hash of the file, if MD5 hashes are being tracked
    NotFound            bit              No       No     Was the file not found when the last library scan ocurred?
    Rating              tinyint          No       No     User rating of the file
    SkipForMetaPlaylist bit              No       No     Should the file be skipped for embedded queries in AVPL playlists ** Currently unused **
    Title               nvarchar  100    No       No     Title of the media file (song name)
    TrackNumber         int              No       No     The track number, with respect to album track order
    Year                int              No       No     The year the track was released
    PlaylistLibrary:
    Code:
    Column Name     Type     Length Nullable Unique Description
    Key             int             No       Yes    Identity Column - Primary Key
    ContainsFiles   bit             No       No     Does the playlist contain media files?
    ContainsStreams bit             No       No     Does the playlist contain streams?
    FileModifyDate  datetime        No       No     Date/Time the file was last modified
    FilePath        nvarchar 260    No       Yes    Full path to playlist file
    Format          nvarchar 25     No       No     Format of playlist file (M3U, AVPL, etc.)
    IsFavorite      bit             No       No     Is this file "favorited" by the user?
    LastFoundDate   datetime        No       No     Date/Time the file was last found in the file system
    MD5Hash         binary   128    No       No     MD5 hash of the file, if MD5 hashes are being tracked
    NotFound        bit             No       No     Was the file not found when the last library scan ocurred?
    Title           nvarchar 50     No       No     Title of the playlist file (derived from filename, but AVPL may support)

    Architecture
    Some people might be interested in the architecture of Avian Play. So I will describe my approach here. Avian Play consists of two processes: AvianPlay.exe and APEngine.exe. AvianPlay.exe is a managed .Net Framework app written in VB.Net. It controls the bulk of your Avian Play experience. Everything from the control surface, library, podcast management, etc., is handled here. AvianPlay.exe spawns a second process, APEngine.exe which is the audio engine. APEngine is a wrapper for the MAD MP3 audio engine. This is the same engine used in MortPlayer, GSPlayer, and many others. It is a super high quality playback engine ported to many platforms. I chose it due to how easy it is to work with and the quality of playback.

    Why two processes? I tried to P/Invoke MAD from a DLL, but due to memory management issues that led to freeze-ups, I realized I needed a larger barrier between the managed and unmanaged code. It took me a while, but I finally realized that I could avoid memory management issues by using two processes and using the registry for string-based IPC. The registry is very high performance on Windows Mobile, due to it being used for state notification via SHNAPI. So, by settings up registry callbacks on both processes, the application and audio engine are able to communicate successfully, with no memory management or other issues. The biggest disadvantage to this approach is that WM has a limit of 32 processes, and Avian Play will use two. I'm sorry, but there was no way around this! Attached to this thread is a Visio I made to map out how the application is structured.
    1
    File Feature Matrix
    Code:
    Audio File = The type of media file, such as MP3 and OGG.
    Embedded Tags = Also known as "ID3" tags from the MP3 tag definition.  This contains information like Artist, Album, Title, Track Number, etc.
    Playback Attributes = This is information usually only known when open for playback, such as track length (in time).
    
    Audio File   Embedded Tags   Playback Attributes
    MP3          Yes             No
    Ogg          Yes             Coming Soon
    Flac         Yes             Coming Soon
    WMA          Yes             Coming Soon
    WAV          No              No
    
    
    Playlist File = The type of playlist file, such as M3U or AVPL
    Files = Locations of files
    URLs = URLs to internet media
    Multiple URLs = URLs to internet media linked together as a single online radio station
    Wildcards = Locations that point to folders or multiple files in one line
    Recursive = Playlists that point to other playlists
    Queries = Queries against the Avian Play database
    
    Playlist File   Files   URLs   Multiple URLs   Wildcards   Recursive   Queries
    AVPL            Yes     Yes    Yes             No          No          Coming Soon
    M3U             Yes     Yes    No              No          No          No
    PLS             Yes     Yes    No              No          No          No

    Configuration
    Avian Play's configuration is completely stored in INI files under the "INI" folder under the installation folder. In the future, you will be able to configure nearly everything from within the application, but these early versions are missing some configuration capabilities without manual editing.

    Settings.INI
    This is the main configuration file. Most of these settings are configurable from within Avian Play, but there are a few that are not. First, you can't edit the Avian Play database path. This is intentional because it's a bit advanced to move that around. But if you want to move the database file, you can do so and then edit the DatabasePath option under General. Second, the TagsFromPathRegEx option describes the regular expression used to derive tag information from the path. This is RegEx Pattern for Tags from Path in the application. Although you can edit it from within AvianPlay, it probably isn't optimal, since you might want to tweak the pattern from your PC where you can use an editor with RegEx capabilities.

    Controls.INI
    This file describes the control surface layout for the three control surfaces (Music, Podcasts, and Radio). It's a bit cryptic because it's designed to be configured and ready by the app, but the control surface editor is not yet ready. :) So if you want to change the control surfaces, you have to edit this file for now. The file starts under the [Main] section. Here there are the three control surfaces (0=music, 1=podcast, 2=radio). The C#L (Control Surface Length) tells Avian Play how much scenes are in each control surface. Minimum is 1. Then there are various sections, in the format of CXSY, where X=surface and Y=scene. So, C0S1 is the music surface and second scene (count starts at 0). Under that, you will see "SL" (Scene Length) which tells Avian Play how many rows the scene has (starting at bottom, going up). There is also R#L (Row Length) which tells Avian Play how many controls per row (1-4). Then you have RXBY, where X=row number (from bottom) and Y=Button (from left). Note that a button is any type fo control in Avian Play parlance, including track slider. The list of controls can be found at the bottom of this post. This is just the initial list and will grow as new features are added.

    Events.INI
    Avian Play uses events to allow you to execute commands based on occurances. The events currently supported are: OnApplicationStart, OnApplicationEnd, OnPhoneInUseStart, OnPhoneInUseEnd, and then keyboard/SIP events, which are Key_XX, where "XX" is the hex code of the key being pressed. ActiveOnList is a boolean that determines whether the action happens when a list (library, now playing, etc.) is active. Basically, some commands you don't want to work when the list is active. An example is that Avian Play allows lists to be filtered simply by typing. But if you remap "K" to play/stop, you can never use "K" to filter a list. So you would set ActiveOnList to false, in that case. AllowRepeat indicates whether a keypress can be repeated by holding it down. Action# are the steps of the script. The script itself is a super simple crappy thing I made up on the spot. If somebody knows of a script language I can easily include to replace this, that would be awesome. It has to be able to be plugged in easily and should be managed code.

    Library.INI
    This file defines the Avian Play Library's query results. Execution starts at the MAIN section, then jumps to the next sections based on user input. Most of the options describe the query used to retrieve data from the database. But there are other ways to populate a library list. For example, by using an external plugin. If you want to develop an external plugin, see the MemorizedSong plugin source code. I can't reveal the code for the ShoutCast plugin due to licensing restrictions with ShoutCast. You can also create a section that populates the list directly from a AVPL playlist file.

    Podcasts.INI
    Avian Play can manage podcast subscriptions and this is where you define your subscriptions. Again, this was designed to be edited by the application, so it's not exactly friendly, but it works well in my tests. Under Main section you set the next index to use to distinguish the subscriptions in the database. Under each SubscriptionX section, you use "Index" to differentiate each entry. Note that the title of the section does NOT differentiate the subscriptions. This is intentional. The rest of the sections are described in the file itself.

    RegEx.INI
    Online streams present information to the user, such as artist and title, in a single string. Avian Play allows you to use regular expressions to derive this pseudo-tag information to format it on the display easier. Many online radio stations seem to like to include superflous garbage surrounding the title information you care about. With RegEx, it's easy to exclude this crap! A few stations I listen to are included in the default file. Each entry has a "Station" tag which is the actual title of the station (partial or full -- use "ExactMatch" to set this). If multiple matches occur, use Priority to determine which one has precedence (higher number overrides lower number). Then the "RegEx" line is the actual regular expression used to derive title information. Named captures <A> represents Artist and <T> represents Title. The "Default" section is just what it sounds like: the default regular expression used to parse the stations. It follows the format "Artist - Title" which seems to be most common.

    Schema.INI
    This is used by the settings editor to know the layout of the Settings.INI file. DO NOT EDIT THIS.

    State.INI
    This file is overwritten every time you exit Avian Play. It stores the last track and some other UI information. DO NOT EDIT THIS.

    Control Codes
    These are the control codes used in the Controls.INI and Events.INI. Each code corresponds to a logical control (play, pause, stop, next, etc.). Some codes have an argument, which is another integer. Some codes also represent "multi" buttons, where the button may change based on the playback state; An example would be the StartPauseStop button which changes what it does based on whether playback has started or not.
    Code:
    NONE = 0               ' Do nothing
    Stop = 1
    Play = 2
    Pause = 3
    PreviousRewind = 5
    NextForward = 6
    SkipBack = 7           ' Argument, number of seconds
    SkipAhead = 8          ' Argument, number of seconds
    MemorizeSong = 9
    OpenAudioFile = 10
    OpenPlaylistFile = 11
    JumpToEntry = 12       ' Argument: which playlist entry in the current list?  1..n
    OpenURL = 13
    VolToggle = 16         ' Argument, number of volume 'segments' (plus 1); Positive value increments; Negative value decrements. Example: 4 cycles through 0%, 25%, 50%, 75%, 100%, in that order
    Close = 29             ' Close the currently open file or stream
    
    ListUp = 201           ' Move up in the current list
    ListDown = 202         ' Move Down in the current list
    ListSelect = 203       ' Select the item on the list
    ScenePrevious = 207    ' Go to previous scene in the collection
    SceneNext = 208        ' Go to next scene in the collection
    
    StopPlayPause = 401    ' Depending on playback state, stop, play, or pause
    SelectStopPlayPause = 402  ' If in a list, select the list item, otherwise same as StopPlayPause
    
    TrackPositionSlider = 601  ' The slider you can drag to jump around a loaded item
    1
    Tips
    - Quickly double tap the song title area to toggle between the large multiline and small single line display modes.
    - Press and hold some buttons for additional functionality: hold the volume toggle button to show the full screen volume bar, hold the PlayPauseStop button to stop.
    - Don't want or need all three control surfaces (music, podcast, and internet radio)? Since V3, you can disable ones you don't want under Settings->Display

    Frequently Asked Questions
    None yet. :)
    1
    V5 Released

    - Fixed bug: When saving Now Playing cache files, if the thread is aborted due to crash or other termination, it would raise an exception on the aborting thread, leading to a (second) crash and confusion for the user as the application fails to terminate gracefully.
    - Fixed bug: Fixed a possible divide by zero error that may occur when shutting down the application, but due to timing, may or may not be an issue (most of the time, seems not).
    - Fixed bug: Realtime monitor would not enable/disable without a restart after changing setting.
    - Fixed bug: Changing scan paths and exclude paths would not take effect without a restart.
    - Fixed bug: Fixed some parsing bugs in the controls.ini parser. Note: this only became noticible with the control editor. There were no crashes associated with this before the editor.
    - Refactored: Modularized skin, settings, and control functions codes into their own respective DLLs. This is done to make porting Avian Play easier in the future and also to just clean up the main module.
    - Refactored: Realtime monitor interaction between the main application and realtime monitor thread.
    + New debugging: Added more debugging information for when the audio engine crashes.
    + New feature: The control editor is here! Translators: This feature added the following strings to translate: Surface, Scene, ControlButtonSelectSurfaceScene, ControlButtonRemoveScene, ControlButtonAddRow, ControlButtonRemoveRow, ControlButtonRowOrder, ControlRemoveRowTitle, ControlAddScene, ControlDeleteSceneAreYouSure, ControlButtonCount, ControlMoveRow1, ControlMoveRow2, and all the Control### strings (which correspond to all valid control functions).
    + New feature: The official "rating" tag is now supported in MP3 (ID3v2) and WMA. MP3 may store multiple ratings per file, so only the first one is used.
    + New feature: The unofficial "rating" tag used in MediaMonkey is now supported in Ogg/Flac. Values between 20, 40, 60, 80, and 100 are normalized to 1, 2, 3, 4, and 5, respectively. Values of 1 through 5 are left alone. Values larger than 100 is set to 5 and less than 0 to 0. This is done to comply with MediaMonkey's custom tag's format, while also complying with the very common "star" rating system of 1 through 5 stars for how a file is rated. A value of 0 means that there is no rating on the file.