annotate foosdk/sdk/foobar2000/helpers/cue_parser.h @ 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 #pragma once
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3 #include "cue_creator.h"
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4 #include <SDK/chapterizer.h>
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
5 #include <SDK/input_impl.h>
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 //HINT: for info on how to generate an embedded cuesheet enabled input, see the end of this header.
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
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
10
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
11 namespace file_info_record_helper {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
12
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
13 class file_info_record {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
14 public:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
15 typedef pfc::chain_list_v2_t<pfc::string8> t_meta_value;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
16 typedef pfc::map_t<pfc::string8,t_meta_value,file_info::field_name_comparator> t_meta_map;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
17 typedef pfc::map_t<pfc::string8,pfc::string8,file_info::field_name_comparator> t_info_map;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
18
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
19 file_info_record() : m_replaygain(replaygain_info_invalid), m_length(0) {}
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 replaygain_info get_replaygain() const {return m_replaygain;}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
22 void set_replaygain(const replaygain_info & p_replaygain) {m_replaygain = p_replaygain;}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
23 double get_length() const {return m_length;}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
24 void set_length(double p_length) {m_length = p_length;}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
25
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
26 void reset();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
27 void from_info_overwrite_info(const file_info & p_info);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
28 void from_info_overwrite_meta(const file_info & p_info);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
29 void from_info_overwrite_rg(const file_info & p_info);
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 template<typename t_source>
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
32 void overwrite_meta(const t_source & p_meta) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
33 m_meta.overwrite(p_meta);
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 template<typename t_source>
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
36 void overwrite_info(const t_source & p_info) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
37 m_info.overwrite(p_info);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
38 }
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 void merge_overwrite(const file_info & p_info);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
41 void transfer_meta_entry(const char * p_name,const file_info & p_info,t_size p_index);
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 void meta_set(const char * p_name,const char * p_value);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
44 const t_meta_value * meta_query_ptr(const char * p_name) const;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
45
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
46 void from_info_set_meta(const file_info & p_info);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
47
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
48 void from_info(const file_info & p_info);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
49 void to_info(file_info & p_info) const;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
50
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
51 template<typename t_callback> void enumerate_meta(t_callback & p_callback) const {m_meta.enumerate(p_callback);}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
52 template<typename t_callback> void enumerate_meta(t_callback & p_callback) {m_meta.enumerate(p_callback);}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
53
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
54 size_t meta_value_count(const char* name) const;
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 t_meta_map m_meta;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
58 t_info_map m_info;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
59 replaygain_info m_replaygain;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
60 double m_length;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
61 };
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
62
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
63 }//namespace file_info_record_helper
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
64
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
65
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
66 namespace cue_parser
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
67 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
68 struct cue_entry {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
69 pfc::string8 m_file, m_fileType;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
70 unsigned m_track_number;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
71 t_cuesheet_index_list m_indexes;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
72 bool isFileBinary() const {return pfc::stringEqualsI_ascii(m_fileType, "BINARY");}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
73 };
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
74
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
75 typedef pfc::chain_list_v2_t<cue_entry> t_cue_entry_list;
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 PFC_DECLARE_EXCEPTION(exception_bad_cuesheet,exception_io_data,"Invalid cuesheet");
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 //! Throws exception_bad_cuesheet on failure.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
81 void parse(const char *p_cuesheet,t_cue_entry_list & p_out);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
82 //! Throws exception_bad_cuesheet on failure.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
83 void parse_info(const char *p_cuesheet,file_info & p_info,unsigned p_index);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
84 //! Throws exception_bad_cuesheet on failure.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
85 void parse_full(const char * p_cuesheet,cue_creator::t_entry_list & p_out);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
86
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
87
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
88
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
89 struct track_record {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
90 file_info_record_helper::file_info_record m_info;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
91 pfc::string8 m_file,m_flags;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
92 t_cuesheet_index_list m_index_list;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
93 };
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 typedef pfc::map_t<unsigned,track_record> track_record_list;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
96
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
97 class embeddedcue_metadata_manager {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
98 public:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
99 // 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
100 void get_tag(file_info & p_info) const;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
101 // Imports tag read from file
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
102 void set_tag(file_info const & p_info);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
103
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
104 void get_track_info(unsigned p_track,file_info & p_info) const;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
105 void set_track_info(unsigned p_track,file_info const & p_info);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
106 void 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
107 bool have_cuesheet() const;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
108 unsigned remap_trackno(unsigned p_index) const;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
109 t_size get_cue_track_count() const;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
110 pfc::string8 build_minimal_cuesheet() const;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
111 private:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
112 track_record_list m_content;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
113 };
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
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
117
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
118
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
119 template<typename t_base>
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
120 class input_wrapper_cue_t : public input_forward_static_methods<t_base> {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
121 public:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
122 typedef input_info_writer_v2 interface_info_writer_t; // remove_tags supplied
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
123 void open(service_ptr_t<file> p_filehint,const char * p_path,t_input_open_reason p_reason,abort_callback & p_abort) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
124 m_remote = filesystem::g_is_recognized_and_remote( p_path );
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
125 if (m_remote && p_reason == input_open_info_write) throw exception_io_object_is_remote();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
126 m_impl.open( p_filehint, p_path, p_reason, p_abort );
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
127 if (!m_remote) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
128 file_info_impl info;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
129 m_impl.get_info(info, p_abort);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
130 m_meta.set_tag(info);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
131 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
132 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
133
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
134 t_uint32 get_subsong_count() {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
135 return this->expose_cuesheet() ? (uint32_t) m_meta.get_cue_track_count() : 1;
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
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
138 t_uint32 get_subsong(t_uint32 p_index) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
139 return this->expose_cuesheet() ? m_meta.remap_trackno(p_index) : 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
140 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
141
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
142 void get_info(t_uint32 p_subsong,file_info & p_info,abort_callback & p_abort) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
143 if (m_remote) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
144 PFC_ASSERT(p_subsong == 0);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
145 m_impl.get_info(p_info, p_abort);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
146 } else {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
147 m_meta.get_track_info(p_subsong,p_info);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
148 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
149 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
150
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
151 t_filestats get_file_stats(abort_callback& p_abort) { return get_stats2(stats2_legacy, p_abort).to_legacy(); }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
152 t_filestats2 get_stats2(uint32_t f, abort_callback& a) { return m_impl.get_stats2(f, a); }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
153
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
154 void decode_initialize(t_uint32 p_subsong,unsigned p_flags,abort_callback & p_abort) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
155 if (p_subsong == 0) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
156 m_impl.decode_initialize(p_flags, p_abort);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
157 m_decodeFrom = 0; m_decodeLength = -1; m_decodePos = 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
158 } else {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
159 double start, length;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
160 _query_track_offsets(p_subsong,start,length);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
161 unsigned flags2 = p_flags;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
162 if (start > 0) flags2 &= ~input_flag_no_seeking;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
163 flags2 &= ~input_flag_allow_inaccurate_seeking;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
164 m_impl.decode_initialize(flags2, p_abort);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
165 m_impl.decode_seek(start, p_abort);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
166 m_decodeFrom = start; m_decodeLength = length; m_decodePos = 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
167 }
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 bool decode_run(audio_chunk & p_chunk,abort_callback & p_abort) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
171 return _run(p_chunk, NULL, p_abort);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
172 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
173
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
174 void decode_seek(double p_seconds,abort_callback & p_abort) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
175 if (this->m_decodeLength >= 0 && p_seconds > m_decodeLength) p_seconds = m_decodeLength;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
176 m_impl.decode_seek(m_decodeFrom + p_seconds,p_abort);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
177 m_decodePos = p_seconds;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
178 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
179
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
180 bool decode_can_seek() {return m_impl.decode_can_seek();}
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 bool decode_run_raw(audio_chunk & p_chunk, mem_block_container & p_raw, abort_callback & p_abort) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
183 return _run(p_chunk, &p_raw, p_abort);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
184 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
185 void set_logger(event_logger::ptr ptr) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
186 m_impl.set_logger(ptr);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
187 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
188 bool flush_on_pause() {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
189 return m_impl.flush_on_pause();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
190 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
191 void set_pause(bool) {} // obsolete
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
192 size_t extended_param(const GUID & type, size_t arg1, void * arg2, size_t arg2size) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
193 return m_impl.extended_param(type, arg1, arg2, arg2size);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
194 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
195
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
196 bool decode_get_dynamic_info(file_info & p_out, double & p_timestamp_delta) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
197 return m_impl.decode_get_dynamic_info(p_out, p_timestamp_delta);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
198 }
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 bool decode_get_dynamic_info_track(file_info & p_out, double & p_timestamp_delta) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
201 return m_impl.decode_get_dynamic_info_track(p_out, p_timestamp_delta);
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 void decode_on_idle(abort_callback & p_abort) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
205 m_impl.decode_on_idle(p_abort);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
206 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
207
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
208 void remove_tags(abort_callback & abort) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
209 PFC_ASSERT(!m_remote);
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 pfc::string8 restoreCuesheet;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
212 if (this->expose_cuesheet()) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
213 restoreCuesheet = m_meta.build_minimal_cuesheet();
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 m_impl.remove_tags( abort );
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
217
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
218 if (restoreCuesheet.length() > 0) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
219 // restore minimal tag
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
220 file_info_impl infoMinimal; infoMinimal.meta_set("cuesheet", restoreCuesheet);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
221 m_impl.retag(infoMinimal, abort);
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
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
224 file_info_impl info;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
225 m_impl.get_info(info, abort);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
226 m_meta.set_tag( info );
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 void retag_set_info(t_uint32 p_subsong,const file_info & p_info,abort_callback & p_abort) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
230 PFC_ASSERT(!m_remote);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
231 if (p_subsong == 0) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
232 // Special case: Only subsong zero altered
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
233 m_retag0 = p_info; m_retag0_pending = true;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
234 } else {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
235 if (m_retag0_pending) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
236 m_meta.set_tag(m_retag0); m_retag0.reset();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
237 m_retag0_pending = false;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
238 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
239 m_meta.set_track_info(p_subsong,p_info);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
240 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
241 m_retag_pending = true;
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 _retag(const file_info& info, abort_callback& abort) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
244 m_impl.retag(info, abort);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
245 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
246 void retag_commit(abort_callback & p_abort) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
247 PFC_ASSERT(!m_remote);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
248 if (!m_retag_pending) return;
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 if (m_retag0_pending) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
251 // Special case: Only subsong zero altered
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
252 _retag(m_retag0, p_abort); m_retag0.reset();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
253 m_retag0_pending = false;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
254 } else {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
255 file_info_impl info;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
256 m_meta.get_tag(info);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
257 _retag(info, p_abort);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
258 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
259
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
260 file_info_impl info;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
261 m_impl.get_info(info, p_abort);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
262 m_meta.set_tag( info );
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
263
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
264 m_retag_pending = false;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
265
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 void _query_track_offsets(unsigned p_subsong, double& start, double& length) const {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
268 m_meta.query_track_offsets(p_subsong,start,length);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
269 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
270 bool expose_cuesheet() const {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
271 return !m_remote && m_meta.have_cuesheet();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
272 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
273 private:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
274 bool _run(audio_chunk & chunk, mem_block_container * raw, abort_callback & aborter) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
275 if (m_decodeLength >= 0 && m_decodePos >= m_decodeLength) return false;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
276 if (raw == NULL) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
277 if (!m_impl.decode_run(chunk, aborter)) return false;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
278 } else {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
279 if (!m_impl.decode_run_raw(chunk, *raw, aborter)) return false;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
280 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
281
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
282 if (m_decodeLength >= 0) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
283 const uint64_t remaining = audio_math::time_to_samples( m_decodeLength - m_decodePos, chunk.get_sample_rate() );
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
284 const size_t samplesGot = chunk.get_sample_count();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
285 if (remaining < samplesGot) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
286 m_decodePos = m_decodeLength;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
287 if (remaining == 0) { // rare but possible as a result of rounding SNAFU - we're EOF but we didn't notice earlier
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
288 return false;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
289 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
290
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
291 chunk.set_sample_count( (size_t) remaining );
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
292 if (raw != NULL) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
293 const t_size rawSize = raw->get_size();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
294 PFC_ASSERT( rawSize % samplesGot == 0 );
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
295 raw->set_size( (t_size) ( (t_uint64) rawSize * remaining / samplesGot ) );
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
296 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
297 } else {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
298 m_decodePos += chunk.get_duration();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
299 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
300 } else {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
301 m_decodePos += chunk.get_duration();
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 return true;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
304 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
305 t_base m_impl;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
306 double m_decodeFrom, m_decodeLength, m_decodePos;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
307 bool m_remote = false;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
308 embeddedcue_metadata_manager m_meta;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
309
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
310 file_info_impl m_retag0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
311 bool m_retag0_pending = false;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
312 bool m_retag_pending = false;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
313 };
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
314 #ifdef FOOBAR2000_HAVE_CHAPTERIZER
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
315 template<typename I>
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
316 class chapterizer_impl_t : public chapterizer
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 public:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
319 bool is_our_path(const char * p_path) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
320 return I::g_is_our_path(p_path, pfc::string_extension(p_path));
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 void set_chapters(const char * p_path,chapter_list const & p_list,abort_callback & p_abort) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
324 input_wrapper_cue_t<I> instance;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
325 instance.open(0,p_path,input_open_info_write,p_abort);
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 //stamp the cuesheet first
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
328 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
329 file_info_impl info;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
330 instance.get_info(0,info,p_abort);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
331
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
332 pfc::string_formatter cuesheet;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
333
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
334 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
335 cue_creator::t_entry_list entries;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
336 t_size n, m = p_list.get_chapter_count();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
337 const double pregap = p_list.get_pregap();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
338 double offset_acc = pregap;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
339 for(n=0;n<m;n++)
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 cue_creator::t_entry_list::iterator entry;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
342 entry = entries.insert_last();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
343 entry->m_infos = p_list.get_info(n);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
344 entry->m_file = "CDImage.wav";
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
345 entry->m_track_number = (unsigned)(n+1);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
346 entry->m_index_list.from_infos(entry->m_infos,offset_acc);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
347 if (n == 0) entry->m_index_list.m_positions[0] = 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
348 offset_acc += entry->m_infos.get_length();
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 cue_creator::create(cuesheet,entries);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
351 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
352
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
353 info.meta_set("cuesheet",cuesheet);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
354
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
355 instance.retag_set_info(0,info,p_abort);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
356 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
357 //stamp per-chapter infos
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
358 for(t_size walk = 0, total = p_list.get_chapter_count(); walk < total; ++walk) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
359 instance.retag_set_info( (uint32_t)( walk + 1 ), p_list.get_info(walk),p_abort);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
360 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
361
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
362 instance.retag_commit(p_abort);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
363 }
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 void get_chapters(const char * p_path,chapter_list & p_list,abort_callback & p_abort) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
366
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
367 input_wrapper_cue_t<I> instance;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
368 instance.open(0,p_path,input_open_info_read,p_abort);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
369 const t_uint32 total = instance.get_subsong_count();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
370
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
371 if (instance.expose_cuesheet()) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
372 double start, len;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
373 instance._query_track_offsets(1, start, len);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
374 p_list.set_pregap( start );
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
375 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
376
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
377
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
378 p_list.set_chapter_count(total);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
379 for(t_uint32 walk = 0; walk < total; ++walk) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
380 file_info_impl info;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
381 instance.get_info(instance.get_subsong(walk),info,p_abort);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
382 p_list.set_info(walk,info);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
383 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
384 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
385
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
386 bool supports_pregaps() {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
387 return true;
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 #endif
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
391 };
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
392
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
393 //! Wrapper template for generating embedded cuesheet enabled inputs.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
394 //! t_input_impl is a singletrack input implementation (see input_singletrack_impl for method declarations).
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
395 //! To declare an embedded cuesheet enabled input, change your input declaration from input_singletrack_factory_t<myinput> to input_cuesheet_factory_t<myinput>.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
396 template<typename t_input_impl, unsigned t_flags = 0>
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
397 class input_cuesheet_factory_t {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
398 public:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
399 input_factory_t<cue_parser::input_wrapper_cue_t<t_input_impl>,t_flags > m_input_factory;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
400 #ifdef FOOBAR2000_HAVE_CHAPTERIZER
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
401 service_factory_single_t<cue_parser::chapterizer_impl_t<t_input_impl> > m_chapterizer_factory;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
402 #endif
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
403 };