view TODO @ 4661:e4e7999a21bc

Move D-Bus initialization before plugin system and playlist initialization. (The other changes in this changeset are to remedy the problem arising from the move, which resulted in annoying pause during startup due to D-Bus being initialized when assumed not to be.)
author Matti Hamalainen <ccr@tnsp.org>
date Fri, 27 Jun 2008 17:57:39 +0300
parents e36c207de2c1
children
line wrap: on
line source

Long-term "TODO"
================
- output plugins should have some kind of (optional) "query available formats"
  function, so that the core could determine what should be used. perhaps
  offer users this info?

- remove the idiotic XMMS compatibility output plugin hack.

- all audio plugins (input, output, effect) should be made completely
  re-entrant. this probably means severely breaking the API. not very
  trivial either :(
  * basically plugin init() should allocate / init a state struct to
    be used in all operations, etc.


- the equalizer should be fixed .. in more than one way:
  * equalizer was broken by asphyx's libSAD
  * lots of things are hardcoded, like number of EQ bands. this should
    be changed.


- URIs with "?" are stripped (the subtune support uses that), which is bad,
  because some (a lot) of real-world URLs use 'GET' arguments. this breaks
  probing, but current input probing is confusing (and possibly broken anyway)
  and should be refactored.


- mime-types support:
  * there is already code for mime support, but I think it may not be
    sufficient as it is designed for input plugins only -- 
    also playlist containers etc. need this (IMHO)

  * might be nicer to have the type registrations in plugin struct
    instead of a separate function, a'la vfs_extensions.


- document the different APIs via Doxygen


- unified debugging/message system, for core and plugins
  * something like glib logging system, with logging levels
  * hardcoded "debugging" levels and/or macro-wrappers that would
    disable superfluous debugging output compile-time.
  --- being planned by ccr


- audacious VFS is not 64-bit offset safe, breakage will most likely occur,
  if files larger than 2^31 are used (rather unlikely, tho, but still...)

  * nenolod says: current vfs sucks, it needs a "rewrite":
    - buffering support
    - non-blocking I/O support


- {core,plugins}/configure.ac need some cleanup loving.
  * make session management (SM) optional. (done)
  * build system cleanups .. extra.mk.in? wtf? (done in core, progressing
  for plugins)
  --- this is in progress, worked on by ccr


- plugin rewrites:
  * madplug
  * modplug (in progress by ccr)
  * scrobbler


Playlist code issues
====================
It's been determined that the playlist code should be completely refactored.

ATTENTION! Add more stuff here! Issues that you can think of, suggestions
for solutions, etc. References to algorithms...


- code (mostly in playlist.c) is unnecessarily complex in some places and
  there is lots of useless duplication.

- what data structures should be used? things that factor in are
  efficiency and scalability -  memory usage and speed.
  see also below and notice the manipulation bottleneck(s).

  (different structures typically have bottlenecks in different places.)

- playlist_clear() is VERY slow with large playlists, possible reasons?
  * GList scalability sucks? (it does, but is it the real reason here? need
  to profile this...)
  * maybe playlist_entry_free() is at fault instead? (see also below)
  * mowgli_heap_free()?

  possible solutions?
  * mempools for playlist data? not sure if possible, the tuple heaps
    should then somehow be collected into pools...
  * storing the playlist as a GtkTreeModel seems to be fairly fast (at least
    in mudkip-player it is) --nenolod

- current implementation has a nasty racecondition in scanner thread vs. playlist
  manipulation (playlist_clear(), free, etc.)

  * new code should be water-tight when it comes to locking. simpler code
  with more "atomic operations" should help.


ccr rants:
----------
I suggest that the whole playlist manipulation should be moved into separate
thread. What I mean, is that the playlist scanning (e.g. probing for
metadata) AND adding files into playlist should be in a thread.

Adding files would work like this:
  1) feed URIs to playlist handler thread
  2) playlist handler notices new URIs and starts checking if they are valid
     aka probing or other checks.
  3) valid files/URIs get added to the playlist. unsupported files get discarded.

Possible benefits of this approach:
  - checking for "can we play this?", which currently happens in main
     thread and blocks the GUI etc, would now happen asynchronously.
  - improved user experience: less blocking generally, and it would be even
     possible to _parallelize_ probing, if we wanted to, getting metadata
     for multiple files at the same time. (this could be a user-settable
     option.)

Bad sides:
  - requires careful design and thread locking .. but that we need anyway.
  - possibly might make playlist GUI representation harder. I am not sure
    what effects this might have, feel free to pitch in thoughts...