diff --git a/app/build.gradle b/app/build.gradle
index e90fc3c..de255d0 100644
--- a/app/build.gradle
+++ b/app/build.gradle
@@ -8,8 +8,8 @@ android {
applicationId "com.github.axet.audiorecorder"
minSdkVersion 16
targetSdkVersion 23
- versionCode 87
- versionName "1.1.65"
+ versionCode 88
+ versionName "1.2.0"
}
signingConfigs {
release {
diff --git a/app/src/main/java/com/github/axet/audiorecorder/activities/RecordingActivity.java b/app/src/main/java/com/github/axet/audiorecorder/activities/RecordingActivity.java
index 044c519..e1920c7 100644
--- a/app/src/main/java/com/github/axet/audiorecorder/activities/RecordingActivity.java
+++ b/app/src/main/java/com/github/axet/audiorecorder/activities/RecordingActivity.java
@@ -427,7 +427,7 @@ public class RecordingActivity extends AppCompatActivity {
final SharedPreferences shared = PreferenceManager.getDefaultSharedPreferences(this);
int rate = Integer.parseInt(shared.getString(MainApplication.PREFERENCE_RATE, ""));
- int m = RawSamples.CHANNEL_CONFIG == AudioFormat.CHANNEL_IN_MONO ? 1 : 2;
+ int m = MainApplication.getChannels(this);
int c = RawSamples.AUDIO_FORMAT == AudioFormat.ENCODING_PCM_16BIT ? 2 : 1;
long perSec = (c * m * rate);
@@ -582,15 +582,15 @@ public class RecordingActivity extends AppCompatActivity {
rs.open(samplesTime);
- int min = AudioRecord.getMinBufferSize(sampleRate, RawSamples.CHANNEL_CONFIG, RawSamples.AUDIO_FORMAT);
+ int min = AudioRecord.getMinBufferSize(sampleRate, MainApplication.getMode(RecordingActivity.this), RawSamples.AUDIO_FORMAT);
if (min <= 0) {
throw new RuntimeException("Unable to initialize AudioRecord: Bad audio values");
}
// min = 1 sec
- min = Math.max(sampleRate * (RawSamples.CHANNEL_CONFIG == AudioFormat.CHANNEL_IN_MONO ? 1 : 2), min);
+ min = Math.max(sampleRate * (MainApplication.getChannels(RecordingActivity.this)), min);
- recorder = new AudioRecord(MediaRecorder.AudioSource.MIC, sampleRate, RawSamples.CHANNEL_CONFIG, RawSamples.AUDIO_FORMAT, min);
+ recorder = new AudioRecord(MediaRecorder.AudioSource.MIC, sampleRate, MainApplication.getMode(RecordingActivity.this), RawSamples.AUDIO_FORMAT, min);
if (recorder.getState() != AudioRecord.STATE_INITIALIZED) {
throw new RuntimeException("Unable to initialize AudioRecord");
}
@@ -600,7 +600,7 @@ public class RecordingActivity extends AppCompatActivity {
int samplesTimeCount = 0;
// how many samples we need to update 'samples'. time clock. every 1000ms.
- int samplesTimeUpdate = 1000 / 1000 * sampleRate * (RawSamples.CHANNEL_CONFIG == AudioFormat.CHANNEL_IN_MONO ? 1 : 2);
+ int samplesTimeUpdate = 1000 / 1000 * sampleRate * MainApplication.getChannels(RecordingActivity.this);
short[] buffer = null;
@@ -622,15 +622,16 @@ public class RecordingActivity extends AppCompatActivity {
start = end;
- int s = RawSamples.CHANNEL_CONFIG == AudioFormat.CHANNEL_IN_MONO ? readSize : readSize / 2;
+ int s = readSize / MainApplication.getChannels(RecordingActivity.this);
if (stableRefresh || diff >= s) {
stableRefresh = true;
rs.write(buffer);
- for (int i = 0; i < readSize; i += samplesUpdate) {
- final double dB = RawSamples.getDB(buffer, i, samplesUpdate);
+ int ps = samplesUpdate * MainApplication.getChannels(RecordingActivity.this);
+ for (int i = 0; i < readSize; i += ps) {
+ final double dB = RawSamples.getDB(buffer, i, ps);
handle.post(new Runnable() {
@Override
public void run() {
@@ -707,7 +708,7 @@ public class RecordingActivity extends AppCompatActivity {
samplesUpdate = this.samplesUpdate;
}
- bufferSize = RawSamples.CHANNEL_CONFIG == AudioFormat.CHANNEL_IN_MONO ? samplesUpdate : samplesUpdate * 2;
+ bufferSize = samplesUpdate * MainApplication.getChannels(this);
}
}
@@ -756,7 +757,7 @@ public class RecordingActivity extends AppCompatActivity {
}
EncoderInfo getInfo() {
- final int channels = RawSamples.CHANNEL_CONFIG == AudioFormat.CHANNEL_IN_STEREO ? 2 : 1;
+ final int channels = MainApplication.getChannels(this);
final int bps = RawSamples.AUDIO_FORMAT == AudioFormat.ENCODING_PCM_16BIT ? 16 : 8;
return new EncoderInfo(channels, sampleRate, bps);
@@ -768,7 +769,7 @@ public class RecordingActivity extends AppCompatActivity {
File parent = targetFile.getParentFile();
- if(!parent.exists()) {
+ if (!parent.exists()) {
if (!parent.mkdirs()) { // in case if it were manually deleted
throw new RuntimeException("Unable to create: " + parent);
}
diff --git a/app/src/main/java/com/github/axet/audiorecorder/activities/SettingsActivity.java b/app/src/main/java/com/github/axet/audiorecorder/activities/SettingsActivity.java
index a044935..48c24a9 100644
--- a/app/src/main/java/com/github/axet/audiorecorder/activities/SettingsActivity.java
+++ b/app/src/main/java/com/github/axet/audiorecorder/activities/SettingsActivity.java
@@ -262,6 +262,7 @@ public class SettingsActivity extends AppCompatPreferenceActivity implements Sha
bindPreferenceSummaryToValue(findPreference(MainApplication.PREFERENCE_RATE));
bindPreferenceSummaryToValue(findPreference(MainApplication.PREFERENCE_THEME));
+ bindPreferenceSummaryToValue(findPreference(MainApplication.PREFERENCE_CHANNELS));
}
@Override
diff --git a/app/src/main/java/com/github/axet/audiorecorder/app/MainApplication.java b/app/src/main/java/com/github/axet/audiorecorder/app/MainApplication.java
index f94f0dc..97fce23 100644
--- a/app/src/main/java/com/github/axet/audiorecorder/app/MainApplication.java
+++ b/app/src/main/java/com/github/axet/audiorecorder/app/MainApplication.java
@@ -3,10 +3,8 @@ package com.github.axet.audiorecorder.app;
import android.app.Application;
import android.content.Context;
import android.content.SharedPreferences;
-import android.content.res.TypedArray;
+import android.media.AudioFormat;
import android.preference.PreferenceManager;
-import android.util.Log;
-import android.util.TypedValue;
import com.github.axet.androidlibrary.widgets.ThemeUtils;
import com.github.axet.audiorecorder.R;
@@ -19,6 +17,7 @@ public class MainApplication extends Application {
public static final String PREFERENCE_ENCODING = "encoding";
public static final String PREFERENCE_LAST = "last_recording";
public static final String PREFERENCE_THEME = "theme";
+ public static final String PREFERENCE_CHANNELS = "channels";
@Override
public void onCreate() {
@@ -109,4 +108,20 @@ public class MainApplication extends Application {
return str;
}
+ public static int getChannels(Context context) {
+ final SharedPreferences shared = PreferenceManager.getDefaultSharedPreferences(context);
+ int i = Integer.parseInt(shared.getString(MainApplication.PREFERENCE_CHANNELS, "1"));
+ return i;
+ }
+
+ public static int getMode(Context context) {
+ switch (getChannels(context)) {
+ case 1:
+ return AudioFormat.CHANNEL_IN_MONO;
+ case 2:
+ return AudioFormat.CHANNEL_IN_STEREO;
+ default:
+ throw new RuntimeException("unknown mode");
+ }
+ }
}
diff --git a/app/src/main/java/com/github/axet/audiorecorder/app/RawSamples.java b/app/src/main/java/com/github/axet/audiorecorder/app/RawSamples.java
index 6e704d1..8d6245a 100644
--- a/app/src/main/java/com/github/axet/audiorecorder/app/RawSamples.java
+++ b/app/src/main/java/com/github/axet/audiorecorder/app/RawSamples.java
@@ -24,7 +24,6 @@ import java.nio.channels.FileChannel;
public class RawSamples {
public static int AUDIO_FORMAT = AudioFormat.ENCODING_PCM_16BIT;
- public static int CHANNEL_CONFIG = AudioFormat.CHANNEL_IN_MONO;
// quite root gives me 20db
public static int NOISE_DB = 20;
diff --git a/app/src/main/java/com/github/axet/audiorecorder/app/Sound.java b/app/src/main/java/com/github/axet/audiorecorder/app/Sound.java
index 88687b3..748b755 100644
--- a/app/src/main/java/com/github/axet/audiorecorder/app/Sound.java
+++ b/app/src/main/java/com/github/axet/audiorecorder/app/Sound.java
@@ -7,8 +7,6 @@ import android.media.AudioManager;
import android.media.AudioTrack;
import android.preference.PreferenceManager;
-import com.github.axet.audiorecorder.activities.RecordingActivity;
-
public class Sound {
Context context;
@@ -56,11 +54,16 @@ public class Sound {
int c = 0;
- if (RawSamples.CHANNEL_CONFIG == AudioFormat.CHANNEL_IN_MONO)
- c = AudioFormat.CHANNEL_OUT_MONO;
-
- if (RawSamples.CHANNEL_CONFIG == AudioFormat.CHANNEL_IN_STEREO)
- c = AudioFormat.CHANNEL_OUT_STEREO;
+ switch (MainApplication.getChannels(context)) {
+ case 1:
+ c = AudioFormat.CHANNEL_OUT_MONO;
+ break;
+ case 2:
+ c = AudioFormat.CHANNEL_OUT_STEREO;
+ break;
+ default:
+ throw new RuntimeException("unknown mode");
+ }
// old phones bug.
// http://stackoverflow.com/questions/27602492
diff --git a/app/src/main/java/com/github/axet/audiorecorder/app/Storage.java b/app/src/main/java/com/github/axet/audiorecorder/app/Storage.java
index ebd379d..457d351 100644
--- a/app/src/main/java/com/github/axet/audiorecorder/app/Storage.java
+++ b/app/src/main/java/com/github/axet/audiorecorder/app/Storage.java
@@ -209,13 +209,13 @@ public class Storage {
long x = rate;
long y = (x - x1) * (y2 - y1) / (x2 - x1) + y1;
- int m = RawSamples.CHANNEL_CONFIG == AudioFormat.CHANNEL_IN_MONO ? 1 : 2;
+ int m = MainApplication.getChannels(context);
long perSec = (y / 60) * m;
return free / perSec * 1000;
}
// default raw
- int m = RawSamples.CHANNEL_CONFIG == AudioFormat.CHANNEL_IN_MONO ? 1 : 2;
+ int m = MainApplication.getChannels(context);
int c = RawSamples.AUDIO_FORMAT == AudioFormat.ENCODING_PCM_16BIT ? 2 : 1;
long perSec = (c * m * rate);
return free / perSec * 1000;
diff --git a/app/src/main/java/com/github/axet/audiorecorder/encoders/Encoder.java b/app/src/main/java/com/github/axet/audiorecorder/encoders/Encoder.java
index 6907b21..6659fa2 100644
--- a/app/src/main/java/com/github/axet/audiorecorder/encoders/Encoder.java
+++ b/app/src/main/java/com/github/axet/audiorecorder/encoders/Encoder.java
@@ -3,7 +3,7 @@ package com.github.axet.audiorecorder.encoders;
public interface Encoder {
void encode(short[] buf, int len);
- void flush();
+ void end(); // flush stream. may throw state exceptions
- void close();
+ void close(); // release native resources, sholud not throw exceptions
}
diff --git a/app/src/main/java/com/github/axet/audiorecorder/encoders/FileEncoder.java b/app/src/main/java/com/github/axet/audiorecorder/encoders/FileEncoder.java
index 10c39cf..22c5af2 100644
--- a/app/src/main/java/com/github/axet/audiorecorder/encoders/FileEncoder.java
+++ b/app/src/main/java/com/github/axet/audiorecorder/encoders/FileEncoder.java
@@ -47,7 +47,7 @@ public class FileEncoder {
while (!Thread.currentThread().isInterrupted()) {
int len = rs.read(buf);
if (len <= 0) {
- encoder.flush();
+ encoder.end();
handler.post(done);
return;
} else {
diff --git a/app/src/main/java/com/github/axet/audiorecorder/encoders/FormatWAV.java b/app/src/main/java/com/github/axet/audiorecorder/encoders/FormatWAV.java
index 3b83ca5..09a2df9 100755
--- a/app/src/main/java/com/github/axet/audiorecorder/encoders/FormatWAV.java
+++ b/app/src/main/java/com/github/axet/audiorecorder/encoders/FormatWAV.java
@@ -111,7 +111,7 @@ public class FormatWAV implements Encoder {
}
}
- public void flush() {
+ public void end() {
try {
outFile.seek(0);
save();
diff --git a/app/src/main/java/com/github/axet/audiorecorder/encoders/MuxerMP4.java b/app/src/main/java/com/github/axet/audiorecorder/encoders/MuxerMP4.java
index 6d53a63..c75b6c9 100755
--- a/app/src/main/java/com/github/axet/audiorecorder/encoders/MuxerMP4.java
+++ b/app/src/main/java/com/github/axet/audiorecorder/encoders/MuxerMP4.java
@@ -138,12 +138,6 @@ public class MuxerMP4 implements Encoder {
return true;
}
- public void flush() {
- end();
- encoder.stop();
- muxer.stop();
- }
-
public void close() {
encoder.release();
muxer.release();
@@ -153,7 +147,7 @@ public class MuxerMP4 implements Encoder {
return NumSamples * 1000 * 1000 / info.sampleRate;
}
- void end() {
+ public void end() {
if (input != null) {
queue();
}
@@ -165,6 +159,8 @@ public class MuxerMP4 implements Encoder {
}
while (encode())
;// do encode()
+ encoder.stop();
+ muxer.stop();
}
public EncoderInfo getInfo() {
diff --git a/app/src/main/res/values-ru/strings.xml b/app/src/main/res/values-ru/strings.xml
index c8cc0fe..974634f 100644
--- a/app/src/main/res/values-ru/strings.xml
+++ b/app/src/main/res/values-ru/strings.xml
@@ -21,6 +21,11 @@
- .m4a
+
+ - Моно (по умолчанию)
+ - Стерео
+
+
Аудио Рекордер
Настройки
Доступ запрещен
diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml
index 423ac87..16ca354 100644
--- a/app/src/main/res/values/strings.xml
+++ b/app/src/main/res/values/strings.xml
@@ -41,6 +41,16 @@
- Theme_Dark
+
+ - Mono (default)
+ - Stereo
+
+
+
+ - 1
+ - 2
+
+
Audio Recorder
Settings
Not permitted
diff --git a/app/src/main/res/xml/pref_general.xml b/app/src/main/res/xml/pref_general.xml
index faf1cff..6ad2b71 100644
--- a/app/src/main/res/xml/pref_general.xml
+++ b/app/src/main/res/xml/pref_general.xml
@@ -26,6 +26,16 @@
android:summary="Output file formats (.wav, .m4a, ...)"
android:title="Encoding" />
+
+