From your comment it looks that the "track list" is generated in one of the core functions of foobar2000 and this can not be modified by an extension/component, right?
Not quite, the code for cue sheet parsing is contained in the SDK itself, more specifically in the foobar2000_sdk_helpers library. This code is compiled into each component that supports cue sheets. So even if this code is changed, every such component needs to be recompiled for the changes to take effect. On the other hand foo_input_std contains the support for cue sheet files and since this comes with the foobar2000 installer, it has to be updated by Peter.
I glanced over the cue sheet code in foobar2000_sdk_helpers and I think the change is not that trivial as you hope it would be. The reason is that the code is based on the design decision that every TRACK in the cue sheet is mapped to a track in foobar2000. Different indexes are represented as meta data in foobar2000 which can be retrieved in title formatting code via the $info() function. Specifically
- INDEX 01 is available as $info(referenced_offset) if is greater than zero.
- The difference between INDEX 01 and INDEX 00 is available as $info(pregap) if it is greater than zero.
- INDEX 02 is available as $info(index 02), INDEX 03 as $info(index 03), etc.
I haven't tested it but it should be like that according to this code from cuesheet_index_list.cpp:
void t_cuesheet_index_list::to_infos(file_info & p_out) const
{
double base = m_positions[1];
if (base > 0) {
p_out.info_set("referenced_offset",cuesheet_format_index_time(base));
}
if (m_positions[0] < base)
p_out.info_set("pregap",cuesheet_format_index_time(base - m_positions[0]));
else
p_out.info_remove("pregap");
p_out.info_remove("index 00");
p_out.info_remove("index 01");
for(unsigned n=2;n<count;n++)
{
char namebuffer[16];
sprintf_s(namebuffer,"index %02u",n);
double position = m_positions[n] - base;
if (position > 0)
p_out.info_set(namebuffer,cuesheet_format_index_time(position));
else
p_out.info_remove(namebuffer);
}
}