8
8
import android .graphics .SurfaceTexture ;
9
9
import android .hardware .Camera ;
10
10
import android .hardware .Camera .CameraInfo ;
11
+ import android .media .AudioAttributes ;
11
12
import android .media .AudioDeviceInfo ;
12
- import android .media .AudioManager ;
13
13
import android .os .Build ;
14
14
import android .util .Log ;
15
15
import android .util .LongSparseArray ;
20
20
21
21
import com .cloudwebrtc .webrtc .audio .AudioDeviceKind ;
22
22
import c
10000
om .cloudwebrtc .webrtc .audio .AudioSwitchManager ;
23
+ import com .cloudwebrtc .webrtc .audio .AudioUtils ;
23
24
import com .cloudwebrtc .webrtc .record .AudioChannel ;
24
25
import com .cloudwebrtc .webrtc .record .FrameCapturer ;
25
26
import com .cloudwebrtc .webrtc .utils .AnyThreadResult ;
30
31
import com .cloudwebrtc .webrtc .utils .ObjectType ;
31
32
import com .cloudwebrtc .webrtc .utils .PermissionUtils ;
32
33
import com .cloudwebrtc .webrtc .utils .Utils ;
33
-
34
34
import com .twilio .audioswitch .AudioDevice ;
35
35
36
36
import org .webrtc .AudioTrack ;
63
63
import org .webrtc .SdpObserver ;
64
64
import org .webrtc .SessionDescription ;
65
65
import org .webrtc .SessionDescription .Type ;
66
- import org .webrtc .SoftwareVideoDecoderFactory ;
67
- import org .webrtc .SoftwareVideoEncoderFactory ;
68
66
import org .webrtc .VideoTrack ;
69
- import org .webrtc .WrappedVideoDecoderFactory ;
70
67
import org .webrtc .audio .AudioDeviceModule ;
71
68
import org .webrtc .audio .JavaAudioDeviceModule ;
72
69
import org .webrtc .video .CustomVideoDecoderFactory ;
73
70
import org .webrtc .video .CustomVideoEncoderFactory ;
74
71
75
72
import java .io .File ;
76
- import java .io .UnsupportedEncodingException ;
77
73
import java .nio .ByteBuffer ;
78
74
import java .nio .charset .StandardCharsets ;
79
75
import java .util .ArrayList ;
@@ -146,8 +142,8 @@ void dispose() {
146
142
}
147
143
mPeerConnectionObservers .clear ();
148
144
}
149
-
150
- private void initialize ( int networkIgnoreMask , boolean forceSWCodec , List < String > forceSWCodecList ) {
145
+ private void initialize ( int networkIgnoreMask , boolean forceSWCodec , List < String > forceSWCodecList ,
146
+ @ Nullable ConstraintsMap androidAudioConfiguration ) {
151
147
if (mFactory != null ) {
152
148
return ;
153
149
}
@@ -161,11 +157,36 @@ private void initialize(int networkIgnoreMask, boolean forceSWCodec, List<String
161
157
162
158
frameCryptor = new FlutterRTCFrameCryptor (this );
163
159
164
- audioDeviceModule = JavaAudioDeviceModule .builder (context )
160
+ AudioAttributes audioAttributes = null ;
161
+ if (androidAudioConfiguration != null ) {
162
+ Integer usageType = AudioUtils .getAudioAttributesUsageTypeForString (
163
+ androidAudioConfiguration .getString ("androidAudioAttributesUsageType" ));
164
+ Integer contentType = AudioUtils .getAudioAttributesContentTypeFromString (
165
+ androidAudioConfiguration .getString ("androidAudioAttributesContentType" ));
166
+
167
+ // Warn if one is provided without the other.
168
+ if (usageType == null ^ contentType == null ) {
169
+ Log .w (TAG , "usageType and contentType must both be provided!" );
170
+ }
171
+
172
+ if (usageType != null && contentType != null ) {
173
+ audioAttributes = new AudioAttributes .Builder ()
174
+ .setUsage (usageType )
175
+ .setContentType (contentType )
176
+ .build ();
177
+ }
178
+ }
179
+
180
+ JavaAudioDeviceModule .Builder audioDeviceModuleBuilder = JavaAudioDeviceModule .builder (context )
165
181
.setUseHardwareAcousticEchoCanceler (true )
166
182
.setUseHardwareNoiseSuppressor (true )
167
- .setSamplesReadyCallback (getUserMediaImpl .inputSamplesInterceptor )
168
- .createAudioDeviceModule ();
183
+ .setSamplesReadyCallback (getUserMediaImpl .inputSamplesInterceptor );
184
+
185
+ if (audioAttributes != null ) {
186
+ audioDeviceModuleBuilder .setAudioAttributes (audioAttributes );
187
+ }
188
+
189
+ audioDeviceModule = audioDeviceModuleBuilder .createAudioDeviceModule ();
169
190
170
191
getUserMediaImpl .audioDeviceModule = (JavaAudioDeviceModule ) audioDeviceModule ;
171
192
@@ -251,7 +272,14 @@ public void onMethodCall(MethodCall call, @NonNull Result notSafeResult) {
251
272
// disable HW Codec for VP9 by default.
252
273
forceSWCodecList .add ("VP9" );
253
274
}
254
- initialize (networkIgnoreMask ,forceSWCodec , forceSWCodecList );
275
+
276
+ ConstraintsMap androidAudioConfiguration = null ;
277
+ if (constraintsMap .hasKey ("androidAudioConfiguration" )
278
+ && constraintsMap .getType ("androidAudioConfiguration" ) == ObjectType .Map ) {
279
+ androidAudioConfiguration = constraintsMap .getMap ("androidAudioConfiguration" );
280
+ }
281
+
282
+ initialize (networkIgnoreMask , forceSWCodec , forceSWCodecList , androidAudioConfiguration );
255
283
result .success (null );
256
284
break ;
257
285
}
0 commit comments