#pragma once #include #include #include #include #include #include #include #include #include #include #include static const char recStreamName[] = "vulcanoLE"; static const char recStreamDescription[] = "Keyboard Input Stream"; static const int32_t sampleRate = 44100; static const int32_t channels = 2; static const std::string defaultMonitorPostfix = ".monitor"; class AudioGrabber { public: enum class ReqMode { FFT = 0, RMS = 1, PEAK = 2, ALL = 3 }; AudioGrabber(); ~AudioGrabber(); bool read(stereoSample *buffer, uint32_t bufferSize); static AudioGrabber* createAudioGrabber(); void init(); FFT fft; ReqMode requestMode = ReqMode::FFT; stereoSampleFrame loudness = {0.0, 0.0}; stereoSampleFrame getLoudness(); bool work(); VUtils::Environment *env = nullptr; private: std::mutex m_mtx; stereoSample *m_buffer{}; pa_simple *m_pulseaudioSimple{}; pa_mainloop *m_pulseaudioMainloop{}; std::string m_PulseaudioDefaultSourceName; void populateDefaultSourceName(); bool openPulseaudioSource(uint32_t maxBufferSize); static void pulseaudioContextStateCallback(pa_context *c, void *userdata); static void pulseaudioServerInfoCallback(pa_context *context, const pa_server_info *i, void *userdata); void calculateRMS(stereoSample *pFrame); void calculatePEAK(stereoSample *pFrame); double m_scale = 1.0; };