annotate foosdk/sdk/foobar2000/SDK/chapterizer.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 #include "file_info_impl.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 // Not everything is on #ifdef FOOBAR2000_HAVE_CHAPTERIZER
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
5 // Some things use chapter_list internally even if chapterizer is disabled
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 //! Interface for object storing list of chapters.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
8 class NOVTABLE chapter_list {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
9 public:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
10 //! Returns number of chapters.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
11 virtual t_size get_chapter_count() const = 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
12 //! Queries description of specified chapter.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
13 //! @param p_chapter Index of chapter to query, greater or equal zero and less than get_chapter_count() value. If p_chapter value is out of valid range, results are undefined (e.g. crash).
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
14 //! @returns reference to file_info object describing specified chapter (length part of file_info indicates distance between beginning of this chapter and next chapter mark). Returned reference value for temporary use only, becomes invalid after any non-const operation on the chapter_list object.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
15 virtual const file_info & get_info(t_size p_chapter) const = 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
16
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
17 //! Sets number of chapters.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
18 virtual void set_chapter_count(t_size p_count) = 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
19 //! Modifies description of specified chapter.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
20 //! @param p_chapter Index of chapter to modify, greater or equal zero and less than get_chapter_count() value. If p_chapter value is out of valid range, results are undefined (e.g. crash).
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
21 //! @param p_info New chapter description. Note that length part of file_info is used to calculate chapter marks.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
22 virtual void set_info(t_size p_chapter,const file_info & p_info) = 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 //! Gets first track pregap - offset into audio at which first track begins.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
25 //! Not every chapterizer supports this, see chapterizer::supports_pregaps()
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
26 virtual double get_pregap() const = 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
27 //! Sets first track pregap - offset into audio at which first track begins.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
28 //! Not every chapterizer supports this, see chapterizer::supports_pregaps()
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
29 virtual void set_pregap(double val) = 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
30
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
31 //! Copies contents of specified chapter_list object to this object.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
32 void copy(const chapter_list & p_source);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
33
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
34 inline const chapter_list & operator=(const chapter_list & p_source) {copy(p_source); return *this;}
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 protected:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
37 chapter_list() {}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
38 ~chapter_list() {}
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 //! Implements chapter_list.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
42 template<typename file_info_ = file_info_impl>
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
43 class chapter_list_impl_t : public chapter_list {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
44 public:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
45 chapter_list_impl_t() {}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
46 typedef chapter_list_impl_t<file_info_> t_self;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
47 chapter_list_impl_t(const chapter_list & p_source) : m_pregap() {copy(p_source);}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
48 const t_self & operator=(const chapter_list & p_source) {copy(p_source); return *this;}
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 t_size get_chapter_count() const {return m_infos.get_size();}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
51 const file_info & get_info(t_size p_chapter) const {return m_infos[p_chapter];}
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 void set_chapter_count(t_size p_count) {m_infos.set_size(p_count);}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
54 void set_info(t_size p_chapter,const file_info & p_info) {m_infos[p_chapter] = p_info;}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
55 file_info_ & get_info_(t_size p_chapter) {return m_infos[p_chapter];}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
56
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
57 double get_pregap() const {return m_pregap;}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
58 void set_pregap(double val) {PFC_ASSERT(val >= 0); m_pregap = val;}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
59 private:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
60 pfc::array_t<file_info_> m_infos;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
61 double m_pregap = 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
62 };
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
63
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
64 typedef chapter_list_impl_t<> chapter_list_impl;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
65
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
66 #ifdef FOOBAR2000_HAVE_CHAPTERIZER
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 //! This service implements chapter list editing operations for various file formats, e.g. for MP4 chapters or CD images with embedded cuesheets. Used by converter "encode single file with chapters" feature.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
69 class NOVTABLE chapterizer : public service_base {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
70 FB2K_MAKE_SERVICE_INTERFACE_ENTRYPOINT(chapterizer);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
71 public:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
72 //! Tests whether specified path is supported by this implementation.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
73 virtual bool is_our_path(const char * p_path) = 0;
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 //! Writes new chapter list to specified file.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
76 //! @param p_path Path of file to modify.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
77 //! @param p_list New chapter list to write.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
78 //! @param p_abort abort_callback object signaling user aborting the operation.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
79 virtual void set_chapters(const char * p_path,chapter_list const & p_list,abort_callback & p_abort) = 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
80 //! Retrieves chapter list from specified file.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
81 //! @param p_path Path of file to examine.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
82 //! @param p_list Object receiving chapter list.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
83 //! @param p_abort abort_callback object signaling user aborting the operation.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
84 virtual void get_chapters(const char * p_path,chapter_list & p_list,abort_callback & p_abort) = 0;
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 //! @returns Whether this chapterizer supports altering pregap before first track, see chapter_list::get_pregap() & set_pregap()
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
87 virtual bool supports_pregaps() = 0;
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 //! Static helper, tries to find chapterizer interface that supports specified file.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
90 static bool g_find(service_ptr_t<chapterizer> & p_out,const char * p_path);
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 static bool g_is_pregap_capable(const char * p_path);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
93 };
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
94
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
95 #endif