vlc_meta.h
上传用户:kjfoods
上传日期:2020-07-06
资源大小:29949k
文件大小:8k
源码类别:

midi

开发平台:

Unix_Linux

  1. /*****************************************************************************
  2.  * vlc_meta.h: Stream meta-data
  3.  *****************************************************************************
  4.  * Copyright (C) 2004 the VideoLAN team
  5.  * $Id: e5b11b89d3dc285769769d641aa4416da1086b5a $
  6.  *
  7.  * Authors: Laurent Aimar <fenrir@via.ecp.fr>
  8.  *
  9.  * This program is free software; you can redistribute it and/or modify
  10.  * it under the terms of the GNU General Public License as published by
  11.  * the Free Software Foundation; either version 2 of the License, or
  12.  * (at your option) any later version.
  13.  *
  14.  * This program is distributed in the hope that it will be useful,
  15.  * but WITHOUT ANY WARRANTY; without even the implied warranty of
  16.  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  17.  * GNU General Public License for more details.
  18.  *
  19.  * You should have received a copy of the GNU General Public License
  20.  * along with this program; if not, write to the Free Software
  21.  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA.
  22.  *****************************************************************************/
  23. #ifndef VLC_META_H
  24. #define VLC_META_H 1
  25. /**
  26.  * file
  27.  * This file defines functions and structures for stream meta-data in vlc
  28.  *
  29.  */
  30. #include <vlc_arrays.h>
  31. typedef enum vlc_meta_type_t
  32. {
  33.     vlc_meta_Title,
  34.     vlc_meta_Artist,
  35.     vlc_meta_Genre,
  36.     vlc_meta_Copyright,
  37.     vlc_meta_Album,
  38.     vlc_meta_TrackNumber,
  39.     vlc_meta_Description,
  40.     vlc_meta_Rating,
  41.     vlc_meta_Date,
  42.     vlc_meta_Setting,
  43.     vlc_meta_URL,
  44.     vlc_meta_Language,
  45.     vlc_meta_NowPlaying,
  46.     vlc_meta_Publisher,
  47.     vlc_meta_EncodedBy,
  48.     vlc_meta_ArtworkURL,
  49.     vlc_meta_TrackID
  50. } vlc_meta_type_t;
  51. #define VLC_META_TYPE_COUNT 17
  52. /* Returns a localizes string describing the meta */
  53. VLC_EXPORT(const char *, input_MetaTypeToLocalizedString, ( vlc_meta_type_t meta_type ) );
  54. #define ITEM_PREPARSED      0x01
  55. #define ITEM_ARTURL_FETCHED 0x02
  56. #define ITEM_ART_FETCHED    0x04
  57. #define ITEM_ART_NOTFOUND   0x08
  58. struct vlc_meta_t
  59. {
  60.     char * ppsz_meta[VLC_META_TYPE_COUNT];
  61.     vlc_dictionary_t extra_tags;
  62.     int i_status;
  63. };
  64. /* Setters for meta.
  65.  * Warning: Make sure to use the input_item meta setters (defined in vlc_input.h)
  66.  * instead of those one. */
  67. #define vlc_meta_SetTitle( meta, b )       vlc_meta_Set( meta, vlc_meta_Title, b )
  68. #define vlc_meta_SetArtist( meta, b )      vlc_meta_Set( meta, vlc_meta_Artist, b )
  69. #define vlc_meta_SetGenre( meta, b )       vlc_meta_Set( meta, vlc_meta_Genre, b )
  70. #define vlc_meta_SetCopyright( meta, b )   vlc_meta_Set( meta, vlc_meta_Copyright, b )
  71. #define vlc_meta_SetAlbum( meta, b )       vlc_meta_Set( meta, vlc_meta_Album, b )
  72. #define vlc_meta_SetTrackNum( meta, b )    vlc_meta_Set( meta, vlc_meta_TrackNumber, b )
  73. #define vlc_meta_SetDescription( meta, b ) vlc_meta_Set( meta, vlc_meta_Description, b )
  74. #define vlc_meta_SetRating( meta, b )      vlc_meta_Set( meta, vlc_meta_Rating, b )
  75. #define vlc_meta_SetDate( meta, b )        vlc_meta_Set( meta, vlc_meta_Date, b )
  76. #define vlc_meta_SetSetting( meta, b )     vlc_meta_Set( meta, vlc_meta_Setting, b )
  77. #define vlc_meta_SetURL( meta, b )         vlc_meta_Set( meta, vlc_meta_URL, b )
  78. #define vlc_meta_SetLanguage( meta, b )    vlc_meta_Set( meta, vlc_meta_Language, b )
  79. #define vlc_meta_SetNowPlaying( meta, b )  vlc_meta_Set( meta, vlc_meta_NowPlaying, b )
  80. #define vlc_meta_SetPublisher( meta, b )   vlc_meta_Set( meta, vlc_meta_Publisher, b )
  81. #define vlc_meta_SetEncodedBy( meta, b )   vlc_meta_Set( meta, vlc_meta_EncodedBy, b )
  82. #define vlc_meta_SetArtURL( meta, b )      vlc_meta_Set( meta, vlc_meta_ArtworkURL, b )
  83. #define vlc_meta_SetTrackID( meta, b )     vlc_meta_Set( meta, vlc_meta_TrackID, b )
  84. /* Free a dictonary key allocated by strdup() in vlc_meta_AddExtra() */
  85. static inline void vlc_meta_FreeExtraKey( void *p_data, void *p_obj )
  86. {
  87.     VLC_UNUSED( p_obj );
  88.     free( p_data );
  89. }
  90. static inline void vlc_meta_Set( vlc_meta_t *p_meta, vlc_meta_type_t meta_type, const char *psz_val )
  91. {
  92.     free( p_meta->ppsz_meta[meta_type] );
  93.     p_meta->ppsz_meta[meta_type] = psz_val ? strdup( psz_val ) : NULL;
  94. }
  95. static inline const char *vlc_meta_Get( const vlc_meta_t *p_meta, vlc_meta_type_t meta_type )
  96. {
  97.     return p_meta->ppsz_meta[meta_type];
  98. }
  99. static inline vlc_meta_t *vlc_meta_New( void )
  100. {
  101.     vlc_meta_t *m = (vlc_meta_t*)malloc( sizeof(*m) );
  102.     if( !m )
  103.         return NULL;
  104.     memset( m->ppsz_meta, 0, sizeof(m->ppsz_meta) );
  105.     m->i_status = 0;
  106.     vlc_dictionary_init( &m->extra_tags, 0 );
  107.     return m;
  108. }
  109. static inline void vlc_meta_Delete( vlc_meta_t *m )
  110. {
  111.     int i;
  112.     for( i = 0; i < VLC_META_TYPE_COUNT ; i++ )
  113.         free( m->ppsz_meta[i] );
  114.     vlc_dictionary_clear( &m->extra_tags, vlc_meta_FreeExtraKey, NULL );
  115.     free( m );
  116. }
  117. static inline void vlc_meta_AddExtra( vlc_meta_t *m, const char *psz_name, const char *psz_value )
  118. {
  119.     char *psz_oldvalue = (char *)vlc_dictionary_value_for_key( &m->extra_tags, psz_name );
  120.     if( psz_oldvalue != kVLCDictionaryNotFound )
  121.         vlc_dictionary_remove_value_for_key( &m->extra_tags, psz_name,
  122.                                              vlc_meta_FreeExtraKey, NULL );
  123.     vlc_dictionary_insert( &m->extra_tags, psz_name, strdup(psz_value) );
  124. }
  125. static inline void vlc_meta_Merge( vlc_meta_t *dst, const vlc_meta_t *src )
  126. {
  127.     char **ppsz_all_keys;
  128.     int i;
  129.     if( !dst || !src )
  130.         return;
  131.     for( i = 0; i < VLC_META_TYPE_COUNT; i++ )
  132.     {
  133.         if( src->ppsz_meta[i] )
  134.         {
  135.             free( dst->ppsz_meta[i] );
  136.             dst->ppsz_meta[i] = strdup( src->ppsz_meta[i] );
  137.         }
  138.     }
  139.     /* XXX: If speed up are needed, it is possible */
  140.     ppsz_all_keys = vlc_dictionary_all_keys( &src->extra_tags );
  141.     for( i = 0; ppsz_all_keys && ppsz_all_keys[i]; i++ )
  142.     {
  143.         /* Always try to remove the previous value */
  144.         vlc_dictionary_remove_value_for_key( &dst->extra_tags, ppsz_all_keys[i], vlc_meta_FreeExtraKey, NULL );
  145.         void *p_value = vlc_dictionary_value_for_key( &src->extra_tags, ppsz_all_keys[i] );
  146.         vlc_dictionary_insert( &dst->extra_tags, ppsz_all_keys[i], strdup( (const char*)p_value ) );
  147.         free( ppsz_all_keys[i] );
  148.     }
  149.     free( ppsz_all_keys );
  150. }
  151. #define VLC_META_TITLE              input_MetaTypeToLocalizedString( vlc_meta_Title )
  152. #define VLC_META_ARTIST             input_MetaTypeToLocalizedString( vlc_meta_Artist )
  153. #define VLC_META_GENRE              input_MetaTypeToLocalizedString( vlc_meta_Genre )
  154. #define VLC_META_COPYRIGHT          input_MetaTypeToLocalizedString( vlc_meta_Copyright )
  155. #define VLC_META_ALBUM              input_MetaTypeToLocalizedString( vlc_meta_Album )
  156. #define VLC_META_TRACK_NUMBER       input_MetaTypeToLocalizedString( vlc_meta_TrackNumber )
  157. #define VLC_META_DESCRIPTION        input_MetaTypeToLocalizedString( vlc_meta_Description )
  158. #define VLC_META_RATING             input_MetaTypeToLocalizedString( vlc_meta_Rating )
  159. #define VLC_META_DATE               input_MetaTypeToLocalizedString( vlc_meta_Date )
  160. #define VLC_META_SETTING            input_MetaTypeToLocalizedString( vlc_meta_Setting )
  161. #define VLC_META_URL                input_MetaTypeToLocalizedString( vlc_meta_URL )
  162. #define VLC_META_LANGUAGE           input_MetaTypeToLocalizedString( vlc_meta_Language )
  163. #define VLC_META_NOW_PLAYING        input_MetaTypeToLocalizedString( vlc_meta_NowPlaying )
  164. #define VLC_META_PUBLISHER          input_MetaTypeToLocalizedString( vlc_meta_Publisher )
  165. #define VLC_META_ENCODED_BY         input_MetaTypeToLocalizedString( vlc_meta_EncodedBy )
  166. #define VLC_META_ART_URL            input_MetaTypeToLocalizedString( vlc_meta_ArtworkURL )
  167. #define VLC_META_TRACKID            input_MetaTypeToLocalizedString( vlc_meta_TrackID )
  168. enum {
  169.     ALBUM_ART_WHEN_ASKED,
  170.     ALBUM_ART_WHEN_PLAYED,
  171.     ALBUM_ART_ALL
  172. };
  173. struct meta_export_t
  174. {
  175.     input_item_t *p_item;
  176.     const char *psz_file;
  177. };
  178. #endif