+
+ SET( title, Title );
+ SET( artist, Artist );
+ SET( album, Album );
+ SET( comment, Description );
+ SET( genre, Genre );
+ SETINT( year, Date );
+ SETINT( track, TrackNum );
+
+#undef SETINT
+#undef SET
+
+
+ // Try now to read special tags
+ if( FLAC::File* flac = dynamic_cast<FLAC::File*>(f.file()) )
+ {
+ if( flac->ID3v2Tag() )
+ ReadMetaFromId3v2( flac->ID3v2Tag(), p_demux, p_demux_meta, p_meta );
+ else if( flac->xiphComment() )
+ ReadMetaFromXiph( flac->xiphComment(), p_demux, p_demux_meta, p_meta );
+ }
+ else if( MPC::File* mpc = dynamic_cast<MPC::File*>(f.file()) )
+ {
+ if( mpc->APETag() )
+ ReadMetaFromAPE( mpc->APETag(), p_demux, p_demux_meta, p_meta );
+ }
+ else if( MPEG::File* mpeg = dynamic_cast<MPEG::File*>(f.file()) )
+ {
+ if( mpeg->ID3v2Tag() )
+ ReadMetaFromId3v2( mpeg->ID3v2Tag(), p_demux, p_demux_meta, p_meta );
+ else if( mpeg->APETag() )
+ ReadMetaFromAPE( mpeg->APETag(), p_demux, p_demux_meta, p_meta );
+ }
+ else if( Ogg::File* ogg = dynamic_cast<Ogg::File*>(f.file()) )
+ {
+ if( Ogg::FLAC::File* ogg_flac = dynamic_cast<Ogg::FLAC::File*>(f.file()))
+ ReadMetaFromXiph( ogg_flac->tag(), p_demux, p_demux_meta, p_meta );
+ else if( Ogg::Speex::File* ogg_speex = dynamic_cast<Ogg::Speex::File*>(f.file()) )
+ ReadMetaFromXiph( ogg_speex->tag(), p_demux, p_demux_meta, p_meta );
+ else if( Ogg::Vorbis::File* ogg_vorbis = dynamic_cast<Ogg::Vorbis::File*>(f.file()) )
+ ReadMetaFromXiph( ogg_vorbis->tag(), p_demux, p_demux_meta, p_meta );
+ }
+ else if( TrueAudio::File* trueaudio = dynamic_cast<TrueAudio::File*>(f.file()) )
+ {
+ if( trueaudio->ID3v2Tag() )
+ ReadMetaFromId3v2( trueaudio->ID3v2Tag(), p_demux, p_demux_meta, p_meta );
+ }
+ else if( WavPack::File* wavpack = dynamic_cast<WavPack::File*>(f.file()) )
+ {
+ if( wavpack->APETag() )
+ ReadMetaFromAPE( wavpack->APETag(), p_demux, p_demux_meta, p_meta );
+ }
+
+ return VLC_SUCCESS;
+}
+
+
+
+/**
+ * Write meta informations to APE tags
+ * @param tag: the APE tag
+ * @param p_item: the input item
+ */
+static void WriteMetaToAPE( APE::Tag* tag, input_item_t* p_item )
+{
+ char* psz_meta;
+#define WRITE( metaName, keyName ) \
+ psz_meta = input_item_Get##metaName( p_item ); \
+ if( psz_meta ) \
+ { \
+ String key( keyName, String::UTF8 ); \
+ String value( psz_meta, String::UTF8 ); \
+ tag->addValue( key, value, true ); \
+ } \
+ free( psz_meta );
+
+ WRITE( Copyright, "COPYRIGHT" );
+ WRITE( Language, "LANGUAGE" );
+ WRITE( Publisher, "PUBLISHER" );
+
+#undef WRITE