]> git.sesse.net Git - bmusb/blob - bmusb/fake_capture.h
17982ea50e6d0ff3071f6d01f9240ede4e9ed993
[bmusb] / bmusb / fake_capture.h
1 #ifndef _FAKE_CAPTURE_H
2 #define _FAKE_CAPTURE_H 1
3
4 #include <stdint.h>
5 #include <functional>
6 #include <string>
7
8 #include "bmusb/bmusb.h"
9
10 namespace bmusb {
11
12 class FakeCapture : public CaptureInterface
13 {
14 public:
15         FakeCapture(unsigned width, unsigned height, unsigned fps, unsigned audio_sample_frequency, int card_index, bool has_audio = false);
16         ~FakeCapture();
17
18         // CaptureInterface.
19         void set_video_frame_allocator(FrameAllocator *allocator) override
20         {
21                 video_frame_allocator = allocator;
22                 if (owned_video_frame_allocator.get() != allocator) {
23                         owned_video_frame_allocator.reset();
24                 }
25         }
26
27         FrameAllocator *get_video_frame_allocator() override
28         {
29                 return video_frame_allocator;
30         }
31
32         // Does not take ownership.
33         void set_audio_frame_allocator(FrameAllocator *allocator) override
34         {
35                 audio_frame_allocator = allocator;
36                 if (owned_audio_frame_allocator.get() != allocator) {
37                         owned_audio_frame_allocator.reset();
38                 }
39         }
40
41         FrameAllocator *get_audio_frame_allocator() override
42         {
43                 return audio_frame_allocator;
44         }
45
46         void set_frame_callback(frame_callback_t callback) override
47         {
48                 frame_callback = callback;
49         }
50
51         void set_dequeue_thread_callbacks(std::function<void()> init, std::function<void()> cleanup) override
52         {
53                 dequeue_init_callback = init;
54                 dequeue_cleanup_callback = cleanup;
55                 has_dequeue_callbacks = true;
56         }
57
58         std::string get_description() const override
59         {
60                 return description;
61         }
62
63         void configure_card() override;
64         void start_bm_capture() override;
65         void stop_dequeue_thread() override;
66         bool get_disconnected() const override { return false; }
67
68         std::map<uint32_t, VideoMode> get_available_video_modes() const override;
69         void set_video_mode(uint32_t video_mode_id) override;
70         uint32_t get_current_video_mode() const override { return 0; }
71
72         std::map<uint32_t, std::string> get_available_video_inputs() const override;
73         void set_video_input(uint32_t video_input_id) override;
74         uint32_t get_current_video_input() const override { return 0; }
75
76         std::map<uint32_t, std::string> get_available_audio_inputs() const override;
77         void set_audio_input(uint32_t audio_input_id) override;
78         uint32_t get_current_audio_input() const override { return 0; }
79
80 private:
81         void producer_thread_func();
82         void make_tone(int32_t *out, unsigned num_stereo_samples);
83
84         unsigned width, height, fps, audio_sample_frequency;
85         uint8_t y, cb, cr;
86
87         // sin(2 * pi * f / F) and similar for cos. Used for fast sine generation.
88         // Zero when no audio.
89         float audio_sin = 0.0f, audio_cos = 0.0f;
90         float audio_real = 0.0f, audio_imag = 0.0f;  // Current state of the audio phaser.
91         float audio_ref_level;
92
93         bool has_dequeue_callbacks = false;
94         std::function<void()> dequeue_init_callback = nullptr;
95         std::function<void()> dequeue_cleanup_callback = nullptr;
96
97         FrameAllocator *video_frame_allocator = nullptr;
98         FrameAllocator *audio_frame_allocator = nullptr;
99         std::unique_ptr<FrameAllocator> owned_video_frame_allocator;
100         std::unique_ptr<FrameAllocator> owned_audio_frame_allocator;
101         frame_callback_t frame_callback = nullptr;
102
103         std::string description;
104
105         std::atomic<bool> producer_thread_should_quit{false};
106         std::thread producer_thread;
107 };
108
109 }  // namespace bmusb
110
111 #endif  // !defined(_FAKE_CAPTURE_H)