Line data Source code
1 : #pragma once
2 :
3 : #include <string>
4 :
5 : namespace Amplitron {
6 :
7 : class IAudioEngine;
8 :
9 : /**
10 : * @brief Interface for audio recorder subsystem.
11 : * Satisfies the Dependency Inversion Principle (DIP).
12 : */
13 300 : class IRecorder {
14 : public:
15 : static constexpr int WAVEFORM_SIZE = 512;
16 :
17 889 : virtual ~IRecorder() = default;
18 :
19 : // Start recording to a temporary WAV file
20 : virtual bool start(const std::string& filepath, int sample_rate, int channels = 1) = 0;
21 :
22 : // Stop recording and finalize the WAV file
23 : virtual void stop() = 0;
24 :
25 : // Pause / resume recording
26 : virtual void pause() = 0;
27 : virtual void resume() = 0;
28 :
29 : // Write audio samples (called from audio callback)
30 : virtual void write_samples(const float* buffer, int num_samples) = 0;
31 : virtual void write_samples_stereo(const float* left, const float* right, int num_samples) = 0;
32 :
33 : // Write metadata JSON sidecar file
34 : virtual void write_metadata(const std::string& wav_path, IAudioEngine& engine) = 0;
35 :
36 : // Move the recorded temp file to a user-chosen path
37 : virtual bool save_to(const std::string& dest_path) = 0;
38 :
39 : // Discard the recorded temp file
40 : virtual void discard() = 0;
41 :
42 : virtual bool is_recording() const = 0;
43 : virtual bool is_paused() const = 0;
44 : virtual bool has_unsaved() const = 0;
45 : virtual float get_duration() const = 0;
46 : virtual int64_t get_samples_written() const = 0;
47 : virtual int get_channels() const = 0;
48 : virtual const std::string& filepath() const = 0;
49 :
50 : // Waveform visualization data (lock-free ring buffer of peak values)
51 : virtual void get_waveform(float* out, int count) const = 0;
52 : virtual float get_current_peak() const = 0;
53 : };
54 :
55 : } // namespace Amplitron
|