TODO-list for amaroK
======================
<nick>  == reported by
-->nick == assigned to
#x      == sequential bug number,
           #24 being the highest available (take this one for your next bug and increase here)


SHORT-TERM (URGENT):

    * fix: #12<markey> prevent zombie processes after amarok has exited (proper exit or crashing).
              such zombies can lead to very weird behaviour on next amarok start and eat ressources,
              and the user has no chance of noticing what's wrong.
              is it possible to catch crash signals and do some cleanup?
              <mxcl> I just read that KApplication tries to prevent zombies, so something is amiss

    * fix: #11<markey> bitrate display often shows bogus values (especially with VBR, it seems)
              <mxcl> currently taglib is scanning files in Fast mode and on demand, the code is in
              PlaylistItem::metaBundle(). If it's still doing it wrong we should consider setting it
              to Accurate.

    * fix: #7<mxcl> originally reported all this, <berkus> summarized
             * The playwidget and playlistwidget should display as single entry on taskbar.
             * Clicking on either or on tray icon should bring both up/down.
             * Setting WType_Dialog on playlist doesn't help, because then playlist always
               obscures the playwidget.

    * chg: <mxcl> make the color and font groupboxes checkable again for next version (requires qt 3.2)


MID-TERM:

    * fix: redirected URLs do not work (? - we need some testcase)

    * fix: <mxcl> reimplement ask recursively on drop operations to playlist
           <markey> replace with "add all media in current directory".
           basically just a shortcut for going up to the parent directory, and then dragging
           the directory. imagine you're in the root directory of some filesystem, and want to add all
           files in it.. currently you'd have to select all files manually

    * fix: filebrowser does not display hidden directories; so they cannot be accessed, either

    * fix: <mxcl>KListView sets the hand cursor on column(0) of the playlist. This is not
           relevant to amaroK since we are naughty and don't obey KDE's single click mode
           we should disable the hand cursor since that means "single-click to activate me"
           maybe override KListView::mouseMoveEvent, or is there a better way?

    * fix: pause vis/anim timers when hide/show main widget as a courtesy to our users -->mxcl

    * fix: honor KDE single/double-click setting in BrowserWin

    * add: extend keyboard shortcuts [<mxcl> show playlist, also I'd say do this with actions as it's easiest]

    * add: "show playlist" to the right click menu, redundant but necessary

    * add: <muesli> background chooser

    * add: <muesli> add OSD support (permanent display or just on events like a song switch)

    * add: more KTips, better KTips, somehow use the "Did you know" tip dialog (eg kmail, gideon, etc.) -->mxcl

    * add: extend documentation

    * add: history to add dialog, or implement better system for adding urls etc.

    * add: column "length" in playlist

    * add: option to automatically adjust column widths

    * add: option to implicitly sort playlist by { track, album } (on drop only) -->mxcl

    * add: <muesli> reading metadata on the fly (read for displayed playlist-items or onClick)
           <berkus> this means that metadata is read only for visible now items or the items
           you click. (see winamp)

    * add: "add item"-dialog should support multiple selections

    * add: <berkus> playmode indication button in main widget (repeat track/pl/shuffle), clickable

    * add: display warning when artsd is run w/o realtime

    * add: background pseudo-transparency for playlist window

    * add: function for adding all files in current dir to playlist

    * add: seeking with mousewheel

    * add: make blinking currentTrack optional

    * add: display type of media next to bitrate

    * add: save/load arts effects on close/startup automatically

    * chg: #21<markey> use more accurate interpolation for analyzers (cubic or spline)

    * chg: <mxcl> use QApplication::setPalette to adjust application colours, as it propagates
           changes to all widgets and will hopefully deal with the selection colour issues in
           the browser/janus widgets (although we have to stop it setting browserWin colors)

    * chg: can we make all buttons into actions? if we can, we could use setState(), a global
           actionCollection and save plenty of LOC. I see problems with the play/stop/etc
           buttons though.

    * chg: pre 1.0, big cleanup to reduce mem consumption (I dunno if we use a lot or not, but
           this is a good goal anyway!)

    * chg: pre 1.0, plan, cleanup and future-proof settings file keys. Will almost certainly
           mean that people will lose their settings, oh well, best to do it for the 1.0 release.

    * chg: select tracks on mouseup, not mousedown (does this make sense?)


LONG-TERM:

    * add: support for multiple audio frameworks (will require switching to an abstract audio engine class.
           hopefully this will also improve our architecture, and reduce the playerapp dependency hell).
           alternative frameworks might include gstreamer, and NMM  -->markey

    * add: make windows magnetic / sticking together (difficult)

    * add: generate text or html document from playlist entries

    * add: <berkus> add smooth fade outs on stop

    * add: make PlayerWidget shadeable (like XMMS) [<mxcl> doesn't the systray provide this functionality
           already?] [<berkus> no it doesn't, double click the winamp/xmms window and see for yourself]

    * add: display some information about current track in playlist window

    * add: support for compressed archives / tarballs

    * add: <mxcl> implement beat detection (thread?), interface should glow/move to
           the beat, visualisations have access to beat/bpm info

    * add: pitch-slider (?) [<berkus> should be in separate "Effects Control" panel]

    * add: audio system info widget, showing all available codecs and maybe more

    * chg: resizable playerwidget, like in Winamp3.


IDEAS:

    * bookmarks inside of tracks (good for very long tracks), and nifty bookmark browser

    * think about moving amarok to kdeextragear

    * using filelight (as a kpart maybe) for a graphical representation of the playlist. so you could
      see at first glance how the altogether playing time is divided into different albums, tunes and
      so on.


DISCUSSING:

    * add: a "hide playlist when main widget is not active" option (?? comments please: )
           <berkus> noo, we have it hiding into tray, thats enough (imagine how much flashing will be
           if i drag mouse around with "focus follows mouse" on - this is the one i use all the time)
           <mxcl> hence it's an option, you'd not use it with focus follows mouse. But it was just an idea
                  anyway.. dunno if I like the sound of it anymore either.

    * inf: <markey> I'd very much appreciate people keeping line length in all amaroK sources/textfiles
           at 110 characters max. Longer lines cause horrible dynamic line breaks or scrolling when you only
           have limited screen width, like in console or kdevelop. pretty please with icing =)

DUMPED:


BACKTRACES/VALGRIND/DEFECTS:

12.19.03:
valgrind --logfile=amarok12_19_03valgrind.log --trace-children=yes /opt/kde3/bin/amarok

==2121== Invalid write of size 4
==2121==    at 0x80883E0: PlaylistLoader::LoaderEvent::makePlaylistItem(QListView*) (amarok/playlistloader.cpp:484)
==2121==    by 0x80824F1: PlaylistWidget::customEvent(QCustomEvent*) (amarok/playlistwidget.cpp:351)
==2121==    by 0x419FA5FB: QObject::event(QEvent*) (in /usr/lib/qt3/lib/libqt-mt.so.3.2.3)
==2121==    by 0x41A3153B: QWidget::event(QEvent*) (in /usr/lib/qt3/lib/libqt-mt.so.3.2.3)
==2121==    Address 0x47AB064C is 20 bytes inside a block of size 28 free'd
==2121==    at 0x4015F64A: __builtin_delete (in /usr/lib/valgrind/valgrind.so)
==2121==    by 0x4015F66A: operator delete(void*) (in /usr/lib/valgrind/valgrind.so)
==2121==    by 0x808A937: PlaylistLoader::~PlaylistLoader() (amarok/playlistloader.h:32)
==2121==    by 0x8085690: PlaylistLoader::LoaderDoneEvent::dispose() (amarok/playlistloader.h:67)
==2121== discard syms in /opt/kde3/lib/libx11globalcomm.so.1.0.0 due to munmap()
==2121== discard syms in /usr/lib/qt3/plugins/imageformats/libqmng.so due to munmap()
==2121== discard syms in /usr/lib/libmng.so.1.0.0 due to munmap()
==2121== discard syms in /usr/lib/liblcms.so.1.0.9 due to munmap()
==2121== discard syms in /usr/lib/qt3/plugins/imageformats/libqjpeg.so due to munmap()
==2121== discard syms in /usr/lib/libjpeg.so.62.0.0 due to munmap()
==2121== discard syms in /usr/lib/libGLU.so.1.3 due to munmap()
==2121== discard syms in /opt/kde3/lib/kde3/plugins/styles/plastik.so due to munmap()

[New Thread 1024 (LWP 3927)]
[New Thread 2049 (LWP 3929)]
0x42100449 in wait4 () from /lib/libc.so.6
#0  0x42100449 in wait4 () from /lib/libc.so.6
#1  0x4217cfd0 in __DTOR_END__ () from /lib/libc.so.6
#2  0x41f24a73 in waitpid () from /lib/libpthread.so.0
#3  0x4141d798 in KCrash::defaultCrashHandler(int) ()
   from /opt/kde3/lib/libkdecore.so.4
#4  0x41f2211b in pthread_sighandler () from /lib/libpthread.so.0
#5  <signal handler called>
#6  0x08287829 in ?? ()
#7  0x417b4735 in QApplication::notify(QObject*, QEvent*) ()
   from /usr/lib/qt3/lib/libqt-mt.so.3
#8  0x413ae933 in KApplication::notify(QObject*, QEvent*) ()
   from /opt/kde3/lib/libkdecore.so.4
#9  0x417a2adb in QEventLoop::activateTimers() ()
   from /usr/lib/qt3/lib/libqt-mt.so.3
#10 0x4175f8e2 in QEventLoop::processEvents(unsigned) ()
   from /usr/lib/qt3/lib/libqt-mt.so.3
#11 0x417c8516 in QEventLoop::enterLoop() ()
   from /usr/lib/qt3/lib/libqt-mt.so.3
#12 0x417c83b8 in QEventLoop::exec() () from /usr/lib/qt3/lib/libqt-mt.so.3
#13 0x417b5591 in QApplication::exec() () from /usr/lib/qt3/lib/libqt-mt.so.3
#14 0x08066d57 in main (argc=5, argv=0xbffff614) at amarok/main.cpp:68
#15 0x4207a4f2 in __libc_start_main () from /lib/libc.so.6
