annotate foosdk/sdk/foobar2000/SDK/vis.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 //! This class provides abstraction for retrieving visualisation data. Instances of visualisation_stream being created/released serve as an indication for visualisation backend to process currently played audio data or shut down when there are no visualisation clients active.\n
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4 //! Use visualisation_manager::create_stream to instantiate.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
5 class NOVTABLE visualisation_stream : public service_base {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
6 public:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
7 //! Retrieves absolute playback time since last playback start or seek. You typically pass value retrieved by this function - optionally with offset added - to other visualisation_stream methods.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
8 virtual bool get_absolute_time(double & p_value) = 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
9
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
10 //! Retrieves an audio chunk starting at specified offset (see get_absolute_time()), of specified length.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
11 //! @returns False when requested timestamp is out of available range, true on success.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
12 virtual bool get_chunk_absolute(audio_chunk & p_chunk,double p_offset,double p_requested_length) = 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
13 //! Retrieves spectrum for audio data at specified offset (see get_absolute_time()), with specified FFT size.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
14 //! @param p_chunk Receives spectrum data. audio_chunk type is used for consistency (since required functionality is identical to provided by audio_chunk), the data is *not* PCM. Returned sample count is equal to half of FFT size; channels and sample rate are as in audio stream the spectrum was generated from.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
15 //! @param p_offset Timestamp of spectrum to retrieve. See get_absolute_time().
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
16 //! @param p_fft_size FFT size to use for spectrum generation. Must be a power of 2.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
17 //! @returns False when requested timestamp is out of available range, true on success.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
18 virtual bool get_spectrum_absolute(audio_chunk & p_chunk,double p_offset,unsigned p_fft_size) = 0;
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 //! Generates fake audio chunk to display when get_chunk_absolute() fails - e.g. shortly after visualisation_stream creation data for currently played audio might not be available yet.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
21 //! Throws std::exception derivatives on failure.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
22 virtual void make_fake_chunk_absolute(audio_chunk & p_chunk,double p_offset,double p_requested_length) = 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
23 //! Generates fake spectrum to display when get_spectrum_absolute() fails - e.g. shortly after visualisation_stream creation data for currently played audio might not be available yet.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
24 //! Throws std::exception derivatives on failure.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
25 virtual void make_fake_spectrum_absolute(audio_chunk & p_chunk,double p_offset,unsigned p_fft_size) = 0;
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 FB2K_MAKE_SERVICE_INTERFACE(visualisation_stream,service_base);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
28 };
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 //! New in 0.9.5.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
31 class NOVTABLE visualisation_stream_v2 : public visualisation_stream {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
32 public:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
33 virtual void request_backlog(double p_time) = 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
34 virtual void set_channel_mode(t_uint32 p_mode) = 0;
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 enum {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
37 channel_mode_default = 0,
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
38 channel_mode_mono,
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
39 channel_mode_frontonly,
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
40 channel_mode_backonly,
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
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
43 FB2K_MAKE_SERVICE_INTERFACE(visualisation_stream_v2,visualisation_stream);
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
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
46 //! New in 0.9.5.2.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
47 class NOVTABLE visualisation_stream_v3 : public visualisation_stream_v2 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
48 public:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
49 virtual void chunk_to_spectrum(audio_chunk const & chunk, audio_chunk & spectrum, double centerOffset) = 0;
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 FB2K_MAKE_SERVICE_INTERFACE(visualisation_stream_v3,visualisation_stream_v2);
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
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
54 //! Entrypoint service for visualisation processing; use this to create visualisation_stream objects that can be used to retrieve properties of currently played audio. \n
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
55 //! Implemented by core; do not reimplement.\n
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
56 //! Use visualisation_manager::get() to obtain an instance, e.g. visualisation_manager::get()->create_stream(mystream,0);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
57 class NOVTABLE visualisation_manager : public service_base {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
58 FB2K_MAKE_SERVICE_COREAPI(visualisation_manager);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
59 public:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
60 //! Creates a visualisation_stream object. See visualisation_stream for more info.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
61 //! @param p_out Receives newly created visualisation_stream instance.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
62 //! @param p_flags Combination of one or more KStreamFlag* values. Currently only KStreamFlagNewFFT is defined.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
63 //! It's recommended that you set p_flags to KStreamFlagNewFFT to get the new FFT behavior (better quality and result normalization), the old behavior for null flags is preserved for compatibility with old components that rely on it.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
64 virtual void create_stream(service_ptr_t<visualisation_stream> & p_out,unsigned p_flags) = 0;
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 enum {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
67 //! New FFT behavior for spectrum-generating methods, available in 0.9.5.2 and newer: output normalized to 0..1, Gauss window used instead of rectangluar (better quality / less aliasing).
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
68 //! It's recommended to always set this flag. The old behavior is preserved for backwards compatibility.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
69 KStreamFlagNewFFT = 1 << 0,
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
70 };
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 //! Wrapper around non-template create_stream(); retrieves one of newer visualisation_stream_* interfaces rather than base visualisation_stream interface. Throws exception_service_extension_not_found() when running too old foobar2000 version for the requested interface.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
74 template<typename t_streamptr>
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
75 void create_stream(t_streamptr & out, unsigned flags) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
76 visualisation_stream::ptr temp; create_stream(temp, flags);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
77 if (!temp->service_query_t(out)) throw exception_service_extension_not_found();
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 };