diff options
author | Andrew Comminos <andrewcomminos@gmail.com> | 2014-01-01 06:01:03 +0400 |
---|---|---|
committer | Andrew Comminos <andrewcomminos@gmail.com> | 2014-01-01 06:01:03 +0400 |
commit | b5f911af43e9b0e4969e4a70ad8ba8f890601011 (patch) | |
tree | 2f3391d6affcb4a78f177c048ebe2b34b34202d3 /src/main | |
parent | dadc4de622c14b0a050c9fd86ada28fc79f012cd (diff) |
Added audio input quality preference.
Diffstat (limited to 'src/main')
-rw-r--r-- | src/main/java/com/morlunk/jumble/JumbleService.java | 6 | ||||
-rw-r--r-- | src/main/java/com/morlunk/jumble/audio/AudioInput.java | 36 | ||||
-rw-r--r-- | src/main/java/com/morlunk/jumble/audio/AudioOutput.java | 2 |
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); } - });; + }); } }); } |