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_override_lua_input_sample_rate);
57  SET_FROM(adm_input_sample_rate);
58  SET_FROM(adm_output_sample_rate);
59  SET_FROM(adm_stereo_out);
60  SET_FROM(adm_force_use_bluetooth_a2dp);
61  SET_FROM(adm_keep_audio_session);
62  SET_FROM(adm_use_hw_aec);
63  SET_FROM(adm_output_align_input_sample_rate);
64  SET_FROM(adm_force_restart);
65  SET_FROM(adm_enable_opensl);
66  SET_FROM(adm_audio_layer);
67  SET_FROM(adm_enable_record_but_not_publish);
68  SET_FROM(adm_audio_source);
69  SET_FROM(adm_playout_bufsize_factor);
70 
71  SET_FROM(apm_override_lua_enable_aec);
72  SET_FROM(apm_override_lua_enable_ns);
73  SET_FROM(apm_override_lua_enable_agc);
74  SET_FROM(apm_override_lua_enable_md);
75  SET_FROM(apm_enable_aec);
76  SET_FROM(apm_enable_ns);
77  SET_FROM(apm_enable_agc);
78  SET_FROM(apm_enable_md);
79  SET_FROM(apm_enable_highpass_filter);
80  SET_FROM(apm_enable_tone_remover);
81  SET_FROM(apm_enable_pitch_smoother);
82  SET_FROM(apm_enable_howling_control);
83  SET_FROM(apm_delay_offset_ms);
84  SET_FROM(apm_aec_suppression_level);
85  SET_FROM(apm_aec_delay_type);
86  SET_FROM(apm_aec_nlp_aggressiveness);
87  SET_FROM(apm_agc_target_level_dbfs);
88  SET_FROM(apm_agc_compression_gain_db);
89  SET_FROM(apm_agc_mode);
90  SET_FROM(apm_ns_level);
91  SET_FROM(apm_enable_dtd);
92 
93  SET_FROM(acm_bitrate);
94  SET_FROM(acm_codec);
95  SET_FROM(acm_dtx);
96  SET_FROM(acm_plc);
97  SET_FROM(acm_complex_level);
98  SET_FROM(acm_ptime);
99  SET_FROM(neteq_live_min_delay);
100  SET_FROM(neteq_jitter_buffer_max_packets);
101  SET_FROM(neteq_jitter_buffer_fast_accelerate);
102  SET_FROM(neteq_target_level_optimization);
103  SET_FROM(neteq_aqm_voice_threshold);
104  SET_FROM(playback_volume);
105  SET_FROM(webrtc_enable_aec3);
106  SET_FROM(derived_headset_black_list_device);
107 #if defined(WEBRTC_IOS) || defined(WEBRTC_ANDROID)
108  SET_FROM(use_media_volume_in_headset);
109  SET_FROM(use_media_volume_in_audience);
110  SET_FROM(use_media_volume_in_solo);
111 #endif // defined(WEBRTC_IOS) || defined(WEBRTC_ANDROID)
112  }
113 
114  bool operator==(const AudioOptions& o) const {
115  BEGIN_COMPARE();
116  ADD_COMPARE(audio_scenario);
117  ADD_COMPARE(audio_routing);
118  ADD_COMPARE(opensl_mode);
119  ADD_COMPARE(has_published_stream);
120  ADD_COMPARE(has_subscribed_stream);
121 
122  ADD_COMPARE(adm_mix_option_selected);
123  ADD_COMPARE(adm_override_lua_input_sample_rate);
124  ADD_COMPARE(adm_input_sample_rate);
125  ADD_COMPARE(adm_output_sample_rate);
126  ADD_COMPARE(adm_stereo_out);
127  ADD_COMPARE(adm_force_use_bluetooth_a2dp);
128  ADD_COMPARE(adm_keep_audio_session);
129  ADD_COMPARE(adm_use_hw_aec);
130  ADD_COMPARE(adm_output_align_input_sample_rate);
131  ADD_COMPARE(adm_force_restart);
132  ADD_COMPARE(adm_enable_opensl);
133  ADD_COMPARE(adm_audio_layer);
134  ADD_COMPARE(adm_enable_record_but_not_publish);
135  ADD_COMPARE(adm_audio_source);
136  ADD_COMPARE(adm_playout_bufsize_factor);
137 
138  ADD_COMPARE(apm_override_lua_enable_aec);
139  ADD_COMPARE(apm_override_lua_enable_ns);
140  ADD_COMPARE(apm_override_lua_enable_agc);
141  ADD_COMPARE(apm_override_lua_enable_md);
142  ADD_COMPARE(apm_enable_aec);
143  ADD_COMPARE(apm_enable_ns);
144  ADD_COMPARE(apm_enable_agc);
145  ADD_COMPARE(apm_enable_md);
146  ADD_COMPARE(apm_enable_highpass_filter);
147  ADD_COMPARE(apm_enable_tone_remover);
148  ADD_COMPARE(apm_enable_pitch_smoother);
149  ADD_COMPARE(apm_enable_howling_control);
150  ADD_COMPARE(apm_delay_offset_ms);
151  ADD_COMPARE(apm_aec_suppression_level);
152  ADD_COMPARE(apm_aec_delay_type);
153  ADD_COMPARE(apm_aec_nlp_aggressiveness);
154  ADD_COMPARE(apm_agc_target_level_dbfs);
155  ADD_COMPARE(apm_agc_compression_gain_db);
156  ADD_COMPARE(apm_agc_mode);
157  ADD_COMPARE(apm_ns_level);
158  ADD_COMPARE(apm_enable_dtd);
159 
160  ADD_COMPARE(acm_bitrate);
161  ADD_COMPARE(acm_codec);
162  ADD_COMPARE(acm_dtx);
163  ADD_COMPARE(acm_plc);
164  ADD_COMPARE(acm_complex_level);
165  ADD_COMPARE(acm_ptime);
166 
167  ADD_COMPARE(neteq_live_min_delay);
168  ADD_COMPARE(neteq_jitter_buffer_max_packets);
169  ADD_COMPARE(neteq_jitter_buffer_fast_accelerate);
170  ADD_COMPARE(neteq_target_level_optimization);
171  ADD_COMPARE(neteq_aqm_voice_threshold);
172  ADD_COMPARE(playback_volume);
173  ADD_COMPARE(webrtc_enable_aec3);
174  ADD_COMPARE(derived_headset_black_list_device);
175 #if defined(WEBRTC_IOS) || defined(WEBRTC_ANDROID)
176  ADD_COMPARE(use_media_volume_in_headset);
177  ADD_COMPARE(use_media_volume_in_audience);
178  ADD_COMPARE(use_media_volume_in_solo);
179 #endif // defined(WEBRTC_IOS) || defined(WEBRTC_ANDROID)
180  END_COMPARE_AND_RETURN();
181  }
182 
183  AudioOptions& Filter() {
184  UNPUBLISH(adm_input_sample_rate);
185  UNPUBLISH(adm_output_sample_rate);
186  UNPUBLISH(adm_stereo_out);
187  UNPUBLISH(adm_use_hw_aec);
188  UNPUBLISH(adm_output_align_input_sample_rate);
189  UNPUBLISH(derived_headset_black_list_device);
190  UNPUBLISH(playback_volume);
191  return *this;
192  }
193 
194  bool operator!=(const AudioOptions& o) const { return !(*this == o); }
195 
196  Optional<uint32_t> audio_scenario; // agora::rtc::AUDIO_SCENARIO_TYPE
197  Optional<uint32_t> audio_routing; // agora::rtc::AudioRoute
198  Optional<OPENSL_MODE> opensl_mode;
199  Optional<bool> has_published_stream;
200  Optional<bool> has_subscribed_stream;
201 
202  // ios::AVAudioSessionCategoryOptionMixWithOthers
203  Optional<uint32_t> adm_mix_option_selected;
204  Optional<uint32_t> adm_override_lua_input_sample_rate;
205  Optional<uint32_t> adm_input_sample_rate;
206  Optional<uint32_t> adm_output_sample_rate;
207  Optional<bool> adm_stereo_out;
208  // ios::AVAudioSessionCategoryOptionAllowBluetoothA2DP
209  Optional<uint32_t> adm_force_use_bluetooth_a2dp;
210  Optional<bool> adm_keep_audio_session;
211  Optional<bool> adm_use_hw_aec;
212  Optional<bool> adm_output_align_input_sample_rate;
213 
214  Optional<bool> adm_force_restart;
215 
216  Optional<bool> adm_enable_opensl; // Deprecated
217  Optional<uint32_t> adm_audio_layer;
218  Optional<bool> adm_enable_record_but_not_publish;
219  Optional<uint32_t> adm_audio_source; //for android
220  Optional<float> adm_playout_bufsize_factor; //for android
221 
222  Optional<bool> apm_override_lua_enable_aec;
223  Optional<bool> apm_override_lua_enable_ns;
224  Optional<bool> apm_override_lua_enable_agc;
225  Optional<bool> apm_override_lua_enable_md;
226  Optional<bool> apm_enable_aec;
227  Optional<bool> apm_enable_ns;
228  Optional<bool> apm_enable_agc;
229  Optional<bool> apm_enable_md;
230  Optional<bool> apm_enable_highpass_filter;
231  Optional<bool> apm_enable_tone_remover;
232  Optional<bool> apm_enable_pitch_smoother;
233  Optional<bool> apm_enable_howling_control;
234  Optional<uint32_t> apm_delay_offset_ms;
235  Optional<uint32_t> apm_aec_suppression_level;
236  Optional<uint32_t> apm_aec_delay_type;
237  Optional<uint32_t> apm_aec_nlp_aggressiveness;
238  Optional<uint32_t> apm_agc_target_level_dbfs;
239  Optional<uint32_t> apm_agc_compression_gain_db;
240  Optional<uint32_t> apm_agc_mode;
241  Optional<uint32_t> apm_ns_level;
242 
243  //Double talk detection switcher.
244  //Android game streaming scenario should be true, all other cases should be false;
245  Optional<bool> apm_enable_dtd;
246 
247  Optional<uint32_t> acm_bitrate;
248  Optional<uint32_t> acm_codec;
249  Optional<bool> acm_dtx;
250  Optional<bool> acm_plc;
251  Optional<uint32_t> acm_complex_level;
252  Optional<uint32_t> acm_ptime;
253  Optional<uint32_t> neteq_live_min_delay;
254  Optional<uint32_t> neteq_jitter_buffer_max_packets;
255  Optional<bool> neteq_jitter_buffer_fast_accelerate;
256  Optional<bool> neteq_target_level_optimization;
257  Optional<uint32_t> neteq_aqm_voice_threshold;
258  Optional<uint32_t> playback_volume;
259 
260  // hacks for alter webrtc behavior
261  Optional<bool> webrtc_enable_aec3;
262 
263  // derived options
264  Optional<bool> derived_headset_black_list_device;
265 #if defined(WEBRTC_IOS) || defined(WEBRTC_ANDROID)
266  Optional<int> use_media_volume_in_headset;
267  Optional<int> use_media_volume_in_audience;
268  Optional<int> use_media_volume_in_solo;
269 #endif // defined(WEBRTC_IOS) || defined(WEBRTC_ANDROID)
270  private:
271  template <typename T>
272  static void SetFrom(Optional<T>* s, const Optional<T>& o) {
273  if (o) {
274  *s = o;
275  }
276  }
277 };
278 
279 } // namespace rtc
280 } // namespace agora
agora::rtc::AudioOptions
Definition: audio_options_i.h:44
agora::Optional< uint32_t >