annotate foosdk/sdk/foobar2000/SDK/replaygain_scanner.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 "replaygain.h"
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
5 //! Container of ReplayGain scan results from one or more tracks.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
6 class replaygain_result : public service_base {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
7 FB2K_MAKE_SERVICE_INTERFACE(replaygain_result, service_base);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
8 public:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
9 //! Retrieves the gain value, in dB.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
10 virtual float get_gain() = 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
11 //! Retrieves the peak value, normalized to 0..1 range (audio_sample value).
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
12 virtual float get_peak() = 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
13 //! Merges ReplayGain scan results from different tracks. Merge results from all tracks in an album to get album gain/peak values. \n
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
14 //! This function returns a newly created replaygain_result object. Existing replaygain_result objects remain unaltered.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
15 virtual replaygain_result::ptr merge(replaygain_result::ptr other) = 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 replaygain_info make_track_info() {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
18 replaygain_info ret = replaygain_info_invalid; ret.m_track_gain = this->get_gain(); ret.m_track_peak = this->get_peak(); return ret;
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 };
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 //! Instance of a ReplayGain scanner. \n
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
23 //! Use replaygain_scanner_entry::instantiate() to create a replaygain_scanner object; see replaygain_scanner_entry for more info. \n
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
24 //! Typical use: call process_chunk() with each chunk read from your track, call finalize() to obtain results for this track and reset replaygain_scanner's state for scanning another track; to obtain album gain/peak values, merge results (replaygain_result::merge) from all tracks. \n
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
25 class replaygain_scanner : public service_base {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
26 FB2K_MAKE_SERVICE_INTERFACE(replaygain_scanner, service_base);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
27 public:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
28 //! Processes a PCM chunk. \n
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
29 //! May throw exception_io_data if the chunk contains something that can't be processed properly.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
30 virtual void process_chunk(const audio_chunk & chunk) = 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
31 //! Finalizes the scanning process; resets scanner's internal state and returns results for the track we've just scanned. \n
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
32 //! After calling finalize(), scanner's state becomes the same as after instantiation; you can continue with processing another track without creating a new scanner object.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
33 virtual replaygain_result::ptr finalize() = 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
34 };
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
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
37 //! Entrypoint class for instantiating replaygain_scanner objects. \n
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
38 //! This service is OPTIONAL; it's available from foobar2000 0.9.5.3 up but only if the ReplayGain Scanner component is installed. \n
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
39 //! It is recommended that you use replaygain_scanner like this: \n
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
40 //! replaygain_scanner_entry::ptr theAPI; \n
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
41 //! if (replaygain_scanner_entry::tryGet(theAPI)) { \n
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
42 //! myInstance = theAPI->instantiate(); \n
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
43 //! } else { \n
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
44 //! no foo_rgscan installed - complain/fail/etc \n
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
45 //! } \n
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
46 //! Note that replaygain_scanner_entry::get() is provided for convenience - it WILL crash with no foo_rgscan present. Use it only after prior checks.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
47 class replaygain_scanner_entry : public service_base {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
48 FB2K_MAKE_SERVICE_COREAPI(replaygain_scanner_entry);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
49 public:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
50 //! Instantiates a replaygain_scanner object.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
51 virtual replaygain_scanner::ptr instantiate() = 0;
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 //! Helper; uses replaygain_scanner_entry_v2 if available; see replaygain_scanner_entry_v2.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
54 replaygain_scanner::ptr instantiate( uint32_t flags );
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
55 };
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 //! \since 1.4
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
58 //! This service is OPTIONAL; it's available from foobar2000 v1.4 up but only if the ReplayGain Scanner component is installed. \n
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
59 //! Use tryGet() to instantiate - get() only after prior verification of availability.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
60 class replaygain_scanner_entry_v2 : public replaygain_scanner_entry {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
61 FB2K_MAKE_SERVICE_COREAPI_EXTENSION(replaygain_scanner_entry_v2, replaygain_scanner_entry)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
62 public:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
63 enum {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
64 flagScanPeak = 1 << 0,
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
65 flagScanGain = 1 << 1,
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
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
68 //! Extended instantiation method. \n
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
69 //! Allows you to declare which parts of the scanning process are relevant for you
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
70 //! so irrelevant parts of the processing can be skipped.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
71 //! For an example, if you don't care about the peak, specify only flagScanGain -
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
72 //! as peak scan while normally cheap may be very expensive with extreme oversampling specified by user.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
73 virtual replaygain_scanner::ptr instantiate(uint32_t flags) = 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
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
76 //! Internal service introduced in 1.5. No guarantees about compatibility. May be changed or removed at any time.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
77 class replaygain_scanner_config : public service_base {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
78 FB2K_MAKE_SERVICE_COREAPI(replaygain_scanner_config);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
79 public:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
80 virtual void get_album_pattern( pfc::string_base & out ) = 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
81 virtual uint64_t get_read_size_bytes() = 0;
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 #ifdef FOOBAR2000_DESKTOP
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
85 //! \since 1.4
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
86 //! A class for applying gain to compressed audio packets such as MP3 or AAC. \n
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
87 //! Implemented by foo_rgscan for common formats. May be extended to allow foo_rgscan to manipulate more different codecs.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
88 class replaygain_alter_stream : public service_base {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
89 FB2K_MAKE_SERVICE_INTERFACE(replaygain_alter_stream, service_base)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
90 public:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
91 //! @returns The amount to which all adjustments are quantized for this format. Essential for caller to be able to correctly prevent clipping.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
92 virtual float get_adjustment_step( ) = 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
93 //! Sets the adjustment in decibels. Note that the actual applied adjustment will be quantized with nearest-rounding to a multiple of get_adjustment_step() value.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
94 virtual void set_adjustment( float deltaDB ) = 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
95 //! Passes the first frame playload. This serves as a hint and may be safely ignored for most formats. However in some cases - MP3 vs MP2 in particular - you do knot know what exact format you're dealing with until you've examined the first frame. \n
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
96 //! If you're calling this service, always feed the first frame before calling get_adjustment_step().
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
97 virtual void on_first_frame( const void * frame, size_t bytes ) = 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
98 //! Applies gain to the frame. \n
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
99 //! May throw exception_io_data if the frame payload is corrupted and cannot be altered. The user will be informed about bad frame statistics, however the operation will continue until EOF.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
100 virtual void alter_frame( void * frame, size_t bytes ) = 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
101 };
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
102
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
103 //! \since 1.4
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
104 //! Entrypoint class for instantiating replaygain_alter_stream. Walk with service_enum_t<> to find one that supports specific format.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
105 class replaygain_alter_stream_entry : public service_base {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
106 FB2K_MAKE_SERVICE_INTERFACE_ENTRYPOINT(replaygain_alter_stream_entry);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
107 public:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
108 //! @returns Newly created replaygain_alter_stream object. Null if this format is not supported by this implementation.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
109 //! Arguments as per packet_decoder::g_open().
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
110 virtual replaygain_alter_stream::ptr open(const GUID & p_owner, size_t p_param1, const void * p_param2, size_t p_param2size ) = 0;
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 #endif