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);
00109 virtual void copy_meta(const file_info & p_source);
00111 virtual void copy_info(const file_info & p_source);
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;
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;
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
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_