audio_effect_spectrum_analyzer.h 1.7 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677
  1. #ifndef AUDIO_EFFECT_SPECTRUM_ANALYZER_H
  2. #define AUDIO_EFFECT_SPECTRUM_ANALYZER_H
  3. #include "servers/audio/audio_effect.h"
  4. class AudioEffectSpectrumAnalyzer;
  5. class AudioEffectSpectrumAnalyzerInstance : public AudioEffectInstance {
  6. GDCLASS(AudioEffectSpectrumAnalyzerInstance, AudioEffectInstance)
  7. public:
  8. enum MagnitudeMode {
  9. MAGNITUDE_AVERAGE,
  10. MAGNITUDE_MAX,
  11. };
  12. private:
  13. friend class AudioEffectSpectrumAnalyzer;
  14. Ref<AudioEffectSpectrumAnalyzer> base;
  15. Vector<Vector<AudioFrame> > fft_history;
  16. Vector<float> temporal_fft;
  17. int temporal_fft_pos;
  18. int fft_size;
  19. int fft_count;
  20. int fft_pos;
  21. float mix_rate;
  22. uint64_t last_fft_time;
  23. protected:
  24. static void _bind_methods();
  25. public:
  26. virtual void process(const AudioFrame *p_src_frames, AudioFrame *p_dst_frames, int p_frame_count);
  27. Vector2 get_magnitude_for_frequency_range(float p_begin, float p_end, MagnitudeMode p_mode = MAGNITUDE_MAX) const;
  28. };
  29. VARIANT_ENUM_CAST(AudioEffectSpectrumAnalyzerInstance::MagnitudeMode)
  30. class AudioEffectSpectrumAnalyzer : public AudioEffect {
  31. GDCLASS(AudioEffectSpectrumAnalyzer, AudioEffect)
  32. public:
  33. enum FFT_Size {
  34. FFT_SIZE_256,
  35. FFT_SIZE_512,
  36. FFT_SIZE_1024,
  37. FFT_SIZE_2048,
  38. FFT_SIZE_4096,
  39. FFT_SIZE_MAX
  40. };
  41. public:
  42. friend class AudioEffectSpectrumAnalyzerInstance;
  43. float buffer_length;
  44. float tapback_pos;
  45. FFT_Size fft_size;
  46. protected:
  47. static void _bind_methods();
  48. public:
  49. Ref<AudioEffectInstance> instance();
  50. void set_buffer_length(float p_seconds);
  51. float get_buffer_length() const;
  52. void set_tap_back_pos(float p_seconds);
  53. float get_tap_back_pos() const;
  54. void set_fft_size(FFT_Size);
  55. FFT_Size get_fft_size() const;
  56. AudioEffectSpectrumAnalyzer();
  57. };
  58. VARIANT_ENUM_CAST(AudioEffectSpectrumAnalyzer::FFT_Size);
  59. #endif // AUDIO_EFFECT_SPECTRUM_ANALYZER_H