annotate foosdk/sdk/foobar2000/SDK/input_impl.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 "input.h"
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4 #include "mem_block_container.h"
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
5
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
6 enum t_input_open_reason {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
7 input_open_info_read,
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
8 input_open_decode,
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
9 input_open_info_write
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
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
12 //! Helper function for input implementation use; ensures that file is open with relevant access mode. This is typically called from input_impl::open() and such.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
13 //! @param p_file File object pointer to process. If passed pointer is non-null, the function does nothing and always succeeds; otherwise it attempts to open the file using filesystem API methods.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
14 //! @param p_path Path to the file.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
15 //! @param p_reason Type of input operation requested. See: input_impl::open() parameters.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
16 //! @param p_abort abort_callback object signaling user aborting the operation.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
17 void input_open_file_helper(service_ptr_t<file> & p_file,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
18
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
19
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
20 //! This is a class that just declares prototypes of functions that each input needs to implement. See input_decoder / input_info_reader / input_info_writer interfaces for full descriptions of member functions. Since input implementation class is instantiated using a template, you don't need to derive from input_impl as virtual functions are not used on implementation class level. Use input_factory_t template to register input class based on input_impl.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
21 class input_impl
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 public:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
24 //! Opens specified file for info read / decoding / info write. This is called only once, immediately after object creation, before any other methods, and no other methods are called if open() fails.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
25 //! @param p_filehint Optional; passes file object to use for the operation; if set to null, the implementation should handle opening file by itself. Note that not all inputs operate on physical files that can be reached through filesystem API, some of them require this parameter to be set to null (tone and silence generators for an example). Typically, an input implementation that requires file access calls input_open_file_helper() function to ensure that file is open with relevant access mode (read or read/write).
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
26 //! @param p_path URL of resource being opened.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
27 //! @param p_reason Type of operation requested. Possible values are: \n
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
28 //! - input_open_info_read - info retrieval methods are valid; \n
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
29 //! - input_open_decode - info retrieval and decoding methods are valid; \n
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
30 //! - input_open_info_write - info retrieval and retagging methods are valid; \n
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
31 //! Note that info retrieval methods are valid in all cases, and they may be called at any point of decoding/retagging process. Results of info retrieval methods (other than get_subsong_count() / get_subsong()) between retag_set_info() and retag_commit() are undefined however; those should not be called during that period. \n
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
32 //! If your implementation does not support writing tags, throw exception_tagging_unsupported in response to input_open_info_write and do not implement other tag writing methods (they will not be called).
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
33 //! @param p_abort abort_callback object signaling user aborting the operation.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
34 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
35
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
36 //! See: input_info_reader::get_subsong_count(). Valid after open() with any reason.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
37 unsigned get_subsong_count();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
38 //! See: input_info_reader::get_subsong(). Valid after open() with any reason.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
39 t_uint32 get_subsong(unsigned p_index);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
40 //! See: input_info_reader::get_info(). Valid after open() with any reason.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
41 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
42 //! See: input_info_reader_v2::get_stats2(). Valid after open() with any reason.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
43 t_filestats2 get_stats2(uint32_t, abort_callback & p_abort);
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 //! See: input_decoder::initialize(). Valid after open() with input_open_decode reason.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
46 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
47 //! See: input_decoder::run(). Valid after decode_initialize().
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
48 bool decode_run(audio_chunk & p_chunk,abort_callback & p_abort);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
49 //! See: input_decoder::seek(). Valid after decode_initialize().
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
50 void decode_seek(double p_seconds,abort_callback & p_abort);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
51 //! See: input_decoder::can_seek(). Valid after decode_initialize().
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
52 bool decode_can_seek();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
53 //! See: input_decoder::get_dynamic_info(). Valid after decode_initialize().
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
54 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
55 //! See: input_decoder::get_dynamic_info_track(). Valid after decode_initialize().
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
56 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
57 //! Obsolete, do not use, do not rely on.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
58 void decode_on_idle(abort_callback & p_abort);
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 //! See: input_info_writer::set_info(). Valid after open() with input_open_info_write reason. \n
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
61 //! If your implementation does not support writing tags, throw exception_tagging_unsupported from open() and retag_* methods will never be called.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
62 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
63 //! See: input_info_writer::commit(). Valid after open() with input_open_info_write reason. \n
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
64 //! If your implementation does not support writing tags, throw exception_tagging_unsupported from open() and retag_* methods will never be called.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
65 void retag_commit(abort_callback & p_abort);
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 //! See: input_info_writer_v2::remove_tags(). Valid after open() with input_open_info_write reason. \n
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
68 //! If possible, entirely remove tags from the file (truncate ID3/APE tags away etc); otherwise set blank metadata. \n
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
69 //! If your implementation does not support writing tags, throw exception_tagging_unsupported from open() and remove_tags() will never be called.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
70 void remove_tags(abort_callback & p_abort);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
71
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
72 //! See: input_entry::is_our_content_type().
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
73 static bool g_is_our_content_type(const char * p_content_type);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
74 //! See: input_entry::is_our_path().
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
75 static bool g_is_our_path(const char * p_path,const char * p_extension);
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 //! See: input_entry::get_guid().
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
78 static GUID g_get_guid();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
79 //! See: input_entry::get_name().
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
80 static const char * g_get_name();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
81 //! See: input_entry::get_preferences_guid().
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
82 static GUID g_get_preferences_guid();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
83 //! See: input_entry::is_low_merit().
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
84 static bool g_is_low_merit();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
85
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
86 //! See: input_decoder_v2::run_raw(). Relevant only when implementing input_decoder_v2. Valid after decode_initialize().
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
87 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
88
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
89 //! OLD way: may be called at any time from input_decoder_v2 \n
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
90 //! NEW way (1.5): called prior to open().
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
91 void set_logger(event_logger::ptr ptr);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
92 protected:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
93 input_impl() {}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
94 ~input_impl() {}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
95 };
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 //! A base class that provides stub implementations of all optional input methods. \n
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
98 //! Inherit from this and you implement input_decoder_v4 without having to provide all the methods you don't actually need.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
99 class input_stubs {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
100 public:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
101 bool decode_run_raw(audio_chunk& p_chunk, mem_block_container& p_raw, abort_callback& p_abort) { (void)p_chunk; (void)p_raw; (void)p_abort; throw pfc::exception_not_implemented(); }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
102 void set_logger(event_logger::ptr ptr) { (void)ptr; }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
103 void set_pause(bool paused) { (void)paused; }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
104 bool flush_on_pause() { return false; }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
105 size_t extended_param(const GUID& type, size_t arg1, void* arg2, size_t arg2size) { (void)type, (void)arg1; (void)arg2; (void)arg2size; return 0; }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
106 static GUID g_get_preferences_guid() {return pfc::guid_null;}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
107 static bool g_is_low_merit() { return false; }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
108 static bool g_fallback_is_our_payload(const void* bytes, size_t bytesAvail, t_filesize bytesWhole) { (void)bytes; (void)bytesAvail; (void)bytes; (void)bytesWhole; return false; }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
109
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
110 bool decode_get_dynamic_info(file_info& p_out, double& p_timestamp_delta) { (void)p_out; (void)p_timestamp_delta; return false; }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
111 bool decode_get_dynamic_info_track(file_info& p_out, double& p_timestamp_delta) { (void)p_out; (void)p_timestamp_delta; return false; }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
112 void decode_on_idle(abort_callback& p_abort) { (void)p_abort; }
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 //! These typedefs indicate which interfaces your class actually supports. You can override them to support non default input API interfaces without specifying input_factory parameters.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
116 typedef input_decoder_v4 interface_decoder_t;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
117 typedef input_info_reader_v2 interface_info_reader_t;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
118 typedef input_info_writer_v2 interface_info_writer_t;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
119 };
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
120
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
121 //! This is a class that just declares prototypes of functions that each non-multitrack-enabled input needs to implement. See input_decoder / input_info_reader / input_info_writer interfaces for full descriptions of member functions. Since input implementation class is instantiated using a template, you don't need to derive from input_singletrack_impl as virtual functions are not used on implementation class level. Use input_singletrack_factory_t template to register input class based on input_singletrack_impl.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
122 class input_singletrack_impl
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
123 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
124 public:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
125 //! Opens specified file for info read / decoding / info write. This is called only once, immediately after object creation, before any other methods, and no other methods are called if open() fails.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
126 //! @param p_filehint Optional; passes file object to use for the operation; if set to null, the implementation should handle opening file by itself. Note that not all inputs operate on physical files that can be reached through filesystem API, some of them require this parameter to be set to null (tone and silence generators for an example). Typically, an input implementation that requires file access calls input_open_file_helper() function to ensure that file is open with relevant access mode (read or read/write).
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
127 //! @param p_path URL of resource being opened.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
128 //! @param p_reason Type of operation requested. Possible values are: \n
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
129 //! - input_open_info_read - info retrieval methods are valid; \n
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
130 //! - input_open_decode - info retrieval and decoding methods are valid; \n
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
131 //! - input_open_info_write - info retrieval and retagging methods are valid; \n
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
132 //! Note that info retrieval methods are valid in all cases, and they may be called at any point of decoding/retagging process. Results of info retrieval methods (other than get_subsong_count() / get_subsong()) between retag_set_info() and retag_commit() are undefined however; those should not be called during that period. \n
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
133 //! If your implementation does not support writing tags, throw exception_tagging_unsupported in response to input_open_info_write and do not implement other tag writing methods (they will not be called).
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
134 //! @param p_abort abort_callback object signaling user aborting the operation.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
135 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
136
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
137 //! See: input_info_reader::get_info(). Valid after open() with any reason. \n
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
138 //! Implementation warning: this is typically also called immediately after tag update and should return newly written content then.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
139 void get_info(file_info & p_info,abort_callback & p_abort);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
140 //! See: input_info_reader_v2::get_stats2(). Valid after open() with any reason. \n
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
141 //! Implementation warning: this is typically also called immediately after tag update and should return new values then.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
142 t_filestats2 get_stats2(uint32_t, abort_callback&);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
143
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
144 //! See: input_decoder::initialize(). Valid after open() with input_open_decode reason.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
145 void decode_initialize(unsigned p_flags,abort_callback & p_abort);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
146 //! See: input_decoder::run(). Valid after decode_initialize().
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
147 bool decode_run(audio_chunk & p_chunk,abort_callback & p_abort);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
148 //! See: input_decoder::seek(). Valid after decode_initialize().
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
149 void decode_seek(double p_seconds,abort_callback & p_abort);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
150 //! See: input_decoder::can_seek(). Valid after decode_initialize().
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
151 bool decode_can_seek();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
152 //! See: input_decoder::get_dynamic_info(). Valid after decode_initialize().
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
153 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
154 //! See: input_decoder::get_dynamic_info_track(). Valid after decode_initialize().
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
155 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
156 //! Obsolete, do not use, do not rely on.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
157 void decode_on_idle(abort_callback & p_abort);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
158
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
159 //! See: input_info_writer::set_info(). Note that input_info_writer::commit() call isn't forwarded because it's useless in case of non-multitrack-enabled inputs. Valid after open() with input_open_info_write reason. \n
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
160 //! If your implementation does not support writing tags, throw exception_tagging_unsupported from open() and retag() will never be called.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
161 void retag(const file_info & p_info,abort_callback & p_abort);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
162
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
163 //! See: input_info_writer_v2::remove_tags(). Valid after open() with input_open_info_write reason. \n
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
164 //! If possible, entirely remove tags from the file (truncate ID3/APE tags away etc); otherwise set blank metadata. \n
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
165 //! If your implementation does not support writing tags, throw exception_tagging_unsupported from open() and remove_tags() will never be called.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
166 void remove_tags(abort_callback & p_abort);
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 //! See: input_entry::is_our_content_type().
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
169 static bool g_is_our_content_type(const char * p_content_type);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
170 //! See: input_entry::is_our_path().
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
171 static bool g_is_our_path(const char * p_path,const char * p_extension);
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 protected:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
174 input_singletrack_impl() {}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
175 ~input_singletrack_impl() {}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
176 };
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
177
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 //! Used internally by standard input_entry implementation; do not use directly. Translates input_decoder / input_info_reader / input_info_writer calls to input_impl calls.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
180 template<typename I, typename interface_t>
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
181 class input_impl_interface_wrapper_t : public interface_t
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
182 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
183 public:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
184 template<typename ... args_t>
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
185 void open( args_t && ... args) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
186 m_instance.open(std::forward<args_t>(args) ... );
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
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
189 // input_info_reader methods
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 t_uint32 get_subsong_count() {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
192 return m_instance.get_subsong_count();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
193 }
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 t_uint32 get_subsong(t_uint32 p_index) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
196 return m_instance.get_subsong(p_index);
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
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 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
201 m_instance.get_info(p_subsong,p_info,p_abort);
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 t_filestats get_file_stats(abort_callback& p_abort) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
205 return get_stats2(stats2_legacy, p_abort).to_legacy();
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 t_filestats2 get_stats2(uint32_t f, abort_callback& a) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
208 return m_instance.get_stats2(f, a);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
209 }
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 // input_decoder methods
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 void initialize(t_uint32 p_subsong,unsigned p_flags,abort_callback & p_abort) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
214 m_instance.decode_initialize(p_subsong,p_flags,p_abort);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
215 #if PFC_DEBUG
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
216 m_eof = false;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
217 m_decoding = true;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
218 #endif
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
219 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
220
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
221 bool run(audio_chunk & p_chunk,abort_callback & p_abort) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
222 #if PFC_DEBUG
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
223 PFC_ASSERT( !m_eof );
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
224 PFC_ASSERT(m_decoding);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
225 // Complain if run()/run_raw() gets called again after having returned EOF, this means a logic error on caller's side
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
226 #endif
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
227 bool ret = m_instance.decode_run(p_chunk,p_abort);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
228 #if PFC_DEBUG
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
229 if ( !ret ) m_eof = true;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
230 #endif
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
231 return ret;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
232 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
233
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
234 bool 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
235 #if PFC_DEBUG
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
236 // Complain if run()/run_raw() gets called again after having returned EOF, this means a logic error on caller's side
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
237 PFC_ASSERT(!m_eof);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
238 PFC_ASSERT(m_decoding);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
239 #endif
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
240 bool ret = m_instance.decode_run_raw(p_chunk, p_raw, p_abort);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
241 #if PFC_DEBUG
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
242 if ( !ret ) m_eof = true;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
243 #endif
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
244 return ret;
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
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
247 void seek(double p_seconds,abort_callback & p_abort) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
248 #if PFC_DEBUG
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
249 PFC_ASSERT(m_decoding);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
250 #endif
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
251 m_instance.decode_seek(p_seconds,p_abort);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
252 #if PFC_DEBUG
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
253 m_eof = false;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
254 #endif
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 bool can_seek() {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
258 return m_instance.decode_can_seek();
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
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
261 bool get_dynamic_info(file_info & p_out, double & p_timestamp_delta) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
262 return m_instance.decode_get_dynamic_info(p_out,p_timestamp_delta);
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
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
265 bool get_dynamic_info_track(file_info & p_out, double & p_timestamp_delta) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
266 return m_instance.decode_get_dynamic_info_track(p_out,p_timestamp_delta);
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
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
269 void on_idle(abort_callback & p_abort) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
270 m_instance.decode_on_idle(p_abort);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
271 }
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 void set_logger(event_logger::ptr ptr) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
274 m_instance.set_logger(ptr);
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 void set_pause(bool paused) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
278 // obsolete
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
279 // m_instance.set_pause(paused);
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 bool flush_on_pause() {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
283 return m_instance.flush_on_pause();
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 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
287 return m_instance.extended_param(type, arg1, arg2, arg2size);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
288 }
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 // input_info_writer methods
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
291
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
292 void 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
293 m_instance.retag_set_info(p_subsong,p_info,p_abort);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
294 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
295
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
296 void commit(abort_callback & p_abort) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
297 m_instance.retag_commit(p_abort);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
298 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
299 void remove_tags(abort_callback & p_abort) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
300 m_instance.remove_tags(p_abort);
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 private:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
304 I m_instance;
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 #if PFC_DEBUG
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
307 // Report illegal API calls in debug build
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
308 bool m_eof = false;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
309 bool m_decoding = false;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
310 #endif
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
311 };
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
312
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
313 template<typename input_t>
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
314 class input_forward_static_methods : public input_stubs {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
315 public:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
316 static bool g_is_our_content_type(const char * p_content_type) { return input_t::g_is_our_content_type(p_content_type); }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
317 static bool g_is_our_path(const char * p_path, const char * p_extension) { return input_t::g_is_our_path(p_path, p_extension); }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
318 static GUID g_get_preferences_guid() { return input_t::g_get_preferences_guid(); }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
319 static GUID g_get_guid() { return input_t::g_get_guid(); }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
320 static const char * g_get_name() { return input_t::g_get_name(); }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
321 static bool g_is_low_merit() { return input_t::g_is_low_merit(); }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
322 static bool g_fallback_is_our_payload(const void* bytes, size_t bytesAvail, t_filesize bytesWhole) { return input_t::g_fallback_is_our_payload(bytes, bytesAvail, bytesWhole); }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
323
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
324 typedef typename input_t::interface_decoder_t interface_decoder_t;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
325 typedef typename input_t::interface_info_reader_t interface_info_reader_t;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
326 typedef typename input_t::interface_info_writer_t interface_info_writer_t;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
327
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
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
330 //! Helper used by input_singletrack_factory_t, do not use directly. Translates input_impl calls to input_singletrack_impl calls.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
331 template<typename I>
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
332 class input_wrapper_singletrack_t : public input_forward_static_methods<I>
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 public:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
335 input_wrapper_singletrack_t() {}
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 template<typename ... args_t>
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
338 void open( args_t && ... args) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
339 m_instance.open(std::forward<args_t>(args) ... );
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
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
342 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
343 if (p_subsong != 0) throw exception_io_bad_subsong_index();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
344 m_instance.get_info(p_info,p_abort);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
345 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
346
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
347 t_uint32 get_subsong_count() {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
348 return 1;
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 t_uint32 get_subsong(t_uint32 p_index) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
352 PFC_ASSERT(p_index == 0);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
353 return 0;
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
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
356 t_filestats get_file_stats(abort_callback& p_abort) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
357 return get_stats2(stats2_legacy, p_abort).to_legacy();
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 t_filestats2 get_stats2(uint32_t f, abort_callback& a) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
360 return m_instance.get_stats2(f, a);
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
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
363 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
364 if (p_subsong != 0) throw exception_io_bad_subsong_index();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
365 m_instance.decode_initialize(p_flags,p_abort);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
366 #if PFC_DEBUG
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
367 m_decoding = true; m_eof = false;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
368 #endif
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
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
371 bool decode_run(audio_chunk & p_chunk,abort_callback & p_abort) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
372 #if PFC_DEBUG
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
373 PFC_ASSERT(!m_eof);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
374 PFC_ASSERT(m_decoding);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
375 #endif
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
376 bool rv = m_instance.decode_run(p_chunk,p_abort);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
377 #if PFC_DEBUG
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
378 if (!rv) m_eof = true;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
379 #endif
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
380 return rv;
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 void decode_seek(double p_seconds,abort_callback & p_abort) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
383 #if PFC_DEBUG
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
384 PFC_ASSERT(m_decoding);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
385 #endif
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
386 m_instance.decode_seek(p_seconds,p_abort);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
387 #if PFC_DEBUG
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
388 m_eof = false;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
389 #endif
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
390 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
391 bool decode_can_seek() {return m_instance.decode_can_seek();}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
392 bool decode_get_dynamic_info(file_info & p_out, double & p_timestamp_delta) {return m_instance.decode_get_dynamic_info(p_out,p_timestamp_delta);}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
393 bool decode_get_dynamic_info_track(file_info & p_out, double & p_timestamp_delta) {return m_instance.decode_get_dynamic_info_track(p_out,p_timestamp_delta);}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
394 void decode_on_idle(abort_callback & p_abort) {m_instance.decode_on_idle(p_abort);}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
395
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
396 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
397 if (p_subsong != 0) throw exception_io_bad_subsong_index();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
398 m_instance.retag(p_info,p_abort);
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
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
401 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
402 #if PFC_DEBUG
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
403 PFC_ASSERT(!m_eof);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
404 PFC_ASSERT(m_decoding);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
405 #endif
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
406 bool rv = m_instance.decode_run_raw(p_chunk, p_raw, p_abort);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
407 #if PFC_DEBUG
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
408 if (!rv) m_eof = true;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
409 #endif
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
410 return rv;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
411 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
412
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
413 void set_logger(event_logger::ptr ptr) {m_instance.set_logger(ptr);}
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 void set_pause(bool paused) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
416 // m_instance.set_pause(paused);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
417 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
418 bool flush_on_pause() {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
419 return m_instance.flush_on_pause();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
420 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
421 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
422 return m_instance.extended_param(type, arg1, arg2, arg2size);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
423 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
424 void retag_commit(abort_callback & p_abort) {}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
425
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
426 void remove_tags(abort_callback & p_abort) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
427 m_instance.remove_tags(p_abort);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
428 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
429 private:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
430 I m_instance;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
431
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
432 #if PFC_DEBUG
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
433 // Report illegal API calls in debug build
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
434 bool m_eof = false;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
435 bool m_decoding = false;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
436 #endif
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
437 };
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
438
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
439 //! Helper; standard input_entry implementation. Do not instantiate this directly, use input_factory_t or one of other input_*_factory_t helpers instead.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
440 template<typename I,unsigned t_flags, typename t_decoder = typename I::interface_decoder_t, typename t_inforeader = typename I::interface_info_reader_t, typename t_infowriter = typename I::interface_info_writer_t>
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
441 class input_entry_impl_t : public input_entry_v4
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
442 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
443 public:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
444 bool is_our_content_type(const char * p_type) override {return I::g_is_our_content_type(p_type);}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
445 bool is_our_path(const char * p_full_path,const char * p_extension) override {return I::g_is_our_path(p_full_path,p_extension);}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
446
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
447 template<typename interface_t, typename outInterace_t, typename ... args_t>
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
448 void open_ex(service_ptr_t<outInterace_t> & p_instance,args_t && ... args)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
449 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
450 auto temp = fb2k::service_new<input_impl_interface_wrapper_t<I,interface_t> >();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
451 temp->open(std::forward<args_t>(args) ... );
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
452 p_instance = temp.get_ptr();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
453 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
454
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
455 service_ptr open_v3(const GUID & whatFor, file::ptr hint, const char * path, event_logger::ptr logger, abort_callback & aborter) override {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
456 if ( whatFor == input_decoder::class_guid ) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
457 auto obj = fb2k::service_new< input_impl_interface_wrapper_t<I, service_multi_inherit<t_decoder, t_inforeader> > > ();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
458 if ( logger.is_valid() ) obj->set_logger(logger);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
459 obj->open( hint, path, input_open_decode, aborter );
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
460 input_decoder_vrequired* p = obj.get_ptr();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
461 return p;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
462 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
463 if ( whatFor == input_info_reader::class_guid ) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
464 auto obj = fb2k::service_new < input_impl_interface_wrapper_t<I, t_inforeader> >();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
465 if (logger.is_valid()) obj->set_logger(logger);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
466 obj->open(hint, path, input_open_info_read, aborter);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
467 input_info_reader_vrequired* p = obj.get_ptr();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
468 return p;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
469 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
470 if ( whatFor == input_info_writer::class_guid ) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
471 auto obj = fb2k::service_new < input_impl_interface_wrapper_t<I, service_multi_inherit<t_infowriter, t_inforeader> > >();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
472 if (logger.is_valid()) obj->set_logger(logger);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
473 obj->open(hint, path, input_open_info_write, aborter);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
474 input_info_writer_vrequired* p = obj.get_ptr();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
475 return p;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
476 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
477 throw pfc::exception_not_implemented();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
478 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
479
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
480 void get_extended_data(service_ptr_t<file> p_filehint,const playable_location & p_location,const GUID & p_guid,mem_block_container & p_out,abort_callback & p_abort) override {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
481 p_out.reset();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
482 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
483
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
484 unsigned get_flags() override {return t_flags;}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
485
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
486 GUID get_guid() override {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
487 return I::g_get_guid();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
488 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
489 const char * get_name() override {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
490 return I::g_get_name();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
491 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
492
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
493 GUID get_preferences_guid() override {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
494 return I::g_get_preferences_guid();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
495 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
496 bool is_low_merit() override {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
497 return I::g_is_low_merit();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
498 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
499 bool fallback_is_our_payload(const void* bytes, size_t bytesAvail, t_filesize bytesWhole) override {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
500 return I::g_fallback_is_our_payload(bytes, bytesAvail, bytesWhole);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
501 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
502 };
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
503
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
504
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
505 //! Stardard input factory. For reference of functions that must be supported by registered class, see input_impl.\n Usage: static input_factory_t<myinputclass> g_myinputclass_factory;\n Note that input classes can't be registered through service_factory_t template directly.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
506 template<typename T, unsigned t_flags = 0>
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
507 class input_factory_t : public service_factory_single_t<input_entry_impl_t<T, t_flags> > {};
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
508
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
509 //! Non-multitrack-enabled input factory (helper) - hides multitrack management functions from input implementation; use this for inputs that handle file types where each physical file can contain only one user-visible playable track. For reference of functions that must be supported by registered class, see input_singletrack_impl.\n Usage: static input_singletrack_factory_t<myinputclass> g_myinputclass_factory;\n Note that input classes can't be registered through service_factory_t template directly.template<class T>
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
510 template<typename T, unsigned t_flags = 0>
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
511 class input_singletrack_factory_t : public service_factory_single_t<input_entry_impl_t<input_wrapper_singletrack_t<T>,t_flags> > {};