From 5aaeb4fda75db15d047114c0602f5e47a171c3ae Mon Sep 17 00:00:00 2001 From: sh123 Date: Wed, 3 Aug 2022 09:40:06 +0300 Subject: [PATCH] Audio tuning --- .../com/radio/codec2talkie/protocol/Hdlc.java | 4 ++-- .../codec2talkie/transport/SoundModem.java | 18 ++++++++++++++---- libcodec2-android/src/main/cpp/Codec2JNI.cpp | 3 +-- 3 files changed, 17 insertions(+), 8 deletions(-) diff --git a/codec2talkie/src/main/java/com/radio/codec2talkie/protocol/Hdlc.java b/codec2talkie/src/main/java/com/radio/codec2talkie/protocol/Hdlc.java index 7978deb..8d00f6e 100644 --- a/codec2talkie/src/main/java/com/radio/codec2talkie/protocol/Hdlc.java +++ b/codec2talkie/src/main/java/com/radio/codec2talkie/protocol/Hdlc.java @@ -112,7 +112,7 @@ public class Hdlc implements Protocol { //Log.i(TAG, "checksum: " + calculatedCrc + " " + packetCrc); if (calculatedCrc == packetCrc) { Log.i(TAG, DebugTools.byteBitsToString(packetBits)); - Log.i(TAG, DebugTools.bytesToHex(packetBytes)); + Log.i(TAG, "RX: " + DebugTools.bytesToHex(packetBytes)); Log.i(TAG, "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!"); _parentProtocolCallback.onReceiveCompressedAudio(null, null, -1, contentBytes); } @@ -164,7 +164,7 @@ public class Hdlc implements Protocol { buffer.flip(); byte[] data = new byte[buffer.remaining()]; buffer.get(data); - Log.i(TAG, DebugTools.bytesToHex(data)); + Log.i(TAG, "TX: " + DebugTools.bytesToHex(data)); byte[] dataBytesAsBits = BitTools.convertToHDLCBitArray(data, true); 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 0da157b..7ebc736 100644 --- a/codec2talkie/src/main/java/com/radio/codec2talkie/transport/SoundModem.java +++ b/codec2talkie/src/main/java/com/radio/codec2talkie/transport/SoundModem.java @@ -8,6 +8,7 @@ import android.media.AudioRecord; import android.media.AudioTrack; import android.media.MediaRecorder; import android.os.Debug; +import android.os.Process; import android.util.Log; import androidx.preference.PreferenceManager; @@ -74,7 +75,7 @@ public class SoundModem implements Transport, Runnable { constructSystemAudioDevices(); if (_isLoopback) - _sampleBuffer = ByteBuffer.allocate(1000000 ); + _sampleBuffer = ByteBuffer.allocate(1000000); else _sampleBuffer = ByteBuffer.allocate(0); @@ -87,7 +88,7 @@ public class SoundModem implements Transport, Runnable { AudioFormat.CHANNEL_IN_MONO, AudioFormat.ENCODING_PCM_16BIT); - int audioSource = MediaRecorder.AudioSource.MIC; + int audioSource = MediaRecorder.AudioSource.UNPROCESSED; _systemAudioRecorder = new AudioRecord( audioSource, AUDIO_SAMPLE_SIZE, @@ -167,7 +168,6 @@ public class SoundModem implements Transport, Runnable { // process tail byte [] bitBufferTail = Arrays.copyOf(_playbackBitBuffer, j); Codec2.fskModulate(_fskModem, _playbackAudioBuffer, bitBufferTail); - _systemAudioPlayer.write(_playbackAudioBuffer, 0, bitBufferTail.length * _samplesPerSymbol); if (_isLoopback) { synchronized (_sampleBuffer) { for (short sample : _playbackAudioBuffer) { @@ -194,12 +194,19 @@ public class SoundModem implements Transport, Runnable { @Override public void run() { byte prevBit = 0; + android.os.Process.setThreadPriority(Process.THREAD_PRIORITY_URGENT_AUDIO); while (_isRunning) { int nin = Codec2.fskNin(_fskModem); + try { + Thread.sleep(10); + } catch (InterruptedException e) { + e.printStackTrace(); + } // TODO, take readCnt into account, do not read if playback is active if (_isLoopback) { synchronized (_sampleBuffer) { if (_sampleBuffer.position() / 2 >= nin) { + Log.i(TAG, "" + nin + " " + _sampleBuffer.position() / 2); _sampleBuffer.flip(); for (int i = 0; i < nin; i++) { _recordAudioBuffer[i] = _sampleBuffer.getShort(); @@ -211,6 +218,9 @@ public class SoundModem implements Transport, Runnable { } } else { int readCnt = _systemAudioRecorder.read(_recordAudioBuffer, 0, nin); + if (readCnt != nin) { + Log.i(TAG, "" + readCnt + " " + nin); + } } //Log.i(TAG, "! " + AudioTools.getSampleLevelDb(Arrays.copyOf(_recordAudioBuffer, Codec2.fskNin(_fskModem)))); //Log.i(TAG, DebugTools.shortsToHex(_recordAudioBuffer)); @@ -219,7 +229,7 @@ public class SoundModem implements Transport, Runnable { //Log.i(TAG, "----- " + DebugTools.byteBitsToFlatString(_recordBitBuffer)); //Log.i(TAG, "----- " + DebugTools.byteBitsToFlatString(BitTools.convertFromNRZI(_recordBitBuffer, prevBit))); - //Log.i(TAG, "== " + DebugTools.byteBitsToString(BitTools.convertFromNRZI(_recordBitBuffer, prevLastBit))); + //Log.i(TAG, "== " + DebugTools.byteBitsToString(BitTools.convertFromNRZI(_recordBitBuffer, prevBit))); synchronized (_bitBuffer) { try { _bitBuffer.put(BitTools.convertFromNRZI(_recordBitBuffer, prevBit)); diff --git a/libcodec2-android/src/main/cpp/Codec2JNI.cpp b/libcodec2-android/src/main/cpp/Codec2JNI.cpp index 694b98c..c533d37 100644 --- a/libcodec2-android/src/main/cpp/Codec2JNI.cpp +++ b/libcodec2-android/src/main/cpp/Codec2JNI.cpp @@ -74,7 +74,6 @@ namespace Java_com_ustadmobile_codec2_Codec2 { conFsk->demodBits = (uint8_t*)malloc(sizeof(uint8_t) * fsk->Nbits); conFsk->demodBuf = (int16_t*)malloc(sizeof(short) * (fsk->N + 2 * fsk->Ts)); - //fsk_set_freq_est_limits(fsk, 500, 2700); fsk_set_freq_est_limits(fsk, 0, sampleFrequency / 2); fsk_set_freq_est_alg(fsk, 0); @@ -187,7 +186,7 @@ namespace Java_com_ustadmobile_codec2_Codec2 { ContextFsk *conFsk = getContextFsk(n); env->GetShortArrayRegion(inputSamples, 0, conFsk->N, reinterpret_cast(conFsk->demodBuf)); for(int i = 0; i < fsk_nin(conFsk->fsk); i++){ - conFsk->demodCBuf[i].real = ((float)conFsk->demodBuf[i]) / FDMDV_SCALE; + conFsk->demodCBuf[i].real = ((float)conFsk->demodBuf[i]) / FDMDV_SCALE ; conFsk->demodCBuf[i].imag = 0.0; } fsk_demod(conFsk->fsk, conFsk->demodBits, conFsk->demodCBuf);