commit acc2dc62a78d59cda5e66910ea322de49033ca2a Author: Christophe Fergeau <t...@gnome.org> Date: Tue Sep 21 17:55:53 2010 +0200
MediaType is a bitfield 1e719585f6 added new members to Itdb_Mediatype, but these members are trivial binary OR of existing Itdb_MediaType elements. Media types are actually bitfields, but this was never mentioned explicitly anywhere. Improve Itdb_MediaType definition and documentation to make that more obvious. This also fixes the few places where libgpod manipulates media types to take into account the fact that it's a bitfield. src/itdb.h | 38 +++++++++++++++++++++++--------------- src/itdb_itunesdb.c | 10 ++++------ src/itdb_playlist.c | 2 +- src/itdb_sqlite.c | 2 -- 4 files changed, 28 insertions(+), 24 deletions(-) --- diff --git a/src/itdb.h b/src/itdb.h index e8d7547..f81d987 100644 --- a/src/itdb.h +++ b/src/itdb.h @@ -1247,28 +1247,36 @@ typedef enum * * The mediatype is used to determine what menu a track appears under. For * example, setting the mediatype to #ITDB_MEDIATYPE_PODCAST makes the track - * appear on the Podcast menu. + * appear on the Podcast menu. Media type is a bitfield, so it can be a + * binary combination of these constants, make sure to use binary operators + * when you want to operate on media types (eg use a binary AND in + * preference over a straight == when you want to test if a track has a + * given media type). * * Since: 0.5.0 */ typedef enum { - ITDB_MEDIATYPE_AUDIO = 0x000001, - ITDB_MEDIATYPE_MOVIE = 0x000002, - ITDB_MEDIATYPE_PODCAST = 0x000004, - ITDB_MEDIATYPE_VIDEO_PODCAST= 0x000006, - ITDB_MEDIATYPE_AUDIOBOOK = 0x000008, - ITDB_MEDIATYPE_MUSICVIDEO = 0x000020, - ITDB_MEDIATYPE_TVSHOW = 0x000040, - ITDB_MEDIATYPE_MUSIC_TVSHOW = 0x000060, - ITDB_MEDIATYPE_RINGTONE = 0x004000, - ITDB_MEDIATYPE_RENTAL = 0x008000, - ITDB_MEDIATYPE_ITUNES_EXTRA = 0x010000, - ITDB_MEDIATYPE_MEMO = 0x100000, - ITDB_MEDIATYPE_ITUNES_U = 0x200000, - ITDB_MEDIATYPE_EPUB_BOOK = 0x400000 + ITDB_MEDIATYPE_AUDIO = (1 << 0), + ITDB_MEDIATYPE_MOVIE = (1 << 1), + ITDB_MEDIATYPE_PODCAST = (1 << 2), + ITDB_MEDIATYPE_AUDIOBOOK = (1 << 3), + ITDB_MEDIATYPE_MUSICVIDEO = (1 << 5), + ITDB_MEDIATYPE_TVSHOW = (1 << 6), + ITDB_MEDIATYPE_RINGTONE = (1 << 14), + ITDB_MEDIATYPE_RENTAL = (1 << 15), + ITDB_MEDIATYPE_ITUNES_EXTRA = (1 << 16), + ITDB_MEDIATYPE_MEMO = (1 << 20), + ITDB_MEDIATYPE_ITUNES_U = (1 << 21), + ITDB_MEDIATYPE_EPUB_BOOK = (1 << 22) } Itdb_Mediatype; +/* Known compound media types which have been observed in iPod databases. + * This list is in no way exhaustive, and these constants are only helpers, + * there's nothing wrong with not using them. + */ +#define ITDB_MEDIATYPE_VIDEO_PODCAST (ITDB_MEDIATYPE_MOVIE | ITDB_MEDIATYPE_PODCAST) +#define ITDB_MEDIATYPE_MUSIC_TVSHOW (ITDB_MEDIATYPE_MUSICVIDEO | ITDB_MEDIATYPE_TVSHOW) typedef struct _Itdb_Track_Private Itdb_Track_Private; /** * Itdb_Track: diff --git a/src/itdb_itunesdb.c b/src/itdb_itunesdb.c index ea3a7ad..bae2844 100644 --- a/src/itdb_itunesdb.c +++ b/src/itdb_itunesdb.c @@ -6472,9 +6472,8 @@ 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_AUDIOBOOK || - track->mediatype == ITDB_MEDIATYPE_VIDEO_PODCAST || - track->mediatype == ITDB_MEDIATYPE_PODCAST) + if ((track->mediatype & ITDB_MEDIATYPE_AUDIOBOOK) || + (track->mediatype & ITDB_MEDIATYPE_PODCAST)) nonstdtrackcnt++; /* Go to the offset for the next track */ @@ -6542,9 +6541,8 @@ static gboolean write_lphs (WContents *cts, Itdb_Playlist *pl) id = tr->dbid; ctr = current_track->data; /* Count the number of podcasts and audiobooks for later use */ - if (tr->mediatype == ITDB_MEDIATYPE_AUDIOBOOK || - tr->mediatype == ITDB_MEDIATYPE_VIDEO_PODCAST || - tr->mediatype == ITDB_MEDIATYPE_PODCAST) + if ((tr->mediatype & ITDB_MEDIATYPE_AUDIOBOOK) || + (tr->mediatype & ITDB_MEDIATYPE_PODCAST)) nonstdtrackcnt++; while( id != ctr->dbid) diff --git a/src/itdb_playlist.c b/src/itdb_playlist.c index 5b1e8d8..85cef97 100644 --- a/src/itdb_playlist.c +++ b/src/itdb_playlist.c @@ -1595,7 +1595,7 @@ gboolean itdb_playlist_is_audiobooks (Itdb_Playlist *pl) for (tl = pl->members; tl; tl = tl->next) { track = tl->data; - if (track->mediatype != ITDB_MEDIATYPE_AUDIOBOOK) + if (!(track->mediatype & ITDB_MEDIATYPE_AUDIOBOOK)) { return FALSE; } diff --git a/src/itdb_sqlite.c b/src/itdb_sqlite.c index 380b5a1..4825cb2 100644 --- a/src/itdb_sqlite.c +++ b/src/itdb_sqlite.c @@ -1256,8 +1256,6 @@ static int mk_Library(Itdb_iTunesDB *itdb, /* if it's a movie, music video or tv show */ if ((track->mediatype & ITDB_MEDIATYPE_MOVIE) || (track->mediatype & ITDB_MEDIATYPE_MUSICVIDEO) - || (track->mediatype & ITDB_MEDIATYPE_VIDEO_PODCAST) - || (track->mediatype & ITDB_MEDIATYPE_MUSIC_TVSHOW) || (track->mediatype & ITDB_MEDIATYPE_TVSHOW)) { /* printf("[%s] -- inserting into \"video_info\"\n", __func__); */ res = sqlite3_reset(stmt_video_info); ------------------------------------------------------------------------------ Start uncovering the many advantages of virtual appliances and start using them to simplify application deployment and accelerate your shift to cloud computing. http://p.sf.net/sfu/novell-sfdev2dev _______________________________________________ gtkpod-cvs2 mailing list gtkpod-cvs2@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/gtkpod-cvs2