mirror of
https://github.com/Pinball3D/Rabbit-R1.git
synced 2025-01-09 13:43:22 +00:00
277 lines
11 KiB
Java
277 lines
11 KiB
Java
package tech.rabbit.r1launcher.wss.rtc;
|
|
|
|
import android.content.Context;
|
|
import android.media.AudioDeviceInfo;
|
|
import android.media.AudioManager;
|
|
import android.util.Log;
|
|
import com.google.common.net.HttpHeaders;
|
|
import com.google.gson.Gson;
|
|
import java.util.Arrays;
|
|
import java.util.List;
|
|
import okhttp3.MediaType;
|
|
import okhttp3.OkHttpClient;
|
|
import okhttp3.Request;
|
|
import okhttp3.RequestBody;
|
|
import okhttp3.Response;
|
|
import org.json.JSONObject;
|
|
import org.mediasoup.droid.Consumer;
|
|
import org.mediasoup.droid.Device;
|
|
import org.mediasoup.droid.PeerConnection;
|
|
import org.mediasoup.droid.RecvTransport;
|
|
import org.mediasoup.droid.Transport;
|
|
import org.webrtc.AudioTrack;
|
|
import org.webrtc.MediaStream;
|
|
import org.webrtc.MediaStreamTrack;
|
|
import tech.rabbit.common.utils.RLog;
|
|
import tech.rabbit.r1launcher.utils.OkHttpUtil;
|
|
|
|
/* loaded from: classes3.dex */
|
|
public class RTCInstance {
|
|
public static final double MAX_VOLUME = 0.3d;
|
|
public static final double MIN_VOLUME = 0.01d;
|
|
private static final String TAG = "RTCInstance";
|
|
private static CreateWebRtcTransportResponse mTransportResponse;
|
|
private String mAppData;
|
|
private String mBaseUrl;
|
|
private PeerConnection.Options mConfig;
|
|
private Consumer mConsumer;
|
|
public Context mContext;
|
|
double mCurrentVolume;
|
|
private String mDtlsParameters;
|
|
private String mIceCandidates;
|
|
private String mIceParameters;
|
|
private Device mMediasoupDevice;
|
|
private RTCStateListener mRTCStateListener;
|
|
public String mRTCStateMsg;
|
|
private RecvTransport mRecvTransport;
|
|
private Object mSctp;
|
|
private MediaStream mStream;
|
|
private MediaStreamTrack mTrack;
|
|
private String mTransportId;
|
|
|
|
/* loaded from: classes3.dex */
|
|
public interface RTCStateListener {
|
|
void onChange(String str);
|
|
}
|
|
|
|
public void setRTCStateListener(RTCStateListener rTCStateListener) {
|
|
this.mRTCStateListener = rTCStateListener;
|
|
}
|
|
|
|
private RTCInstance() {
|
|
this.mCurrentVolume = 0.3d;
|
|
this.mRTCStateMsg = "Disconnect";
|
|
}
|
|
|
|
public AudioTrack getAudioTrack() {
|
|
MediaStreamTrack mediaStreamTrack = this.mTrack;
|
|
if (mediaStreamTrack instanceof AudioTrack) {
|
|
return (AudioTrack) mediaStreamTrack;
|
|
}
|
|
return null;
|
|
}
|
|
|
|
public Double getCurrentVolume() {
|
|
RLog.d(TAG, "getCurrentVolume: " + this.mCurrentVolume);
|
|
return Double.valueOf(this.mCurrentVolume);
|
|
}
|
|
|
|
public void setCurrentVolume(double d) {
|
|
this.mCurrentVolume = d;
|
|
RLog.d(TAG, "setCurrentVolume: " + this.mCurrentVolume);
|
|
}
|
|
|
|
/* JADX INFO: Access modifiers changed from: private */
|
|
/* loaded from: classes3.dex */
|
|
public static class Holder {
|
|
private static final RTCInstance INSTANCE = new RTCInstance();
|
|
|
|
private Holder() {
|
|
}
|
|
}
|
|
|
|
public static RTCInstance getInstance() {
|
|
return Holder.INSTANCE;
|
|
}
|
|
|
|
public Device createDevice() {
|
|
Device device = this.mMediasoupDevice;
|
|
if (device != null) {
|
|
return device;
|
|
}
|
|
Device device2 = new Device();
|
|
this.mMediasoupDevice = device2;
|
|
return device2;
|
|
}
|
|
|
|
/* JADX INFO: Access modifiers changed from: private */
|
|
public void updateState(String str) {
|
|
if ("completed".equals(str)) {
|
|
str = "Connected";
|
|
}
|
|
this.mRTCStateMsg = str;
|
|
RTCStateListener rTCStateListener = this.mRTCStateListener;
|
|
if (rTCStateListener != null) {
|
|
rTCStateListener.onChange(str);
|
|
}
|
|
}
|
|
|
|
public RecvTransport createRecvTransport(String str, String str2, String str3, String str4, Object obj, PeerConnection.Options options, String str5, String str6) {
|
|
try {
|
|
this.mBaseUrl = str;
|
|
this.mIceParameters = str2;
|
|
this.mIceCandidates = str3;
|
|
this.mTransportId = str4;
|
|
this.mSctp = obj;
|
|
this.mConfig = options;
|
|
this.mAppData = str5;
|
|
this.mDtlsParameters = str6;
|
|
RecvTransport createRecvTransport = this.mMediasoupDevice.createRecvTransport(new RecvTransport.Listener() { // from class: tech.rabbit.r1launcher.wss.rtc.RTCInstance.1
|
|
@Override // org.mediasoup.droid.Transport.Listener
|
|
public void onConnect(Transport transport, String str7) {
|
|
RLog.i(RTCInstance.TAG, "onConnect , dtlsParameters=" + str7);
|
|
RTCInstance.this.updateState("Connecting");
|
|
RTCNetworkManager.handleConnectWebRtcTransport(str7, RTCInstance.this.mTransportId, RTCInstance.this.mBaseUrl);
|
|
}
|
|
|
|
@Override // org.mediasoup.droid.Transport.Listener
|
|
public void onConnectionStateChange(Transport transport, String str7) {
|
|
RLog.i(RTCInstance.TAG, "onConnectionStateChange: " + str7);
|
|
RTCInstance.this.updateState(str7);
|
|
RTCInstance.this.handleConnectionStateChange(str7);
|
|
}
|
|
}, this.mTransportId, this.mIceParameters, this.mIceCandidates, this.mDtlsParameters, null, this.mConfig, this.mAppData);
|
|
this.mRecvTransport = createRecvTransport;
|
|
return createRecvTransport;
|
|
} catch (Exception e) {
|
|
RLog.e(TAG, "createRecvTransport Exception", e);
|
|
return null;
|
|
}
|
|
}
|
|
|
|
/* JADX INFO: Access modifiers changed from: package-private */
|
|
public static void handleStreamConnect(OkHttpClient okHttpClient, String str, CreateWebRtcTransportResponse createWebRtcTransportResponse, Device device) {
|
|
JSONObject jSONObject = new JSONObject();
|
|
try {
|
|
jSONObject.put("transportId", createWebRtcTransportResponse.getTransportId());
|
|
jSONObject.put("rtpCapabilitiesJson", device.getRtpCapabilities());
|
|
mTransportResponse = createWebRtcTransportResponse;
|
|
} catch (Exception e) {
|
|
RLog.e(TAG, "handleStreamConnect Exception", e);
|
|
}
|
|
try {
|
|
Response execute = okHttpClient.newCall(new Request.Builder().url(str + "/mediasoupConsume").post(RequestBody.create(MediaType.parse("application/json"), jSONObject.toString())).header(HttpHeaders.CONTENT_TYPE, "application/json").build()).execute();
|
|
if (execute.isSuccessful()) {
|
|
String string = execute.body().string();
|
|
MediasoupConsumeResponse mediasoupConsumeResponse = (MediasoupConsumeResponse) new Gson().fromJson(string, MediasoupConsumeResponse.class);
|
|
Log.w(TAG, "handleStreamConnect: " + mediasoupConsumeResponse + "," + mediasoupConsumeResponse.toString());
|
|
Log.w(TAG, "handleStreamConnect: " + string);
|
|
getInstance().createConsumer(mediasoupConsumeResponse.getConsumerId(), mediasoupConsumeResponse.getProducerId(), "audio", mediasoupConsumeResponse.getRtpParameters());
|
|
} else {
|
|
RLog.i(RTCNetworkManager.TAG, "onMessage: onError");
|
|
}
|
|
} catch (Exception e2) {
|
|
RLog.e(TAG, "handleStreamConnect Exception", e2);
|
|
}
|
|
}
|
|
|
|
/* JADX INFO: Access modifiers changed from: private */
|
|
public void handleConnectionStateChange(String str) {
|
|
if ("disconnected".equals(str)) {
|
|
RLog.i(TAG, "WebRTC disconnected. Attempting to reconnect...");
|
|
reconnect();
|
|
}
|
|
}
|
|
|
|
private void reconnect() {
|
|
createRecvTransport(this.mBaseUrl, this.mIceParameters, this.mIceCandidates, this.mTransportId, this.mSctp, this.mConfig, this.mAppData, this.mDtlsParameters);
|
|
handleStreamConnect(OkHttpUtil.client(), this.mBaseUrl, mTransportResponse, getInstance().createDevice());
|
|
}
|
|
|
|
public void createConsumer(String str, String str2, String str3, String str4) {
|
|
if (this.mRecvTransport == null) {
|
|
RLog.e(TAG, "createConsumer mRecvTransport is null");
|
|
return;
|
|
}
|
|
try {
|
|
Context context = this.mContext;
|
|
if (context != null) {
|
|
setSpeakerMode(context);
|
|
}
|
|
Consumer consume = this.mRecvTransport.consume(new Consumer.Listener() { // from class: tech.rabbit.r1launcher.wss.rtc.RTCInstance$$ExternalSyntheticLambda0
|
|
@Override // org.mediasoup.droid.Consumer.Listener
|
|
public final void onTransportClose(Consumer consumer) {
|
|
RLog.i(RTCInstance.TAG, "onTransportClose: ");
|
|
}
|
|
}, str, str2, str3, str4);
|
|
this.mConsumer = consume;
|
|
if (consume != null) {
|
|
this.mTrack = consume.getTrack();
|
|
}
|
|
} catch (Exception e) {
|
|
RLog.e(TAG, "createConsumer Exception", e);
|
|
}
|
|
}
|
|
|
|
public void closeStream() {
|
|
Consumer consumer;
|
|
RLog.d(TAG, "closeStream");
|
|
if (this.mStream == null || (consumer = this.mConsumer) == null || !(consumer.getTrack() instanceof AudioTrack)) {
|
|
return;
|
|
}
|
|
this.mStream.removeTrack((AudioTrack) this.mConsumer.getTrack());
|
|
}
|
|
|
|
public void closeRTC() {
|
|
RLog.d(TAG, "closeRTC");
|
|
RecvTransport recvTransport = this.mRecvTransport;
|
|
if (recvTransport != null) {
|
|
recvTransport.close();
|
|
}
|
|
}
|
|
|
|
public void release() {
|
|
RLog.d(TAG, "release");
|
|
closeStream();
|
|
closeRTC();
|
|
this.mMediasoupDevice = null;
|
|
}
|
|
|
|
public static void setSpeakerMode(Context context) {
|
|
if (isBluetoothDeviceOn(context)) {
|
|
setBluetoothScoOn(context);
|
|
} else {
|
|
setSpeakerphoneOn(context);
|
|
}
|
|
}
|
|
|
|
public static boolean isBluetoothDeviceOn(Context context) {
|
|
List<AudioDeviceInfo> asList = Arrays.asList(((AudioManager) context.getSystemService("audio")).getDevices(2));
|
|
if (asList == null || asList.isEmpty()) {
|
|
return false;
|
|
}
|
|
for (AudioDeviceInfo audioDeviceInfo : asList) {
|
|
RLog.d(TAG, "bluetooth device type: " + audioDeviceInfo.getType() + " " + ((Object) audioDeviceInfo.getProductName()));
|
|
if (audioDeviceInfo.getType() == 8 || audioDeviceInfo.getType() == 7) {
|
|
RLog.d(TAG, "bluetooth connected, audioManager mode: " + audioDeviceInfo.getType());
|
|
return true;
|
|
}
|
|
}
|
|
return false;
|
|
}
|
|
|
|
public static void setSpeakerphoneOn(Context context) {
|
|
RLog.i(TAG, "setSpeakerphoneOn: ");
|
|
AudioManager audioManager = (AudioManager) context.getSystemService("audio");
|
|
audioManager.setMode(0);
|
|
audioManager.setSpeakerphoneOn(true);
|
|
}
|
|
|
|
public static void setBluetoothScoOn(Context context) {
|
|
RLog.i(TAG, "setBluetoothScoOn: ");
|
|
AudioManager audioManager = (AudioManager) context.getSystemService("audio");
|
|
audioManager.setMode(0);
|
|
audioManager.setBluetoothScoOn(true);
|
|
audioManager.setSpeakerphoneOn(false);
|
|
}
|
|
}
|