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

*: check in everything else yay
author Paper <paper@tflc.us>
date Mon, 05 Jan 2026 02:15:46 -0500
parents
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
1
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1 #include "StdAfx.h"
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2 #include "input_helper_cue.h"
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3 #include <SDK/mem_block_container.h>
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4 #include <SDK/input.h>
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
5 #include <SDK/file_info_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
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
8 namespace {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
9 class input_dec_binary : public input_decoder_v2 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
10 enum {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
11 m_rate = 44100,
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
12 m_bps = 16,
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
13 m_channels = 2,
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
14 m_channelMask = audio_chunk::channel_config_stereo,
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
15 m_sampleBytes = (m_bps/8)*m_channels,
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
16 m_readAtOnce = 588,
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
17 m_readAtOnceBytes = m_readAtOnce * m_sampleBytes
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 public:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
20 input_dec_binary( file::ptr f ) : m_file(f) {}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
21 t_uint32 get_subsong_count() override {return 0;}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
22 t_uint32 get_subsong(t_uint32 p_index) override {return 0;}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
23
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
24 void get_info(t_uint32 p_subsong,file_info & p_info,abort_callback & p_abort) override {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
25 p_info.reset();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
26 p_info.info_set_int("samplerate", m_rate);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
27 p_info.info_set_int("channels", m_channels);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
28 p_info.info_set_int("bitspersample", m_bps);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
29 p_info.info_set("encoding","lossless");
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
30 p_info.info_set_bitrate((m_bps * m_channels * m_rate + 500 /* rounding for bps to kbps*/ ) / 1000 /* bps to kbps */);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
31 p_info.info_set("codec", "PCM");
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
32
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
33 try {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
34 auto stats = get_file_stats(p_abort);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
35 if ( stats.m_size != filesize_invalid ) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
36 p_info.set_length( audio_math::samples_to_time( stats.m_size / 4, 44100 ) );
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
37 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
38 } catch(exception_io) {}
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
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
41
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
42 t_filestats get_file_stats(abort_callback & p_abort) override {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
43 return m_file->get_stats(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 void initialize(t_uint32 p_subsong,unsigned p_flags,abort_callback & p_abort) override {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
46 m_file->reopen( p_abort );
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 bool run(audio_chunk & p_chunk,abort_callback & p_abort) override {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
49 mem_block_container_impl stfu;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
50 return run_raw(p_chunk, stfu, p_abort);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
51 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
52 bool run_raw(audio_chunk & out, mem_block_container & outRaw, abort_callback & abort) override {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
53 size_t bytes = m_readAtOnceBytes;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
54 outRaw.set_size( bytes );
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
55 size_t got = m_file->read(outRaw.get_ptr(), bytes, abort);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
56 got -= got % m_sampleBytes;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
57 if ( got == 0 ) return false;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
58 if ( got < bytes ) outRaw.set_size( got );
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
59 out.set_data_fixedpoint_signed( outRaw.get_ptr(), got, m_rate, m_channels, m_bps, m_channelMask);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
60 return true;
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 void seek(double p_seconds,abort_callback & p_abort) override {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
63 m_file->seek( audio_math::time_to_samples( p_seconds, m_rate ) * m_sampleBytes, p_abort );
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 bool can_seek() override {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
66 return m_file->can_seek();
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 bool get_dynamic_info(file_info & p_out, double & p_timestamp_delta) override {return false;}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
69 bool get_dynamic_info_track(file_info & p_out, double & p_timestamp_delta) override {return false;}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
70 void on_idle(abort_callback & p_abort) override {}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
71 void set_logger(event_logger::ptr ptr) override {}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
72 private:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
73 const file::ptr m_file;
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 }
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 void input_helper_cue::get_info_binary( const char * path, file_info & out, abort_callback & abort ) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
79 auto f = fileOpenReadExisting( path, abort );
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
80 auto obj = fb2k::service_new< input_dec_binary > ( f );
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
81 obj->get_info( 0, out, abort );
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
82 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
83
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
84 void input_helper_cue::open(service_ptr_t<file> p_filehint,const playable_location & p_location,unsigned p_flags,abort_callback & p_abort,double p_start,double p_length, bool binary) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
85 p_abort.check();
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 m_start = p_start;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
88 m_position = 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
89 m_dynamic_info_trigger = false;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
90 m_dynamic_info_track_trigger = false;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
91
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
92 if ( binary ) {
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 const char * path = p_location.get_path();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
95 auto f = fileOpenReadExisting( path, p_abort );
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
96 auto obj = fb2k::service_new< input_dec_binary > ( f );
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
97
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
98 m_input.attach( obj, path );
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
99 m_input.open_decoding( 0, p_flags, p_abort );
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
100 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
101 } else {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
102 m_input.open(p_filehint,p_location,p_flags,p_abort,true,true);
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
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
105
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
106 if (!m_input.can_seek()) throw exception_io_object_not_seekable();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
107
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
108 if (m_start > 0) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
109 m_input.seek(m_start,p_abort);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
110 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
111
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
112 if (p_length > 0) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
113 m_length = p_length;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
114 } else {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
115 file_info_impl temp;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
116 m_input.get_info(0,temp,p_abort);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
117 double ref_length = temp.get_length();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
118 if (ref_length <= 0) throw exception_io_data();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
119 m_length = ref_length - m_start + p_length /* negative or zero */;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
120 if (m_length <= 0) throw exception_io_data();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
121 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
122 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
123
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
124 void input_helper_cue::close() {m_input.close();}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
125 bool input_helper_cue::is_open() {return m_input.is_open();}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
126
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
127 bool input_helper_cue::_m_input_run(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
128 if (p_raw == NULL) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
129 return m_input.run(p_chunk, p_abort);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
130 } else {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
131 return m_input.run_raw(p_chunk, *p_raw, p_abort);
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 bool input_helper_cue::_run(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
135 p_abort.check();
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 if (m_length > 0) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
138 if (m_position >= m_length) return false;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
139
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
140 if (!_m_input_run(p_chunk, p_raw, p_abort)) return false;
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 m_dynamic_info_trigger = true;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
143 m_dynamic_info_track_trigger = true;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
144
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
145 t_uint64 max = (t_uint64)audio_math::time_to_samples(m_length - m_position, p_chunk.get_sample_rate());
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
146 if (max == 0)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
147 {//handle rounding accidents, this normally shouldn't trigger
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
148 m_position = m_length;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
149 return false;
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
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
152 t_size samples = p_chunk.get_sample_count();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
153 if ((t_uint64)samples > max)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
154 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
155 p_chunk.set_sample_count((unsigned)max);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
156 if (p_raw != NULL) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
157 const t_size rawSize = p_raw->get_size();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
158 PFC_ASSERT(rawSize % samples == 0);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
159 p_raw->set_size((t_size)((t_uint64)rawSize * max / samples));
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
160 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
161 m_position = m_length;
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 else
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
164 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
165 m_position += p_chunk.get_duration();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
166 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
167 return true;
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 else
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
170 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
171 if (!_m_input_run(p_chunk, p_raw, p_abort)) return false;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
172 m_position += p_chunk.get_duration();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
173 return true;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
174 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
175 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
176 bool input_helper_cue::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
177 return _run(p_chunk, &p_raw, p_abort);
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 input_helper_cue::run(audio_chunk & p_chunk, abort_callback & p_abort) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
181 return _run(p_chunk, NULL, p_abort);
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
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
184 void input_helper_cue::seek(double p_seconds, abort_callback & p_abort)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
185 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
186 m_dynamic_info_trigger = false;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
187 m_dynamic_info_track_trigger = false;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
188 if (m_length <= 0 || p_seconds < m_length) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
189 m_input.seek(p_seconds + m_start, p_abort);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
190 m_position = p_seconds;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
191 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
192 else {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
193 m_position = m_length;
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
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
197 bool input_helper_cue::can_seek() { return true; }
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 void input_helper_cue::on_idle(abort_callback & p_abort) { m_input.on_idle(p_abort); }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
200
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
201 bool input_helper_cue::get_dynamic_info(file_info & p_out, double & p_timestamp_delta) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
202 if (m_dynamic_info_trigger) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
203 m_dynamic_info_trigger = false;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
204 return m_input.get_dynamic_info(p_out, p_timestamp_delta);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
205 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
206 else {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
207 return false;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
208 }
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 bool input_helper_cue::get_dynamic_info_track(file_info & p_out, double & p_timestamp_delta) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
212 if (m_dynamic_info_track_trigger) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
213 m_dynamic_info_track_trigger = false;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
214 return m_input.get_dynamic_info_track(p_out, p_timestamp_delta);
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 else {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
217 return false;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
218 }
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 const char * input_helper_cue::get_path() const { return m_input.get_path(); }
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 void input_helper_cue::get_info(t_uint32 p_subsong, file_info & p_info, abort_callback & p_abort) { m_input.get_info(p_subsong, p_info, p_abort); }