annotate foosdk/sdk/foobar2000/SDK/playback_stream_capture.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 //! \since 1.0
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4 //! Implemented by components - register with playback_stream_capture methods.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
5 class NOVTABLE playback_stream_capture_callback {
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 //! Delivers a real-time chunk of audio data. \n
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
8 //! Audio is roughly synchronized with what can currently be heard. This API is provided for utility purposes such as streaming; if you want to implement a visualisation, use the visualisation_manager API instead. \n
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
9 //! Contrary to visualisation methods, this guarantees that all played audio data is coming thru. \n
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
10 //! Called only from the main thread. \n
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
11 virtual void on_chunk(const audio_chunk &) = 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
12 protected:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
13 playback_stream_capture_callback() {}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
14 ~playback_stream_capture_callback() {}
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
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
17 //! \since 1.0
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
18 //! Implemented by core.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
19 class NOVTABLE playback_stream_capture : public service_base {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
20 FB2K_MAKE_SERVICE_COREAPI(playback_stream_capture)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
21 public:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
22 //! Register a playback_stream_capture_callback. \n
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
23 //! Possible to call only from the main thread.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
24 virtual void add_callback(playback_stream_capture_callback * ) = 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
25 //! Un-register a playback_stream_capture_callback. \n
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
26 //! Possible to call only from the main thread.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
27 virtual void remove_callback(playback_stream_capture_callback * ) = 0;
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 //! \since 2.0.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
31 //! Implemented by core.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
32 class NOVTABLE playback_stream_capture_v2 : public playback_stream_capture {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
33 FB2K_MAKE_SERVICE_COREAPI_EXTENSION(playback_stream_capture_v2, playback_stream_capture);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
34 public:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
35 //! @param requestInterval Interval, in seconds, in which the callback expects to be called. \n
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
36 //! Set to -1 to use defaults. \n
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
37 //! Note that if many callbacks are registered, they all get called at once; one callback requesting lower interval lowers the interval for all. \n
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
38 //! Non negative values are clamped to allowed range, that is, request of zero results in lowest possible update interval.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
39 virtual void add_callback_v2(playback_stream_capture_callback* cb, double requestInterval = -1) = 0;
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 class playback_stream_capture_callback_impl : public playback_stream_capture_callback {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
43 public:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
44 void on_chunk(const audio_chunk&) override {}
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 //! @param interval requested update interval, see playback_stream_capture_v2::add_callback_v2()
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
47 playback_stream_capture_callback_impl(double interval = -1) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
48 PFC_ASSERT(core_api::is_main_thread());
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
49 #if FOOBAR2020
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
50 playback_stream_capture_v2::get()->add_callback_v2(this, interval);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
51 #else
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
52 auto api = playback_stream_capture::get();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
53 playback_stream_capture_v2::ptr v2;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
54 if (v2 &= api) v2->add_callback_v2(this, interval);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
55 else api->add_callback(this);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
56 #endif
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
57 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
58 ~playback_stream_capture_callback_impl() {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
59 PFC_ASSERT(core_api::is_main_thread());
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
60 playback_stream_capture::get()->remove_callback(this);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
61 }
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 playback_stream_capture_callback_impl(const playback_stream_capture_callback_impl&) = delete;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
64 void operator=(const playback_stream_capture_callback_impl&) = delete;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
65 };