正在查看: 夜猫麻将 v24.1.1 应用的 AudioDispatcher.java JAVA 源代码文件
本页面展示 JAVA 反编译生成的源代码文件,支持语法高亮显示。 仅供安全研究与技术分析使用,严禁用于任何非法用途。请遵守相关法律法规。
正在查看: 夜猫麻将 v24.1.1 应用的 AudioDispatcher.java JAVA 源代码文件
本页面展示 JAVA 反编译生成的源代码文件,支持语法高亮显示。 仅供安全研究与技术分析使用,严禁用于任何非法用途。请遵守相关法律法规。
package com.gme.av.audiodispatcher;
import com.gme.av.utils.QLog;
import com.gme.av.wrapper.GMEJavaInstance;
import java.io.DataOutputStream;
import java.io.IOException;
import java.net.BindException;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.concurrent.ArrayBlockingQueue;
import java.util.concurrent.atomic.AtomicBoolean;
public class AudioDispatcher {
private static final String TAG = "AudioDispatcher";
private static final int TRY_BIND_SOCKET_TIMES = 20;
private static AudioDispatcher mAudioDispatcher;
private static ArrayBlockingQueue<byte[]> mQueue = new ArrayBlockingQueue<>(10);
private ServerSocket mServerSocket;
private SocketClient mSocketClient;
private int mPort = 7878;
private AtomicBoolean mIsSendingAudioData = new AtomicBoolean(false);
private AtomicBoolean mIsWaitingClient = new AtomicBoolean(false);
public static AudioDispatcher getInstance() {
if (mAudioDispatcher == null) {
mAudioDispatcher = new AudioDispatcher();
}
return mAudioDispatcher;
}
public void offerAudioData(byte[] data) {
if (data != null) {
if (mQueue.remainingCapacity() <= 1) {
mQueue.poll();
}
mQueue.add(data);
}
}
public boolean isNeedOfferAudioData() {
return this.mIsSendingAudioData.get();
}
public void onAudioCaptureChange(boolean enable) {
GMEAudioBroadcast.getInstance().onAudioCaptureChange(enable);
}
public void onAudioEnableBroadcast(boolean enable) {
if (enable) {
GMEAudioBroadcast.getInstance().registerBroadcast(GMEJavaInstance.getmActivity());
} else {
GMEAudioBroadcast.getInstance().unRegisterBroadcast(GMEJavaInstance.getmActivity());
}
}
public byte[] pollAudioData() {
return mQueue.poll();
}
public void clearAudioQueue() {
mQueue.clear();
}
boolean startServer() {
QLog.e(TAG, "startServer");
if (this.mIsSendingAudioData.get()) {
QLog.i(TAG, "AudioDispatcher is sending audio data. request refuse");
return false;
}
if (this.mIsWaitingClient.get()) {
QLog.i(TAG, "AudioDispatcher Server is ready and waiting accept.");
return true;
}
ServerSocket TryBindSocket = TryBindSocket();
this.mServerSocket = TryBindSocket;
if (TryBindSocket == null) {
QLog.i(TAG, "AudioDispatcher Server TryBindSocket failed");
return false;
}
QLog.i(TAG, "AudioDispatcher Server start");
new AudioServer().start();
return true;
}
public int getPort() {
return this.mPort;
}
public void onRecordStateChange(boolean isRecord) {
if (!isRecord) {
QLog.e(TAG, "onRecordStateChange:" + isRecord + " try closeSocketClient");
closeSocketClient();
}
}
public void closeSocketClient() {
SocketClient socketClient = this.mSocketClient;
if (socketClient != null) {
socketClient.stopClient();
}
}
class AudioServer extends Thread {
private AudioServer() {
QLog.e(AudioDispatcher.TAG, "AudioServer start");
AudioDispatcher.this.mIsWaitingClient.set(true);
}
@Override
public void run() {
try {
Socket socketClient = AudioDispatcher.this.mServerSocket.accept();
AudioDispatcher.this.mSocketClient = AudioDispatcher.this.new SocketClient(socketClient);
AudioDispatcher.this.mSocketClient.start();
} catch (Exception e) {
e.printStackTrace();
}
AudioDispatcher.this.mIsWaitingClient.set(false);
QLog.e(AudioDispatcher.TAG, "AudioServer end");
}
}
private ServerSocket TryBindSocket() {
ServerSocket serverSocket = null;
int tryTimes = 0;
boolean run = true;
do {
try {
int i = this.mPort + 1;
this.mPort = i;
serverSocket = new ServerSocket(i);
QLog.e(TAG, "try to bind Socket" + this.mPort);
run = false;
} catch (BindException e) {
e.printStackTrace();
tryTimes++;
if (tryTimes >= 20) {
break;
}
QLog.e(TAG, "BindException" + e.getMessage());
} catch (IOException e2) {
QLog.e(TAG, "IOException" + e2.getMessage());
}
} while (run);
return serverSocket;
}
class SocketClient extends Thread {
private boolean mFlag = true;
private Socket mSocket;
public SocketClient(Socket socket) {
this.mSocket = socket;
AudioDispatcher.this.clearAudioQueue();
AudioDispatcher.this.mIsSendingAudioData.set(true);
}
public void stopClient() {
this.mFlag = false;
}
@Override
public void run() {
super.run();
QLog.e(AudioDispatcher.TAG, "start Send audio data");
try {
try {
try {
DataOutputStream dos = new DataOutputStream(this.mSocket.getOutputStream());
do {
byte[] outData = AudioDispatcher.this.pollAudioData();
if (outData == null) {
Thread.sleep(10L);
} else {
dos.write(outData);
}
} while (this.mFlag);
dos.close();
this.mSocket.close();
} catch (Throwable th) {
try {
this.mSocket.close();
} catch (IOException e) {
e.printStackTrace();
}
throw th;
}
} catch (IOException e2) {
e2.printStackTrace();
QLog.e(AudioDispatcher.TAG, e2.getMessage());
this.mSocket.close();
} catch (InterruptedException e3) {
e3.printStackTrace();
this.mSocket.close();
}
} catch (IOException e4) {
e4.printStackTrace();
}
AudioDispatcher.this.mIsSendingAudioData.set(false);
QLog.e(AudioDispatcher.TAG, "stop Send audio data");
}
}
}