commit 567831784ab1c3f49ec460eaf27b1dcfd4b4d03f
Author: Adam Broschinski <[email protected]>
Date: Fri Apr 16 17:10:36 2010 -0400
Cleaned up shuffle podcast related code
I cleaned up the code related to counting podcasts and podcast
playlists. It should be much easier to correct if needed when
we find out how to add audiobooks.
src/itdb_itunesdb.c | 81 +++++++++++++++++++++++++++------------------------
1 files changed, 43 insertions(+), 38 deletions(-)
---
diff --git a/src/itdb_itunesdb.c b/src/itdb_itunesdb.c
index 24d06b7..b697e6d 100644
--- a/src/itdb_itunesdb.c
+++ b/src/itdb_itunesdb.c
@@ -6294,6 +6294,7 @@ static gboolean write_hths (FExport *fexp)
WContents *cts;
GList *gl;
guint32 trackcnt;
+ guint32 podcastcnt;
g_return_val_if_fail (fexp, FALSE);
g_return_val_if_fail (fexp->itdb, FALSE);
@@ -6302,6 +6303,7 @@ static gboolean write_hths (FExport *fexp)
cts = fexp->wcontents;
hths_seek = cts->pos;
trackcnt = itdb_tracks_number(fexp->itdb);
+ podcastcnt = 0;
/* Add Track list offset to bdhs header */
/* If the bdhs header changes make sure the seek value is still correct
*/
@@ -6325,10 +6327,15 @@ static gboolean write_hths (FExport *fexp)
put32lint_seek(cts, cts->pos, track_seek);
g_return_val_if_fail (write_rths(cts, track), FALSE);
+ if (track->mediatype == ITDB_MEDIATYPE_PODCAST)
+ podcastcnt++;
+
/* Go to the offset for the next track */
track_seek += 4;
}
-
+ /* Add the number of nonpodcasts to bdhs header */
+ /* If the bdhs header changes make sure the seek value is still correct
*/
+ put32lint_seek(cts, trackcnt-podcastcnt, 28);
return TRUE;
}
@@ -6338,15 +6345,17 @@ static gboolean write_lphs (WContents *cts,
Itdb_Playlist *pl)
GList *tl, *tracks, *current_track;
Itdb_Track *tr, *ctr;
gulong id;
- guint32 stype, tracknum;
+ guint32 stype;
+ guint32 tracknum;
+ guint32 podcastcnt;
g_return_val_if_fail (pl, FALSE);
g_return_val_if_fail (pl->itdb, FALSE);
g_return_val_if_fail (cts, FALSE);
- lphs_seek=cts->pos;
+ lphs_seek = cts->pos;
tracks = pl->itdb->tracks;
-
+ podcastcnt = 0;
/* Change the playlist itunesDB into a itunesSD type */
/* 1 is for the master playlist
2 is for a normal playlist
@@ -6361,13 +6370,7 @@ static gboolean write_lphs (WContents *cts,
Itdb_Playlist *pl)
put_header (cts, "lphs");
put32lint (cts, -1); /* Length of header to be written later */
put32lint (cts, pl->num); /* Number of tracks in this playlist */
- /* I don't know enough to know how to compute this number in general
- so I'll do it the stupid way for now */
- /* The number of non podcast tracks */
- if ( stype == 3 ) /* If this is the podcast playlist */
- put32_n0 (cts, 1); /* There should be no normal tracks */
- else
- put32lint (cts, pl->num); /* Otherwise everything is normal */
+ put32lint (cts, -1); /* The number of nonpodcasts to be added later */
if (stype == 1)
put32_n0 (cts, 2); /* The voiceover for the master is at 0 */
@@ -6387,6 +6390,10 @@ static gboolean write_lphs (WContents *cts,
Itdb_Playlist *pl)
tr = tl->data;
id = tr->dbid;
ctr = current_track->data;
+ /* Count the number of podcasts for later use */
+ if (tr->mediatype == ITDB_MEDIATYPE_PODCAST)
+ podcastcnt++;
+
while( id != ctr->dbid)
{
tracknum ++;
@@ -6398,6 +6405,7 @@ static gboolean write_lphs (WContents *cts, Itdb_Playlist
*pl)
}
}
+ put32lint_seek (cts, pl->num - podcastcnt, lphs_seek+12);
fix_short_header (cts, lphs_seek);
return TRUE;
@@ -6408,8 +6416,8 @@ static gboolean write_hphs (FExport *fexp)
gulong hphs_seek, playlist_seek;
WContents *cts;
GList *gl;
- guint16 allplaylistcnt;
- guint16 stdplaylistcnt;
+ guint16 playlistcnt;
+ guint16 podcastscnt;
g_return_val_if_fail (fexp, FALSE);
g_return_val_if_fail (fexp->itdb, FALSE);
@@ -6417,35 +6425,27 @@ static gboolean write_hphs (FExport *fexp)
cts = fexp->wcontents;
hphs_seek = cts->pos;
- allplaylistcnt = itdb_playlists_number (fexp->itdb);
-
- /* If there is no podcasts playlist stdplaylistcnt
- should be 0xffff, otherwise it is allplaylistcnt-1 */
- /* This will probably change once it is know how the suffle
- handles audiobook playlists */
-
- if (itdb_playlist_podcasts (fexp->itdb)) {
- stdplaylistcnt = allplaylistcnt -1;
- } else {
- stdplaylistcnt = 0xffff;
- }
+ playlistcnt = itdb_playlists_number (fexp->itdb);
+ podcastscnt = 0; /* Number of podcast playlists should be 1
+ but may also include audiobooks eventually */
-
/* Add the Playlist Header Offset */
put32lint_seek (cts, cts->pos, 40);
put_header (cts, "hphs");
put32lint (cts, -1); /* Length of header to be added later */
- put16lint (cts, allplaylistcnt); /* Number of playlists */
+ put16lint (cts, playlistcnt); /* Number of playlists */
put16_n0 (cts, 1); /* Unknown */
- put16lint (cts, stdplaylistcnt); /* Number of non podcast playlists see
the
- comment when the variable is
assigned */
+ put16lint (cts, 0xffff); /* Number of non podcast playlists if there
+ isn't a podcast playlist leave this
+ current value. If there is a podcast
+ playlist the number should be playlistcnt-1
*/
put16lint (cts, 0x0100); /* Unknown */
put16lint (cts, 0xffff); /* Unknown */
put16_n0 (cts, 1);
playlist_seek = cts->pos;
- put32_n0 (cts, allplaylistcnt); /* Offsets for each playlist */
+ put32_n0 (cts, playlistcnt); /* Offsets for each playlist */
fix_short_header (cts, hphs_seek);
@@ -6456,11 +6456,17 @@ static gboolean write_hphs (FExport *fexp)
/* Write this headers offset */
put32lint_seek (cts, cts->pos, playlist_seek);
+ if (itdb_playlist_is_podcasts (pl))
+ podcastscnt++;
+
g_return_val_if_fail (write_lphs (cts, pl),FALSE);
/* Move to the field for the next header */
playlist_seek += 4;
}
+ /* Is there at least 1 podcast playlist? If so correct the
+ first 0xffff from before */
+ put16lint_seek (cts, playlistcnt-podcastscnt, hphs_seek+12);
return TRUE;
}
@@ -6470,8 +6476,8 @@ static gboolean write_bdhs (FExport *fexp)
{
WContents *cts;
gulong bdhs_seek;
- guint32 alltrackcnt, playlistcnt;
- guint32 stdtrackcnt;
+ guint32 trackcnt;
+ guint32 playlistcnt;
g_return_val_if_fail (fexp, FALSE);
g_return_val_if_fail (fexp->itdb, FALSE);
@@ -6479,16 +6485,13 @@ static gboolean write_bdhs (FExport *fexp)
cts = fexp->wcontents;
bdhs_seek = cts->pos;
- alltrackcnt = itdb_tracks_number (fexp->itdb);
+ trackcnt = itdb_tracks_number (fexp->itdb);
playlistcnt = itdb_playlists_number (fexp->itdb);
- /* This will yield 0 if there is no master play list */
- stdtrackcnt = itdb_playlist_tracks_number (itdb_playlist_mpl
(fexp->itdb));
-
put_header (cts, "bdhs");
put32lint (cts, 0x02000003); /* Unknown */
put32lint (cts, -1); /* Length of header to be added later*/
- put32lint (cts, alltrackcnt); /* Number of tracks */
+ put32lint (cts, trackcnt); /* Number of tracks */
put32lint (cts, playlistcnt); /* Number of playlists */
put32_n0 (cts, 2); /* Unknown */
/* TODO: Parse the max volume */
@@ -6496,12 +6499,14 @@ static gboolean write_bdhs (FExport *fexp)
/* TODO: Find another source of the voiceover option */
put8int (cts, 1); /* Voiceover currently ignored and set to on */
put16_n0 (cts, 1); /* Unknown */
- put32lint (cts, stdtrackcnt); /* Number of tracks excluding podcasts */
/* If the bdhs header changes the offsets of these fields may change
make sure you correct the field offset in their respective tags */
+
+ put32lint (cts, -1); /* Number of tracks excluding podcasts added in
write_hths */
put32lint (cts, -1); /* Track Header Offset added in write_hths */
put32lint (cts, -1); /* Playlist Header Offset added in write_hphs */
+
put32_n0 (cts, 5); /* Unknown */
fix_header(cts, bdhs_seek);
------------------------------------------------------------------------------
This SF.net email is sponsored by Sprint
What will you do first with EVO, the first 4G phone?
Visit sprint.com/first -- http://p.sf.net/sfu/sprint-com-first
_______________________________________________
gtkpod-cvs2 mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/gtkpod-cvs2