| 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 | 452 | => Problem #9020: I am confused about the removal queue and count_references. See library.c:2054. |
| 63 | ||
| 64 | 451 | * Replace 'process' system with GTask which is hopefully less crappy |
| 65 | -> GTask is conceptually totally different from Process. | |
| 66 | - A GTask is one work item, so to process 10k songs, we would need 10k GObjects * 3 or 4 task | |
| 67 | classes. | |
| 68 | - Whereas, Process's work items are much more lightweight. They are not ref counted or any | |
| 69 | such nonsense and I think are much closer to what we need. | |
| 70 | - GTask's examples are things like parsing a log file and RSS reading. With Process, these | |
| 71 | would cause extra overhead because of the queueue which would only be for one item. | |
| 72 | - Using GTask in calliope means | |
| 73 | -> How about implementing Process *on top* of GTask - like a GTaskQueue or GProcess. ... | |
| 74 | -> mailed chergert | |
| 75 | ||
| 76 | 418 | ---------------------------------------------------------- |
| 77 | 415 | |
| 78 | 451 | * 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