On Thu, 2005-10-20 at 15:56 -0700, Marc E. wrote:
> Does it have the same functionality as iTunes, like if you stop playing
> it, and start playing something else, then you play the old one, it
> picks up at the time you left it?
Attached is a first attempt at doing this. There are a couple of things
that need improvement:
* It doesn't save the position when quitting, you have to stop or change
what's playing first.
* Occasionally the seek bar has the wrong duration
* This should really be gone with the "song changed" signal, and a new
"pre-change" signal (for doing things with the track that is ending).
Cheers,
James "Doc" Livingston
--
| <- You must be smarter than this stick to ride the Internet
-- Mike Handler, paraphrased from Bev White
Index: rhythmdb/rhythmdb-tree.c
===================================================================
RCS file: /cvs/gnome/rhythmbox/rhythmdb/rhythmdb-tree.c,v
retrieving revision 1.75
diff -u -u -r1.75 rhythmdb-tree.c
--- rhythmdb/rhythmdb-tree.c 20 Oct 2005 16:42:16 -0000 1.75
+++ rhythmdb/rhythmdb-tree.c 22 Oct 2005 04:08:38 -0000
@@ -420,6 +420,9 @@
case RHYTHMDB_PROP_POST_TIME:
ctx->entry->podcast->post_time = parse_ulong (ctx->buf->str);
break;
+ case RHYTHMDB_PROP_PLAYBACK_POS:
+ ctx->entry->podcast->playback_pos = parse_ulong (ctx->buf->str);
+ break;
case RHYTHMDB_PROP_TITLE_SORT_KEY:
case RHYTHMDB_PROP_GENRE_SORT_KEY:
case RHYTHMDB_PROP_ARTIST_SORT_KEY:
@@ -766,6 +769,10 @@
case RHYTHMDB_PROP_POST_TIME:
if (entry->podcast)
save_entry_ulong (ctx, elt_name, entry->podcast->post_time);
+ break;
+ case RHYTHMDB_PROP_PLAYBACK_POS:
+ if (entry->podcast)
+ save_entry_ulong (ctx, elt_name, entry->podcast->playback_pos);
break;
case RHYTHMDB_PROP_TITLE_SORT_KEY:
case RHYTHMDB_PROP_GENRE_SORT_KEY:
Index: rhythmdb/rhythmdb.c
===================================================================
RCS file: /cvs/gnome/rhythmbox/rhythmdb/rhythmdb.c,v
retrieving revision 1.120
diff -u -u -r1.120 rhythmdb.c
--- rhythmdb/rhythmdb.c 20 Oct 2005 16:42:16 -0000 1.120
+++ rhythmdb/rhythmdb.c 22 Oct 2005 04:08:44 -0000
@@ -2149,6 +2149,9 @@
case RHYTHMDB_PROP_POST_TIME:
entry->podcast->post_time = g_value_get_ulong (value);
break;
+ case RHYTHMDB_PROP_PLAYBACK_POS:
+ entry->podcast->playback_pos = g_value_get_ulong (value);
+ break;
case RHYTHMDB_NUM_PROPERTIES:
g_assert_not_reached ();
break;
@@ -2829,6 +2832,7 @@
ENUM_ENTRY (RHYTHMDB_PROP_COPYRIGHT, "Podcast copyright (gchararray) [copyright]"),
ENUM_ENTRY (RHYTHMDB_PROP_IMAGE, "Podcast image(gchararray) [image]"),
ENUM_ENTRY (RHYTHMDB_PROP_POST_TIME, "Podcast time of post (gulong) [post-time]"),
+ ENUM_ENTRY (RHYTHMDB_PROP_PLAYBACK_POS, "Saved playback position (gulong) [playback-position]"),
{ 0, 0, 0 }
};
g_assert ((sizeof (values) / sizeof (values[0]) - 1) == RHYTHMDB_NUM_PROPERTIES);
Index: rhythmdb/rhythmdb.h
===================================================================
RCS file: /cvs/gnome/rhythmbox/rhythmdb/rhythmdb.h,v
retrieving revision 1.52
diff -u -u -r1.52 rhythmdb.h
--- rhythmdb/rhythmdb.h 21 Oct 2005 03:05:44 -0000 1.52
+++ rhythmdb/rhythmdb.h 22 Oct 2005 04:08:48 -0000
@@ -112,6 +112,7 @@
RHYTHMDB_PROP_COPYRIGHT,
RHYTHMDB_PROP_IMAGE,
RHYTHMDB_PROP_POST_TIME,
+ RHYTHMDB_PROP_PLAYBACK_POS,
RHYTHMDB_NUM_PROPERTIES
} RhythmDBPropType;
@@ -138,8 +139,9 @@
RBRefString *lang;
RBRefString *copyright;
RBRefString *image;
- gulong status; //0-99: downloading; 100: Conplete; 101: Error; 102: wait; 103: pause;
+ gulong status; /*0-99: downloading; 100: Conplete; 101: Error; 102: wait; 103: pause;*/
gulong post_time;
+ gulong playback_pos; /* saved playback position */
} RhythmDBPodcastFields;
@@ -343,6 +345,11 @@
case RHYTHMDB_PROP_POST_TIME:
if (entry->podcast)
return entry->podcast->post_time;
+ else
+ return 0;
+ case RHYTHMDB_PROP_PLAYBACK_POS:
+ if (entry->podcast)
+ return entry->podcast->playback_pos;
else
return 0;
case RHYTHMDB_PROP_STATUS:
Index: shell/rb-shell-player.c
===================================================================
RCS file: /cvs/gnome/rhythmbox/shell/rb-shell-player.c,v
retrieving revision 1.177
diff -u -u -r1.177 rb-shell-player.c
--- shell/rb-shell-player.c 22 Oct 2005 02:13:04 -0000 1.177
+++ shell/rb-shell-player.c 22 Oct 2005 04:08:53 -0000
@@ -162,6 +162,7 @@
static void gconf_play_order_changed (GConfClient *client,guint cnxn_id,
GConfEntry *entry, RBShellPlayer *player);
+static void rb_shell_player_entry_changing (RBShellPlayer *player);
#ifdef HAVE_MMKEYS
static void grab_mmkey (int key_code, GdkWindow *root);
@@ -738,6 +739,7 @@
g_return_if_fail (player->priv != NULL);
+ rb_shell_player_entry_changing (player);
if (player->priv->playing_attempt_entry)
rhythmdb_entry_unref (player->priv->db, player->priv->playing_attempt_entry);
@@ -1119,6 +1121,8 @@
songs = rb_source_get_entry_view (player->priv->source);
+ rb_shell_player_entry_changing (player);
+
if (player->priv->playing_attempt_entry)
rhythmdb_entry_unref (player->priv->db, player->priv->playing_attempt_entry);
rhythmdb_entry_ref (player->priv->db, entry);
@@ -1129,6 +1133,12 @@
if (!rb_shell_player_play (player, &tmp_error))
goto lose;
+ if (entry && rhythmdb_entry_get_ulong (entry, RHYTHMDB_PROP_TYPE) == RHYTHMDB_ENTRY_TYPE_PODCAST_POST) {
+ gulong save_time = rhythmdb_entry_get_ulong (entry, RHYTHMDB_PROP_PLAYBACK_POS);
+ rb_debug ("restoring podcast playback position %d", save_time);
+ rb_player_set_time (player->priv->mmplayer, save_time);
+ }
+
rb_entry_view_set_playing_entry (songs, entry);
rb_debug ("Success!");
@@ -1957,8 +1967,8 @@
player);
}
+ rb_shell_player_entry_changing (player);
player->priv->source = source;
-
if (player->priv->playing_attempt_entry)
rhythmdb_entry_unref (player->priv->db, player->priv->playing_attempt_entry);
player->priv->playing_attempt_entry = NULL;
@@ -2395,6 +2405,29 @@
}
return TRUE;
+}
+
+static void
+rb_shell_player_entry_changing (RBShellPlayer *player)
+{
+ RhythmDBEntry *old_entry = player->priv->playing_attempt_entry;
+
+ if (old_entry) {
+ if (rhythmdb_entry_get_ulong (old_entry, RHYTHMDB_PROP_TYPE) == RHYTHMDB_ENTRY_TYPE_PODCAST_POST) {
+ gulong cur_time = rb_player_get_time (player->priv->mmplayer);
+ gulong duration = rhythmdb_entry_get_ulong (old_entry, RHYTHMDB_PROP_DURATION);
+ GValue val = {0,};
+
+ /* save the position, if not withing 5 seconds of either end */
+ if ((cur_time < 5) && (cur_time > duration - 5))
+ cur_time = 0;
+
+ rb_debug ("saving podcast playback position %d", cur_time);
+ g_value_init (&val, G_TYPE_ULONG);
+ g_value_set_ulong (&val, cur_time);
+ rhythmdb_entry_set (player->priv->db, old_entry, RHYTHMDB_PROP_PLAYBACK_POS, &val);
+ }
+ }
}
#ifdef HAVE_MMKEYS
Attachment:
signature.asc
Description: This is a digitally signed message part