Agora Java API Reference for Android
audio_options_i.h
1 // Agora SDK
2 //
3 // Copyright (c) 2019 Agora.io. All rights reserved.
4 // Reference from WebRTC project
5 //
6 #pragma once
7 
8 #include "AgoraOptional.h"
9 
10 #define SET_FROM(X) SetFrom(&X, change.X)
11 
12 #define BEGIN_COMPARE() bool b = true
13 #define ADD_COMPARE(X) b = (b && (X == o.X))
14 #define END_COMPARE_AND_RETURN() \
15  ; \
16  return b
17 
18 #define UNPUBLISH(X) X.reset()
19 
20 namespace agora {
21 namespace rtc {
22 
26  enum class OPENSL_MODE {
30  ALWAYS_ON,
31 
35  ALWAYS_OFF,
36 
40  ON_WITH_HEADSET,
41  };
42 
43 // Options that can be applied to an audio track or audio engine.
44 struct AudioOptions {
45  AudioOptions() = default;
46  ~AudioOptions() = default;
47 
48  void SetAll(const AudioOptions& change) {
49  SET_FROM(audio_scenario);
50  SET_FROM(audio_routing);
51  SET_FROM(opensl_mode);
52  SET_FROM(has_published_stream);
53  SET_FROM(has_subscribed_stream);
54 
55  SET_FROM(adm_mix_option_selected);
56  SET_FROM(adm_input_sample_rate);
57  SET_FROM(adm_output_sample_rate);
58  SET_FROM(adm_stereo_out);
59  SET_FROM(adm_force_use_bluetooth_a2dp);
60  SET_FROM(adm_keep_audio_session);
61  SET_FROM(adm_use_hw_aec);
62  SET_FROM(adm_output_align_input_sample_rate);
63  SET_FROM(adm_force_restart);
64  SET_FROM(adm_enable_opensl);
65  SET_FROM(adm_audio_layer);
66  SET_FROM(adm_enable_record_but_not_publish);
67  SET_FROM(adm_audio_source);
68  SET_FROM(adm_playout_bufsize_factor);
69 
70  SET_FROM(apm_override_lua_enable_aec);
71  SET_FROM(apm_override_lua_enable_ns);
72  SET_FROM(apm_override_lua_enable_agc);
73  SET_FROM(apm_override_lua_enable_md);
74  SET_FROM(apm_enable_aec);
75  SET_FROM(apm_enable_ns);
76  SET_FROM(apm_enable_agc);
77  SET_FROM(apm_enable_md);
78  SET_FROM(apm_enable_highpass_filter);
79  SET_FROM(apm_enable_tone_remover);
80  SET_FROM(apm_enable_pitch_smoother);
81  SET_FROM(apm_enable_howling_control);
82  SET_FROM(apm_delay_offset_ms);
83  SET_FROM(apm_aec_suppression_level);
84  SET_FROM(apm_aec_delay_type);
85  SET_FROM(apm_aec_nlp_aggressiveness);
86  SET_FROM(apm_agc_target_level_dbfs);
87  SET_FROM(apm_agc_compression_gain_db);
88  SET_FROM(apm_agc_mode);
89  SET_FROM(apm_ns_level);
90  SET_FROM(apm_enable_dtd);
91 
92  SET_FROM(acm_bitrate);
93  SET_FROM(acm_codec);
94  SET_FROM(acm_dtx);
95  SET_FROM(acm_plc);
96  SET_FROM(acm_complex_level);
97  SET_FROM(neteq_live_min_delay);
98  SET_FROM(neteq_jitter_buffer_max_packets);
99  SET_FROM(neteq_jitter_buffer_fast_accelerate);
100  SET_FROM(neteq_target_level_optimization);
101  SET_FROM(playback_volume);
102  SET_FROM(webrtc_enable_aec3);
103  SET_FROM(derived_headset_black_list_device);
104  }
105 
106  bool operator==(const AudioOptions& o) const {
107  BEGIN_COMPARE();
108  ADD_COMPARE(audio_scenario);
109  ADD_COMPARE(audio_routing);
110  ADD_COMPARE(opensl_mode);
111  ADD_COMPARE(has_published_stream);
112  ADD_COMPARE(has_subscribed_stream);
113 
114  ADD_COMPARE(adm_mix_option_selected);
115  ADD_COMPARE(adm_input_sample_rate);
116  ADD_COMPARE(adm_output_sample_rate);
117  ADD_COMPARE(adm_stereo_out);
118  ADD_COMPARE(adm_force_use_bluetooth_a2dp);
119  ADD_COMPARE(adm_keep_audio_session);
120  ADD_COMPARE(adm_use_hw_aec);
121  ADD_COMPARE(adm_output_align_input_sample_rate);
122  ADD_COMPARE(adm_force_restart);
123  ADD_COMPARE(adm_enable_opensl);
124  ADD_COMPARE(adm_audio_layer);
125  ADD_COMPARE(adm_enable_record_but_not_publish);
126  ADD_COMPARE(adm_audio_source);
127  ADD_COMPARE(adm_playout_bufsize_factor);
128 
129  ADD_COMPARE(apm_override_lua_enable_aec);
130  ADD_COMPARE(apm_override_lua_enable_ns);
131  ADD_COMPARE(apm_override_lua_enable_agc);
132  ADD_COMPARE(apm_override_lua_enable_md);
133  ADD_COMPARE(apm_enable_aec);
134  ADD_COMPARE(apm_enable_ns);
135  ADD_COMPARE(apm_enable_agc);
136  ADD_COMPARE(apm_enable_md);
137  ADD_COMPARE(apm_enable_highpass_filter);
138  ADD_COMPARE(apm_enable_tone_remover);
139  ADD_COMPARE(apm_enable_pitch_smoother);
140  ADD_COMPARE(apm_enable_howling_control);
141  ADD_COMPARE(apm_delay_offset_ms);
142  ADD_COMPARE(apm_aec_suppression_level);
143  ADD_COMPARE(apm_aec_delay_type);
144  ADD_COMPARE(apm_aec_nlp_aggressiveness);
145  ADD_COMPARE(apm_agc_target_level_dbfs);
146  ADD_COMPARE(apm_agc_compression_gain_db);
147  ADD_COMPARE(apm_agc_mode);
148  ADD_COMPARE(apm_ns_level);
149  ADD_COMPARE(apm_enable_dtd);
150 
151  ADD_COMPARE(acm_bitrate);
152  ADD_COMPARE(acm_codec);
153  ADD_COMPARE(acm_dtx);
154  ADD_COMPARE(acm_plc);
155  ADD_COMPARE(acm_complex_level);
156 
157  ADD_COMPARE(neteq_live_min_delay);
158  ADD_COMPARE(neteq_jitter_buffer_max_packets);
159  ADD_COMPARE(neteq_jitter_buffer_fast_accelerate);
160  ADD_COMPARE(neteq_target_level_optimization);
161  ADD_COMPARE(playback_volume);
162  ADD_COMPARE(webrtc_enable_aec3);
163  ADD_COMPARE(derived_headset_black_list_device);
164  END_COMPARE_AND_RETURN();
165  }
166 
167  AudioOptions& Filter() {
168  UNPUBLISH(adm_input_sample_rate);
169  UNPUBLISH(adm_output_sample_rate);
170  UNPUBLISH(adm_stereo_out);
171  UNPUBLISH(adm_use_hw_aec);
172  UNPUBLISH(adm_output_align_input_sample_rate);
173  UNPUBLISH(derived_headset_black_list_device);
174  UNPUBLISH(playback_volume);
175  return *this;
176  }
177 
178  bool operator!=(const AudioOptions& o) const { return !(*this == o); }
179 
180  Optional<uint32_t> audio_scenario; // agora::rtc::AUDIO_SCENARIO_TYPE
181  Optional<uint32_t> audio_routing; // agora::rtc::AudioRoute
182  Optional<OPENSL_MODE> opensl_mode;
183  Optional<bool> has_published_stream;
184  Optional<bool> has_subscribed_stream;
185 
186  // ios::AVAudioSessionCategoryOptionMixWithOthers
187  Optional<uint32_t> adm_mix_option_selected;
188  Optional<uint32_t> adm_input_sample_rate;
189  Optional<uint32_t> adm_output_sample_rate;
190  Optional<bool> adm_stereo_out;
191  // ios::AVAudioSessionCategoryOptionAllowBluetoothA2DP
192  Optional<uint32_t> adm_force_use_bluetooth_a2dp;
193  Optional<bool> adm_keep_audio_session;
194  Optional<bool> adm_use_hw_aec;
195  Optional<bool> adm_output_align_input_sample_rate;
196 
197  Optional<bool> adm_force_restart;
198 
199  Optional<bool> adm_enable_opensl; // Deprecated
200  Optional<uint32_t> adm_audio_layer;
201  Optional<bool> adm_enable_record_but_not_publish;
202  Optional<uint32_t> adm_audio_source; //for android
203  Optional<float> adm_playout_bufsize_factor; //for android
204 
205  Optional<bool> apm_override_lua_enable_aec;
206  Optional<bool> apm_override_lua_enable_ns;
207  Optional<bool> apm_override_lua_enable_agc;
208  Optional<bool> apm_override_lua_enable_md;
209  Optional<bool> apm_enable_aec;
210  Optional<bool> apm_enable_ns;
211  Optional<bool> apm_enable_agc;
212  Optional<bool> apm_enable_md;
213  Optional<bool> apm_enable_highpass_filter;
214  Optional<bool> apm_enable_tone_remover;
215  Optional<bool> apm_enable_pitch_smoother;
216  Optional<bool> apm_enable_howling_control;
217  Optional<uint32_t> apm_delay_offset_ms;
218  Optional<uint32_t> apm_aec_suppression_level;
219  Optional<uint32_t> apm_aec_delay_type;
220  Optional<uint32_t> apm_aec_nlp_aggressiveness;
221  Optional<uint32_t> apm_agc_target_level_dbfs;
222  Optional<uint32_t> apm_agc_compression_gain_db;
223  Optional<uint32_t> apm_agc_mode;
224  Optional<uint32_t> apm_ns_level;
225 
226  //Double talk detection switcher.
227  //Android game streaming scenario should be true, all other cases should be false;
228  Optional<bool> apm_enable_dtd;
229 
230  Optional<uint32_t> acm_bitrate;
231  Optional<uint32_t> acm_codec;
232  Optional<bool> acm_dtx;
233  Optional<bool> acm_plc;
234  Optional<uint32_t> acm_complex_level;
235  Optional<uint32_t> neteq_live_min_delay;
236  Optional<uint32_t> neteq_jitter_buffer_max_packets;
237  Optional<bool> neteq_jitter_buffer_fast_accelerate;
238  Optional<bool> neteq_target_level_optimization;
239  Optional<uint32_t> playback_volume;
240 
241  // hacks for alter webrtc behavior
242  Optional<bool> webrtc_enable_aec3;
243 
244  // derived options
245  Optional<bool> derived_headset_black_list_device;
246 
247  private:
248  template <typename T>
249  static void SetFrom(Optional<T>* s, const Optional<T>& o) {
250  if (o) {
251  *s = o;
252  }
253  }
254 };
255 
256 } // namespace rtc
257 } // namespace agora
agora::rtc::AudioOptions
Definition: audio_options_i.h:44
agora::Optional< uint32_t >