kopia lustrzana https://github.com/N0BOY/FT8CN
153 wiersze
4.7 KiB
Java
153 wiersze
4.7 KiB
Java
package com.bg7yoz.ft8cn.icom;
|
|
/**
|
|
* WIFI模式下电台操作。
|
|
* @author BGY70Z
|
|
* @date 2023-03-20
|
|
*/
|
|
|
|
import android.media.AudioAttributes;
|
|
import android.media.AudioFormat;
|
|
import android.media.AudioTrack;
|
|
|
|
import com.bg7yoz.ft8cn.GeneralVariables;
|
|
import com.bg7yoz.ft8cn.R;
|
|
import com.bg7yoz.ft8cn.icom.IcomUdpBase.IcomUdpStyle;
|
|
import com.bg7yoz.ft8cn.ui.ToastMessage;
|
|
|
|
import java.io.IOException;
|
|
|
|
public class IComWifiRig {
|
|
public interface OnIComDataEvents{
|
|
void onReceivedCivData(byte[] data);
|
|
void onReceivedWaveData(byte[] data);
|
|
}
|
|
private IcomControlUdp controlUdp;
|
|
private AudioTrack audioTrack = null;
|
|
private final String ip;
|
|
private final int port;
|
|
private final String userName;
|
|
private final String password;
|
|
public boolean opened=false;
|
|
public boolean isPttOn=false;
|
|
|
|
private OnIComDataEvents onIComDataEvents;
|
|
|
|
|
|
|
|
public IComWifiRig(String ip, int port, String userName, String password) {
|
|
this.ip = ip;
|
|
this.port = port;
|
|
this.userName = userName;
|
|
this.password = password;
|
|
}
|
|
|
|
|
|
public void start(){
|
|
opened=true;
|
|
openAudio();//打开音频
|
|
controlUdp=new IcomControlUdp(userName,password,ip,port);
|
|
//设置事件,这里可以处理电台状态,和接收电台送来的音频数据
|
|
controlUdp.setOnStreamEvents(new IcomUdpBase.OnStreamEvents() {
|
|
@Override
|
|
public void OnReceivedIAmHere(byte[] data) {
|
|
|
|
}
|
|
|
|
@Override
|
|
public void OnReceivedCivData(byte[] data) {
|
|
if (onIComDataEvents!=null){
|
|
onIComDataEvents.onReceivedCivData(data);
|
|
}
|
|
}
|
|
|
|
@Override
|
|
public void OnReceivedAudioData(byte[] audioData) {
|
|
if (onIComDataEvents!=null){
|
|
onIComDataEvents.onReceivedWaveData(audioData);
|
|
}
|
|
if (audioTrack!=null){
|
|
// if (!isPttOn) {//如果ptt没有按下
|
|
audioTrack.write(audioData, 0, audioData.length
|
|
, AudioTrack.WRITE_NON_BLOCKING);
|
|
// }
|
|
}
|
|
}
|
|
|
|
@Override
|
|
public void OnUdpSendIOException(IcomUdpStyle style,IOException e) {
|
|
ToastMessage.show(String.format(GeneralVariables.getStringFromResource(
|
|
R.string.network_exception),IcomUdpBase.getUdpStyle(style),e.getMessage()));
|
|
close();
|
|
}
|
|
|
|
@Override
|
|
public void OnLoginResponse(boolean authIsOK) {
|
|
if (authIsOK){
|
|
ToastMessage.show(GeneralVariables.getStringFromResource(R.string.login_succeed));
|
|
}else {
|
|
ToastMessage.show(GeneralVariables.getStringFromResource(R.string.loging_failed));
|
|
controlUdp.closeAll();
|
|
}
|
|
}
|
|
|
|
});
|
|
controlUdp.openStream();//打开端口
|
|
controlUdp.startAreYouThereTimer();//开始连接电台
|
|
}
|
|
|
|
public void setPttOn(boolean on){//打开PTT
|
|
isPttOn=on;
|
|
controlUdp.civUdp.sendPttAction(on);
|
|
controlUdp.audioUdp.isPttOn=on;
|
|
}
|
|
public void sendCivData(byte[] data){
|
|
controlUdp.civUdp.sendCivData(data);
|
|
}
|
|
|
|
public void sendWaveData(float[] data){//发送音频数据到电台
|
|
controlUdp.sendWaveData(data);
|
|
}
|
|
|
|
/**
|
|
* 关闭各种连接,以及音频
|
|
*/
|
|
public void close(){
|
|
opened=false;
|
|
controlUdp.closeAll();
|
|
closeAudio();
|
|
//controlUdp.closeStream();
|
|
}
|
|
/**
|
|
* 打开音频,流方式。当收到音频流的时候,播放数据
|
|
*/
|
|
public void openAudio() {
|
|
if (audioTrack!=null) closeAudio();
|
|
|
|
AudioAttributes attributes = new AudioAttributes.Builder()
|
|
.setUsage(AudioAttributes.USAGE_MEDIA)
|
|
.setContentType(AudioAttributes.CONTENT_TYPE_MUSIC)
|
|
.build();
|
|
AudioFormat myFormat = new AudioFormat.Builder().setSampleRate(IComPacketTypes.AUDIO_SAMPLE_RATE)
|
|
.setEncoding(AudioFormat.ENCODING_PCM_16BIT)
|
|
.setChannelMask(AudioFormat.CHANNEL_OUT_MONO).build();
|
|
int mySession = 0;
|
|
audioTrack = new AudioTrack(attributes, myFormat
|
|
, IComPacketTypes.AUDIO_SAMPLE_RATE/4, AudioTrack.MODE_STREAM
|
|
, mySession);
|
|
audioTrack.play();
|
|
}
|
|
/**
|
|
* 关闭音频
|
|
*/
|
|
public void closeAudio() {
|
|
if (audioTrack != null) {
|
|
audioTrack.stop();
|
|
audioTrack = null;
|
|
}
|
|
}
|
|
|
|
public void setOnIComDataEvents(OnIComDataEvents onIComDataEvents) {
|
|
this.onIComDataEvents = onIComDataEvents;
|
|
}
|
|
}
|