annotate foosdk/sdk/foobar2000/helpers/cue_parser_embedding.cpp @ 1:20d02a178406 default tip

*: check in everything else yay
author Paper <paper@tflc.us>
date Mon, 05 Jan 2026 02:15:46 -0500
parents
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
1
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1 #include "StdAfx.h"
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2 #include "cue_parser.h"
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4 using namespace cue_parser;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
5 using namespace file_info_record_helper;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
6
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
7 #define CUE_EMBED_DEBUG 0
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
8
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
9 #if CUE_EMBED_DEBUG
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
10 static void DEBUG_INFO(file_info const& p_info, const char* what) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
11 FB2K_console_formatter() << "embeddedcue_metadata_manager : " << what << " >>>>";
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
12 p_info.to_console();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
13 FB2K_console_formatter() << "<<<<\n";
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
14 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
15 static void DEBUG_INFO(const track_record_list& content, const char* what) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
16 FB2K_console_formatter() << "embeddedcue_metadata_manager : " << what << " >>>>";
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
17 for (auto iter = content.first(); iter.is_valid(); ++iter) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
18 FB2K_console_formatter() << "track " << iter->m_key << " >>>>";
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
19 file_info_impl temp; iter->m_value.m_info.to_info(temp); temp.to_console();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
20 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
21 FB2K_console_formatter() << "<<<<\n";
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
22 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
23 #else
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
24 #define DEBUG_INFO(info, what)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
25 #endif
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
26
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
27 static void build_cue_meta_name(const char * p_name,unsigned p_tracknumber,pfc::string_base & p_out) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
28 p_out.reset();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
29 p_out << "cue_track" << pfc::format_uint(p_tracknumber % 100,2) << "_" << p_name;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
30 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
31
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
32 static bool is_reserved_meta_entry(const char * p_name) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
33 return file_info::field_name_comparator::compare(p_name,"cuesheet") == 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
34 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
35
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
36 static bool is_global_meta_entry(const char * p_name) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
37 static const char header[] = "cue_track";
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
38 return pfc::stricmp_ascii_ex(p_name,strlen(header),header,~0) != 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
39 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
40 static bool is_allowed_field(const char * p_name) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
41 return !is_reserved_meta_entry(p_name) && is_global_meta_entry(p_name);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
42 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
43 namespace {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
44
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
45 typedef pfc::avltree_t<pfc::string8,file_info::field_name_comparator> field_name_list;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
46
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
47 class __get_tag__enum_fields_enumerator {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
48 public:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
49 __get_tag__enum_fields_enumerator(field_name_list & p_out) : m_out(p_out) {}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
50 void operator() (unsigned p_trackno,const track_record & p_record) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
51 if (p_trackno > 0) p_record.m_info.enumerate_meta(*this);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
52 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
53 template<typename t_value> void operator() (const char * p_name,const t_value & p_value) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
54 m_out.add(p_name);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
55 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
56 private:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
57 field_name_list & m_out;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
58 };
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
59
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
60
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
61 class __get_tag__is_field_global_check {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
62 private:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
63 typedef file_info_record::t_meta_value t_value;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
64 public:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
65 __get_tag__is_field_global_check(const char * p_field) : m_field(p_field), m_value(NULL), m_state(true) {}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
66
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
67 void operator() (unsigned p_trackno,const track_record & p_record) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
68 if (p_trackno > 0 && m_state) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
69 const t_value * val = p_record.m_info.meta_query_ptr(m_field);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
70 if (val == NULL) {m_state = false; return;}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
71 if (m_value == NULL) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
72 m_value = val;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
73 } else {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
74 if (pfc::comparator_list<pfc::comparator_strcmp>::compare(*m_value,*val) != 0) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
75 m_state = false; return;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
76 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
77 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
78 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
79 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
80 void finalize(file_info_record::t_meta_map & p_globals) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
81 if (m_state && m_value != NULL) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
82 p_globals.set(m_field,*m_value);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
83 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
84 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
85 private:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
86 const char * const m_field;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
87 const t_value * m_value;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
88 bool m_state;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
89 };
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
90
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
91 class __get_tag__filter_globals {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
92 public:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
93 __get_tag__filter_globals(track_record_list const & p_tracks,file_info_record::t_meta_map & p_globals) : m_tracks(p_tracks), m_globals(p_globals) {}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
94
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
95 void operator() (const char * p_field) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
96 if (is_allowed_field(p_field)) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
97 __get_tag__is_field_global_check wrapper(p_field);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
98 m_tracks.enumerate(wrapper);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
99 wrapper.finalize(m_globals);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
100 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
101 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
102 private:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
103 const track_record_list & m_tracks;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
104 file_info_record::t_meta_map & m_globals;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
105 };
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
106
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
107 class __get_tag__local_field_filter {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
108 public:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
109 __get_tag__local_field_filter(const file_info_record::t_meta_map & p_globals,file_info_record::t_meta_map & p_output) : m_globals(p_globals), m_output(p_output), m_currenttrack(0) {}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
110 void operator() (unsigned p_trackno,const track_record & p_track) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
111 if (p_trackno > 0) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
112 m_currenttrack = p_trackno;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
113 p_track.m_info.enumerate_meta(*this);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
114 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
115 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
116 void operator() (const char * p_name,const file_info_record::t_meta_value & p_value) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
117 PFC_ASSERT(m_currenttrack > 0);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
118 if (!m_globals.have_item(p_name)) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
119 build_cue_meta_name(p_name,m_currenttrack,m_buffer);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
120 m_output.set(m_buffer,p_value);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
121 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
122 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
123 private:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
124 unsigned m_currenttrack;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
125 pfc::string8_fastalloc m_buffer;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
126 const file_info_record::t_meta_map & m_globals;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
127 file_info_record::t_meta_map & m_output;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
128 };
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
129 };
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
130
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
131 static bool meta_value_equals(const char* v1, const char* v2, bool asNumber) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
132 if (asNumber) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
133 // Special fix: leading zeros on track numbers
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
134 while( *v1 == '0' ) ++ v1;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
135 while( *v2 == '0' ) ++ v2;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
136 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
137 return strcmp(v1,v2) == 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
138 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
139
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
140 static void strip_redundant_track_meta(unsigned p_tracknumber,const file_info & p_cueinfo,file_info_record::t_meta_map & p_meta,const char * p_metaname, bool asNumber) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
141 const size_t metaindex = p_cueinfo.meta_find(p_metaname);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
142 if (metaindex == SIZE_MAX) return;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
143 pfc::string_formatter namelocal;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
144 build_cue_meta_name(p_metaname,p_tracknumber,namelocal);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
145 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
146 const file_info_record::t_meta_value * val = p_meta.query_ptr(namelocal);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
147 if (val == NULL) return;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
148 file_info_record::t_meta_value::const_iterator iter = val->first();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
149 for(t_size valwalk = 0, valcount = p_cueinfo.meta_enum_value_count(metaindex); valwalk < valcount; ++valwalk) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
150 if (iter.is_empty()) return;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
151
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
152 if (!meta_value_equals(*iter,p_cueinfo.meta_enum_value(metaindex,valwalk), asNumber)) return;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
153 ++iter;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
154 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
155 if (!iter.is_empty()) return;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
156 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
157 //success
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
158 p_meta.remove(namelocal);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
159 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
160
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
161 // Named get_tag() for backwards compat - it doesn't just get tag, it builds the intended tag from current metadata
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
162 // Called prior to file update
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
163 void embeddedcue_metadata_manager::get_tag(file_info & p_info) const {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
164 if (!have_cuesheet()) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
165 m_content.query_ptr(0u)->m_info.to_info(p_info);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
166 p_info.meta_remove_field("cuesheet");
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
167 return;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
168 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
169
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
170 cue_creator::t_entry_list entries;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
171 m_content.enumerate([&entries] (unsigned p_trackno,const track_record & p_record) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
172 if (p_trackno > 0) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
173 cue_creator::t_entry_list::iterator iter = entries.insert_last();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
174 iter->m_trackType = "AUDIO";
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
175 iter->m_file = p_record.m_file;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
176 iter->m_flags = p_record.m_flags;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
177 iter->m_index_list = p_record.m_index_list;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
178 iter->m_track_number = p_trackno;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
179 p_record.m_info.to_info(iter->m_infos);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
180 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
181 } );
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
182 pfc::string_formatter cuesheet;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
183 cue_creator::create(cuesheet,entries);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
184 entries.remove_all();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
185 //parse it back to see what info got stored in the cuesheet and what needs to be stored outside cuesheet in the tags
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
186 cue_parser::parse_full(cuesheet,entries);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
187 file_info_record output;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
188
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
189 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
190 file_info_record::t_meta_map globals;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
191 //1. find global infos and forward them
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
192 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
193 field_name_list fields;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
194 { __get_tag__enum_fields_enumerator e(fields); m_content.enumerate(e);}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
195 { __get_tag__filter_globals e(m_content,globals); fields.enumerate(e); }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
196 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
197
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
198 output.overwrite_meta(globals);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
199
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
200 //2. find local infos
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
201 {__get_tag__local_field_filter e(globals,output.m_meta); m_content.enumerate(e);}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
202 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
203
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
204
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
205 //strip redundant titles, artists and tracknumbers that the cuesheet already contains
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
206 for(cue_creator::t_entry_list::const_iterator iter = entries.first(); iter.is_valid(); ++iter) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
207 strip_redundant_track_meta(iter->m_track_number,iter->m_infos,output.m_meta,"tracknumber", true);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
208 strip_redundant_track_meta(iter->m_track_number,iter->m_infos,output.m_meta,"title", false);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
209 strip_redundant_track_meta(iter->m_track_number,iter->m_infos,output.m_meta,"artist", false);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
210 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
211
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
212
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
213 //add tech infos etc
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
214
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
215 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
216 const track_record * rec = m_content.query_ptr((unsigned)0);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
217 if (rec != NULL) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
218 output.set_length(rec->m_info.get_length());
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
219 output.set_replaygain(rec->m_info.get_replaygain());
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
220 output.overwrite_info(rec->m_info.m_info);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
221 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
222 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
223 output.meta_set("cuesheet",cuesheet);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
224 output.to_info(p_info);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
225
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
226 DEBUG_INFO( p_info, "get_tag" );
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
227 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
228
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
229 static bool resolve_cue_meta_name(const char * p_name,pfc::string_base & p_outname,unsigned & p_tracknumber) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
230 //"cue_trackNN_fieldname"
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
231 static const char header[] = "cue_track";
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
232 if (pfc::stricmp_ascii_ex(p_name,strlen(header),header,~0) != 0) return false;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
233 p_name += strlen(header);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
234 if (!pfc::char_is_numeric(p_name[0]) || !pfc::char_is_numeric(p_name[1]) || p_name[2] != '_') return false;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
235 unsigned tracknumber = pfc::atoui_ex(p_name,2);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
236 if (tracknumber == 0) return false;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
237 p_name += 3;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
238 p_tracknumber = tracknumber;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
239 p_outname = p_name;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
240 return true;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
241 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
242
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
243 void embeddedcue_metadata_manager::set_tag(file_info const & p_info) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
244
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
245 DEBUG_INFO( p_info, "set_tag" );
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
246
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
247 m_content.remove_all();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
248
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
249 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
250 track_record & track0 = m_content.find_or_add((unsigned)0);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
251 track0.m_info.from_info(p_info);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
252 track0.m_info.m_info.set("cue_embedded","no");
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
253 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
254
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
255
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
256
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
257 const char * cuesheet = p_info.meta_get("cuesheet",0);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
258 if (cuesheet == NULL) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
259 return;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
260 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
261
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
262 //processing order
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
263 //1. cuesheet content
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
264 //2. supplement with global metadata from the tag
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
265 //3. overwrite with local metadata from the tag
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
266
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
267 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
268 cue_creator::t_entry_list entries;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
269 try {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
270 cue_parser::parse_full(cuesheet,entries);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
271 } catch(exception_io_data const & e) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
272 console::complain("Attempting to embed an invalid cuesheet", e.what());
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
273 return;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
274 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
275
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
276 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
277 const double length = p_info.get_length();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
278 for(cue_creator::t_entry_list::const_iterator iter = entries.first(); iter.is_valid(); ++iter ) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
279 if (iter->m_index_list.start() > length) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
280 console::info("Invalid cuesheet - index outside allowed range");
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
281 return;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
282 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
283 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
284 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
285
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
286 for(cue_creator::t_entry_list::const_iterator iter = entries.first(); iter.is_valid(); ) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
287 cue_creator::t_entry_list::const_iterator next = iter;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
288 ++next;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
289 track_record & entry = m_content.find_or_add(iter->m_track_number);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
290 entry.m_file = iter->m_file;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
291 entry.m_flags = iter->m_flags;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
292 entry.m_index_list = iter->m_index_list;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
293 entry.m_info.from_info(iter->m_infos);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
294 DEBUG_INFO(iter->m_infos, "set_tag cue track info" );
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
295 entry.m_info.from_info_overwrite_info(p_info);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
296 entry.m_info.m_info.set("cue_embedded","yes");
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
297 double begin = entry.m_index_list.start(), end = next.is_valid() ? next->m_index_list.start() : p_info.get_length();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
298 if (end <= begin) throw exception_io_data();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
299 entry.m_info.set_length(end - begin);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
300 iter = next;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
301 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
302 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
303
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
304 DEBUG_INFO( m_content, "set_tag part 1");
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
305
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
306 // == GLOBALS ==
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
307 for(t_size metawalk = 0, metacount = p_info.meta_get_count(); metawalk < metacount; ++metawalk) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
308 const char * name = p_info.meta_enum_name(metawalk);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
309 const t_size valuecount = p_info.meta_enum_value_count(metawalk);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
310 if (valuecount > 0 && !is_reserved_meta_entry(name) && is_global_meta_entry(name)) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
311 m_content.enumerate( [&p_info, metawalk, name, valuecount] ( unsigned p_trackno, track_record & p_record ) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
312 if (p_trackno > 0) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
313 // Supplement, not overwrite
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
314 // 2021-02-12 fix: prefer whatever has more values
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
315 if (valuecount > p_record.m_info.meta_value_count(name)) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
316 p_record.m_info.transfer_meta_entry(name, p_info, metawalk);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
317 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
318 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
319 } );
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
320 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
321 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
322
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
323 DEBUG_INFO( m_content, "set_tag part 2");
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
324
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
325 // == TRACK LOCALS ==
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
326 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
327 pfc::string8_fastalloc namebuffer;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
328 for(t_size metawalk = 0, metacount = p_info.meta_get_count(); metawalk < metacount; ++metawalk) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
329 const char * name = p_info.meta_enum_name(metawalk);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
330 const t_size valuecount = p_info.meta_enum_value_count(metawalk);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
331 unsigned trackno;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
332 if (valuecount > 0 && !is_reserved_meta_entry(name) && resolve_cue_meta_name(name,namebuffer,trackno)) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
333 track_record * rec = m_content.query_ptr(trackno);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
334 if (rec != NULL) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
335 rec->m_info.transfer_meta_entry(namebuffer,p_info,metawalk);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
336 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
337 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
338 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
339 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
340
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
341 DEBUG_INFO( m_content, "set_tag part 3");
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
342 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
343
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
344 void embeddedcue_metadata_manager::get_track_info(unsigned p_track,file_info & p_info) const {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
345 const track_record * rec = m_content.query_ptr(p_track);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
346 if (rec == NULL) throw exception_io_data();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
347 rec->m_info.to_info(p_info);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
348 DEBUG_INFO( p_info, pfc::format("get_track_info(", p_track, ")" ));
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
349 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
350
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
351 void embeddedcue_metadata_manager::set_track_info(unsigned p_track,file_info const & p_info) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
352 DEBUG_INFO( p_info, pfc::format("set_track_info(", p_track, ")" ));
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
353 track_record * rec = m_content.query_ptr(p_track);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
354 if (rec == NULL) throw exception_io_data();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
355 rec->m_info.from_info_set_meta(p_info);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
356 rec->m_info.set_replaygain(p_info.get_replaygain());
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
357 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
358
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
359 void embeddedcue_metadata_manager::query_track_offsets(unsigned p_track,double & p_begin,double & p_length) const {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
360 const track_record * rec = m_content.query_ptr(p_track);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
361 if (rec == NULL) throw exception_io_data();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
362 p_begin = rec->m_index_list.start();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
363 p_length = rec->m_info.get_length();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
364 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
365
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
366 bool embeddedcue_metadata_manager::have_cuesheet() const {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
367 return m_content.get_count() > 1;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
368 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
369
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
370 namespace {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
371 class _remap_trackno_enumerator {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
372 public:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
373 _remap_trackno_enumerator(unsigned p_index) : m_countdown(p_index), m_result(0) {}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
374 template<typename t_blah> void operator() (unsigned p_trackno,const t_blah&) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
375 if (p_trackno > 0 && m_result == 0) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
376 if (m_countdown == 0) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
377 m_result = p_trackno;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
378 } else {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
379 --m_countdown;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
380 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
381 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
382 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
383 unsigned result() const {return m_result;}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
384 private:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
385 unsigned m_countdown;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
386 unsigned m_result;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
387 };
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
388 };
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
389
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
390 unsigned embeddedcue_metadata_manager::remap_trackno(unsigned p_index) const {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
391 if (have_cuesheet()) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
392 _remap_trackno_enumerator wrapper(p_index);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
393 m_content.enumerate(wrapper);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
394 return wrapper.result();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
395 } else {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
396 return 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
397 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
398 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
399
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
400 t_size embeddedcue_metadata_manager::get_cue_track_count() const {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
401 return m_content.get_count() - 1;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
402 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
403
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
404 pfc::string8 embeddedcue_metadata_manager::build_minimal_cuesheet() const {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
405 cue_creator::t_entry_list entries;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
406 m_content.enumerate([&entries](unsigned p_trackno, const track_record& p_record) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
407 if (p_trackno > 0) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
408 cue_creator::t_entry_list::iterator iter = entries.insert_last();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
409 iter->m_trackType = "AUDIO";
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
410 iter->m_file = "Image.wav";
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
411 iter->m_flags = p_record.m_flags;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
412 iter->m_index_list = p_record.m_index_list;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
413 iter->m_track_number = p_trackno;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
414 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
415 });
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
416 pfc::string_formatter cuesheet;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
417 cue_creator::create(cuesheet, entries);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
418 return cuesheet;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
419 }