I found a way in Ubuntu (9.10) to put ringtones on my iPhone 3GS... It's a bit complex to do it manually, but it's possible
1 - Mount your iPhone as a regular USB media storage (See wwwDOTubuntugeekDOTcom/how-to-connect-iphoneipod-touch-using-usbin-karmicjauntyintrepidhardy.html)
2 - Once your iPhone is mounted, get any MP3 and transcode it into mp4 format. Put the extention as .m4r
Using gstreamer from the command line:
Take a not that Gstreamer will give you the lenght in nanosec...
gst-launch filesrc location=test.mp3 ! decodebin ! audioconvert ! faac ! filesink location=test.m4r
3 - Locate the file Ringtones.plist
4 - Make a backup of Ringtones.plist just in case...
5 - Edit the file using any text editor
6 - Open /media/iphone/iTines_Control/iTunes/Ringtones.plist
7 - Add this block for your mp3 file:
Note that "Total Time" is the lenght in milliseconds of your mp3. Also, you will have to generate a randon GUID (Put any numbers you want)...
8 - Copy your mp3 renamed as TEST.m4r in the folder: /media/iphone/iTines_Control/Ringtones
And there you have a new custom ringtone for your iPhone. You do not need to jailbreak your iPhone using the tools mentionned in the webpage. But if it is, simply put the files using the SSH server if you want.
As I said, this is a bit geekie, but it works. I will have to think about making that automated using a script or an application.
Hope you enjoyed!