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

Reply via email to