8000 Add more control over android audio options (#1434) · liliBestCoder/flutter-webrtc@65af5be · GitHub
[go: up one dir, main page]

Skip to content

Commit 65af5be

Browse files
authored
Add more control over android audio options (flutter-webrtc#1434)
1 parent ece4b54 commit 65af5be

File tree

5 files changed

+509
-90
lines changed

5 files changed

+509
-90
lines changed

android/src/main/java/com/cloudwebrtc/webrtc/MethodCallHandlerImpl.java

Lines changed: 40 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -8,8 +8,8 @@
88
import android.graphics.SurfaceTexture;
99
import android.hardware.Camera;
1010
import android.hardware.Camera.CameraInfo;
11+
import android.media.AudioAttributes;
1112
import android.media.AudioDeviceInfo;
12-
import android.media.AudioManager;
1313
import android.os.Build;
1414
import android.util.Log;
1515
import android.util.LongSparseArray;
@@ -20,6 +20,7 @@
2020

2121
import com.cloudwebrtc.webrtc.audio.AudioDeviceKind;
2222
import c 10000 om.cloudwebrtc.webrtc.audio.AudioSwitchManager;
23+
import com.cloudwebrtc.webrtc.audio.AudioUtils;
2324
import com.cloudwebrtc.webrtc.record.AudioChannel;
2425
import com.cloudwebrtc.webrtc.record.FrameCapturer;
2526
import com.cloudwebrtc.webrtc.utils.AnyThreadResult;
@@ -30,7 +31,6 @@
3031
import com.cloudwebrtc.webrtc.utils.ObjectType;
3132
import com.cloudwebrtc.webrtc.utils.PermissionUtils;
3233
import com.cloudwebrtc.webrtc.utils.Utils;
33-
3434
import com.twilio.audioswitch.AudioDevice;
3535

3636
import org.webrtc.AudioTrack;
@@ -63,17 +63,13 @@
6363
import org.webrtc.SdpObserver;
6464
import org.webrtc.SessionDescription;
6565
import org.webrtc.SessionDescription.Type;
66-
import org.webrtc.SoftwareVideoDecoderFactory;
67-
import org.webrtc.SoftwareVideoEncoderFactory;
6866
import org.webrtc.VideoTrack;
69-
import org.webrtc.WrappedVideoDecoderFactory;
7067
import org.webrtc.audio.AudioDeviceModule;
7168
import org.webrtc.audio.JavaAudioDeviceModule;
7269
import org.webrtc.video.CustomVideoDecoderFactory;
7370
import org.webrtc.video.CustomVideoEncoderFactory;
7471

7572
import java.io.File;
76-
import java.io.UnsupportedEncodingException;
7773
import java.nio.ByteBuffer;
7874
import java.nio.charset.StandardCharsets;
7975
import java.util.ArrayList;
@@ -146,8 +142,8 @@ void dispose() {
146142
}
147143
mPeerConnectionObservers.clear();
148144
}
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) {
151147
if (mFactory != null) {
152148
return;
153149
}
@@ -161,11 +157,36 @@ private void initialize(int networkIgnoreMask, boolean forceSWCodec, List<String
161157

162158
frameCryptor = new FlutterRTCFrameCryptor(this);
163159

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)
165181
.setUseHardwareAcousticEchoCanceler(true)
166182
.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();
169190

170191
getUserMediaImpl.audioDeviceModule = (JavaAudioDeviceModule) audioDeviceModule;
171192

@@ -251,7 +272,14 @@ public void onMethodCall(MethodCall call, @NonNull Result notSafeResult) {
251272
// disable HW Codec for VP9 by default.
252273
forceSWCodecList.add("VP9");
253274
}
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);
255283
result.success(null);
256284
break;
257285
}

0 commit comments

Comments
 (0)
0