audio_stream_player_3d.h 4.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176
  1. #ifndef AUDIO_STREAM_PLAYER_3D_H
  2. #define AUDIO_STREAM_PLAYER_3D_H
  3. #include "scene/3d/spatial.h"
  4. #include "scene/3d/spatial_velocity_tracker.h"
  5. #include "servers/audio/audio_filter_sw.h"
  6. #include "servers/audio/audio_stream.h"
  7. #include "servers/audio_server.h"
  8. class Camera;
  9. class AudioStreamPlayer3D : public Spatial {
  10. GDCLASS(AudioStreamPlayer3D, Spatial)
  11. public:
  12. enum AttenuationModel {
  13. ATTENUATION_INVERSE_DISTANCE,
  14. ATTENUATION_INVERSE_SQUARE_DISTANCE,
  15. ATTENUATION_LOGARITHMIC,
  16. };
  17. enum OutOfRangeMode {
  18. OUT_OF_RANGE_MIX,
  19. OUT_OF_RANGE_PAUSE,
  20. };
  21. enum DopplerTracking {
  22. DOPPLER_TRACKING_DISABLED,
  23. DOPPLER_TRACKING_IDLE_STEP,
  24. DOPPLER_TRACKING_PHYSICS_STEP
  25. };
  26. private:
  27. enum {
  28. MAX_OUTPUTS = 8,
  29. MAX_INTERSECT_AREAS = 32
  30. };
  31. struct Output {
  32. AudioFilterSW filter;
  33. AudioFilterSW::Processor filter_process[6];
  34. AudioFrame vol[4];
  35. float filter_gain;
  36. float pitch_scale;
  37. int bus_index;
  38. int reverb_bus_index;
  39. AudioFrame reverb_vol[4];
  40. Viewport *viewport; //pointer only used for reference to previous mix
  41. Output() {
  42. filter_gain = 0;
  43. viewport = NULL;
  44. reverb_bus_index = -1;
  45. bus_index = -1;
  46. }
  47. };
  48. Output outputs[MAX_OUTPUTS];
  49. volatile int output_count;
  50. volatile bool output_ready;
  51. //these are used by audio thread to have a reference of previous volumes (for ramping volume and avoiding clicks)
  52. Output prev_outputs[MAX_OUTPUTS];
  53. int prev_output_count;
  54. Ref<AudioStreamPlayback> stream_playback;
  55. Ref<AudioStream> stream;
  56. Vector<AudioFrame> mix_buffer;
  57. volatile float setseek;
  58. volatile bool active;
  59. volatile float setplay;
  60. AttenuationModel attenuation_model;
  61. float unit_db;
  62. float unit_size;
  63. float max_db;
  64. bool autoplay;
  65. StringName bus;
  66. void _mix_audio();
  67. static void _mix_audios(void *self) { reinterpret_cast<AudioStreamPlayer3D *>(self)->_mix_audio(); }
  68. void _set_playing(bool p_enable);
  69. bool _is_active() const;
  70. void _bus_layout_changed();
  71. uint32_t area_mask;
  72. bool emission_angle_enabled;
  73. float emission_angle;
  74. float emission_angle_filter_attenuation_db;
  75. float attenuation_filter_cutoff_hz;
  76. float attenuation_filter_db;
  77. float max_distance;
  78. Ref<SpatialVelocityTracker> velocity_tracker;
  79. DopplerTracking doppler_tracking;
  80. OutOfRangeMode out_of_range_mode;
  81. float _get_attenuation_db(float p_distance) const;
  82. protected:
  83. void _validate_property(PropertyInfo &property) const;
  84. void _notification(int p_what);
  85. static void _bind_methods();
  86. public:
  87. void set_stream(Ref<AudioStream> p_stream);
  88. Ref<AudioStream> get_stream() const;
  89. void set_unit_db(float p_volume);
  90. float get_unit_db() const;
  91. void set_unit_size(float p_volume);
  92. float get_unit_size() const;
  93. void set_max_db(float p_boost);
  94. float get_max_db() const;
  95. void play(float p_from_pos = 0.0);
  96. void seek(float p_seconds);
  97. void stop();
  98. bool is_playing() const;
  99. float get_playback_position();
  100. void set_bus(const StringName &p_bus);
  101. StringName get_bus() const;
  102. void set_autoplay(bool p_enable);
  103. bool is_autoplay_enabled();
  104. void set_max_distance(float p_metres);
  105. float get_max_distance() const;
  106. void set_area_mask(uint32_t p_mask);
  107. uint32_t get_area_mask() const;
  108. void set_emission_angle_enabled(bool p_enable);
  109. bool is_emission_angle_enabled() const;
  110. void set_emission_angle(float p_angle);
  111. float get_emission_angle() const;
  112. void set_emission_angle_filter_attenuation_db(float p_angle_attenuation_db);
  113. float get_emission_angle_filter_attenuation_db() const;
  114. void set_attenuation_filter_cutoff_hz(float p_hz);
  115. float get_attenuation_filter_cutoff_hz() const;
  116. void set_attenuation_filter_db(float p_db);
  117. float get_attenuation_filter_db() const;
  118. void set_attenuation_model(AttenuationModel p_model);
  119. AttenuationModel get_attenuation_model() const;
  120. void set_out_of_range_mode(OutOfRangeMode p_mode);
  121. OutOfRangeMode get_out_of_range_mode() const;
  122. void set_doppler_tracking(DopplerTracking p_tracking);
  123. DopplerTracking get_doppler_tracking() const;
  124. AudioStreamPlayer3D();
  125. ~AudioStreamPlayer3D();
  126. };
  127. VARIANT_ENUM_CAST(AudioStreamPlayer3D::AttenuationModel)
  128. VARIANT_ENUM_CAST(AudioStreamPlayer3D::OutOfRangeMode)
  129. VARIANT_ENUM_CAST(AudioStreamPlayer3D::DopplerTracking)
  130. #endif // AUDIO_STREAM_PLAYER_3D_H