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
path: root/src/main
diff options
context:
space:
mode:
authorAndrew Comminos <andrewcomminos@gmail.com>2014-01-01 06:01:03 +0400
committerAndrew Comminos <andrewcomminos@gmail.com>2014-01-01 06:01:03 +0400
commitb5f911af43e9b0e4969e4a70ad8ba8f890601011 (patch)
tree2f3391d6affcb4a78f177c048ebe2b34b34202d3 /src/main
parentdadc4de622c14b0a050c9fd86ada28fc79f012cd (diff)
Added audio input quality preference.
Diffstat (limited to 'src/main')
-rw-r--r--src/main/java/com/morlunk/jumble/JumbleService.java6
-rw-r--r--src/main/java/com/morlunk/jumble/audio/AudioInput.java36
-rw-r--r--src/main/java/com/morlunk/jumble/audio/AudioOutput.java2
3 files changed, 33 insertions, 11 deletions
diff --git a/src/main/java/com/morlunk/jumble/JumbleService.java b/src/main/java/com/morlunk/jumble/JumbleService.java
index ec74733..a37cff0 100644
--- a/src/main/java/com/morlunk/jumble/JumbleService.java
+++ b/src/main/java/com/morlunk/jumble/JumbleService.java
@@ -32,6 +32,7 @@ import android.os.RemoteException;
import android.util.Log;
import android.widget.Toast;
+import com.morlunk.jumble.audio.Audio;
import com.morlunk.jumble.audio.AudioInput;
import com.morlunk.jumble.audio.AudioOutput;
import com.morlunk.jumble.model.Channel;
@@ -72,6 +73,7 @@ public class JumbleService extends Service implements JumbleConnection.JumbleCon
public static final String EXTRAS_CERTIFICATE_PASSWORD = "certificate_password";
public static final String EXTRAS_DETECTION_THRESHOLD = "detection_threshold";
public static final String EXTRAS_TRANSMIT_MODE = "transmit_mode";
+ public static final String EXTRAS_INPUT_QUALITY = "input_quality";
public static final String EXTRAS_USE_OPUS = "use_opus";
public static final String EXTRAS_FORCE_TCP = "force_tcp";
public static final String EXTRAS_USE_TOR = "use_tor";
@@ -89,6 +91,7 @@ public class JumbleService extends Service implements JumbleConnection.JumbleCon
public float mDetectionThreshold;
public int mTransmitMode;
public boolean mUseOpus;
+ public int mInputQuality;
public boolean mForceTcp;
public boolean mUseTor;
public String mClientName;
@@ -526,6 +529,7 @@ public class JumbleService extends Service implements JumbleConnection.JumbleCon
mCertificatePassword = extras.getString(EXTRAS_CERTIFICATE_PASSWORD);
mDetectionThreshold = extras.getFloat(EXTRAS_DETECTION_THRESHOLD, 0.5f);
mTransmitMode = extras.getInt(EXTRAS_TRANSMIT_MODE, Constants.TRANSMIT_VOICE_ACTIVITY);
+ mInputQuality = extras.getInt(EXTRAS_INPUT_QUALITY, Audio.SAMPLE_RATE);
mUseOpus = extras.getBoolean(EXTRAS_USE_OPUS, true);
mUseTor = extras.getBoolean(EXTRAS_USE_TOR, false);
mForceTcp = extras.getBoolean(EXTRAS_FORCE_TCP, false) || mUseTor; // Tor requires TCP connections to work- if it's on, force TCP.
@@ -579,7 +583,7 @@ public class JumbleService extends Service implements JumbleConnection.JumbleCon
mUserHandler = new UserHandler(this);
mTextMessageHandler = new TextMessageHandler(this);
mAudioOutput = new AudioOutput(this);
- mAudioInput = new AudioInput(this, JumbleUDPMessageType.UDPVoiceOpus, mTransmitMode, mDetectionThreshold, mAudioInputListener);
+ mAudioInput = new AudioInput(this, JumbleUDPMessageType.UDPVoiceOpus, mInputQuality, mTransmitMode, mDetectionThreshold, mAudioInputListener);
mConnection.addMessageHandlers(mChannelHandler, mUserHandler, mTextMessageHandler, mAudioOutput, mAudioInput);
mConnection.connect();
diff --git a/src/main/java/com/morlunk/jumble/audio/AudioInput.java b/src/main/java/com/morlunk/jumble/audio/AudioInput.java
index ef62895..8e4351f 100644
--- a/src/main/java/com/morlunk/jumble/audio/AudioInput.java
+++ b/src/main/java/com/morlunk/jumble/audio/AudioInput.java
@@ -61,7 +61,7 @@ public class AudioInput extends ProtocolHandler implements Runnable {
public void onTalkStateChanged(boolean talking);
}
- private static final int[] SAMPLE_RATES = { 48000, 44100, 22050, 160000, 11025, 8000 };
+ public static final int[] SAMPLE_RATES = { 48000, 44100, 22050, 16000, 11025, 8000 };
private static final int SPEEX_RESAMPLE_QUALITY = 3;
private static final int OPUS_MAX_BYTES = 512; // Opus specifies 4000 bytes as a recommended value for encoding, but the official mumble project uses 512.
@@ -106,21 +106,15 @@ public class AudioInput extends ProtocolHandler implements Runnable {
* Creates a new audio input manager configured for the specified codec.
* @param listener
*/
- public AudioInput(JumbleService service, JumbleUDPMessageType codec, int transmitMode, float voiceThreshold, AudioInputListener listener) {
+ public AudioInput(JumbleService service, JumbleUDPMessageType codec, int sampleRate, int transmitMode, float voiceThreshold, AudioInputListener listener) {
super(service);
mListener = listener;
mTransmitMode = transmitMode;
mVADThreshold = voiceThreshold;
+ mInputSampleRate = getSupportedSampleRate(sampleRate);
switchCodec(codec);
configurePreprocessState();
- // Use the highest sample rate we can get. TODO make this an option in settings.
- for(int rate : SAMPLE_RATES) {
- if(AudioRecord.getMinBufferSize(rate, AudioFormat.CHANNEL_IN_MONO, AudioFormat.ENCODING_PCM_16BIT) > 0) {
- mInputSampleRate = rate;
- break;
- }
- }
if(mInputSampleRate != -1) {
Log.d(Constants.TAG, "Initialized AudioInput with sample rate "+mInputSampleRate);
if(mInputSampleRate != Audio.SAMPLE_RATE) {
@@ -136,6 +130,30 @@ public class AudioInput extends ProtocolHandler implements Runnable {
mAudioRecord = new AudioRecord(MediaRecorder.AudioSource.MIC, mInputSampleRate, AudioFormat.CHANNEL_IN_MONO, AudioFormat.ENCODING_PCM_16BIT, mMinBufferSize);
}
+ /**
+ * Checks if the preferred sample rate is supported, and use it if so. Otherwise, automatically find a supported rate.
+ * @param preferredSampleRate The preferred sample rate, or -1 if there is no preference.
+ * @return The preferred sample rate if supported, otherwise a default one.
+ * If no rates are supported, return -1.
+ */
+ private int getSupportedSampleRate(int preferredSampleRate) {
+ // Attempt to use preferred rate first
+ if(preferredSampleRate != -1) {
+ int bufferSize = AudioRecord.getMinBufferSize(preferredSampleRate, AudioFormat.CHANNEL_IN_MONO, AudioFormat.ENCODING_PCM_16BIT);
+ if(bufferSize > 0) return preferredSampleRate;
+ }
+
+ // Use the highest sample rate we can get.
+ for(int rate : SAMPLE_RATES) {
+ if(AudioRecord.getMinBufferSize(rate, AudioFormat.CHANNEL_IN_MONO, AudioFormat.ENCODING_PCM_16BIT) > 0) {
+ if(preferredSampleRate != -1) getService().logWarning("Failed to use desired sample rate, falling back to "+rate+"Hz.");
+ return rate;
+ }
+ }
+
+ return -1;
+ }
+
public void setVADThreshold(float threshold) {
mVADThreshold = threshold;
}
diff --git a/src/main/java/com/morlunk/jumble/audio/AudioOutput.java b/src/main/java/com/morlunk/jumble/audio/AudioOutput.java
index 0bdb8ad..10641bb 100644
--- a/src/main/java/com/morlunk/jumble/audio/AudioOutput.java
+++ b/src/main/java/com/morlunk/jumble/audio/AudioOutput.java
@@ -221,7 +221,7 @@ public class AudioOutput extends ProtocolHandler implements Runnable, AudioOutpu
public void run(IJumbleObserver observer) throws RemoteException {
observer.onUserTalkStateUpdated(user);
}
- });;
+ });
}
});
}