diff options
author | Andrew Comminos <andrew@comminos.com> | 2016-09-19 09:03:06 +0300 |
---|---|---|
committer | Andrew Comminos <andrew@comminos.com> | 2016-09-19 09:03:06 +0300 |
commit | 2d29a0bfa3638ad286e9380f1858f25f47c74a6d (patch) | |
tree | e8e16f3f3f377d43288ea15a8c5005dd87ddb03e | |
parent | cf0991b5c81ebd87ceb3a9debba969928377fd09 (diff) |
Implement blocking when PTT is toggled off.
6 files changed, 59 insertions, 1 deletions
diff --git a/src/main/java/com/morlunk/jumble/audio/AudioInput.java b/src/main/java/com/morlunk/jumble/audio/AudioInput.java index f21bd32..494f8d3 100644 --- a/src/main/java/com/morlunk/jumble/audio/AudioInput.java +++ b/src/main/java/com/morlunk/jumble/audio/AudioInput.java @@ -21,6 +21,7 @@ import android.media.AudioFormat; import android.media.AudioRecord; import android.util.Log; +import com.morlunk.jumble.BuildConfig; import com.morlunk.jumble.Constants; import com.morlunk.jumble.exception.AudioInitializationException; import com.morlunk.jumble.exception.NativeAudioException; @@ -121,6 +122,8 @@ public class AudioInput implements Runnable { if(mRecording) { mRecording = false; try { + // Interrupt so that we stop waiting on the PTT CV. + mRecordThread.interrupt(); mRecordThread.join(); } catch (InterruptedException e) { e.printStackTrace(); diff --git a/src/main/java/com/morlunk/jumble/audio/inputmode/ActivityInputMode.java b/src/main/java/com/morlunk/jumble/audio/inputmode/ActivityInputMode.java index fd7d2a7..d6376e0 100644 --- a/src/main/java/com/morlunk/jumble/audio/inputmode/ActivityInputMode.java +++ b/src/main/java/com/morlunk/jumble/audio/inputmode/ActivityInputMode.java @@ -53,6 +53,11 @@ public class ActivityInputMode implements IInputMode { return talking; } + @Override + public void waitForInput() { + + } + public void setThreshold(float threshold) { mVADThreshold = threshold; } diff --git a/src/main/java/com/morlunk/jumble/audio/inputmode/ContinuousInputMode.java b/src/main/java/com/morlunk/jumble/audio/inputmode/ContinuousInputMode.java index 9405e00..e24d1b3 100644 --- a/src/main/java/com/morlunk/jumble/audio/inputmode/ContinuousInputMode.java +++ b/src/main/java/com/morlunk/jumble/audio/inputmode/ContinuousInputMode.java @@ -26,4 +26,9 @@ public class ContinuousInputMode implements IInputMode { public boolean shouldTransmit(short[] pcm, int length) { return true; } + + @Override + public void waitForInput() { + + } } diff --git a/src/main/java/com/morlunk/jumble/audio/inputmode/IInputMode.java b/src/main/java/com/morlunk/jumble/audio/inputmode/IInputMode.java index 4244afc..c7eed42 100644 --- a/src/main/java/com/morlunk/jumble/audio/inputmode/IInputMode.java +++ b/src/main/java/com/morlunk/jumble/audio/inputmode/IInputMode.java @@ -17,6 +17,8 @@ package com.morlunk.jumble.audio.inputmode; +import java.util.concurrent.locks.Condition; + /** * A talk state engine, providing information regarding when it is appropriate to send audio. * Created by andrew on 13/02/16. @@ -29,4 +31,13 @@ public interface IInputMode { * @return true if the input should be transmitted. */ boolean shouldTransmit(short[] pcm, int length); + + /** + * Called before any audio processing to wait for a change in input availability. + * For example, a push to talk implementation will block the audio input thread until the + * button has been activated. Other implementations may do nothing. + * + * This function should return immediately when shouldTransmit is returning true. + */ + void waitForInput(); } diff --git a/src/main/java/com/morlunk/jumble/audio/inputmode/ToggleInputMode.java b/src/main/java/com/morlunk/jumble/audio/inputmode/ToggleInputMode.java index 1a86e62..cb3fb16 100644 --- a/src/main/java/com/morlunk/jumble/audio/inputmode/ToggleInputMode.java +++ b/src/main/java/com/morlunk/jumble/audio/inputmode/ToggleInputMode.java @@ -17,19 +17,31 @@ package com.morlunk.jumble.audio.inputmode; +import android.util.Log; + +import com.morlunk.jumble.Constants; + +import java.util.concurrent.locks.Condition; +import java.util.concurrent.locks.Lock; +import java.util.concurrent.locks.ReentrantLock; + /** * An input mode that depends on a toggle, such as push to talk. * Created by andrew on 13/02/16. */ public class ToggleInputMode implements IInputMode { private boolean mInputOn; + private final Lock mToggleLock; + private final Condition mToggleCondition; public ToggleInputMode() { mInputOn = false; + mToggleLock = new ReentrantLock(); + mToggleCondition = mToggleLock.newCondition(); } public void toggleTalkingOn() { - mInputOn = !mInputOn; + setTalkingOn(!mInputOn); } public boolean isTalkingOn() { @@ -37,11 +49,30 @@ public class ToggleInputMode implements IInputMode { } public void setTalkingOn(boolean talking) { + mToggleLock.lock(); mInputOn = talking; + mToggleCondition.signalAll(); + mToggleLock.unlock(); } @Override public boolean shouldTransmit(short[] pcm, int length) { return mInputOn; } + + @Override + public void waitForInput() { + mToggleLock.lock(); + if (!mInputOn) { + Log.v(Constants.TAG, "PTT: Suspending audio input."); + long startTime = System.currentTimeMillis(); + try { + mToggleCondition.await(); + } catch (InterruptedException e) { + Log.w(Constants.TAG, "Blocking for PTT interrupted, likely due to input thread shutdown."); + } + Log.v(Constants.TAG, "PTT: Suspended audio input for " + (System.currentTimeMillis() - startTime) + "ms."); + } + mToggleLock.unlock(); + } } diff --git a/src/main/java/com/morlunk/jumble/protocol/AudioHandler.java b/src/main/java/com/morlunk/jumble/protocol/AudioHandler.java index 357d613..686bed9 100644 --- a/src/main/java/com/morlunk/jumble/protocol/AudioHandler.java +++ b/src/main/java/com/morlunk/jumble/protocol/AudioHandler.java @@ -448,6 +448,9 @@ public class AudioHandler extends JumbleNetworkListener implements AudioInput.Au } mTalking = talking; + if (!talking) { + mInputMode.waitForInput(); + } } public void setVoiceTargetId(byte id) { |