file_info.h

Go to the documentation of this file.
00001 #ifndef _FILE_INFO_H_
00002 #define _FILE_INFO_H_
00003 
00005 struct replaygain_info
00006 {
00007         float m_album_gain,m_track_gain;
00008         float m_album_peak,m_track_peak;
00009 
00010         enum {text_buffer_size = 16 };
00011         typedef char t_text_buffer[text_buffer_size];
00012 
00013         enum { peak_invalid = -1, gain_invalid = -1000 };
00014 
00015         static bool g_format_gain(float p_value,char p_buffer[text_buffer_size]);
00016         static bool g_format_peak(float p_value,char p_buffer[text_buffer_size]);
00017 
00018         inline bool format_album_gain(char p_buffer[text_buffer_size]) const {return g_format_gain(m_album_gain,p_buffer);}
00019         inline bool format_track_gain(char p_buffer[text_buffer_size]) const {return g_format_gain(m_track_gain,p_buffer);}
00020         inline bool format_album_peak(char p_buffer[text_buffer_size]) const {return g_format_peak(m_album_peak,p_buffer);}
00021         inline bool format_track_peak(char p_buffer[text_buffer_size]) const {return g_format_peak(m_track_peak,p_buffer);}
00022 
00023         void set_album_gain_text(const char * p_text,t_size p_text_len = infinite);
00024         void set_track_gain_text(const char * p_text,t_size p_text_len = infinite);
00025         void set_album_peak_text(const char * p_text,t_size p_text_len = infinite);
00026         void set_track_peak_text(const char * p_text,t_size p_text_len = infinite);
00027 
00028         static bool g_is_meta_replaygain(const char * p_name,t_size p_name_len = infinite);
00029         bool set_from_meta_ex(const char * p_name,t_size p_name_len,const char * p_value,t_size p_value_len);
00030         inline bool set_from_meta(const char * p_name,const char * p_value) {return set_from_meta_ex(p_name,infinite,p_value,infinite);}
00031 
00032         inline bool is_album_gain_present() const {return m_album_gain != gain_invalid;}
00033         inline bool is_track_gain_present() const {return m_track_gain != gain_invalid;}
00034         inline bool is_album_peak_present() const {return m_album_peak != peak_invalid;}
00035         inline bool is_track_peak_present() const {return m_track_peak != peak_invalid;}
00036         
00037         inline void remove_album_gain() {m_album_gain = gain_invalid;}
00038         inline void remove_track_gain() {m_track_gain = gain_invalid;}
00039         inline void remove_album_peak() {m_album_peak = peak_invalid;}
00040         inline void remove_track_peak() {m_track_peak = peak_invalid;}
00041 
00042         t_size  get_value_count();
00043 
00044         static replaygain_info g_merge(replaygain_info r1,replaygain_info r2);
00045 
00046         static bool g_equal(const replaygain_info & item1,const replaygain_info & item2);
00047 
00048         void reset();   
00049 };
00050 
00051 inline bool operator==(const replaygain_info & item1,const replaygain_info & item2) {return replaygain_info::g_equal(item1,item2);}
00052 inline bool operator!=(const replaygain_info & item1,const replaygain_info & item2) {return !replaygain_info::g_equal(item1,item2);}
00053 
00054 static const replaygain_info replaygain_info_invalid = {replaygain_info::gain_invalid,replaygain_info::gain_invalid,replaygain_info::peak_invalid,replaygain_info::peak_invalid};
00055 
00056 
00058 class NOVTABLE file_info {
00059 public:
00061         virtual double          get_length() const = 0;
00063         virtual void            set_length(double p_length) = 0;
00064 
00066         virtual void                    set_replaygain(const replaygain_info & p_info) = 0;
00068         virtual replaygain_info get_replaygain() const = 0;
00069 
00071         virtual t_size          meta_get_count() const = 0;
00073         virtual const char*     meta_enum_name(t_size p_index) const = 0;
00075         virtual t_size          meta_enum_value_count(t_size p_index) const = 0;
00077         virtual const char*     meta_enum_value(t_size p_index,t_size p_value_number) const = 0;
00079         virtual t_size          meta_find_ex(const char * p_name,t_size p_name_length) const;
00081         virtual t_size          meta_set_ex(const char * p_name,t_size p_name_length,const char * p_value,t_size p_value_length) = 0;
00083         virtual void            meta_insert_value_ex(t_size p_index,t_size p_value_index,const char * p_value,t_size p_value_length) = 0;
00085         virtual void            meta_remove_mask(const bit_array & p_mask) = 0;
00087         virtual void            meta_reorder(const t_size * p_order) = 0;
00089         virtual void            meta_remove_values(t_size p_index,const bit_array & p_mask) = 0;
00091         virtual void            meta_modify_value_ex(t_size p_index,t_size p_value_index,const char * p_value,t_size p_value_length) = 0;
00092 
00094         virtual t_size          info_get_count() const = 0;
00096         virtual const char*     info_enum_name(t_size p_index) const = 0;
00098         virtual const char*     info_enum_value(t_size p_index) const = 0;
00100         virtual t_size          info_set_ex(const char * p_name,t_size p_name_length,const char * p_value,t_size p_value_length) = 0;
00102         virtual void            info_remove_mask(const bit_array & p_mask) = 0;
00104         virtual t_size          info_find_ex(const char * p_name,t_size p_name_length) const;
00105 
00107         virtual void            copy(const file_info & p_source);//virtualized for performance reasons, can be faster in two-pass
00109         virtual void            copy_meta(const file_info & p_source);//virtualized for performance reasons, can be faster in two-pass
00111         virtual void            copy_info(const file_info & p_source);//virtualized for performance reasons, can be faster in two-pass
00112 
00113         bool                    meta_exists_ex(const char * p_name,t_size p_name_length) const;
00114         void                    meta_remove_field_ex(const char * p_name,t_size p_name_length);
00115         void                    meta_remove_index(t_size p_index);
00116         void                    meta_remove_all();
00117         void                    meta_remove_value(t_size p_index,t_size p_value);
00118         const char *    meta_get_ex(const char * p_name,t_size p_name_length,t_size p_index) const;
00119         t_size                  meta_get_count_by_name_ex(const char * p_name,t_size p_name_length) const;
00120         void                    meta_add_value_ex(t_size p_index,const char * p_value,t_size p_value_length);
00121         t_size                  meta_add_ex(const char * p_name,t_size p_name_length,const char * p_value,t_size p_value_length);
00122         t_size                  meta_calc_total_value_count() const;
00123         bool                    meta_format(const char * p_name,pfc::string_base & p_out, const char * separator = ", ") const;
00124         void                    meta_format_entry(t_size index, pfc::string_base & p_out, const char * separator = ", ") const;//same as meta_format but takes index instead of meta name.
00125         
00126         
00127         bool                    info_exists_ex(const char * p_name,t_size p_name_length) const;
00128         void                    info_remove_index(t_size p_index);
00129         void                    info_remove_all();
00130         bool                    info_remove_ex(const char * p_name,t_size p_name_length);
00131         const char *    info_get_ex(const char * p_name,t_size p_name_length) const;
00132 
00133         inline t_size           meta_find(const char * p_name) const    {return meta_find_ex(p_name,infinite);}
00134         inline bool                     meta_exists(const char * p_name) const          {return meta_exists_ex(p_name,infinite);}
00135         inline void                     meta_remove_field(const char * p_name)          {meta_remove_field_ex(p_name,infinite);}
00136         inline t_size           meta_set(const char * p_name,const char * p_value)              {return meta_set_ex(p_name,infinite,p_value,infinite);}
00137         inline void                     meta_insert_value(t_size p_index,t_size p_value_index,const char * p_value) {meta_insert_value_ex(p_index,p_value_index,p_value,infinite);}
00138         inline void                     meta_add_value(t_size p_index,const char * p_value)     {meta_add_value_ex(p_index,p_value,infinite);}
00139         inline const char*      meta_get(const char * p_name,t_size p_index) const      {return meta_get_ex(p_name,infinite,p_index);}
00140         inline t_size           meta_get_count_by_name(const char * p_name) const               {return meta_get_count_by_name_ex(p_name,infinite);}
00141         inline t_size           meta_add(const char * p_name,const char * p_value)              {return meta_add_ex(p_name,infinite,p_value,infinite);}
00142         inline void                     meta_modify_value(t_size p_index,t_size p_value_index,const char * p_value) {meta_modify_value_ex(p_index,p_value_index,p_value,infinite);}
00143 
00144         
00145 
00146         inline t_size           info_set(const char * p_name,const char * p_value)      {return info_set_ex(p_name,infinite,p_value,infinite);}
00147         inline t_size           info_find(const char * p_name) const                            {return info_find_ex(p_name,infinite);}
00148         inline t_size           info_exists(const char * p_name) const                          {return info_exists_ex(p_name,infinite);}
00149         inline bool                     info_remove(const char * p_name)                                        {return info_remove_ex(p_name,infinite);}
00150         inline const char *     info_get(const char * p_name) const                                     {return info_get_ex(p_name,infinite);}
00151 
00152         bool                            info_set_replaygain_ex(const char * p_name,t_size p_name_len,const char * p_value,t_size p_value_len);
00153         inline bool                     info_set_replaygain(const char * p_name,const char * p_value) {return info_set_replaygain_ex(p_name,infinite,p_value,infinite);}
00154         void                            info_set_replaygain_auto_ex(const char * p_name,t_size p_name_len,const char * p_value,t_size p_value_len);
00155         inline void                     info_set_replaygain_auto(const char * p_name,const char * p_value) {info_set_replaygain_auto_ex(p_name,infinite,p_value,infinite);}
00156 
00157         
00158 
00159         void            copy_meta_single(const file_info & p_source,t_size p_index);
00160         void            copy_info_single(const file_info & p_source,t_size p_index);
00161         void            copy_meta_single_by_name_ex(const file_info & p_source,const char * p_name,t_size p_name_length);
00162         void            copy_info_single_by_name_ex(const file_info & p_source,const char * p_name,t_size p_name_length);
00163         inline void     copy_meta_single_by_name(const file_info & p_source,const char * p_name) {copy_meta_single_by_name_ex(p_source,p_name,infinite);}
00164         inline void     copy_info_single_by_name(const file_info & p_source,const char * p_name) {copy_info_single_by_name_ex(p_source,p_name,infinite);}
00165         void            reset();
00166         void            reset_replaygain();
00167         void            copy_meta_single_rename_ex(const file_info & p_source,t_size p_index,const char * p_new_name,t_size p_new_name_length);
00168         inline void     copy_meta_single_rename(const file_info & p_source,t_size p_index,const char * p_new_name) {copy_meta_single_rename_ex(p_source,p_index,p_new_name,infinite);}
00169         void            overwrite_info(const file_info & p_source);
00170 
00171         t_int64 info_get_int(const char * name) const;
00172         t_int64 info_get_length_samples() const;
00173         double info_get_float(const char * name) const;
00174         void info_set_int(const char * name,t_int64 value);
00175         void info_set_float(const char * name,double value,unsigned precision,bool force_sign = false,const char * unit = 0);
00176         void info_set_replaygain_track_gain(float value);
00177         void info_set_replaygain_album_gain(float value);
00178         void info_set_replaygain_track_peak(float value);
00179         void info_set_replaygain_album_peak(float value);
00180 
00181         inline t_int64 info_get_bitrate_vbr() const {return info_get_int("bitrate_dynamic");}
00182         inline void info_set_bitrate_vbr(t_int64 val) {info_set_int("bitrate_dynamic",val);}
00183         inline t_int64 info_get_bitrate() const {return info_get_int("bitrate");}
00184         inline void info_set_bitrate(t_int64 val) {info_set_int("bitrate",val);}
00185         bool is_encoding_lossy() const;
00186 
00187         void info_calculate_bitrate(t_filesize p_filesize,double p_length);
00188 
00189         unsigned info_get_decoded_bps() const;//what bps the stream originally was (before converting to audio_sample), 0 if unknown
00190 
00191         void merge(const pfc::list_base_const_t<const file_info*> & p_sources);
00192 
00193         bool are_meta_fields_identical(t_size p_index1,t_size p_index2) const;
00194 
00195         inline const file_info & operator=(const file_info & p_source) {copy(p_source);return *this;}
00196 
00197         static bool g_is_meta_equal(const file_info & p_item1,const file_info & p_item2);
00198         static bool g_is_info_equal(const file_info & p_item1,const file_info & p_item2);
00199 
00201         t_size  __meta_add_unsafe_ex(const char * p_name,t_size p_name_length,const char * p_value,t_size p_value_length) {return meta_set_nocheck_ex(p_name,p_name_length,p_value,p_value_length);}
00203         t_size  __meta_add_unsafe(const char * p_name,const char * p_value) {return meta_set_nocheck_ex(p_name,infinite,p_value,infinite);}
00204 
00206         t_size __info_add_unsafe_ex(const char * p_name,t_size p_name_length,const char * p_value,t_size p_value_length) {return info_set_nocheck_ex(p_name,p_name_length,p_value,p_value_length);}
00208         t_size __info_add_unsafe(const char * p_name,const char * p_value) {return info_set_nocheck_ex(p_name,infinite,p_value,infinite);}
00209 
00210         static bool g_is_valid_field_name(const char * p_name,t_size p_length = infinite);
00211         //typedef pfc::comparator_stricmp_ascii field_name_comparator;
00212         typedef pfc::string::comparatorCaseInsensitiveASCII field_name_comparator;
00213 protected:
00214         file_info() {}
00215         ~file_info() {}
00216         void    copy_meta_single_nocheck(const file_info & p_source,t_size p_index);
00217         void    copy_info_single_nocheck(const file_info & p_source,t_size p_index);
00218         void    copy_meta_single_by_name_nocheck_ex(const file_info & p_source,const char * p_name,t_size p_name_length);
00219         void    copy_info_single_by_name_nocheck_ex(const file_info & p_source,const char * p_name,t_size p_name_length);
00220         inline void     copy_meta_single_by_name_nocheck(const file_info & p_source,const char * p_name) {copy_meta_single_by_name_nocheck_ex(p_source,p_name,infinite);}
00221         inline void     copy_info_single_by_name_nocheck(const file_info & p_source,const char * p_name) {copy_info_single_by_name_nocheck_ex(p_source,p_name,infinite);}
00222 
00223         virtual t_size  meta_set_nocheck_ex(const char * p_name,t_size p_name_length,const char * p_value,t_size p_value_length) = 0;
00224         virtual t_size  info_set_nocheck_ex(const char * p_name,t_size p_name_length,const char * p_value,t_size p_value_length) = 0;
00225         inline t_size   meta_set_nocheck(const char * p_name,const char * p_value) {return meta_set_nocheck_ex(p_name,infinite,p_value,infinite);}
00226         inline t_size   info_set_nocheck(const char * p_name,const char * p_value) {return info_set_nocheck_ex(p_name,infinite,p_value,infinite);}
00227 };
00228 
00229 
00230 #endif //_FILE_INFO_H_

Generated on Fri Apr 25 18:49:34 2008 for foobar2000 SDK by  doxygen 1.5.5