Welcome to mirror list, hosted at ThFree Co, Russian Federation.

gitlab.com/quite/humla.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAndrew Comminos <andrew@comminos.com>2016-09-19 09:03:06 +0300
committerAndrew Comminos <andrew@comminos.com>2016-09-19 09:03:06 +0300
commit2d29a0bfa3638ad286e9380f1858f25f47c74a6d (patch)
treee8e16f3f3f377d43288ea15a8c5005dd87ddb03e
parentcf0991b5c81ebd87ceb3a9debba969928377fd09 (diff)
Implement blocking when PTT is toggled off.
-rw-r--r--src/main/java/com/morlunk/jumble/audio/AudioInput.java3
-rw-r--r--src/main/java/com/morlunk/jumble/audio/inputmode/ActivityInputMode.java5
-rw-r--r--src/main/java/com/morlunk/jumble/audio/inputmode/ContinuousInputMode.java5
-rw-r--r--src/main/java/com/morlunk/jumble/audio/inputmode/IInputMode.java11
-rw-r--r--src/main/java/com/morlunk/jumble/audio/inputmode/ToggleInputMode.java33
-rw-r--r--src/main/java/com/morlunk/jumble/protocol/AudioHandler.java3
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) {