[Weekly Report] Week 4: Rhythmbox iPod/MTP Syncing
- From: Paul A Bellamy <paul a bellamy gmail com>
- To: "gnome-soc-list gnome org" <gnome-soc-list gnome org>, rhythmbox-devel gnome org
- Subject: [Weekly Report] Week 4: Rhythmbox iPod/MTP Syncing
- Date: Mon, 22 Jun 2009 10:26:32 -0700
This last week I have been working on the Syncing function for the
iPod. I am using the iPod plugin as a way to prototype the syncing
function before moving the appropriate code up to the
RBMediaPlayerSource, and into the MTP plugin.
The big victory for me last week was to get the GKeyFile saving data
for the different iPods. In order to associate the preferences
(auto-sync, sync podcasts?, what to sync, etc...) with the device, the
plugin saves a GKeyFile ipod-prefs.conf. The file is not created/loaded
until it is needed. In the file there is a group for each iPod, which
stores all it's properties, and a list of playlists selected for
syncing. In order to parse this file and pass it nicely between the
plugin and each RBiPodSource, a new GObject was needed, RBiPodPrefs.
When a new RBiPodSource is being constructed the plugin will pass it a
pointer to the plugin's keyfile. The RBiPodPrefs is created in
RBiPodSourcePrivate->prefs, and if/when the prefs are accessed
RBiPodPrefs loads/saves the file as needed. There was a bit of
debugging to do with this, (functions which return errors, calling other
sub-functions which return errors), and so I was learning about GError
objects.
To have a unique device identifier, I got the
rb_ipod_helpers_get_serial() function working, so now the identifier in
the GKeyFile is the serial number for the device.
Last week, I also started on the hashing stuff, for comparison
between the itinerary (what is to be synced) and the ipod database. I
created two functions for the hash table (a hashing one, and a
comparison one). The hashing one does a g_str_hash ( Title + Artist +
Duration + Album ), where the plus signs are appending.
The plan for comparison between the databases is to have two
GHashTables, one populated from the itinerary, and one from the iPod,
that we can compare between and figure out what needs addition and what
needs removal.
A few entries from my work log:
: wrote hashing and equality functions.
- The equality function simply calls a hash on both, then
compares that
- The hashing function has a comment which could be added to
increase specificity for podcasts if needed.
: Added rb-ipod-prefs.h and rb-ipod-prefs.c, to help passing
preferences between the rb-ipod-source and the rb-ipod-plugin
: Worked on rb-ipod-prefs. got it being used by RBiPodSource and
RBIpodPlugin, and building.
: Fixed rb-ipod-prefs
- Ignores it if it can't find the file.
- File will be created at first save.
: Fixed the rb_ipod_helpers_get_serial() function, now queries Hal
for parent_udi->storage.serial
This coming week I will be continuing work on the syncing mechanisms,
focusing on populating the GHashTables. I have already got the
ipod_sync_hash populated from ipod_db->entry_map. However, I am a bit
stuck on how to populate the itinerary_sync_hash. It will get a list of
playlist names from the GKeyFile, and has a pointer to the RhythmDB for
the library (passed via the 'shell' object). However, I am not sure how
to get from the playlist names, to a list of the entries in that
playlist. The current method is something similar to:
# // Get all the names of the playlists
# rb_playlist_manager_get_playlist_names ((RBPlaylistManager *)
rb_shell_get_playlist_manager (shell),
# &playlists,
# NULL);
# // for each entry in the GKeyFile
# for ( iter = (const gchar **) rb_ipod_prefs_get_entries(
ipod_priv->prefs );
# *iter != NULL;
# iter++ )
# {
# // get playlist with matching name.
# for (playlist_iter = (const gchar **) playlists; playlist_iter
!= NULL; playlist_iter++ ) {
# if ( playlist_iter == iter ) {
# // Get it's RBPlaylistSourcePrivate so we can get at
it's entries.
# pl_priv = PLAYLIST_SOURCE_GET_PRIVATE
((RBPlaylistSource *) _get_playlist_by_name ((RBPlaylistManager *)
rb_shell_get_playlist_manager (shell), playlist_iter));
# // Insert the entres for this playlist into the
itinerary_sync_hash
# g_hash_table_foreach ( pl_priv->entries,
rb_ipod_helpers_hash_table_insert, itinerary_sync_hash );
# break;
# }
# }
# }
Obviously, the above will not quite work. If anyone has any advice on
how to do this in a better way I would *really* appreciate it.
Thanks,
Paul
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]