RSS

(root)/calliope : /TODO (revision 447)

Line Revision Contents
1 184 ****
2 Current versions of packages which don't work on Win32 & why:
3
4 gconf 2.24.0: requires dbus for something which I don't fully understand.
5 425  -> switch to gsettings anyway soon.
6 184
7 gstreamer 0.10.21: requires _fstat64 which needs newer msvcrt than mingw uses.
8  and therefore: gst-plugins-good 0.10.11
9 -> need all new gstreamer :(
10 420 -> GNOME bug #575988
11 322
12 libsoup 2.26: invalid flag for gcc3
13 184 *****
14 355 gtk 2.16.1
15 **
16 260
17 362 * gconf gsoc project - use it
18 269         * last.fm client should wait maybe a second from params changing before it tries connecting,
19           trying on every letter when a new username is entered is silly.
20           -> binding with a delay, gsoc project
21
22 191 Creepy little bugs!
23  - a song plays back silently every so often for no apparent reason.
24 390    -> this maybe affects songbird too - it seems to
25 371    -> win32 only?
26 361  - once it fucked up with 'invalid message on scrobbler message bus: #0' or some shit in an infinite
27     loop.
28 206  - Here was a weird problem. 'test-data/test.db' started being really slow. It's hard to understand why
29    (some locking problem?). I wonder if this will happen again.
30 261
31 *** calliope just likes to lock up sometimes at the moment. :(
32
33 243 * playback is shit with high CPU
34 365 -> songbird uses gst on win32 but seems to do much better than calliope. have a look at their code
35    and find out what the deal is there.
36 184
37 271 -> Preset 1 Dynamic test fails locating sometimes :( libraryview only?
38
39 439 --> improve wscript for latest waf (global bld, check function, build on dist etc.)
40 299
41 417 -> make a libtestutils, and make the test build logic better ..
42
43 283 *** APRIL +
44
45 353 -> processes are slooow on win32 now .. probably because the threads must wait for gdk lock to
46    finalize?
47
48 390 -> add unit test for "(artist[name]:album:release:track:recording)/recording[name]"
49
50 397 -> matching extensions is fucked
51
52 -> changing files: group change notifications together for speed (ie. hold them back so we don't
53      emit row-changed on the same row 6 times in a row).
54 432
55 445 -> Sometimes the sort order is wrong, i think .. hard to reproduce
56
57 * Some bizarre threading issue, where the view is being freed and the import is still going ..
58   - Seems like the weak reference that notify closures hold is not doing what it should.
59
60 441 Tests that occasionally fail:
61   main-test/final/preset 1 failed on me once for no reason
62   files/Empty (this may be gtk_init not being called correctly by gtk_test_init)
63   process/cancelling/GUI (same??)
64 418  
65 445 * Code terminology. You have about 3 different concepts called Node. Write a lexicon.
66
67 * Don't steal focus when you start! Esp. in the tests !!!
68
69 418 ----------------------------------------------------------
70 415
71 445 * final tests fail randomly. Replace 'process' system with GTask which is hopefully less crappy
72 415
73 * reimplement library, and merge whatever you can with importing into the superclass
74   ... or, have library inherit from importing (and rename it to generic) and do it that way ..
75
76 441 * This will probably be important in libraryview, I ripped the code out for now ...
77         Reimplement the 'general' flag in a better way:
78
79         /* FIXME: problem!
80          * So that's the problem the 'general' flag fixes - if the node's tail type is general, the view
81          * queries the node's children straight away and if there are none, it doesn't show the node after
82          * all. At the moment this only applies to artist. FIXME: I think any type where more than one
83          * foreign key points to it should be treated this way, but I'm not sure yet so I decided to use
84          * an explicit flag instead.
85          *
86          * FIXME: we could be cleverer how we deal with this in the sources. For example, if the config
87          * has artist > (album .)/(recording .) (ie. if every possible foreign key is represented) we
88          * can once again assume no entry nodes - except for VA and Unknown Artist, who are special
89          * cases really anyway.
90          */
91         //extern const gboolean entry_general[ENTRY_TYPE_COUNT];
92
93 307
94 * test insertion, changing & removal in the preset sources tests
95 208    - removing entries with chaining
96 260
97 390
98 425 SEPTEMBER
99 266 --------
100
101
102 Memory issues:
103     - a memory monitor dialog !!
104 269           -> http://www.reddit.com/r/programming/comments/86d72/ask_progreddit_getting_the_amount_of_memory_used/
105           -> can glib do this? gslice?
106 266         - concrete limits on memory use - test with a really low limit. This basically affects
107           how many pages to keep in memory before we go nuts and free a bunch of them.
108         on this subject:
109                 - what pages are best to remove? you could track how long ago a page was accessed - but
110                   this is kind of nuts. Randomly? Every even no.?
111                 - track total allowable memory use. Estimate how full node is. Free some pages of
112                   root node, until size is okay again!
113                 - when could this be triggered? On every 10th page alloc or something? Is there an
114                   easy way to check our own memory use?
115                 - or, we could just count how many total nodes are in memory, * it by size of a node.
116                   total memory use of the view will never be more than double this value. every time
117                   it goes over memory allowed/(node size*2), free a bunch of nodes..
118         - you also need to manage sqlite's cache size.
119           see http://bugzilla.songbirdnest.com/show_bug.cgi?id=14442
120 361         - on linux, look up 'mallinfo' and 'malloc_info'
121 364 Mem requirements during import to library still seem to be pretty much unbounded
122 -> you don't empty any caches
123  - add in simplistic memory management, including cleaning library cache and libraryview pages
124 266
125 282 Here is an idea: batching file imports. This fixes a few issues:
126         - maintaining the recording cache in libraryview etc adds a lot of expense to imports.
127           If files were added in batches of 50, say, all those inserts could be done in one go and so
128           it would be almost 50x faster .. if a method is called, we can just do the batch update
129           straight away.
130         - how about doing it in increments of MUSIC_SOURCE_VIEW_PAGE_SIZE ...
131         - long imports wouldn't be lost in a crash, just the last 50 or so songs.
132
133 278 * Library & LibraryView: sqlite_prepare all queries.
134
135 248 * recreate library!!
136 266 ----
137 260
138
139 336
140
141 TUESDAY 10th
142 -----------
143
144 * use artist[sortname] not artist[name] everywhere!
145
146
147 - in albumtree, two albums from same year have their tracks mixed together.
148   it sees: sort by date, then sort by track number.
149
150
151   make Calliope, basically, work.
152   - ie, play through library on shuffle & sorted on all configs
153         Put this into the unit tests!!
154
155
156 TUESDAY 17th
157 -----------
158
159
160 - store default sort property for each entry type, so they can be more implicit ..
161
162
163 g_slice , including hashtables ! How can we do that !!!
164 - where?
165
166
167 ----------------
168
169
170  * execute in view config dialog crashes calliope, sometimes
171
172
173 Little fuckers
174 --------------
175 seeking has gone back up its own ass.
176 - sometimes songs seem to play back silently for no reason.
177 -doesn't install a desktop icon on ubuntu
178 * skipping problem - seems to skip two when one is broken.
179 - when you're playing lots of tracks that it doesn't know the time for, it shouldn't use the
180  previous track's length each time! In fact maybe should not show a length at all.
181
182 * unplug h4 while calliope is playing through it - a. why has it decided to play though asio now,
183   and b. why does it fuck up when h4 is disconnected.
184 * also, audio outputs so I can play along with the main guitar!
185
186 test bjork (weird character encodings) code on linux & unit tests for that sort of thing!
187
188 start calliope-unstable, with tag reading on. start a local calliope. turn tag reading off, & back on.
189 Both crash!
190
191 change song on shuffle, then change to a different one, and the next played song is the one you
192 selected before ...
193
194
195         * fix last.fm thread lockups on quit. These are caused by libsoup waiting on a port and the thread
196           not quiting until the function has returned. However, we can't use libsoup asynchrously without
197           having a glib main loop in scrobblerthread. Which actually is a possibility !!!  Or, pthread
198           may have a way to cancel threads? Or we have to find a new lib to do non-blocking network io,
199           or find a way to make libsoup abort when we want it to ..
200
201
202 -> unit AND SPPEED tests for new get_id_at_path, and get_value ..
203
204 - make skipping faster! it's still pretty sluggish.
205
206 get_id_at_iter speed! resizing the columns is really slow for example!
207
208 * info should update when id is found, not when path is found.
209
210 -cancelling a long load with filesource takes a long time (basically a hang)
211         -> i think this may be fixed now
212
213 - try using finer-grained locking (an individual mutex for each source .. involving transactions too?)
214   rather than using gdklock for source.
215
216         * How to change what sources we are playing from. At the moment player has a crazy combo box
217           which does nothing.
218  fix statusus
219
220
221 * Needs a better icon
222
223
224         * Default extensions list - things we need.
225       Allow choosing of what files to search for!
226         -> if music is added that is in A but gst can't play, come up with an explanatory dialog ...
227             or, when it's played.
228         -> unit tests for these too !
229
230 * make sure transient parents are given for dialogs everywhere, or they could appear in weird places
231
232 - columns should be reorderable ..
233
234
235
236 MYSTERY TIME
237
238 209
239 224 -- test the parser more thoroughly for errors etc.
240 - test music_source_view_get_first
241 - catch many_to_one flag being written in config in wrong place.
242 test intermediate ids more thoroughly ..
243 flat/branching should be a flag.
244
245 - it would simplify things if an empty config meant view->Config still existed, but with NULL head.
246
247 260 has-child erroneously says orphans have children, you should emit has_child_toggled when adding leaf
248 224 nodes with depth < n_levels.
249 260 /* iter_has_child needs to be able to execute without taking the iter out of freefall. If the iter
250 224  * is in freefall (ie. it points to an as yet unqueried region of the node) has_child has to guess,
251  * which it does by returning TRUE unless depth==n_levels. For this reason, when reading bits of
252  * partially queried pages, leaf nodes of depth < n_levels need to have has_child_toggled emitted so
253  * they display correctly.
254  */
255
256 209
257 204 - do a bigass new unit test for process, with lots of chained processes.
258   Catch more of the race conditions. Process should run its tests LOTS of
259   times too.
260 260
261 224 -removing a track should add its file as an orphan to the view, that doesn't happen.
262 260
263 184
264 206 ----
265 260
266 206
267 207
268
269 THINGS TO ADD:
270
271 104         - we don't emit has-child toggled at the moment - it's not strictly necessary as GtkTreeView
272 260           is the only user and it can manage without, but we still should do.
273
274 184
275 425 CHRISTMAS
276 421 ----------
277
278 89 Can't access SMB shares on win32 in gtk+ file chooser
279 - can you access them under loonix?
280
281 165 sort out path handling in calliope. Don't hardcode paths in random places!
282
283 104 * skip count and play count
284 146 -> How does this relate to last.fm's play count?
285    The two cannot be linked too closely b/c plays may come from anywhere, not just calliope.
286    I  guess both measures must be taken into account when deciding popularity etc. but not
287    related in any other ways!
288    - Or you could not keep a play count!
289
290 112 - limit on size of 'now playing' label, and source choose combo box
291 -> in fact, what about that combo box?
292 260
293 43 GtkVolumeButton
294 or if not, at least make our button a gtkscale.
295 67         - on win32 there is a weird bug which makes our popup window get really stuck .. i think its
296 43         to do with gtkpopup and then alt-tab somehow ..
297 165         - and the icons are clipped.
298 260
299 184 - non-debug builds should disable all the asserts etc. for speed.
300         http://svn.gnome.org/viewvc/glib/trunk/docs/macros.txt?view=markup
301 - perhaps normal builds shouldn't, but make a seperate 'fast' build which does?
302
303 43
304 32 * View config dialog (text, sorting, layout, semantics)
305 & tree view columns - these should do something like you would expect them to !!
306 42 Right-click on columns should show a show/hide menu
307 32
308 184 * custom collation function to give natural sort order from db. well and from genericsource.
309 195
310 260 installer should detect old calliopes and update!
311 184  Make killing gconf and calliopes in installer a lot more user friendly!
312 - Only kill them if they are from our install dir.
313 - Present a dialog informing the user!
314 http://nsis.sourceforge.net/KillProcDLL_plug-in
315 - Make sure they are killed!
316
317 197 * Also, add a 'run program' once calliope is installed.
318   - http://nsis.sourceforge.net/Run_an_application_shortcut_after_an_install
319   -> Can either add a checkbox to 'installing files' page (this looks like I have to make a new .rc
320      file with a replacement dialog somehowe)
321   -> Or pop up a messagebox with "Run now?" (this is the worst way)
322   -> Or add an extra page with "Install complete" and a "run now" checkbox.
323        - nsDialogs: http://nsis.sourceforge.net/Docs/nsDialogs/Readme.html
324 260   Remember also that an elevated installer should run the program not elevated.
325 197        - http://discuss.joelonsoftware.com/default.asp?biz.5.466846.9
326 260
327 197 * Add 'version key'
328 260   -> http://nsis.sourceforge.net/Docs/Chapter4.html#4.8.3.1
329 184
330 32 when no song is playing but there is a selection, play should change to the selected song,
331 not a random one
332
333 184 replaygain working
334
335 32 * Use normal last.fm client optionally
336
337 Still to do:
338 184         - reload metadata dialog
339 32         - rganlysis thread priority too high
340
341 70
342 32 Things for before 0.1 release!
343 ------------------------------
344
345 184 dir watches
346 32 track my music collection on disk, so new added files are added to db automagically
347   -- watch library dir & automatically a'dd new songs & highlight them - works nicely with bittorrent. Or: add files in a dir automatically, don't move them but highlight/tag so they can be moved at a later date
348 184
349 32 add helptext to add music dialog, looks kind of confusing. (also work out why its crashing glade)
350 184
351 235 needs to add to library on drag ..
352 32
353 import should have lower priority, leak less memory
354 207
355 32 * gconf - crash when some values change
356 110  -> torture test
357 184
358 248
359
360
361
362
363 184 FINAL THINGS BEFORE RELEASE.
364
365 - go through all the dialogs and make sure it's all good.
366 - merge all the existing updates and go back to db ver 1
367 248 - tidy up this file & docs etc.
368 184
369 201 --------------------------------- 0.1 release I guess !
370
371
372 226 -> discuss, on like gnome-devel lists and desktop-devel lists and places like that ...
373 209 -> fix more things in 0.1 and release 0.2, and add new features into 0.3 ...
374 226 -> make loonix work on pc again
375 201
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399 260
400
401
402
403 250 .. this is the stuff to do before a 1.0 release. There is a lot! Some of it can probably move down
404    to after a 1.0 release, because there isn't that much down there!
405 260
406 250
407
408 Fix:
409 337         * player widget is really ugly under the dark ubuntu theme (toolbar is shaded but playbar isn't)
410
411 425         * i18n :(
412 274
413 250         * accessing drive H under Windows on my laptop (H is an ext3 drive which unreadable by ext2ifs,
414           so unreadable under Windows) causes gtk file chooser to basically lock up.
415 260
416 250         * see jaunty bug https://bugs.edge.launchpad.net/ubuntu/+source/linux/+bug/317781 which relates to
417 260           loss of data on ext4 when not fsync()'d or fdatasync()'d properly.
418 250            - This can't affect our database because sqlite3 syncs properly already.
419           -> The scrobbler disk cache needs to fsync after write so it stays consistent.
420           -> Whenever we write tags to a file (which we can't do anyway yet, but still) we need to make sure
421                  gstreamer syncs property.
422 261           -> what about using g_file_set_contents(): http://mail.gnome.org/archives/gtk-devel-list/2009-March/msg00082.html
423 260
424 250         * insert some space around the textual time indicator because it is changing the size of the bar a lot and that's weird (might have been done i forget)
425 260
426 345         * When tracks are removed an album might not be VA any more.
427
428 250         * THE MERGING PROBLEM:
429 32         The merging problem is the cause of the recording.initial-file-path and
430         album.inital-release-date properties. The issue is that two entries (for
431         example, two albums) may differ only by a property in a parent, such as the
432 260         album's release.date. The thing is, an album does need it's 'initial'
433 32         release highlighted, and a recording needs its highest quality file, for
434         things like the flat musiclist view and for the player. We can't just use
435         a pointer to the entry though, as this is very difficult to add to the db:
436 260         each entry needs the other's id before it can be added.
437 32         What to do? I don't know. At the moment it works with the kludges in place.
438         The backpointer entries should be doable if hard. The easiest solution is
439         to mark it as a FIXME for later on !!
440 250
441         * On shuffle: when a song is jumped to, should we replace the current song in the
442           order with it, or jump to its position in the order? Should be an option I think.
443
444         * We use time_t for dates & times which i don't like because of 2038 and all that
445           * perhaps this means use time64_t
446 260           Also I dislike how there is date and datetime, should be possible to encode which part of the
447 250           info is important in the date/time and have just one entry type, ...
448
449 267         * Follow fdo dir spec: http://standards.freedesktop.org/basedir-spec/latest/ar01s03.html
450           This really only affects the scrobbler disk queue.
451
452 358         * music source entry notifications should make sure watch-only callbacks don't check out anything
453           or at least don't check out the entry being notified on
454
455 390         * How should Calliope behave on a suspend?
456           -> http://bugzilla.gnome.org/show_bug.cgi?id=402863
457
458 260
459 250
460 Features:
461         * replace gnomevfs with gio/gvfs, and then make cd playing work again. play cds direct !!!
462           Make sure scratched CD's don't cause unresponsiveness like they used to.
463
464 309         * Improve formats - eg. 44.10Hz isn't great. "Friendly" date output would be nice (code from gtk file manager or something?)
465           Enums like file type and channels.
466
467         * Add more smart columns, and improve existing
468
469 250         * Use windows file chooser? Or, make gtk+ file chooser faster
470
471         * any files which gst can't play we need some sort of info box explaining why. In particular we
472 260           should have special ones for eg. mp3's on ubuntu/debian, where the user needs to know why
473 250           certain codecs aren't installed.
474
475         * Choosing audio output:
476                 http://blog.drinsama.de/erich/en/linux/2008122801-gstreamer-enumeration.html
477
478         * Album categories - live album, ep, bootleg etc.
479           Should these be tags? for the problem of eg. Vic Ruggiero - Alive at the Ladybug House, which
480           is predominately new material but still a live album. Allow sorting by these.
481 260
482 250         * gapless playback - playbin2
483 260
484 250         * unique names for each source - so two with libraries you don't get "copy to music library" and
485           "copy to music library"
486
487 260         * What about artists who change their name?? eg black dyke mills band -> black dyke band.
488           My thought is ARTIST RELATIONS the same way musicbrainz has, which can also be used to link band members to their
489 250       band and stuff like that !
490 260
491     * Make the process code a whole lot cooler. different ways of displaying progress other than
492 250           dialog. Note 'mathusalem' project - http://live.gnome.org/Mathusalem
493
494 260
495 250         * And make notifications non-interrupting like firefox's.
496
497         * Prevent user from using any of these extensions for db when on Windows:
498                 http://msdn.microsoft.com/en-us/library/aa378870.aspx
499           (all the system restore ones)
500           This is:
501 260                 MSDN - MSDN Library - Win32 and COM Development - Administration and Management -
502 250                 System Configuration and Servicing - System Restore - System Restore Reference - Monitored File Extensions
503           at the moment (msdn gets reorganised all the time so I don't want to use a URL)
504 260
505 250         * A Calliope auto updater, for Windows! Should be an NSIS feature somehow maybe.
506
507         * Might be nice to have a "tidy database" option where songs with no recording, etc. are deleted.
508           Although there shouldn't be any. I guess this should be a "check database consistency" tool.
509 260
510 250         * Allow non-gnome build on LInux?? The only real problem is gconf .... who is also a problem
511           on Windows. Well make it so KDE'ers and whoever need the minimum of deps to build Calliope.
512
513     * HELP for file name filter
514 260
515 250         * Use gtkrecent - at least in file-open database dialogs etc
516 260
517 361         * This would be good for people who want ipod support:
518            http://www.floola.com/modules/wiwimod/
519
520 250
521 446
522 371 Instrumentation
523         * The debug window in Pidgin looks useful. Maybe it could be adapted to be a more generic log tracer ...
524
525 Document
526         * all of the internals :) A big "how calliope works" document, referenced in comments as relevant,
527           instead of having docs scattered around. How about using gtk-doc for the actual functions, and leaving
528           major things to hand-written doc files ..
529
530
531 250 Session Management:
532    (this is such a crazy problem that I gave it its own header).
533         Session management. Here are the things I have in mind.
534           * Remembering window geometry (we do this anyway in a dumb way.)
535 267                : At the moment this is supposed to be the window manager's job. However, Windows
536                      doesn't, Metacity doesn't want to (http://blogs.gnome.org/metacity/2008/03/08/session-management/)
537                          and it wouldn't affect the app closing and reopening within the same session anyway.
538                          I definitely think we should manage our window position ourself, which won't be perfect
539                          on UNIX but perhaps one day will be, if GNOME decide to let the app manage its position,
540                          and 100% accuracy isn't vital anyway. If a WM does want to save window position itself, we
541                          should let it however!!
542 250           * Remembering open sources and playing song (although don't carry on playing, that's too much.)
543           * Remembering running processes and continuing them.
544                 -> this behaviour is unexpected so maybe should ask first time.
545           * Allowing more than one Calliope (mainly because, why not, and because I want to listen to music
546 260                 in a different Calliope to the one I'm hacking on, but on the same PC). However, the second
547 250                 instance shouldn't recall state, it should start afresh. Each saves state so that the one closed
548                 last is the one whose state persists.
549 260           * Persistance of settings!! At the moment gconf manages this but is that the right approach?
550 250                 Should gconf only be for global settings? !!!??? Where does session management end and default
551 260                 settings begin?
552 250         That's not very complex. How should this be done? Using gnome-session or equivalent and porting that
553         to Windows? Different approaches between *nix and Win32? It's all a very complex business. Dbus is
554         ropey on Windows so far.
555         References:
556 267            http://bugzilla.gnome.org/show_bug.cgi?id=552387
557 250            http://live.gnome.org/SessionManagement
558            http://live.gnome.org/SessionManagement/NewGnomeSession
559            http://live.gnome.org/SessionManagement/GnomeSession
560            http://live.gnome.org/SessionManagement/SavingState
561            http://bugzilla.gnome.org/show_bug.cgi?id=79285
562            http://www.freedesktop.org/wiki/Software/dbus
563            http://library.gnome.org/devel/libgnomeui/unstable/GnomeClient.html
564         What does Calliope really need from a session manager then?
565           * X WM's to remember its position (on Windows we can do this ourselves accurately).
566 260                 Or, in the blue sky there is talk of GTK serialising its state for us. That would be nice. It's
567 250                 really a superset of the window geometry functionality, and actually largely unnecessary I
568                 reckon (but still worth doing if it's easy). It's actually a pretty hard thing to do because
569                 Calliope needs to have its data structures matching GTK+'s state, or the sourceviews etc will do
570 260                 nothing and break. What we can do is use hooks into this imaginary GTK serialisation code to
571 250                 save Calliope's own state in the same place though.
572 260                 * allow more than one calliope, but don't open default libraries in second one (if they're already
573 250                   open?)
574                 http://live.gnome.org/SingleInstanceApps
575
576 267         Implications of session management:
577           - no more default library stuff.
578
579 250
580 259     STORING DEFAULTS
581     ----------------
582
583     Things that need storing:
584             - view type - a default for each source type
585             - playorder - just use last value might be okay?>
586             - visible columns - do we want these different for each source type ?
587             - sorting - again, different?
588
589     This is a problem for the future though I think!
590 260     *** So, the solution. Save our state into gconf, and wait. Implement GtkUnique (and port that to
591 259         Windows).
592               - http://live.gnome.org/LibUnique
593             There was some discussion over why can't you just use dbus to do what libunique does? The fact
594             is I guess libunique is a) easier than implementing dbus? b) a useful bridge for if dbus doesn't
595             work on windows (even though we may need it to for gconf 2.24+)
596             I can write a nice Windows backend for libunique and everything is cool you see.
597
598 260
599 250 Major Things:
600 306         * Tests won't pass in Libraryview with cache disabled, because of the following issue:
601           - It would be nice if entries could tell when they were only reffed by other entries and free
602           themselves appropriately. The problem is how they can know this. It's easy to track external
603           refs seperately, although atomicity is a potential concern.
604
605                 When do you need to take action?
606                 * when total ref count reaches 0, free the memory.
607                 * when external ref count reaches 0, we still need a way in to know when to free us. We really need
608                   to know who holds a reference to us .. when artist is touched, it will probably have 2 refs.
609                   can't be freed until they are. recording - 2 refs, can't be
610                 I have been worrying about the atomicity of these, but we could just say "don't unref/ref same entry
611                 in multiple threads" since source access is not multithreaded this is really not a problem i don't
612                 think.  http://bugzilla.gnome.org/show_bug.cgi?id=166020 is relevant.
613
614           The real issue is how an entry can know it's not needed.
615
616 260         * Jumping to songs & filtering views. This all needs designing and implementing. I want to be
617 250           able to at minimum jump to any song by typing words.
618 260
619 250         * Editing metadata. Writing it to file tags & rearranging filesystem - either as backup of data
620           in library, or as only output in Filesource.
621 260
622 250         * Queuing/editing playorder - perhaps a playlist above the library, muine-style
623 260
624 250         * Automatically grab metadata from Musicbrainz (3.0) .. and amazon (album art) ..
625           and last.fm, one day they will share their metadata I hope. And anywhere else we can go.
626           How do we store the album art ?
627 260
628         ->      Here is a good idea: any songs where there are errors or confusion etc, should
629 250         be tagged & highlighted for user to see. This means like VA albums with track
630         number clashes (which I guess we could probably sort out by looking at filenames
631         but that's not the point). And songs which can't be played and whatever else.
632 260
633 250         * Tagging (web2.0 sense now) albums, and syncing with some of your last.fm tags, and some of
634           the global tags ...
635 260
636 250         * More playorders: shuffle within album, shuffle albums, etc
637 260
638 250         * Get it translated! (I doubt internationalisation works at all at the moment. I never remember
639           to mark strings.)
640
641         * make an intro wizard, to set up library, set up last.fm, import music etc.
642 260
643 250         * Sharing:
644           http://snorp.net/log/tangerine [c# though]
645           libdaap ??
646 420  
647         * You could rewrite most of entry.c using GVariant when it hits GLib I imagine.
648 250
649 260
650
651
652 250 Major Possibilites:
653     * Don't do file parsing, tag reading, musicbrainz connection etc. in C. Let some Guile or JS
654           code handle the job. I saw a post on Guile being able to read Javascript recently. I'd love to
655           be able to use Scheme or Javascript to do whatever I feel like with the tags, and let people
656           create metadata plugins for other services which Calliope can use without a recompile.
657 260
658 250           A tiny bit related to this is the GSoC 2009 idea to improve GST's tag reading. It should be
659           easily usable from GUILE etc - we could create a binding inside Calliope, but it would be nice
660           to not have to.
661 260
662 250           Also, since I want Calliope data to be written back out to tags and to the FS, maybe the GUILE
663           backend can do that. Actually, I think that would introduce too much of a security risk because
664 260           suddenly arbitrary scripts can access your FS. So that can still be done in C.
665
666 250         * Rating songs/albums/etc somehow by putting them in order of preference
667 260
668 250         * EQ on a per-album/per-song basis, plus globally ... really? Don't implement this.
669 260
670 250     * CD burning - I consider this a problem of integration rather than implementation because it's
671           silly for Calliope to reimplement the wheel. On Windows we can integrate with Infra Recorder,
672           or I guess possibly bundle its core or something? (Which I think is cdrtools anyway).
673           On Linux we can integrate with everyone, including cdrtools perhaps.
674 267           GNOME has Brasero now which exposes an API.
675 351
676 446         * CD ripping: https://thomas.apestaart.org/morituri/trac/
677           best option on linux. it can probably be made to run on win32 too to replace the closed-source
678           EAC.
679
680 350         * A 'dislike' button, which won't do anything drastic like delete the file, but kind of
681           plays it less and less, and you can sometimes clean out your most disliked artists.
682 250
683
684
685 Infrastructure:
686         * find out about distributing Windows binaries with faad and mad (patent issues etc)
687 260
688 250         * wscript should run conftool.
689 260
690 418         * I really like git commit --amend. Could this be a bazaar plugin ??
691
692         * On that subject, bazaar plugins annoy me, I wish they were merged into core. The ones I 
693           like to use are: 
694              -> lessdiff (& colordiff)
695              -> lesslog
696              -> textchecker 
697
698 250         * bring waf up to date, make wscript nice and neat.
699 260
700 250         * 'jhbuild shell' doesn't work! And it seems to give some insight into MSYS's ctrl+c problem
701           when using cmd.exe as terminal.
702
703     * Spin off conftool as its own program .. or, see how easy it would be to replace it with autogen.
704
705 260         * gconf on Win32 has some weird failures depending on unset environment variables. See:
706 250           SYSTEMROOT, PATH  (of course) and TMP and TEMP somehow .. and possibly more ..
707
708         * the typeahead find in gtk open dialogs is really irratiting.
709 260
710 250         * gconf :(
711 269           -> One possible solution is use the new dconf on Windows .. we could presumably use GSettings
712              API to stick with gconf on GNOME?
713 260
714         * Just reduce the huge number of DLL's and the size of them that we have to load on startup.
715 250           I guess we could build -lite versions of some of the bigger libs that we don't really use?
716           I dunno there must be some way to trim the fat.
717 260
718 250         * Use shared gtk+ on Windows. Maybe a shared gstreamer too.
719
720 266         * looks like you can generate marshals automagically!
721         http://www.barisione.org/blog.html/p=136
722                 http://cgwalters.livejournal.com/23514.html
723
724 269         * trunk jhbuild seems to have some win32 modulesets .. I don't know how they work.
725
726 297         * waf on win32 needs some love. Most of the unit tests fail. Lots of things don't work and lots
727           of stuff in my wscript is hacks.
728
729 350         * http://code.google.com/p/omaha
730           Use this to autoupdate calliope on win32
731 250
732 402         * autogenenerate changelog from bzr log when building a tarball
733
734 250 Promote:
735         * Register Calliope's URL with last.fm people.
736 260
737 250         * http://en.wikipedia.org/wiki/List_of_GNOME_applications
738 260
739 250         * http://www.ogmaciel.com/?p=666
740
741
742 Optimise:
743         * Speed calliope startup further. speed test it!
744           - http://www.gnome.org/~federico/hacks/index.html#performance-scripts
745           - optimise all the gconf interaction; there's loads of wasted energy there.
746           - make sure sources and views output the minimum of signals possible ..
747
748         * Give libraryview indices: create index on each column used in a where clause
749           This should be done through library somehow so that it can drop and recreate the indices
750 260           on updates ..
751 351
752 349         * Optimise signal emissions. Edit the queue. Make sure changed only gets emitted if the entry
753           actually changed.
754 250
755         * Make library drop and recreate indices on big updates.
756 260
757 274         * Make sure the library cache is as much use as it could be.
758
759 250         * Just make calliope really fast! Profile it!
760 260
761 250         * http://www.sqlite.org/cvstrac/wiki?p=PerformanceTuning and http://www.sqlite.org/cvstrac/wiki?p=PerformanceTuningWindows
762 260
763 261         * The unit tests have got to being pretty slow. Speed them up as best you can by optimising the code
764           they test, but I think some also need scaling down at least when not run with --thorough.
765 269           libraryview-test in particular! Why is it so slow!!!
766 261
767     * add music dialog does searches sequentially. This is actually silly in the case that two searches
768       are on different drives, because the two would run faster concurrently.
769 250
770 269         * trace everything the source does during an import some time. It's a crazy amount of stuff! Surely
771           you could reduce that some how!
772
773 303         * This is quite a petty optimisation, but it's good to minimise gobject casts. Perhaps it's best
774           to write a tool to do this automatically.
775
776 432         * In "artist[name]:recording[name]:file[path]" for example, every time a recording is added, we
777           get a changed notify on its artist. This is correct, because that recording could have moved in
778           the list, so we might have to emit rows-reordered for the artist-node ... but, at the moment we
779           look to see if any of the recordings under artist have moved, one by one (because of the
780           recursive propagate_forwards). We should really just check the recording that actually changed,
781           and if that hasn't moved none of the others possibly could have ..
782
783 250
784 Potential Optimisations:
785         * Lazy views (ie. libraryview) could maybe on idle query the pages either side of current
786           page, and the next few pages in playorder. We don't want to go crazy and fill RAM up with
787           stuff we might discard straight away again if memory is tight though. In fact this is probably
788           best not happening where small memory footprint is more important than performance. I guess
789           that should be configurable ??? Or not.
790 260
791 250         * Make page list in musicsourceview a tree. GSequence is a Btree ...
792           First, think carefully about how the page list is used - this probably isn't actually a very
793           good optimisation.
794
795
796 Refactor:
797 374         * It seems you could make ViewNode more of an object (don't actually make it an object) but for
798           example each node could handle emit notifications in its children and the code might be more
799           logical in genericview then ..
800
801         * Music sources duplicate way too much checkin/checkout code .
802 351
803 307         * Make the guts of calliope a bit cleaner - every file has to include 'misc.h', surely this
804           should be 'calliope.h' or something?
805
806 260         * Should have MusicSourceView implementing a new 'PagedTreeModel' interface, and then a
807 250           GtkTreeModelProxy wrapper between it and the GtkTreeView.
808 260
809 250         * Use NOT NULL everywhere in Library.
810       http://fishbowl.pastiche.org/2009/01/30/why_null_is_special/
811 260
812 250     * Use sqlite's own foreign key constraints etc.
813
814 260     * Remove music_source_get_loaded - but bear in mind the generic music_source_is_empty needs a
815           way of knowing if source is loaded so it doesn't return TRUE when there are 0 entries but
816 250           the source hasn't loaded yet. Although I guess we need to emit a signal when is-empty toggles
817           anyway, so whoever calls is_empty could be expected to just watch for that signal. In fact,
818           you should probably replace is_empty with a property and anyone who needs to know it should
819           connect to notify::is_empty.
820 260
821 250         * Remove the 'Music' prefix from a bunch of the classes? I mean what else are they going to hold
822 260
823 250         * Make unit tests code as nice as possible - a set of tidy macros ..
824 260
825 250         * Sort out headers, we include all sorts of unnecessary things. You could make a tool to do that
826           perhaps.
827           HERE is a useful idea: a tool which can point out which pieces of code are gonna be affected by changing other parts !!
828 390
829 438         * entry_set_property etc. could use varargs instead of void * pointers, it would be neater.
830
831 250 prune all of the dead code
832     - hey you could make a tool to do that to !
833         - tidy all source files
834         * Doesn't follow the GNOME coding standards, although I probably don't want to follow them to the letter
835 260
836 250         * Use signal detail (::) in more places.
837 260
838         * Use g_signal_connect_object everywhere that you should.
839
840 390         * s/entry/entity/ ???
841
842 261         * Be consistent about what functions you prefix with _'s. It seems like only private but shared
843           functions need a _ prefix, static internal functions don't need one, but you like to give them
844           one anyway :(
845 260
846 264         * musicsource probably has a bunch of unnecessary interface.
847 351
848 350         * We can never really pass around const Entry *'s, because that prevents functions reffing and
849 351           unreffing the entries. It would be nice if there was some way of distinguishing between
850 350           entries that can be modified (ie. result of a checkout), and entries that can only be reffed
851           (and entries that can be reffed but must be unreffed again before call returns if possible as
852            well - ie. an entry that can't be 'owned' .. although this is awkward. The problem I have
853            in mind is that in viewconfig.c for example, part of the tree passed to view_config_walk may
854            be reffed to be returned in an accumulator, because accumulator entries are expected to have
855            one ref. It would be cool if instead, the accumulator itself was smarter and new what needed
856            unreffing and what wasn't. This would in fact mean that entries that could not be modified or
857            preserved (reffed and unreffed) could be const, because we could say you can't ref these
858            either.).
859 264
860 250
861 Test:
862         *  flesh out main-test/final
863 344
864 311         * Make sure we only have the unit tests we need.
865
866 286         * make a nice easy way to define entry trees, for unit tests mainly
867
868 261     * unit tests for last.fm - special chars etc.
869
870 250         - and, on unix, processes with and without GDK_SINGLE_THREAD
871         - I reckon should be waf option to enable all of those things!
872
873         * Fix up wscript to stop regressions in the execution speed.
874       -> store results somehow - sqlite? xml? in a year, fulltime working, you waf check say 20
875          times a day, 5 days a week, 48 weeks a year. 4800 data. Or, is there some format that allows
876          easy graph plotting? What do things like GNU graph plotting program or whatever like for input?
877          with: unique machine id (uuid I guess, plus spec)
878          what you need is, a table of measures and tests, automatically updated
879 260          and a table of results with measure id, current time,
880 250       -> spin off as a waf plugin, with a tool /script to plot graphs of the reusls
881       -> actually, this should really be part of gtester ..
882 260
883 250         * make it so reverse treemodels work - file:recording:track:release:album .. although that's a
884           pretty useless thing to do, it would test the orphan code to perfection. Actually it wouldn't,
885           because most of these joins are non-nullable (m+:1) joins. Still, you need to check those work.
886
887     * add speed test for when there are like 1-1000 files per rec.
888
889         * run main-test with custom gconf.
890                 http://blogs.gnome.org/tthurman/2008/12/13/i-may-have-posted-about-this-already/#comments
891           try this on linux first!
892 260
893 250         * test filesource-test with lots of album tagging/naming styles?  This probably requires the
894           module to be opened up slightly to allow the tests to give mock taglists.
895 260
896 250         * valgrind memfault - causes every nth malloc to fail
897 260
898 250         * And use valgrind's memcheck to sort out all of our memory leaks !
899           also, g_slice allocator can do useful stuff like say when things haven't been
900       freed on shutdown, I believe.
901
902         * strace calliope & make sure we don't do too much shit when we should be idle ! Minimise power
903           use !!
904 260
905 250         * test dialogs and changesets and all that nonsense.
906 286
907         * semantic checks on schema.
908 285           -> an entry must have some unique (non-trivial & non-shadow) properties, so merging
909          works
910           -> no circular links? things like that.
911 250
912 421         * g_test_timer is redundant, just make g_test_trap_fork work on win32 .. :)
913 260
914 445         * What happens if you remove an album, do its recordings get deleted?
915
916
917
918 250
919 Design:
920         * Make the settings as concise, pretty, intuitive and powerful as possible!
921 260
922 250         * What should the selection do when the song changes? I think if the selection is the prev song,
923           move selection, otherwise do nothing
924 260
925 250         * Make the menus logical. Don't have anything in right-click that you can't do in main menu.
926 260
927 250         * I'd prefer if we could have one close button for tabs like firefox rather than like,
928       one for each. However, see gnome bug 116650
929
930         * Just make calliope less ugly!! Check against GNOME HIG!
931 260
932     * some programs, like for example anjuta, have really cool docking interfaces. would be nice if
933           all of the interface junk in calliope could be rearranged as well. i also like the inform 7
934 250           approach of it all being two paned like a book
935 260
936         * come up with some cool theme to make the whole thing look better and less like every gtk2 app.
937 250           make it skinnable using gtk3's CSS theme engine :)
938
939 432 Integrate & standardise:
940         * Calliope's schema should really be an RDF ontology. Maybe there is one we can already
941           use.. Nepomuk has an 'id3 ontology':
942             http://www.semanticdesktop.org/ontologies/2007/05/10/nid3/
943           but this is useless (it has all the same issues as id3, such as one audo file only
944           being on one album).
945
946         * Then we can integrate with tracker and beagle
947
948         * What else is cool? Zeitgeist, Gnome Shell ..
949 250
950
951
952 -----------------------------------------------
953 1.0 release?? ..   ----------------------------
954 -----------------------------------------------
955 209
956 32 Optimisation
957 364         * entry-notify signal is emitted a lot, way too much
958 32         * the g_signal_has_handler_pending() function can save emitting signals with complex
959           arguments which noone is listening for anyway.
960 55         * http://www.gnome.org/~federico/news-2006-03.html#timeline-tools
961 111         * Power usage - don't wake up so much when main window is not visible, for example. No
962 364           need to update playback progress if its invisible.
963 128         * Use G_GNUC_PURE (no side effects) and G_GNUC_CONST (no side effects and a function only
964           of parameters), and the other available constants.
965 130         * Make a list of all the hotspots for optimisation, and optimise them all ..
966 260
967 136         * Speed up _locate_entry and friends.
968                 - Speed up compare-entries somehow
969 260                 - Interpolate? This could take up more cycles than it saves. I think it would only
970 136                   spare a few iterations so isn't worth doing.
971 260
972 168         * Precalculate (sqlite3_prepare_v2) as many queries in Library as possible.
973 260
974 390         * Why is calliope.dll > 2MB ??
975
976 260
977 32 General
978         * Tighten all the code so you are sure it all works all the time!
979         * Add unit tests for everything
980         * Why not make an amalgamation version, like SQLite's ? Would be lots faster?
981                 could be a generic utility really that does an amalgamated compile ..
982 91                 could be a waf plugin ...
983 32         * Make info pane a lot more pretty etc.
984         * Make the commandline interface completely usable, for backwards people. More usefully it
985           will make sure all the ui code is seperated off cleanly enough (even though the core does
986           depend on gtk due to musicsourceview being a gtktreemodel). I would say for this to work,
987 260           switches alone are not enough - calliope needs a set of commands such as import, play,
988 32           etc.
989         * It's a dull job, but be consistent with #includes - either each header should include
990           everything it needs, or nothing that it needs.
991         * How I can I play my iTunes music which has drm ? http://www.el-tunes.com/ !!!
992           More generally, when Calliope can't play something it should do as much as it can to
993           help the user download the plugins they need. Should this be a calliope feature, an OS
994           feature, a gstreamer feature .. ? Does totem, rhythmbox, songbird do this already?
995           One idea is a central registry online for 'what can play what' .. that way the info
996           calliope ships with has less danger of becoming stagnant in a really old install.
997 48           Points of reference for this:
998                 - Totem uses PackageKit: http://packagekit.org/
999 260           Talking of that:
1000 32         * An autoupdate mechanism on platforms that need it. ie, windows and linux built from source.
1001           I guess you should really just make it disablable for distros with packages etc.
1002 44         * A script that keeps FIXME's sync'ed with a bug tracker ...
1003 61     * i18n :(
1004 86         * All of our caches:
1005                 http://bugzilla.gnome.org/show_bug.cgi?id=168417
1006 98         * Fix any functions which are more than a couple of pages in length.
1007           -> It would be nice to have a tool which could highlight these functions ..
1008 187         * Fix all of the fixmes ....
1009 260
1010 250         * Plugin architecture?
1011            - http://taschenorakel.de/mathias/2009/01/12/gtkbuilder-based-plugin-system/
1012 260
1013 250     * Fill calliope up with interviews, .. and videos  .....   ???
1014
1015 402         * Use xesam [http://xesam.org/main] to our advantage
1016
1017 250
1018 260
1019 213 Schema:
1020 260     * It would be nice to be able sort classical music by opus, and then list the performances
1021 213           available.
1022 260
1023 52 Refactoring:
1024 260         * why not use gvalue's in entry ???
1025
1026 45 Radical:
1027 260         * allow zooming in and out of the view. At the smallest zoom all the tracks are there
1028 45           with lots of details on each one. At the highest zoom its just lists of artists, or
1029           album cover thumbnails, or whatever is appropriate.
1030 402         * fullscreen mode. Also, surely the maximise button should be fullscreen not just maximise.
1031 56
1032 MusicSource:
1033         * adding entries is traumatic. The problem is with adding an entry, and then using that
1034           Entry * object even though its now invalid. Perhaps entries should be able to be marked
1035 76           as invalid to prevent this.
1036 260
1037
1038 32 MusicSourceView:
1039         * storing the default view configs should be much more granular - at least, one for each
1040           class of musicsource, not just one big everchanging default. Maybe make it configurable
1041           too rather than using the last closed source.
1042 34         * I have used 'relation' to mean 'foreign key' in a bunch of places.
1043 42         * although the default musicsourceview implementation is meant only for small in-memory
1044           collections (eg. one or two directories/albums), it could be optimised a fair bit and
1045           made to not block for hours or use 2gb of virtual memory when it's asked to do too much.
1046 260
1047 42         * it could do with more advanced testing. I am picturing a standard source with two albums,
1048           some orphan tracks, etc. Then a textual description of how it should be displayed:
1049                 "Album 1"
1050                 ">      Artist 1"
1051                 ">      >       Track 1"
1052                 "Orphan recording 1"
1053           or some such. This would be much more intuitive than the result=gtk_tree_model_* stuff
1054           we do at the moment. And we could give more informative error message. It's quite a big
1055           job to implement though.
1056 57         * we are pretty sloppy about setting the n_ values, since they don't matter to anyone right
1057           now. Still kind of bad though. Really libraryview only this problem.
1058 260
1059 67         * a fill_node_idle - this should be smart and load the pages either side of current, and the
1060           next few pages pointed to by the playorder.
1061 260
1062 50 LibraryView:
1063 51         * LIMITs. One day it would make sense when the queries are returning 10 million rows to
1064           LIMIT them each time. At the moment 10M rows is like 640MB. Well if we just stored them
1065 260           as two ints instead of directly from sqlite, that would be down to like 80MB. LIMITs
1066 51           will slow things down a lot I believe so I want to hold off on them as long as possible.
1067 32
1068 UI:
1069         * Presets in the view config dialog could be lots better. Should be able to edit them without
1070           having to delete them and readd them and stuff.
1071 52           Also, you can't tab onto them.
1072 184         * Calliope should be able to be really thin if you want it to!
1073 260
1074 32 Processes:
1075         * see Nautilus source code b/c it does a similar thing with file ops
1076         * Estimated completion time
1077         * mathusalem
1078 260
1079 32 Windows:
1080 54         * as of 2.14, we need to either build our own gtk+ with only the gdi pixbuf loaders, or
1081           have jhbuild get jpeg62.dll and libtiff3.dll :(
1082
1083 32         * minimise our dependencies !!!! (well in general as well I guess)
1084 260
1085 445.1.1 GNOME:
1086         * with NetworkManager we can do things when network is up etc. 
1087
1088 32         * g_spawn_* has the following checks
1089                   if (!standard_input && !standard_output && !standard_error &&
1090                   (flags & G_SPAWN_CHILD_INHERITS_STDIN) &&
1091                   !(flags & G_SPAWN_STDOUT_TO_DEV_NULL) &&
1092                   !(flags & G_SPAWN_STDERR_TO_DEV_NULL) &&
1093                   (working_directory == NULL || !*working_directory) &&
1094                   (flags & G_SPAWN_LEAVE_DESCRIPTORS_OPEN))
1095           if it's all passed then the cumbersome spawn helper program isn't need. Hack up gconf to
1096 42           spawn its client this way to increase load time ! Then we can not include g_spawn_helper
1097           as well! Perhaps.
1098 260
1099 32         * improve jhbuild infrastructure - list of things to at:
1100            http://calliope.sourceforge.net/jhbuild-win32.html
1101 167            In particular, it would be nice to have new versions of packages handled. Say when a newer
1102            version is found than listed, it gave a choice (or uses the default value):
1103             - ignore
1104                 - use the newest (and change the moduleset accordingly)
1105 260                 - run specified unit tests, check that they pass, build with the newest,
1106 167                   run specified unit tests again, and if they now fail flag up the problem present more options:
1107                     - go back to old version
1108                         - leave new version, but optionally go back at a later date.
1109         This is a complex thing to implement I realise!
1110 260
1111 52         * patch under mingw fucks up with unix line endings in a patch? or something? there must
1112           be some reason my patch from svn diff mostly failed.
1113 260
1114 70         * be nice if we could use gtester on windows.
1115 260
1116 248         * gcc 4 on windows
1117 260
1118 91         * should we use wasapisink on Vista now ? well gstreamer should choose the best
1119           output automatically of course.
1120 260
1121 32 Replay gain:
1122         * is calcing rg for the song you are playing the best way? Why not just go all through collection or
1123                 something? Also process should be pausable to not cane the old cpu ??
1124         * support for audiophile/album analysis. This entails finding a single gain for an entire album. The difficultly
1125           is finding out which tracks are from the same rip of the same pressing of the same mix of an album, because
1126           otherwise we're going to get useless results. Options are I guess
1127                 - let the user decide
1128 260                 - go on
1129 32                 - do all albums with the second heuristic and let the user point out when it's wrong
1130                 - all three (configurable)
1131           So I guess the difficultly really is just implementing doing all of that. Also there would need to be a way
1132           to select which mode to playback in (although this could be guessed as well, shuffle should play in radio mode
1133           and album shuffle or sorted should play in album mode).
1134 260
1135 32 Conftool:
1136         * none of the conftool dialogs need to be modal any more but they still are.
1137 267         * we could do away with conftool's dialog building altogether, and reimplement it as
1138           a GLADE plugin using this gtk-builder code. Don't forget the original problems conftool was
1139           partly to solve - such as how difficult it is to make pretty dialogs in gtk-builder.
1140         * And, could we rewrite the rest using autogen ???
1141 260
1142
1143 172 Testing:
1144         * it's kind of weird we write tests in seperate files to where they're defined and in a
1145           different place. Especially for simple tests like AddMusicDialog's. Just put it in the
1146           same file and link it with some #define magic or something .. more complex tests could
1147 260           go in seperate files but still in the same directory.
1148 32
1149 Other features:
1150         * spectrogram
1151 260
1152 67 Bugs which are probably due to other things:
1153         * songs which are like 17777 minutes long when they're really not.
1154 260
1155 250 To read:
1156 260         * http://library.gnome.org/devel/accessibility-devel-guide/
1157 344
1158 332 Lib code:
1159         * process.c could become GProcess and GtkProcess (those aren't great names because 'process' is
1160           already an important term in the same area). GAsyncLoop? That's not very catchy.
1161 344
1162 332         * misc.c could have some stuff moved into glib
1163 344
1164 332         * format.c could go in glib, it's useful code and needs good i18n.
1165 260
1166 34 Learn from the competition:
1167         * Banshee - http://banshee-project.org/
1168         * foobar2000 - http://www.foobar2000.org/
1169         * iTunes - http://www.apple.com/itunes/
1170         * Muine - http://muine-player.org/
1171         * Songbird - http://www.songbirdnest.com/
1172         * Rhythmbox - http://www.gnome.org/projects/rhythmbox/
1173 91         del.icio.us tag 'calliope'
1174 260
1175 34         Why write Calliope with all these other players which are much more complete?
1176         The main reason is the internal database structure. Absolutely none of these projects
1177 260         show any inclination to do away with the standard metadata of basically artist, title,
1178 34         album, track. Believe me, I check worriedly for another project implementing a new
1179 260         type of internal storage all the time because I don't want to be wasting time doing
1180         something which is being done elsewhere. Seems to me there is no danger of this at
1181         all right now.
1182
1183 32 Long term thoughts
1184 ------------------
1185 260 - i would love to have an IDE which could dynamically resize the code, basically wrapping it to a
1186 229   set line width using a clever algorithm. bw.
1187
1188 188 - How could you make Calliope exposable to some sort of DJ-ing app like Traktor? What you want is to
1189   give the DJ program access to Calliope's library somehow, but to take the filename instead of
1190   letting Calliope play it.
1191 32
1192 260 - Turn your crazy database idea into a reality and make it so calliope (even in its present form) can
1193 250   connect & interact to it
1194
1195 98 - I kind of like the look of Vala. And, because it compiles down to C code a gradual rewrite would
1196   be entirely practical I think. Does a tool exist to do a best guess conversion of C code to Vala
1197   code? because this seems possible ..
1198
1199 32 - Calliope has at its core a very flexible heirachical database. The view configurations are
1200   essentially queries on this database, in a form useful for displaying. For starters, this
1201   means musicsourceview::fill-node's queries should really be handled entirely in the music
1202   source, with library generating SQL queries on the fly (or somehow using precalculated ones)
1203   and importing doing some of what the sourceview does at the moment.
1204 260
1205 32 - In the bigger picture, Calliope's database routines are suitable for managing anything with
1206   metadata that forms a heirachy (or doesn't). Photos, movies, writing, bookmarks, anything
1207   and everything. Slice them off and make a generic library, which calliope can use as a base.
1208   Only do this once you've thought of other uses for the library of course.
1209 260
1210 32 - If you do end up using GUILE for something, you could also reimplement view configs using kind of
1211 260   a LISP syntax.
1212     ((artist :sort-by name :show-orphans) >
1213 32        (album) : (release :sort-by date :sort-direction desc)
1214           ....
1215
1216 250 - Could rowid vars ever overflow ? sqlite uses long longs for them.
1217
1218 32 - http://cgwalters.livejournal.com/18523.html
1219   This is about making RhythmBox a 'transient' application - which exists largely as a notify
1220   icon, and pops up just for you to change the song. I don't really see if that's appropriate
1221   for calliope since it wants to do more than that sometimes. ..
1222 260
1223 85 - http://mpd.wikia.com/
1224   Could calliope just become an mpd client?
1225   Personally I am unconvinced of the value of mpd, it's only real use case seems to be if you
1226   have a crashy x, you can play music anyway. Since ui is seperate from core we could fairly
1227   easily make calliope a daemon or a commandline interface. It seems like several players, such
1228   as rhythmbox, kind of operate as a daemon with a dbus interface anyway, maybe we could just
1229 260   go the whole hog and set up calliope in this manner? Although I haven't looked, I imagine
1230 85   mpd would not support everything calliope wants to do without some major work.

Loggerhead is a web-based interface for Bazaar branches