This file lists long-time goals that are not fixable quickly. Issues that are easily
fixable should not be recorded here, but should rather be fixed in the code.

Structural:

- LibDA as a separate project
	* Also playback and Vorbis + MP3 decoding
	* Mixer and samplerate conversion inside
- Get rid of ScreenManager in favor of recursive approach?
- Switch to Clanlib or SFML?
- Switch to GStreamer? (both the ripper and the game)


Big features:

- Add compose screen (using features discussed on mailing list)
- Multiplayer duet (needs XML or MIDI song format)
- Recording performances
    * Internet highscore
- Mic effects (reduce volume for bad singers, perfect pitch, reverb, etc)
- Ingame Singstar DVD support (integrated ripping + ffmpeg feeding + XML song format)
- Dance game [WIP]


Features:

- Auto-calibration of acoustic roundtrip latency (playback + capture)
- Better audio card configuration ingame (needs libda support for listing cards) [WIP]
- Allow playing a single song given as commandline argument (no menus)
- Kiosk/arcade mode


Text rendering bugs:

- Correct vertical alignment
- Use dimensions to specify bounding box (possibly init from SVG)
- Lyric hilighted should be rendered in front of the others


New config menu:

- Multiple items visible at once
- Modifying strings and stringlist items.
- Predefined options from config schema and libda device enumeration


Ripper:

- Compress into Vorbis Ogg and H.264 MKV


Bugs:

- On Compiz switching from fullscreen to window makes the window maximized even though the viewport stays small
- Random segfault deep within librsvg when entering the singing screen (very hard to reproduce)

*** glibc detected *** performous: free(): invalid pointer: 0x00007f1bc016ec30 ***
======= Backtrace: =========
/lib/libc.so.6[0x7f1bdc530cb8]
/lib/libc.so.6(cfree+0x76)[0x7f1bdc533276]
/usr/lib/libglib-2.0.so.0(g_ptr_array_free+0x4a)[0x7f1bdfca68fa]
/usr/lib/librsvg-2.so.2[0x7f1bdf5b0c2c]
/usr/lib/librsvg-2.so.2[0x7f1bdf5b0c59]
/usr/lib/librsvg-2.so.2[0x7f1bdf59c532]
/usr/lib/librsvg-2.so.2[0x7f1bdf5be78d]
/usr/lib/libgobject-2.0.so.0(g_object_unref+0xc2)[0x7f1bdfa5a1f2]
/usr/lib/librsvg-2.so.2[0x7f1bdf5bed68]
/usr/lib/librsvg-2.so.2(rsvg_pixbuf_from_file_at_size+0x26)[0x7f1bdf5bee56]
performous(_Z6loaderI7TextureEvRT_Ssb+0x82c)[0x451e1c]
performous(_ZN7TextureC1ERKSs+0x44)[0x44f8b4]
performous(_ZN11ProgressBarC1ERKSsS1_NS_4ModeEffb+0x40)[0x4aebd0]
performous(_ZN10ScreenSing5enterEv+0x209)[0x4c9379]
performous(_ZN11ScreenSongs15manageSharedKeyEi6SDLMod+0x178)[0x475d68]
performous(_ZN11ScreenSongs11manageEventE9SDL_Event+0xcb)[0x47600b]
performous[0x4d0659]
performous(_Z8mainLoopv+0x579)[0x4d1bf9]
performous(main+0x1d30)[0x4d42c0]

- Random segfault on program exit (very hard to reproduce)
   * Don't even need to enter songs screen, start and exit is enough.

- Hang on program exit (deadlock in mixer):
(gdb) thread 1
[Switching to thread 1 (Thread 0x7f6f4f1aa8a0 (LWP 13792))]#0  0x00007f6f4949e5a9 in pthread_cond_wait@@GLIBC_2.3.2 () from /lib/libpthread.so.0
(gdb) bt
#0  0x00007f6f4949e5a9 in pthread_cond_wait@@GLIBC_2.3.2 () from /lib/libpthread.so.0
#1  0x00007f6f4ecc7669 in boost::thread::join() () from /usr/lib/libboost_thread.so.1.40.0  // Waiting for audio thread (thread 3) to terminate
#2  0x00007f6f3d980f09 in ~alsa_playback (this=0x218e770, __in_chrg=<value optimized out>) at /home/tronic/performous/libs/libda/plugins/audio_dev_alsa.cpp:194
#3  0x000000000048e68d in da::mixer::~mixer() ()
#4  0x00000000004ffad8 in Audio::~Audio() ()
#5  0x00000000004f7e73 in mainLoop (songlist=<value optimized out>) at /home/tronic/performous/game/main.cc:179
#6  0x00000000004f9a9d in main (argc=<value optimized out>, argv=<value optimized out>) at /home/tronic/performous/game/main.cc:290
(gdb) thread 3
[Switching to thread 3 (Thread 0x7f6f3c65d910 (LWP 13794))]#0  0x00007f6f494a0c34 in __lll_lock_wait () from /lib/libpthread.so.0
(gdb) bt
#0  0x00007f6f494a0c34 in __lll_lock_wait () from /lib/libpthread.so.0
#1  0x00007f6f4949c2b0 in _L_lock_1022 () from /lib/libpthread.so.0
#2  0x00007f6f4949c111 in pthread_mutex_lock () from /lib/libpthread.so.0
#3  0x000000000048c253 in boost::unique_lock<boost::recursive_mutex>::unique_lock(boost::recursive_mutex&) ()    // Mixer lock?
#4  0x000000000048cad5 in boost::detail::function::function_ref_invoker1<da::mutex_stream, bool, da::pcm_data&>::invoke(boost::detail::function::function_buffer&, da::pcm_data&) ()
#5  0x000000000048bd3e in boost::function1<bool, da::pcm_data&>::operator()(da::pcm_data&) const ()
#6  0x00007f6f3d97fddb in operator() (this=0x218e770) at /home/tronic/performous/libs/libda/plugins/audio_dev_alsa.cpp:205
#7  0x00007f6f4ecc6db0 in thread_proxy () from /usr/lib/libboost_thread.so.1.40.0
#8  0x00007f6f49499a04 in start_thread () from /lib/libpthread.so.0
#9  0x00007f6f492037bd in clone () from /lib/libc.so.6
#10 0x0000000000000000 in ?? ()

