I've been working on a player called Euphonos, which is basically going to be setup like foobar2000, except for Mac OS X. I'll just list some of the current bits that I've been toying with so far:
- Written primarily in Objective-C/Cocoa. Some portions will be coded in pure C and make use of the CoreFoundation API, but this will only happen in the few areas where Foundation does not expose the same functionality. Stuff from CoreAudio, and a few isolated parts of the CoreData and Spotlight functionality may be this way.
- Uses CoreData for media library. The player will most likely use the sqlite method of coredata storage, which should allow effecient access to a library with hundreds of thousands of entries without a massive memory overhead.
- Uses Spotlight for all metadata handling (requires writing importers for Ape2 tags, Vorbis comments, and other currently unsupported tags). This will allow for easy searching of the media library (both within and outside of the player), as well as automatic synchronization of the media resource entries in the library with changes made to the file outside of the player. Mass tagging, smart playlists, etc., should become trivial to implement.
- Uses xml/xsl/javascript for playlist formatting. Basically, metadata from an audio resource is exposed as an xml node. To format information from the audio resource into a useful (or cool looking, whatever) entry in a playlist, you write an xslt skin that reformats the information in this node into xhtml, which is then rendered via safari's webkit. Programmatic aspects of the playlist formatting and dynamic behavior (mouseovers, animation, whatever) are handled with javascript. This essentially allows an extremely powerful, extremely flexible, and theoretically efficient approach to complex playlist formatting, yet while still relying on standardized technologies and languages. Anything that is possible via xhtml/css/javascript (dhtml in other words) is possible in the playlist view. In fact, even more can be done through the use of the canvas tag that webkit (and firefox) supports (it basically allows 2d quartz like drawing -- see here). It would also be possible to implement a javascript <-> objective-c bridge to allow lower level control of the program internals through the skinning, although if this is done it will probably be disabled by default due to security concerns. For those that are familiar with the Colloquy IRC client, this process is very similar to how it renders its chat transcript views (i.e., it uses xslt and webkit).
- Uses the plugin architecture for easy addition of extra functionality. The player will end up being modular in quite a similar fashion to how fb2k currently works.
- Uses CoreAudio, specifically newer audio api's introduced in OS X 10.4. Additional codec support would eventially (if not initially) be added through the AudioCodec API, which would have the side effect of allowing these formats to be used elsewhere in the OS. All of the modular DSP stuff will be handled this way.
- Will support Applescript (and probably other less annoying scripting languages
There's more, but I can't think of it all off the top of my head right yet. What I have as of now is not a complete player, but mostly bits and pieces of various components. Most of my time recently has been spent familiarizing myself with the new api's in OS X 10.4 and running small experiments to see how well certain ideas I've had might or might not work. I'm not certain when an initial release will roll around either, though that could conceivably be sped up if there is serious interest on both the user and developer side. Right now, there's quite an incredible amount of functionality that I have planned for the player, but only so much time to program it in...
I suppose a relatively big issue to point out is that what I'm planning on doing is only going to work on OS X 10.4. There are just too many API's that I'm relying on from that release to make a version for earlier OS releases. A significant portion of what I plan to do simply wouldn't be very practical with earlier releases unless I had a desire to reinvent the functionality provided by newer api's in my own private library (I don't).
This is basically a preview of what I have in mind or a proposal for feedback. I hadn't planned on bringing much of anything up in public until I'd reached the point of an initial release, but since the topic has come up, it seems somewhat relevant.
