From f3d779b514672adf0eb1f46935b176461c63fa1e Mon Sep 17 00:00:00 2001 From: Alexey Kuznetsov Date: Mon, 28 Feb 2022 20:24:40 +0300 Subject: [PATCH 1/8] update PCM format --- docs/README.md | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/docs/README.md b/docs/README.md index f5d5206..a48185c 100644 --- a/docs/README.md +++ b/docs/README.md @@ -32,11 +32,17 @@ For example: # Raw format - * Signed 16-bit PCM + * Signed 16-bit PCM or float (depends on user settings) * Big Endian * 1 or 2 channels (depends on user settings). First 2 bytes for left channel, Second 2 bytes for right channel. * 16hz to 48hz Sample Rate / Frequincy (depends on user settings) +Android supports 16-bit PCM format or PCM float. Android recomends to use PCM float over 24-bit PCM format or 16-bit PCM if possible. + +* https://developer.android.com/reference/android/media/AudioFormat#encoding + +float mantisa is 23 bits (plus sign bit and float point bits) persition in range from 0..1 can hold about 1,065,353,215 unique numbers which is equivalent to 29 bits integer. When 24-bit PCM only gives you 2^24=16,777,216 unique values. + # Adb commands # adb shell am start -n com.github.axet.audiorecorder/.activities.RecordingActivity From d21d09972516e53ad7e1633bb49457a19ff97a51 Mon Sep 17 00:00:00 2001 From: Alexey Kuznetsov Date: Tue, 1 Mar 2022 05:31:34 +0300 Subject: [PATCH 2/8] float py --- docs/float.py | 37 +++++++++++++++++++++++++++++++++++++ 1 file changed, 37 insertions(+) create mode 100644 docs/float.py diff --git a/docs/float.py b/docs/float.py new file mode 100644 index 0000000..31c6957 --- /dev/null +++ b/docs/float.py @@ -0,0 +1,37 @@ +# +# simple float test to calculate float unique numbers in range from -1..1 +# +# output: +# +# 1 -0.99999994 +# 2 -0.9999999 +# 3 -0.9999998 +# 4 -0.99999976 +# 5 -0.9999997 +# 6 -0.99999964 +# 7 -0.9999996 +# 8 -0.9999995 +# 9 -0.99999946 +# 10 -0.9999994 +# ... +# 2130706425 0.9999996 +# 2130706426 0.99999964 +# 2130706427 0.9999997 +# 2130706428 0.99999976 +# 2130706429 0.9999998 +# 2130706430 0.9999999 +# 2130706431 0.99999994 +# 2130706432 1.0 +# + +import numpy as np + +i = 0 +f = np.float32(-1.) +while ( f < 1. ): + f = np.nextafter(f, np.float32(2)) + i += 1 + print(i, f) + +type(f) + From a99f15a0a5a9300eb58451e176f5b2f819f2f675 Mon Sep 17 00:00:00 2001 From: Alexey Kuznetsov Date: Tue, 1 Mar 2022 05:32:47 +0300 Subject: [PATCH 3/8] update docs --- docs/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/README.md b/docs/README.md index a48185c..c257577 100644 --- a/docs/README.md +++ b/docs/README.md @@ -41,7 +41,7 @@ Android supports 16-bit PCM format or PCM float. Android recomends to use PCM fl * https://developer.android.com/reference/android/media/AudioFormat#encoding -float mantisa is 23 bits (plus sign bit and float point bits) persition in range from 0..1 can hold about 1,065,353,215 unique numbers which is equivalent to 29 bits integer. When 24-bit PCM only gives you 2^24=16,777,216 unique values. +float mantisa is 23 bits (plus sign bit and float point bits) persition in range from -1..1 can hold about 2130706431 unique numbers which is equivalent to 31 bits integer. When 24-bit PCM only gives you 2^24=16,777,216 unique values. # Adb commands From d66ce336ca8778a753e8ea10812be62840a3fe7d Mon Sep 17 00:00:00 2001 From: Alexey Kuznetsov Date: Tue, 1 Mar 2022 17:03:59 +0300 Subject: [PATCH 4/8] add Prefs --- .../axet/audiorecorder/activities/RecordingActivity.java | 6 +++--- .../com/github/axet/audiorecorder/app/AudioApplication.java | 5 +++++ .../axet/audiorecorder/services/BluetoothReceiver.java | 2 +- .../widgets/RecordingSourcePreferenceCompat.java | 4 ++-- 4 files changed, 11 insertions(+), 6 deletions(-) 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 ed454d5..c16c279 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 @@ -929,14 +929,14 @@ public class RecordingActivity extends AppCompatThemeActivity { boolean startRecording() { try { final SharedPreferences shared = PreferenceManager.getDefaultSharedPreferences(this); - String source = shared.getString(AudioApplication.PREFERENCE_SOURCE, getString(R.string.source_mic)); + String source = shared.getString(AudioApplication.PREFERENCE_SOURCE, AudioApplication.PREFERENCE_SOURCE_MIC); int user; - if (source.equals(getString(R.string.source_raw))) { + if (source.equals(AudioApplication.PREFERENCE_SOURCE_RAW)) { if (Sound.isUnprocessedSupported(this)) user = MediaRecorder.AudioSource.UNPROCESSED; else user = MediaRecorder.AudioSource.VOICE_RECOGNITION; - } else if (source.equals(this.getString(R.string.source_internal))) { + } else if (source.equals(AudioApplication.PREFERENCE_SOURCE_INTERNAL)) { user = Sound.SOURCE_INTERNAL_AUDIO; } else { user = MediaRecorder.AudioSource.MIC; diff --git a/app/src/main/java/com/github/axet/audiorecorder/app/AudioApplication.java b/app/src/main/java/com/github/axet/audiorecorder/app/AudioApplication.java index f466a44..f4140d7 100644 --- a/app/src/main/java/com/github/axet/audiorecorder/app/AudioApplication.java +++ b/app/src/main/java/com/github/axet/audiorecorder/app/AudioApplication.java @@ -11,6 +11,7 @@ import android.util.Log; import android.view.View; import com.github.axet.androidlibrary.app.NotificationManagerCompat; +import com.github.axet.androidlibrary.app.Prefs; import com.github.axet.androidlibrary.widgets.NotificationChannelCompat; import com.github.axet.androidlibrary.widgets.RemoteNotificationCompat; import com.github.axet.audiolibrary.encoders.FormatFLAC; @@ -26,6 +27,10 @@ public class AudioApplication extends com.github.axet.audiolibrary.app.MainAppli public static final String PREFERENCE_TARGET = "target"; public static final String PREFERENCE_FLY = "fly"; public static final String PREFERENCE_SOURCE = "bluetooth"; + public static final String PREFERENCE_SOURCE_MIC = Prefs.PrefString(R.string.source_mic); + public static final String PREFERENCE_SOURCE_BLUETOOTH = Prefs.PrefString(R.string.source_bluetooth); + public static final String PREFERENCE_SOURCE_RAW = Prefs.PrefString(R.string.source_raw); + public static final String PREFERENCE_SOURCE_INTERNAL = Prefs.PrefString(R.string.source_internal); public static final String PREFERENCE_VERSION = "version"; diff --git a/app/src/main/java/com/github/axet/audiorecorder/services/BluetoothReceiver.java b/app/src/main/java/com/github/axet/audiorecorder/services/BluetoothReceiver.java index ac4c380..c2e6b76 100644 --- a/app/src/main/java/com/github/axet/audiorecorder/services/BluetoothReceiver.java +++ b/app/src/main/java/com/github/axet/audiorecorder/services/BluetoothReceiver.java @@ -139,7 +139,7 @@ public class BluetoothReceiver extends BroadcastReceiver { public boolean isRecordingReady() { final SharedPreferences shared = PreferenceManager.getDefaultSharedPreferences(context); - if (shared.getString(AudioApplication.PREFERENCE_SOURCE, context.getString(R.string.source_mic)).equals(context.getString(R.string.source_bluetooth))) { + if (shared.getString(AudioApplication.PREFERENCE_SOURCE, AudioApplication.PREFERENCE_SOURCE_MIC).equals(AudioApplication.PREFERENCE_SOURCE_BLUETOOTH)) { bluetoothSource = true; if (!startBluetooth()) return false; diff --git a/app/src/main/java/com/github/axet/audiorecorder/widgets/RecordingSourcePreferenceCompat.java b/app/src/main/java/com/github/axet/audiorecorder/widgets/RecordingSourcePreferenceCompat.java index 60c571c..998b0d3 100644 --- a/app/src/main/java/com/github/axet/audiorecorder/widgets/RecordingSourcePreferenceCompat.java +++ b/app/src/main/java/com/github/axet/audiorecorder/widgets/RecordingSourcePreferenceCompat.java @@ -55,8 +55,8 @@ public class RecordingSourcePreferenceCompat extends ListPreference { CharSequence[] values = getEntryValues(); ArrayList tt = new ArrayList<>(); ArrayList vv = new ArrayList<>(); - String raw = getContext().getString(R.string.source_raw); - String internal = getContext().getString(R.string.source_internal); + String raw = AudioApplication.PREFERENCE_SOURCE_RAW; + String internal = AudioApplication.PREFERENCE_SOURCE_INTERNAL; for (int i = 0; i < values.length; i++) { String v = values[i].toString(); String t = text[i].toString(); From 10b26be3a8e6c8581d958ac77e330b890780bebd Mon Sep 17 00:00:00 2001 From: Alexey Kuznetsov Date: Tue, 1 Mar 2022 18:19:20 +0300 Subject: [PATCH 5/8] using enc pref --- .../activities/SettingsActivity.java | 19 ------------------- app/src/main/res/xml/pref_general.xml | 2 +- 2 files changed, 1 insertion(+), 20 deletions(-) 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 4252431..7548b3f 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 @@ -138,25 +138,6 @@ public class SettingsActivity extends AppCompatSettingsThemeActivity implements void initPrefs(PreferenceManager pm, PreferenceScreen screen) { final Context context = screen.getContext(); - ListPreference enc = (ListPreference) pm.findPreference(AudioApplication.PREFERENCE_ENCODING); - String v = enc.getValue(); - CharSequence[] ee = Factory.getEncodingTexts(context); - CharSequence[] vv = Factory.getEncodingValues(context); - if (ee.length > 1) { - enc.setEntries(ee); - enc.setEntryValues(vv); - - int i = enc.findIndexOfValue(v); - if (i == -1) { - enc.setValueIndex(0); - } else { - enc.setValueIndex(i); - } - - bindPreferenceSummaryToValue(enc); - } else { - screen.removePreference(enc); - } bindPreferenceSummaryToValue(pm.findPreference(AudioApplication.PREFERENCE_RATE)); bindPreferenceSummaryToValue(pm.findPreference(AudioApplication.PREFERENCE_THEME)); diff --git a/app/src/main/res/xml/pref_general.xml b/app/src/main/res/xml/pref_general.xml index f1c7715..ea583b2 100644 --- a/app/src/main/res/xml/pref_general.xml +++ b/app/src/main/res/xml/pref_general.xml @@ -37,7 +37,7 @@ android:summary="44100" android:title="@string/pref_rate_title" /> - Date: Tue, 1 Mar 2022 21:10:30 +0300 Subject: [PATCH 6/8] fix temp encoding dir --- .../com/github/axet/audiorecorder/app/EncodingStorage.java | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/app/src/main/java/com/github/axet/audiorecorder/app/EncodingStorage.java b/app/src/main/java/com/github/axet/audiorecorder/app/EncodingStorage.java index 1cf7ac9..d45eca3 100644 --- a/app/src/main/java/com/github/axet/audiorecorder/app/EncodingStorage.java +++ b/app/src/main/java/com/github/axet/audiorecorder/app/EncodingStorage.java @@ -84,7 +84,11 @@ public class EncodingStorage extends HashMap { public void load() { clear(); - File storage = this.storage.getTempRecording().getParentFile(); + File file = storage.getTempEncoding().getParentFile(); + load(file); + } + + public void load(File storage) { File[] ff = storage.listFiles(new FilenameFilter() { String start = Storage.getNameNoExt(Storage.TMP_ENC); String ext = "." + Storage.getExt(Storage.TMP_ENC); From f438266556b7f0f39b151e7236d5f1ae0561bc5d Mon Sep 17 00:00:00 2001 From: Alexey Kuznetsov Date: Tue, 1 Mar 2022 21:21:38 +0300 Subject: [PATCH 7/8] fix missing encoding storage --- app/build.gradle | 2 +- .../github/axet/audiorecorder/app/EncodingStorage.java | 10 ++++++++-- 2 files changed, 9 insertions(+), 3 deletions(-) diff --git a/app/build.gradle b/app/build.gradle index 4f036eb..10749b0 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -53,7 +53,7 @@ android { dependencies { testImplementation 'junit:junit:4.12' - implementation ('com.github.axet:android-audio-library:1.1.5') // implementation project(':android-audio-library') + implementation ('com.github.axet:android-audio-library:1.1.6') // implementation project(':android-audio-library') implementation ('com.github.axet:wget:1.7.0') { exclude group: 'org.json', module: 'json' } assets('com.google.android.exoplayer:exoplayer:2.7.3') { exclude group: 'com.android.support' } } diff --git a/app/src/main/java/com/github/axet/audiorecorder/app/EncodingStorage.java b/app/src/main/java/com/github/axet/audiorecorder/app/EncodingStorage.java index d45eca3..be72d8c 100644 --- a/app/src/main/java/com/github/axet/audiorecorder/app/EncodingStorage.java +++ b/app/src/main/java/com/github/axet/audiorecorder/app/EncodingStorage.java @@ -84,11 +84,17 @@ public class EncodingStorage extends HashMap { public void load() { clear(); - File file = storage.getTempEncoding().getParentFile(); - load(file); + load(storage.getTempEncoding().getParentFile()); + Context context = storage.getContext(); + load(context.getCacheDir()); + load(context.getExternalCacheDir()); + load(Storage.getFilesDir(context, Storage.RAW)); + load(context.getExternalFilesDir(Storage.RAW)); } public void load(File storage) { + if (storage == null) + return; File[] ff = storage.listFiles(new FilenameFilter() { String start = Storage.getNameNoExt(Storage.TMP_ENC); String ext = "." + Storage.getExt(Storage.TMP_ENC); From 0efb633c32af2f5b5de0ffeda85b6b8810c86c30 Mon Sep 17 00:00:00 2001 From: Alexey Kuznetsov Date: Tue, 1 Mar 2022 21:21:45 +0300 Subject: [PATCH 8/8] Bump version audiorecorder-3.5.4 --- app/build.gradle | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/app/build.gradle b/app/build.gradle index 10749b0..14a404e 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -9,8 +9,8 @@ android { applicationId "com.github.axet.audiorecorder" minSdkVersion 9 targetSdkVersion 30 - versionCode 359 - versionName "3.5.3" + versionCode 360 + versionName "3.5.4" } signingConfigs { release {