commit acc2dc62a78d59cda5e66910ea322de49033ca2a
Author: Christophe Fergeau <[email protected]>
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
[email protected]
https://lists.sourceforge.net/lists/listinfo/gtkpod-cvs2