From a2b779939de2068d7007b12f32ccebf222803df1 Mon Sep 17 00:00:00 2001
From: aringot <alexis.ringot@fhstp.ac.at>
Date: Wed, 7 Feb 2018 15:44:15 +0100
Subject: [PATCH] Fix bug on launch app and directly exit. Now release audio IO
 on exit.

---
 SoniControl/app/build.gradle                           |  4 ++--
 .../java/at/ac/fhstp/sonicontrol/MainActivity.java     | 10 ++++++----
 .../src/main/java/at/ac/fhstp/sonicontrol/Scan.java    |  8 ++++++++
 SoniControl/app/src/main/jni/FrequencyDomain.cpp       |  6 +++++-
 4 files changed, 21 insertions(+), 7 deletions(-)

diff --git a/SoniControl/app/build.gradle b/SoniControl/app/build.gradle
index d163ac9a..04eb8718 100644
--- a/SoniControl/app/build.gradle
+++ b/SoniControl/app/build.gradle
@@ -11,8 +11,8 @@ android {
         applicationId "at.ac.fhstp.sonicontrol"
         minSdkVersion 16 // more than 95% of all active Android devices (mid 2017)
         targetSdkVersion 25
-        versionCode 3
-        versionName "0.91-alpha"
+        versionCode 4
+        versionName "0.9.2-alpha"
         testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
 
         ndk {
diff --git a/SoniControl/app/src/main/java/at/ac/fhstp/sonicontrol/MainActivity.java b/SoniControl/app/src/main/java/at/ac/fhstp/sonicontrol/MainActivity.java
index c9acfffa..84e2077d 100644
--- a/SoniControl/app/src/main/java/at/ac/fhstp/sonicontrol/MainActivity.java
+++ b/SoniControl/app/src/main/java/at/ac/fhstp/sonicontrol/MainActivity.java
@@ -240,12 +240,14 @@ public class MainActivity extends BaseActivity implements Scan.DetectionListener
     }
 
     private void onBtnExitClick(View v) {
-        Intent service = new Intent(MainActivity.this, SoniService.class);
         if (SoniService.IS_SERVICE_RUNNING) {
+            Intent service = new Intent(MainActivity.this, SoniService.class);
             service.setAction(ServiceConstants.ACTION.STOPFOREGROUND_ACTION);
-            SoniService.IS_SERVICE_RUNNING = false;
+            startService(service);
+        }
+        else {
+            NotificationHelper.cancelOnHoldStatusNotification();
         }
-        startService(service);
         
         // Reset state
         SharedPreferences sp = getSettingsObject();
@@ -265,7 +267,7 @@ public class MainActivity extends BaseActivity implements Scan.DetectionListener
 */
         NotificationHelper.cancelDetectionAlertStatusNotification(getApplicationContext());
 
-        detector.pause(); // stop scanning
+        detector.stopIO(); // release audio resources from the scanner
         Spoofer spoof = Spoofer.getInstance(); //get a spoofing object
         spoof.stopSpoofingComplete(); //stop the whole spoofing process
         MicCapture micCap = MicCapture.getInstance(); //get a microphone capture object
diff --git a/SoniControl/app/src/main/java/at/ac/fhstp/sonicontrol/Scan.java b/SoniControl/app/src/main/java/at/ac/fhstp/sonicontrol/Scan.java
index 2188cbf0..c706f537 100644
--- a/SoniControl/app/src/main/java/at/ac/fhstp/sonicontrol/Scan.java
+++ b/SoniControl/app/src/main/java/at/ac/fhstp/sonicontrol/Scan.java
@@ -140,6 +140,13 @@ public class Scan {
         Resume();
     }
 
+    /**
+     * Will delete the audioIO object, thus releasing audio resources
+     */
+    public void stopIO() {
+        StopIO();
+    }
+
     // ------
     // Native functions to find in jni/FrequencyDomain.cpp
     private native void FrequencyDomain(int samplerate, int buffersize);
@@ -148,4 +155,5 @@ public class Scan {
     private native boolean GetBackgroundModelUpdating();
     private native void Pause();
     private native void Resume();
+    private native void StopIO();
 }
\ No newline at end of file
diff --git a/SoniControl/app/src/main/jni/FrequencyDomain.cpp b/SoniControl/app/src/main/jni/FrequencyDomain.cpp
index da86e3c3..86e803d2 100644
--- a/SoniControl/app/src/main/jni/FrequencyDomain.cpp
+++ b/SoniControl/app/src/main/jni/FrequencyDomain.cpp
@@ -20,7 +20,7 @@
 #define  LOGD(...)  __android_log_print(ANDROID_LOG_DEBUG, LOG_TAG, __VA_ARGS__)
 
 //SUPERPOWERED FFT VARIABLES
-static SuperpoweredAndroidAudioIO *audioIO;
+static SuperpoweredAndroidAudioIO *audioIO = NULL;
 static SuperpoweredFrequencyDomain *frequencyDomain;
 static float *magnitudeLeft, *magnitudeRight, *phaseLeft, *phaseRight, *inputBufferFloat;
 
@@ -489,6 +489,10 @@ extern "C" JNIEXPORT void Java_at_ac_fhstp_sonicontrol_Scan_Resume(JNIEnv * __un
     resumeIO();
 }
 
+extern "C" JNIEXPORT void Java_at_ac_fhstp_sonicontrol_Scan_StopIO(JNIEnv * __unused javaEnvironment, jobject __unused obj) {
+    stopIO();
+}
+
 /* SettingsActivity does not exist in the full app
 extern "C" JNIEXPORT void Java_at_ac_fhstp_sonicontrol_SettingsActivity_SetNewCutFrequency(JNIEnv * __unused javaEnvironment, jobject __unused obj, jint cutF){
     cutoffFrequency = cutF;
-- 
GitLab