annotate foosdk/sdk/foobar2000/helpers/cuesheet_index_list.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 "cuesheet_index_list.h"
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4 #include "cue_parser.h" // exception_bad_cuesheet
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 bool t_cuesheet_index_list::is_valid() const {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
7 if (m_positions[1] < m_positions[0]) return false;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
8 for(t_size n = 2; n < count && m_positions[n] > 0; n++) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
9 if (m_positions[n] < m_positions[n-1]) return false;
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 return true;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
12 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
13
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
14 void t_cuesheet_index_list::to_infos(file_info & p_out) const
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
15 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
16 double base = m_positions[1];
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
17
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
18 if (base > 0) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
19 p_out.info_set("referenced_offset",cuesheet_format_index_time(base));
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
20 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
21
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
22 if (m_positions[0] < base)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
23 p_out.info_set("pregap",cuesheet_format_index_time(base - m_positions[0]));
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
24 else
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
25 p_out.info_remove("pregap");
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
26
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
27 p_out.info_remove("index 00");
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
28 p_out.info_remove("index 01");
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
29
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
30 for(unsigned n=2;n<count;n++)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
31 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
32 char namebuffer[16];
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
33 snprintf(namebuffer, std::size(namebuffer), "index %02u",n);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
34 double position = m_positions[n] - base;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
35 if (position > 0)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
36 p_out.info_set(namebuffer,cuesheet_format_index_time(position));
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
37 else
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
38 p_out.info_remove(namebuffer);
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 static bool parse_value(const char * p_name,double & p_out)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
43 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
44 if (p_name == NULL) return false;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
45 try {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
46 p_out = cuesheet_parse_index_time_e(p_name,strlen(p_name));
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
47 } catch(std::exception const &) {return false;}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
48 return true;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
49 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
50
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
51 bool t_cuesheet_index_list::from_infos(file_info const & p_in,double p_base)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
52 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
53 double pregap;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
54 bool found = false;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
55 if (!parse_value(p_in.info_get("pregap"),pregap)) pregap = 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
56 else found = true;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
57 m_positions[0] = p_base - pregap;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
58 m_positions[1] = p_base;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
59 for(unsigned n=2;n<count;n++)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
60 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
61 char namebuffer[16];
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
62 snprintf(namebuffer, std::size(namebuffer),"index %02u",n);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
63 double temp;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
64 if (parse_value(p_in.info_get(namebuffer),temp)) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
65 m_positions[n] = temp + p_base; found = true;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
66 } else {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
67 m_positions[n] = 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
68 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
69 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
70 return found;
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
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
73 bool t_cuesheet_index_list::is_empty() const {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
74 for(unsigned n=0;n<count;n++) if (m_positions[n] != m_positions[1]) return false;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
75 return true;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
76 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
77
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
78
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
79
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
80
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
81
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 cuesheet_format_index_time::cuesheet_format_index_time(double p_time)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
84 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
85 t_uint64 ticks = audio_math::time_to_samples(p_time,75);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
86 t_uint64 seconds = ticks / 75; ticks %= 75;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
87 t_uint64 minutes = seconds / 60; seconds %= 60;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
88 m_buffer << pfc::format_uint(minutes,2) << ":" << pfc::format_uint(seconds,2) << ":" << pfc::format_uint(ticks,2);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
89 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
90
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
91 double cuesheet_parse_index_time_e(const char * p_string,t_size p_length)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
92 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
93 return (double) cuesheet_parse_index_time_ticks_e(p_string,p_length) / 75.0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
94 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
95
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
96 unsigned cuesheet_parse_index_time_ticks_e(const char * p_string,t_size p_length)
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 p_length = pfc::strlen_max(p_string,p_length);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
99 t_size ptr = 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
100 t_size splitmarks[2];
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
101 t_size splitptr = 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
102 for(ptr=0;ptr<p_length;ptr++)
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 if (p_string[ptr] == ':')
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 (splitptr >= 2)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
107 pfc::throw_exception_with_message< cue_parser::exception_bad_cuesheet >("invalid INDEX time syntax");
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
108 splitmarks[splitptr++] = ptr;
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 else if (!pfc::char_is_numeric(p_string[ptr]))
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
111 pfc::throw_exception_with_message< cue_parser::exception_bad_cuesheet >("invalid INDEX time syntax");
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
112 }
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 t_size minutes_base = 0, minutes_length = 0, seconds_base = 0, seconds_length = 0, frames_base = 0, frames_length = 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
115
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
116 switch(splitptr)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
117 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
118 case 0:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
119 frames_base = 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
120 frames_length = p_length;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
121 break;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
122 case 1:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
123 seconds_base = 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
124 seconds_length = splitmarks[0];
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
125 frames_base = splitmarks[0] + 1;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
126 frames_length = p_length - frames_base;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
127 break;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
128 case 2:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
129 minutes_base = 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
130 minutes_length = splitmarks[0];
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
131 seconds_base = splitmarks[0] + 1;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
132 seconds_length = splitmarks[1] - seconds_base;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
133 frames_base = splitmarks[1] + 1;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
134 frames_length = p_length - frames_base;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
135 break;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
136 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
137
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
138 unsigned ret = 0;
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 (frames_length > 0) ret += pfc::atoui_ex(p_string + frames_base,frames_length);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
141 if (seconds_length > 0) ret += 75 * pfc::atoui_ex(p_string + seconds_base,seconds_length);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
142 if (minutes_length > 0) ret += 60 * 75 * pfc::atoui_ex(p_string + minutes_base,minutes_length);
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 return ret;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
145 }