|
1
|
1 #pragma once
|
|
|
2
|
|
|
3 //! \since 1.0
|
|
|
4 //! Implemented by components - register with playback_stream_capture methods.
|
|
|
5 class NOVTABLE playback_stream_capture_callback {
|
|
|
6 public:
|
|
|
7 //! Delivers a real-time chunk of audio data. \n
|
|
|
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
|
|
|
9 //! Contrary to visualisation methods, this guarantees that all played audio data is coming thru. \n
|
|
|
10 //! Called only from the main thread. \n
|
|
|
11 virtual void on_chunk(const audio_chunk &) = 0;
|
|
|
12 protected:
|
|
|
13 playback_stream_capture_callback() {}
|
|
|
14 ~playback_stream_capture_callback() {}
|
|
|
15 };
|
|
|
16
|
|
|
17 //! \since 1.0
|
|
|
18 //! Implemented by core.
|
|
|
19 class NOVTABLE playback_stream_capture : public service_base {
|
|
|
20 FB2K_MAKE_SERVICE_COREAPI(playback_stream_capture)
|
|
|
21 public:
|
|
|
22 //! Register a playback_stream_capture_callback. \n
|
|
|
23 //! Possible to call only from the main thread.
|
|
|
24 virtual void add_callback(playback_stream_capture_callback * ) = 0;
|
|
|
25 //! Un-register a playback_stream_capture_callback. \n
|
|
|
26 //! Possible to call only from the main thread.
|
|
|
27 virtual void remove_callback(playback_stream_capture_callback * ) = 0;
|
|
|
28 };
|
|
|
29
|
|
|
30 //! \since 2.0.
|
|
|
31 //! Implemented by core.
|
|
|
32 class NOVTABLE playback_stream_capture_v2 : public playback_stream_capture {
|
|
|
33 FB2K_MAKE_SERVICE_COREAPI_EXTENSION(playback_stream_capture_v2, playback_stream_capture);
|
|
|
34 public:
|
|
|
35 //! @param requestInterval Interval, in seconds, in which the callback expects to be called. \n
|
|
|
36 //! Set to -1 to use defaults. \n
|
|
|
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
|
|
|
38 //! Non negative values are clamped to allowed range, that is, request of zero results in lowest possible update interval.
|
|
|
39 virtual void add_callback_v2(playback_stream_capture_callback* cb, double requestInterval = -1) = 0;
|
|
|
40 };
|
|
|
41
|
|
|
42 class playback_stream_capture_callback_impl : public playback_stream_capture_callback {
|
|
|
43 public:
|
|
|
44 void on_chunk(const audio_chunk&) override {}
|
|
|
45
|
|
|
46 //! @param interval requested update interval, see playback_stream_capture_v2::add_callback_v2()
|
|
|
47 playback_stream_capture_callback_impl(double interval = -1) {
|
|
|
48 PFC_ASSERT(core_api::is_main_thread());
|
|
|
49 #if FOOBAR2020
|
|
|
50 playback_stream_capture_v2::get()->add_callback_v2(this, interval);
|
|
|
51 #else
|
|
|
52 auto api = playback_stream_capture::get();
|
|
|
53 playback_stream_capture_v2::ptr v2;
|
|
|
54 if (v2 &= api) v2->add_callback_v2(this, interval);
|
|
|
55 else api->add_callback(this);
|
|
|
56 #endif
|
|
|
57 }
|
|
|
58 ~playback_stream_capture_callback_impl() {
|
|
|
59 PFC_ASSERT(core_api::is_main_thread());
|
|
|
60 playback_stream_capture::get()->remove_callback(this);
|
|
|
61 }
|
|
|
62
|
|
|
63 playback_stream_capture_callback_impl(const playback_stream_capture_callback_impl&) = delete;
|
|
|
64 void operator=(const playback_stream_capture_callback_impl&) = delete;
|
|
|
65 };
|