diff --git a/codec2talkie/src/main/java/com/radio/codec2talkie/app/AppService.java b/codec2talkie/src/main/java/com/radio/codec2talkie/app/AppService.java index 292dabe..b697d6a 100644 --- a/codec2talkie/src/main/java/com/radio/codec2talkie/app/AppService.java +++ b/codec2talkie/src/main/java/com/radio/codec2talkie/app/AppService.java @@ -160,11 +160,9 @@ public class AppService extends Service { _tracker = TrackerFactory.create(trackerName); _tracker.initialize(getApplicationContext(), position -> { if (_appWorker != null) _appWorker.sendPositionToTnc(position); }); - transportType = (TransportFactory.TransportType) extras.get("transportType"); - startAppWorker(transportType); - Notification notification = buildServiceNotification(getString(R.string.app_service_notif_text_ptt_ready), R.drawable.ic_app_action); startForeground(SERVICE_NOTIFICATION_ID, notification); + PowerManager powerManager = (PowerManager) getSystemService(POWER_SERVICE); boolean noCpuSleep = _sharedPreferences.getBoolean(PreferenceKeys.APP_NO_CPU_SLEEP, false); @@ -175,6 +173,9 @@ public class AppService extends Service { isRunning = true; + transportType = (TransportFactory.TransportType) extras.get("transportType"); + startAppWorker(transportType); + Log.i(TAG, "App service started"); } diff --git a/codec2talkie/src/main/java/com/radio/codec2talkie/app/AppWorker.java b/codec2talkie/src/main/java/com/radio/codec2talkie/app/AppWorker.java index 9ae9424..67597cb 100644 --- a/codec2talkie/src/main/java/com/radio/codec2talkie/app/AppWorker.java +++ b/codec2talkie/src/main/java/com/radio/codec2talkie/app/AppWorker.java @@ -87,7 +87,7 @@ public class AppWorker extends Thread { String codec2ModeName = _sharedPreferences.getString(PreferenceKeys.CODEC2_MODE, _context.getResources().getStringArray(R.array.codec2_modes)[0]); _codec2Mode = AudioTools.extractCodec2ModeId(codec2ModeName); - _transport = TransportFactory.create(transportType, context); + _transport = TransportFactory.create(transportType, context); _protocol = ProtocolFactory.create(_codec2Mode, context); _processPeriodicTimer = new Timer(); @@ -492,6 +492,11 @@ public class AppWorker extends Thread { @Override public void run() { Log.i(TAG, "Starting message loop"); + try { + sleep(1000); + } catch (InterruptedException e) { + e.printStackTrace(); + } setPriority(Thread.MAX_PRIORITY); Looper.prepare(); diff --git a/codec2talkie/src/main/java/com/radio/codec2talkie/transport/SoundModem.java b/codec2talkie/src/main/java/com/radio/codec2talkie/transport/SoundModem.java index 983d0ca..09bb74f 100644 --- a/codec2talkie/src/main/java/com/radio/codec2talkie/transport/SoundModem.java +++ b/codec2talkie/src/main/java/com/radio/codec2talkie/transport/SoundModem.java @@ -7,18 +7,21 @@ import android.media.AudioFormat; import android.media.AudioRecord; import android.media.AudioTrack; import android.media.MediaRecorder; -import android.provider.MediaStore; +import android.util.Log; import androidx.preference.PreferenceManager; -import com.radio.codec2talkie.settings.PreferenceKeys; import com.ustadmobile.codec2.Codec2; import java.io.IOException; +import java.util.Arrays; +import java.util.BitSet; public class SoundModem implements Transport { - private static final int AUDIO_SAMPLE_SIZE = 8000; + private static final String TAG = SoundModem.class.getSimpleName(); + + private static final int AUDIO_SAMPLE_SIZE = 12000; private final String _name; @@ -62,7 +65,7 @@ public class SoundModem implements Transport { AUDIO_SAMPLE_SIZE, AudioFormat.CHANNEL_IN_MONO, AudioFormat.ENCODING_PCM_16BIT, - 10 * _audioRecorderMinBufferSize); + _audioRecorderMinBufferSize); int _audioPlayerMinBufferSize = AudioTrack.getMinBufferSize( AUDIO_SAMPLE_SIZE, @@ -81,7 +84,7 @@ public class SoundModem implements Transport { .setChannelMask(AudioFormat.CHANNEL_OUT_MONO) .build()) .setTransferMode(AudioTrack.MODE_STREAM) - .setBufferSizeInBytes(10 * _audioPlayerMinBufferSize) + .setBufferSizeInBytes(_audioPlayerMinBufferSize) .build(); } @@ -95,8 +98,30 @@ public class SoundModem implements Transport { return 0; } + public static byte[] toByteBitArray(BitSet bits) { + byte[] bytes = new byte[bits.length()]; + for (int i=0; i= _playbackBitBuffer.length) { + Log.i(TAG, "-- " + i + " " + j); + Codec2.fskModulate(_fskModem, _playbackAudioBuffer, _playbackBitBuffer); + _systemAudioPlayer.write(_playbackAudioBuffer, 0, _playbackAudioBuffer.length); + j = 0; + } + _playbackBitBuffer[j] = dataBits[i]; + } + Log.i(TAG, "-- " + j); Codec2.fskModulate(_fskModem, _playbackAudioBuffer, _playbackBitBuffer); _systemAudioPlayer.write(_playbackAudioBuffer, 0, _playbackAudioBuffer.length); return 0; diff --git a/libcodec2-android/src/main/cpp/Codec2JNI.cpp b/libcodec2-android/src/main/cpp/Codec2JNI.cpp index e288462..d546f2f 100644 --- a/libcodec2-android/src/main/cpp/Codec2JNI.cpp +++ b/libcodec2-android/src/main/cpp/Codec2JNI.cpp @@ -131,9 +131,8 @@ namespace Java_com_ustadmobile_codec2_Codec2 { static jlong encode(JNIEnv *env, jclass clazz, jlong n, jshortArray inputBuffer, jcharArray outputBits) { Context *con = getContext(n); - int i; jshort *jbuf = env->GetShortArrayElements(inputBuffer, nullptr); - for (i = 0; i < con->nsam; i++) { + for (int i = 0; i < con->nsam; i++) { auto v = (short) jbuf[i]; con->buf[i] = v; } @@ -143,7 +142,7 @@ namespace Java_com_ustadmobile_codec2_Codec2 { codec2_encode(con->c2, con->bits, con->buf); jchar *jbits = env->GetCharArrayElements(outputBits, nullptr); - for (i = 0; i < con->nbyte; i++) { + for (int i = 0; i < con->nbyte; i++) { jbits[i] = con->bits[i]; } env->ReleaseCharArrayElements(outputBits, jbits, 0); @@ -153,9 +152,8 @@ namespace Java_com_ustadmobile_codec2_Codec2 { static jlong fskModulate(JNIEnv *env, jclass clazz, jlong n, jshortArray outputSamples, jbyteArray inputBits) { ContextFsk *conFsk = getContextFsk(n); - int i; jbyte *jbuf = env->GetByteArrayElements(inputBits, nullptr); - for (i = 0; i < conFsk->Nbits; i++) { + for (int i = 0; i < conFsk->Nbits; i++) { auto v = (unsigned char) jbuf[i]; conFsk->modBits[i] = v; } @@ -165,7 +163,7 @@ namespace Java_com_ustadmobile_codec2_Codec2 { fsk_mod(conFsk->fsk, conFsk->modBuf, conFsk->modBits, conFsk->Nbits); jshort *jOutBuf = env->GetShortArrayElements(outputSamples, nullptr); - for (i = 0; i < conFsk->N; i++) { + for (int i = 0; i < conFsk->N; i++) { jOutBuf[i] = (int16_t)(conFsk->modBuf[i] * FDMDV_SCALE); } env->ReleaseShortArrayElements(outputSamples, jOutBuf, 0);