After an evaluation, GNOME has moved from Bugzilla to GitLab. Learn more about GitLab.
No new issues can be reported in GNOME Bugzilla anymore.
To report an issue in a GNOME project, go to GNOME GitLab.
Do not go to GNOME Gitlab for: Bluefish, Doxygen, GnuCash, GStreamer, java-gnome, LDTP, NetworkManager, Tomboy.
Bug 76528 - Allow adding / removing songs from portable MP3 players
Allow adding / removing songs from portable MP3 players
Status: RESOLVED FIXED
Product: rhythmbox
Classification: Other
Component: Removable Media
unspecified
Other Linux
: Normal enhancement
: ---
Assigned To: RhythmBox Maintainers
RhythmBox Maintainers
Depends on: 149716 327153
Blocks:
 
 
Reported: 2002-03-26 23:04 UTC by Seth Nickell
Modified: 2007-03-26 12:26 UTC
See Also:
GNOME target: ---
GNOME version: ---


Attachments
first patch (28.62 KB, patch)
2006-08-13 03:37 UTC, Jonathan Matthew
none Details | Review
additional hackery (29.02 KB, patch)
2006-08-13 06:43 UTC, Jonathan Matthew
none Details | Review
updated patch (28.30 KB, patch)
2006-10-31 10:23 UTC, James "Doc" Livingston
none Details | Review
add some multiple-mime support (33.86 KB, patch)
2006-11-25 06:06 UTC, James "Doc" Livingston
none Details | Review
better patch (39.12 KB, patch)
2006-12-11 06:08 UTC, James "Doc" Livingston
none Details | Review
updated to current cvs (39.62 KB, patch)
2006-12-24 06:06 UTC, Jonathan Matthew
none Details | Review
updated patch (43.66 KB, patch)
2007-01-29 11:44 UTC, James "Doc" Livingston
none Details | Review
better patch (46.56 KB, patch)
2007-02-02 07:44 UTC, James "Doc" Livingston
committed Details | Review
use the format a track is already in if possible (2.02 KB, patch)
2007-03-22 20:08 UTC, Adam Zimmerman
none Details | Review
slightly cleaner patch (2.03 KB, patch)
2007-03-22 20:21 UTC, Adam Zimmerman
none Details | Review

Description Seth Nickell 2002-03-26 23:04:30 UTC
Allow adding / removing songs from portable MP3 players
Comment 1 jensflorian 2003-10-17 07:51:02 UTC
Yes something like http://gtkpod.sourceforge.net/ as part of the
rhythmbox package would be really cool.
Comment 2 Sean Harshbarger 2004-02-11 02:13:09 UTC
Are we talking about ipods or about mp3 players in general?
Comment 3 Marc E. 2004-04-08 04:29:46 UTC
I would love support for my Yepp mp3 player, Its just a mass storage device
mounted on /mnt/yepp
Comment 4 Nick Dimiduk 2004-04-19 12:48:50 UTC
I use a Creative Muvo which mounts as a fat16 mass storage device, mounted on
/mnt/muvo.  I don't know that there's a convention for these device locations
though.
Comment 5 jensflorian 2004-09-14 09:18:37 UTC
I think implementing D-BUS / HAL support should allow to detect any mounted /
new plugged-in players or mass-storage devices with audio data.
Comment 6 Chris 2005-01-15 01:02:24 UTC
     One extra feature along these lines that I think would be great:
     Just supporting adding/removal of songs straight from the library seems
like it's going one step to short (plenty of options for this) what I would love
to see is the ability to:
     Select songs either by hand, or a random number (the AutoFill thing that
iTunes is doing seems very cool btw)
     Downsample those songs to a lower bitrate before storing them on the
portable player.  (I'm sure I'm not the only one that likes to have all their
music archived at a higher bitrate than than really strictly need for a portable
player?)

     This would mean there'd need to be two seperate databases, one for the pc
music and one for the portable which would add complexity, (and drastically slow
down transfers too) but it'd be very cool.  I _sort of_ do this by hand with a
couple of scripts already, but it'd be very nice to have it working with
rhythmbox!  And it'd be a point of difference, something Rhythmbox could do that
I haven't seen on any other jukebox software....
Comment 7 Alex Taylor-Noonan 2005-02-23 23:59:53 UTC
Being able to specify a directory (as a device in the leftmost window), then
highlight songs and copy them there would be nice. I'd like to be able to set a
format for that device and then have it automatically encode/downsaple to that
format. ie FLAC to 192 CBR MP3. This would work for mass storage type devices
and sharing music (make a dir on the hard drive and quickly encode). Right now I
have a FLAC to MP3 shell script to do that.
Comment 8 Michaël Arnauts 2005-03-02 19:29:48 UTC
this would be awesome, GUI-wise, it would be just a source you add to the
left-panel (besides library, radio, ipod), or maybe a replacement for "ipod",
and make it "portable player".
Comment 9 Alex Lancaster 2006-01-27 11:21:47 UTC
Some of this has now been done in bug #325602 which is now in CVS.  If this bug addresses your needs, please close this bug.

Switch component to "Removable Media".
Comment 10 Jonathan Matthew 2006-08-13 03:37:36 UTC
Created attachment 70799 [details] [review]
first patch

This seems to work OK for me.  I'd like to have a bit more control over the directory structure on the device, though.
Comment 11 Jonathan Matthew 2006-08-13 06:43:33 UTC
Created attachment 70806 [details] [review]
additional hackery

maps some gstreamer media types to mime types, mostly so you can transfer mp3s
Comment 12 James "Doc" Livingston 2006-08-14 03:40:47 UTC
For reference, what Banshee does with folder_depth >= 3 is used folders with the start of the Artist name, e.g.  G/Gr/.../Green Day/Dookie/.

We probably want to add some more RBEncoder API for passing multiple mime-types. If the current mime-type is in the list then just copying, and if not transcoding to the first type in the list that there is an encoding profile for.
Comment 13 James "Doc" Livingston 2006-10-31 10:23:51 UTC
Created attachment 75715 [details] [review]
updated patch

Updated for changes in cvs
Comment 14 James "Doc" Livingston 2006-11-25 06:06:22 UTC
Created attachment 77116 [details] [review]
add some multiple-mime support

This adds support to RBEncoder for passing multiple mime types, and makes use of it in the generic player source.

One thing that is still an issue is that when the source needs to determine the file name, it doesn't know what format it's being transcoded to, so doesn't know what extension to use.
Comment 15 James "Doc" Livingston 2006-12-11 06:08:04 UTC
Created attachment 78114 [details] [review]
better patch

This adds a new RBEncoder function that indicates which is the "best" mimetype to use out of a given set, and the appropriate file extension.

This patch works pretty well with my ipod (both ipod plugin and generic-player plugin), with one exception: we currently detect MP3s as application/x-id3 not audio/mpeg so it always transcodes them from mp3 to mp3.
Comment 16 Alex Lancaster 2006-12-11 08:02:42 UTC
Hmm, I just tried to drag and and drop an mp3 to the generic player, got this crash:


System: Linux 2.6.18-1.2849_2.fc6.cubbi_suspend2 #1 SMP Fri Dec 1 20:59:23 PST 2006 i686
X Vendor: The X.Org Foundation
X Vendor Release: 70101000
Selinux: No
Accessibility: Disabled
----------- .xsession-errors (283686 sec old) ---------------------
localuser:alex being added to access control list
warning: /etc/X11/xinit/xinitrc.d/sonypid does not end in .sh extension, ignoring
--------------------------------------------------

Memory status: size: 152207360 vsize: 0 resident: 152207360 share: 0 rss: 33779712 rss_rlim: 0
CPU usage: start_time: 1165824053 rtime: 0 utime: 353 stime: 0 cutime:333 cstime: 0 timeout: 20 it_real_value: 0 frequency: 2

Backtrace was generated from '/home/alex/bin/rhythmbox'

Using host libthread_db library "/lib/libthread_db.so.1".
[Thread debugging using libthread_db enabled]
[New Thread -1208944176 (LWP 19481)]
[New Thread -1272489072 (LWP 19491)]
0x00f83402 in __kernel_vsyscall ()

Thread 1 (Thread -1208944176 (LWP 19481))

  • #0 __kernel_vsyscall
  • #1 __waitpid_nocancel
    from /lib/libpthread.so.0
  • #2 gnome_gtk_module_info_get
    from /usr/lib/libgnomeui-2.so.0
  • #3 <signal handler called>
  • #4 impl_get_mime_types
    at /home/alex/src/remote-cvs/gnome.org/rhythmbox/plugins/generic-player/rb-generic-player-source.c line 716
  • #5 rb_removable_media_source_get_mime_types
    at /home/alex/src/remote-cvs/gnome.org/rhythmbox/sources/rb-removable-media-source.c line 419
  • #6 impl_paste
    at /home/alex/src/remote-cvs/gnome.org/rhythmbox/sources/rb-removable-media-source.c line 284
  • #7 rb_source_paste
    at /home/alex/src/remote-cvs/gnome.org/rhythmbox/sources/rb-source.c line 820
  • #8 impl_receive_drag
    at /home/alex/src/remote-cvs/gnome.org/rhythmbox/sources/rb-removable-media-source.c line 395
  • #9 rb_source_receive_drag
    at /home/alex/src/remote-cvs/gnome.org/rhythmbox/sources/rb-source.c line 989
  • #10 sourcelist_drag_received_cb
    at /home/alex/src/remote-cvs/gnome.org/rhythmbox/shell/rb-shell.c line 2701
  • #11 IA__gtk_marshal_VOID__POINTER_POINTER
    at gtkmarshal.c line 661
  • #12 g_closure_invoke
    from /lib/libgobject-2.0.so.0
  • #13 g_signal_override_class_closure
    from /lib/libgobject-2.0.so.0
  • #14 g_signal_emit_valist
    from /lib/libgobject-2.0.so.0
  • #15 g_signal_emit
    from /lib/libgobject-2.0.so.0
  • #16 drop_received_cb
    at /home/alex/src/remote-cvs/gnome.org/rhythmbox/sources/rb-sourcelist.c line 473
  • #17 rb_marshal_VOID__OBJECT_INT_POINTER
    at rb-marshal.c line 855
  • #18 g_closure_invoke
    from /lib/libgobject-2.0.so.0
  • #19 g_signal_override_class_closure
    from /lib/libgobject-2.0.so.0
  • #20 g_signal_emit_valist
    from /lib/libgobject-2.0.so.0
  • #21 g_signal_emit
    from /lib/libgobject-2.0.so.0
  • #22 rb_sourcelist_model_drag_data_received
    at /home/alex/src/remote-cvs/gnome.org/rhythmbox/sources/rb-sourcelist-model.c line 315
  • #23 rb_tree_drag_dest_drag_data_received
    at /home/alex/src/remote-cvs/gnome.org/rhythmbox/lib/rb-tree-dnd.c line 226
  • #24 rb_tree_dnd_drag_data_received_cb
    at /home/alex/src/remote-cvs/gnome.org/rhythmbox/lib/rb-tree-dnd.c line 793
  • #25 _gtk_marshal_VOID__OBJECT_INT_INT_BOXED_UINT_UINT
    at gtkmarshalers.c line 2120
  • #26 g_closure_invoke
    from /lib/libgobject-2.0.so.0
  • #27 g_signal_override_class_closure
    from /lib/libgobject-2.0.so.0
  • #28 g_signal_emit_valist
    from /lib/libgobject-2.0.so.0
  • #29 g_signal_emit_by_name
    from /lib/libgobject-2.0.so.0
  • #30 gtk_drag_selection_received
    at gtkdnd.c line 1593
  • #31 _gtk_marshal_VOID__BOXED_UINT
    at gtkmarshalers.c line 1457
  • #32 g_closure_invoke
    from /lib/libgobject-2.0.so.0
  • #33 g_signal_override_class_closure
    from /lib/libgobject-2.0.so.0
  • #34 g_signal_emit_valist
    from /lib/libgobject-2.0.so.0
  • #35 g_signal_emit_by_name
    from /lib/libgobject-2.0.so.0
  • #36 gtk_selection_retrieval_report
    at gtkselection.c line 2770
  • #37 IA__gtk_selection_convert
    at gtkselection.c line 1075
  • #38 IA__gtk_drag_get_data
    at gtkdnd.c line 845
  • #39 rb_tree_dnd_drag_drop_cb
    at /home/alex/src/remote-cvs/gnome.org/rhythmbox/lib/rb-tree-dnd.c line 757
  • #40 _gtk_marshal_BOOLEAN__OBJECT_INT_INT_UINT
    at gtkmarshalers.c line 370
  • #41 g_closure_invoke
    from /lib/libgobject-2.0.so.0
  • #42 g_signal_override_class_closure
    from /lib/libgobject-2.0.so.0
  • #43 g_signal_emit_valist
    from /lib/libgobject-2.0.so.0
  • #44 g_signal_emit_by_name
    from /lib/libgobject-2.0.so.0
  • #45 gtk_drag_dest_drop
    at gtkdnd.c line 2154
  • #46 gtk_drag_find_widget
    at gtkdnd.c line 1756
  • #47 gtk_drag_find_widget
    at gtkdnd.c line 1741
  • #48 gtk_drag_find_widget
    at gtkdnd.c line 1741
  • #49 gtk_drag_find_widget
    at gtkdnd.c line 1741
  • #50 gtk_drag_find_widget
    at gtkdnd.c line 1741
  • #51 gtk_drag_find_widget
    at gtkdnd.c line 1741
  • #52 gtk_drag_find_widget
    at gtkdnd.c line 1741
  • #53 _gtk_drag_dest_handle_event
    at gtkdnd.c line 1441
  • #54 IA__gtk_main_do_event
    at gtkmain.c line 1456
  • #55 gdk_event_dispatch
    at gdkevents-x11.c line 2320
  • #56 g_main_context_dispatch
    from /lib/libglib-2.0.so.0
  • #57 g_main_context_check
    from /lib/libglib-2.0.so.0
  • #58 g_main_loop_run
    from /lib/libglib-2.0.so.0
  • #59 IA__gtk_main
    at gtkmain.c line 1001
  • #60 main
    at /home/alex/src/remote-cvs/gnome.org/rhythmbox/shell/main.c line 382
  • #0 __kernel_vsyscall

Comment 17 James "Doc" Livingston 2006-12-11 12:46:51 UTC
That crash can be fixed by changing "*mime != NULL" to "mime && *mime != NULL" in the for loop condition in impl_get_mime_types (rb-generic-player-source.c)
Comment 18 derGott 2006-12-20 00:20:21 UTC
FYI

I downloaded the sources from gnome ftp: http://ftp.gnome.org/pub/GNOME/sources/rhythmbox/0.9/
latest patch does not work fully with version 0.9.6 although rb-0.9.6 was online before this patch:

---------------------------
Hunk #6 FAILED at 945.
Hunk #7 succeeded at 1221 (offset 33 lines).
1 out of 7 hunks FAILED -- saving rejects to file sources/rb-ipod-source.c.rej
---------------------------


and with 0.9.7 is even worse and of course it does not compile:

---------------------------
patching file backends/rb-encoder.c
patching file backends/rb-encoder.h
patching file backends/gstreamer/rb-encoder-gst.c
Hunk #1 FAILED at 67.
Hunk #2 succeeded at 81 (offset 1 line).
Hunk #4 FAILED at 254.
Hunk #5 FAILED at 277.
Hunk #6 succeeded at 642 (offset 15 lines).
Hunk #8 succeeded at 874 (offset 15 lines).
Hunk #10 succeeded at 975 (offset 15 lines).
Hunk #11 FAILED at 983.
Hunk #12 FAILED at 1002.
Hunk #13 succeeded at 1035 (offset 4 lines).
5 out of 13 hunks FAILED -- saving rejects to file backends/gstreamer/rb-encoder-gst.c.rej
patching file bindings/python/rb.defs
patching file lib/rb-util.c
Hunk #1 succeeded at 872 (offset 14 lines).
patching file lib/rb-util.h
patching file plugins/generic-player/rb-generic-player-source.c
patching file plugins/generic-player/rb-generic-player-source.h
patching file shell/rb-removable-media-manager.c
patching file shell/rb-removable-media-manager.h
patching file sources/rb-ipod-source.c
Hunk #4 succeeded at 911 (offset 5 lines).
Hunk #6 FAILED at 946.
Hunk #7 succeeded at 1195 (offset 7 lines).
1 out of 7 hunks FAILED -- saving rejects to file sources/rb-ipod-source.c.rej
patching file sources/rb-removable-media-source.c
patching file sources/rb-removable-media-source.h
------------------------
Comment 19 Jonathan Matthew 2006-12-24 06:06:56 UTC
Created attachment 78852 [details] [review]
updated to current cvs
Comment 20 Alex Lancaster 2006-12-24 10:10:56 UTC
While this patch no longer crashes, when I drag an mp3 from the Library to a generic player, nothing is transferred and I see the following warning on the console:

(rhythmbox:31193): Rhythmbox-CRITICAL **: rb_encoder_gst_get_preferred_mimetype: assertion `mime_types != NULL' failed
Comment 21 derGott 2007-01-01 15:20:30 UTC
It compiles great with 0.9.7, but my (no-name chinese) player is not visible in rhythmbox. I saw that plugin name is "Portable Players - iPod".

shouldn't this plugin/patch work with all mp3-players, not just with iPod?
Comment 22 derGott 2007-01-01 20:25:19 UTC
sorry, my mistake ... I read a little bit, learned a lot about HAL and added my player's fdi informations. The player is recognized and I am now able to play and transfer files to my player.


I have a few objections/questions:

1. rhythmbox does not copy files to the player, but encodes the files before copying. it converts my mp3 files to ogg (because that profile is selected and it is pretty time consuming. why does it encode files without asking? can we somehow avoid this behavior?

2. RB always creates the following directory structure on the the player:
"Artist/Album/" although I selected "Artist-Album"

3. It always asks do I want to overwrite the file which is existing on the player. It would be better to be able to set default option, because nobody wants to click 30 times on "No".

and when I click on "No", RB shows an error: 
-----------
Could not open vfs file "file://..../myFile.ogg" for writing: file exists"
-----------

although it should not write anything. 
clicking on "Yes" encodes the file again without errors.


4. RB doesn't remember when the "browse" area is open for the player. I have to open it every time I connect my player to my computer

5. when I delete a file directly from mp3 player, it does not delete it, but it just removes it from the list. manual "sync" does not help


Comment 23 Ernst Sjöstrand 2007-01-12 04:12:12 UTC
sources/rb-ipod-source.c

has moved to

plugins/ipod/rb-ipod-source.c

otherwise the patch works great here. Only issue is that encodes my mp3's to mp3, a bit unnecessary!
Comment 24 Michaël Arnauts 2007-01-12 08:01:32 UTC
I don't think that's unnecessary. My mp3's I have on my harddisk are of 192 KBit or more, and the ones I play on my MP3 player don't have to be of that high quality since you also have a lot of enviroment noise... If they would be copied with 192 Kbit, a lot of space would be wasted (no, I don't have the luxary to buy an mp3 player with a few gigabyte of space, I only have 128 MB, so every byte counts :) )
Comment 25 James "Doc" Livingston 2007-01-29 11:44:09 UTC
Created attachment 81424 [details] [review]
updated patch

Update to current svn, and fix a number of fairly big (over half a meg per track copied) memory leaks.


(In reply to comment #23)
> otherwise the patch works great here. Only issue is that encodes my mp3's to
> mp3, a bit unnecessary!

(In reply to comment #24)
> I don't think that's unnecessary. My mp3's I have on my harddisk are of 192
> KBit or more, and the ones I play on my MP3 player don't have to be of that
> high quality since you also have a lot of enviroment noise... If they would be
> copied with 192 Kbit, a lot of space would be wasted (no, I don't have the
> luxary to buy an mp3 player with a few gigabyte of space, I only have 128 MB,
> so every byte counts :) )

This is probably something we should let people change on a per-player basis. Since whether to re-encode at a lower bitrate really depends on how much space is on your player.

This could probably go in a future dialog which lets you look at/change the properties of your player, along with other things like how much space to use up for automagically synced music and what to fill it with.
Comment 26 James "Doc" Livingston 2007-01-29 13:33:37 UTC
There is a crasher bug in what I just uploaded. You need to comment out the 'g_list_foreach (profiles, (GFunc)g_object_unref, NULL);' line in backends/gstreamer/rb-player-gst.c:get_profile_from_mime_type
Comment 27 James "Doc" Livingston 2007-02-02 07:44:06 UTC
Created attachment 81740 [details] [review]
better patch

Fixes the above bug, and also makes it so that iPods can actually play transcoded tracks. They seem to choose the decoder solely on the file extension, so this means that we should really hold a map of things like audio/mpeg->mp3 and the like - but most people would have their audio encoding profiles set correctly.

With this patch, copying any assortment of tracks to my ipod (with the ipod plugin, and generic plugin) works well for me. The only issue I've noticed is the always-transcode one mentioned above.
Comment 28 Ernst Sjöstrand 2007-02-02 08:03:31 UTC
What about data from .is_audio_player?

My SE W800 phony wants songs in the MP3/ directory, so a way to configure that would be great.
Comment 29 James "Doc" Livingston 2007-02-02 10:30:36 UTC
That's an additional piece of code, that I haven't looked at yet - but it should be fairly simple to write. A UI to modify those things is further off though.

Or you could edit HAL's .fdi file to add the data and submit a patch to HAL so the device is supported for everyone :)
Comment 30 James "Doc" Livingston 2007-02-03 13:31:21 UTC
I've committed the patch to svn. We still need to do things like not always transcoding, and some UI for options, but the basics work.
Comment 31 Ernst Sjöstrand 2007-02-05 20:43:12 UTC
This is with ubuntu's 0.9.7.90:
Perhaps there's missing a dot in some g_strdup_printf calls in impl_build_dest_uri() ?
I got a file called "0 - Rentmp3" on my phone from rhythmbox.
Comment 32 James "Doc" Livingston 2007-02-06 09:28:24 UTC
(In reply to comment #31)
> This is with ubuntu's 0.9.7.90:
> Perhaps there's missing a dot in some g_strdup_printf calls in
> impl_build_dest_uri() ?
> I got a file called "0 - Rentmp3" on my phone from rhythmbox.


Fixed in svn, we were using the wrong variable for the extension.
Comment 33 Adam Zimmerman 2007-02-21 22:20:28 UTC
One thing I've noticed is that rhythmbox only looks at the first mimetype in the list that the player supports. So if my player supports both mp3 and ogg files, the mp3s will transfer fine, but the oggs will fail silently, with this debug output:

(14:15:37) [0x80f3078] [impl_paste] rb-removable-media-source.c:302: failed to find acceptable mime type for file:///home/adam/music/Arthur%20Yoria/Ill%20Be%20Here%20Awake/02-Permanent-Arthur%20Yoria.ogg

If I have an encoding profile set up for mp3, oggs will be transcoded to mp3 instead of being simply transferred. This is with today's svn.
Comment 34 James "Doc" Livingston 2007-02-25 06:10:51 UTC
There are two things that cause this:

1) The new code that determines the preferred format doesn't check if it's already in an acceptable format. This means that it will always try to transcode, unless the "preferred" format happens to turn out to be the original format. Oops.

2) HAL's FDI file uses "application/ogg" when it probably means "audio/vorbis". When matching encoders we only look for audio encoding elements - which means the Ogg Vorbis pipeline never matches.
Comment 35 Adam Zimmerman 2007-03-15 00:41:12 UTC
(In reply to comment #34)
> 2) HAL's FDI file uses "application/ogg" when it probably means "audio/vorbis".
> When matching encoders we only look for audio encoding elements - which means
> the Ogg Vorbis pipeline never matches.

Has this been brought to the attention of the HAL developers? I didn't notice anything that looked like this problem in the freedesktop bugzilla.
Comment 36 James "Doc" Livingston 2007-03-15 13:06:03 UTC
I asked them about it a while back, but I don't think we got anything sorted out, so I'll ask again. In any case, I've just committed a change to svn trunk to map application/ogg to audio/x-vorbis.
Comment 37 Adam Zimmerman 2007-03-22 20:08:33 UTC
Created attachment 85133 [details] [review]
use the format a track is already in if possible

This might qualify under "dirty dirty hack", and I suspect the code could be better (this is my first real foray into C), but this patch seems to work for me. It goes through the mime_types list, and if it contains the mime type of the current track, it copies it to the front of the list. This ensures that if an encoder is set up for that type, it will be chosen first, and the track will not be reencoded. If there is no encoder for the type, or if the mime-type of the track is not on the list, it should have no effect.

There is likely a much better way to solve the problem, but I figured I'd throw this out there, just in case. It's only been tested a few times, so there could easily be bugs.
Comment 38 Adam Zimmerman 2007-03-22 20:21:02 UTC
Created attachment 85134 [details] [review]
slightly cleaner patch

Just realized I don't need to cast entry_mime to a char* now that I'm using g_strdup to copy the string before I put it into the list.
Comment 39 James "Doc" Livingston 2007-03-26 12:26:54 UTC
I've added a more correct version to svn. Thanks for the patch.

Setting per-device options is now bug #422975, and the other enchancements mentioned here already have other bugs for them. Marking fixed.