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)
Localization
Spanish: http://forum.xda-developers.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.
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
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.
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!
m.reza said:
... it says SQL CE 3.5 may not be installed. please install ....
Click to expand...
Click to collapse
same problem
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.
Farmer Ted said:
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.
Click to expand...
Click to collapse
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.
Farmer Ted said:
I've uploaded the sqlce cab so anyone with the same problem can load it on their own.
Click to expand...
Click to collapse
Thanks! Installed this cab and now it's working fine.
Great app.
Farmer Ted said:
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.
Click to expand...
Click to collapse
i can also confirm, after installing the cab the app loads.
cu,
nosedive
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.
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
eversp01 said:
When I push the END/POWER button in order to save power then the player stops. Any way to avoid this?
Click to expand...
Click to collapse
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.
eversp01 said:
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.
Click to expand...
Click to collapse
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.
lPatriciaNl said:
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
Click to expand...
Click to collapse
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.
last.fm support
are you planning support for last.fm scrobbling so every song played in avianplay will be scrobbled?
how can i add whole folder to the playlist?? i cant see that options
myracleboi said:
are you planning support for last.fm scrobbling so every song played in avianplay will be scrobbled?
Click to expand...
Click to collapse
No current plans, but that sounds like an interesting feature request. I don't use last.fm... can you point me towards some information on how to implement this? Like a last.fm API or something?
fuxmen said:
how can i add whole folder to the playlist?? i cant see that options
Click to expand...
Click to collapse
That's not currently an option, but it's a good feature request.
thx1200 said:
That's not currently an option, but it's a good feature request.
Click to expand...
Click to collapse
It would be very useful because adding one song at a time takes very long time
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