RSS

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

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

Loggerhead is a web-based interface for Bazaar branches