First Commit
This commit is contained in:
9
externals/soundtouch/source/Android-lib/.classpath
vendored
Normal file
9
externals/soundtouch/source/Android-lib/.classpath
vendored
Normal file
@@ -0,0 +1,9 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<classpath>
|
||||
<classpathentry kind="con" path="com.android.ide.eclipse.adt.ANDROID_FRAMEWORK"/>
|
||||
<classpathentry exported="true" kind="con" path="com.android.ide.eclipse.adt.LIBRARIES"/>
|
||||
<classpathentry exported="true" kind="con" path="com.android.ide.eclipse.adt.DEPENDENCIES"/>
|
||||
<classpathentry kind="src" path="src"/>
|
||||
<classpathentry kind="src" path="gen"/>
|
||||
<classpathentry kind="output" path="bin/classes"/>
|
||||
</classpath>
|
||||
33
externals/soundtouch/source/Android-lib/.project
vendored
Normal file
33
externals/soundtouch/source/Android-lib/.project
vendored
Normal file
@@ -0,0 +1,33 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<projectDescription>
|
||||
<name>ExampleActivity</name>
|
||||
<comment></comment>
|
||||
<projects>
|
||||
</projects>
|
||||
<buildSpec>
|
||||
<buildCommand>
|
||||
<name>com.android.ide.eclipse.adt.ResourceManagerBuilder</name>
|
||||
<arguments>
|
||||
</arguments>
|
||||
</buildCommand>
|
||||
<buildCommand>
|
||||
<name>com.android.ide.eclipse.adt.PreCompilerBuilder</name>
|
||||
<arguments>
|
||||
</arguments>
|
||||
</buildCommand>
|
||||
<buildCommand>
|
||||
<name>org.eclipse.jdt.core.javabuilder</name>
|
||||
<arguments>
|
||||
</arguments>
|
||||
</buildCommand>
|
||||
<buildCommand>
|
||||
<name>com.android.ide.eclipse.adt.ApkBuilder</name>
|
||||
<arguments>
|
||||
</arguments>
|
||||
</buildCommand>
|
||||
</buildSpec>
|
||||
<natures>
|
||||
<nature>com.android.ide.eclipse.adt.AndroidNature</nature>
|
||||
<nature>org.eclipse.jdt.core.javanature</nature>
|
||||
</natures>
|
||||
</projectDescription>
|
||||
30
externals/soundtouch/source/Android-lib/AndroidManifest.xml
vendored
Normal file
30
externals/soundtouch/source/Android-lib/AndroidManifest.xml
vendored
Normal file
@@ -0,0 +1,30 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
package="net.surina.soundtouchexample"
|
||||
android:versionCode="1"
|
||||
android:versionName="1.0" >
|
||||
|
||||
<uses-sdk
|
||||
android:minSdkVersion="11"
|
||||
android:targetSdkVersion="21" />
|
||||
|
||||
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
|
||||
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
|
||||
|
||||
<application
|
||||
android:allowBackup="true"
|
||||
android:icon="@drawable/ic_launcher"
|
||||
android:label="@string/app_name"
|
||||
android:theme="@style/AppTheme" >
|
||||
<activity
|
||||
android:name="net.surina.ExampleActivity"
|
||||
android:label="@string/app_name" >
|
||||
<intent-filter>
|
||||
<action android:name="android.intent.action.MAIN" />
|
||||
|
||||
<category android:name="android.intent.category.LAUNCHER" />
|
||||
</intent-filter>
|
||||
</activity>
|
||||
</application>
|
||||
|
||||
</manifest>
|
||||
128
externals/soundtouch/source/Android-lib/README-SoundTouch-Android.html
vendored
Normal file
128
externals/soundtouch/source/Android-lib/README-SoundTouch-Android.html
vendored
Normal file
@@ -0,0 +1,128 @@
|
||||
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
|
||||
<html>
|
||||
<head>
|
||||
<title>SoundTouch in Android</title>
|
||||
<meta http-equiv="Content-Type"
|
||||
content="text/html; charset=windows-1252">
|
||||
<meta http-equiv="Content-Language" content="en-us">
|
||||
<meta name="author" content="Olli Parviainen">
|
||||
<meta name="description"
|
||||
content="Readme file for SoundTouch library Android compilation">
|
||||
<style> <!-- .normal { font-family: Arial }
|
||||
--></style>
|
||||
</head>
|
||||
<body class="normal">
|
||||
<hr>
|
||||
<h1>SoundTouch in Android</h1>
|
||||
<hr>
|
||||
<h2>Compiling SoundTouch for Android</h2>
|
||||
<p>SoundTouch source code package contains "Android-lib" example project that compiles SoundTouch
|
||||
source codes into Android native library, and gives an example of JNI interface
|
||||
for invoking
|
||||
the native SoundTouch routines from an Android application written in Java.</p>
|
||||
<p style="font-weight: 700">Software prerequisites:</p>
|
||||
<ul>
|
||||
<li>Android SDK environment for developing your own Android application. Visit the <a href="http://developer.android.com/index.html">Android developers' site</a>
|
||||
for more information about the Android SDK and developing Android applications.</li>
|
||||
<li>Android NDK compiler kit for compiling native library binaries. The Android NDK
|
||||
is <a href="http://developer.android.com/tools/sdk/ndk/index.html">
|
||||
available for download</a> at the Android developer tools site.</li>
|
||||
<li>In case you're working in Windows environment, install
|
||||
<a href="http://cygwin.com/install.html">
|
||||
Cygwin</a> to run the Android NDK/SDK compiler scripts</li>
|
||||
<li>Latest SoundTouch source code package available at <a href="http://soundtouch.surina.net/sourcecode.html">
|
||||
soundtouch.surina.net</a>.</li>
|
||||
</ul>
|
||||
<p><b>Hint: </b>As installing and configuring all the components for an Android SDK/NDK
|
||||
environment requires fair effort, it's good idea to create a dedicated Virtual
|
||||
Machine environment for the Android development environment installation.
|
||||
Having the Android developer environment setup in dedicated Virtual Machine
|
||||
allows keeping all these settings isolated from your other PC operations, and
|
||||
eases taking backup snapshots of your full development environment.</p>
|
||||
<p><b>Compiling</b></p>
|
||||
<p>
|
||||
To compile the SoundTouch library source codes into an Android native library,
|
||||
open Cygwin/bash shell, go to directory <b>"soundtouch/source/Android-lib/jni"</b> and invoke the NDK
|
||||
compiler with following command:</p>
|
||||
<pre> $NDK/ndk-build</pre>
|
||||
<p>This will build binaries for all the supported Android platforms (arm-v5, arm-v7, X86, MIPS etc) of SoundTouch library, plus the JNI wrapper interface as discussed below. The target binaries will be built into the "libs" subdirectory. As long as all these .so binary library versions are included in the APK Application delivery package, the target Android device can choose the correct library version to use. </p>
|
||||
<p>Notice that to allow Cygwin/bash to locate the NDK compile scripts, you
|
||||
need to define the location of the NDK installation defined in environment
|
||||
variable "NDK". That's easiest done by adding the NDK path definition at end of
|
||||
your <b>~/.bash_profile</b> file, for instance as follows:</p>
|
||||
<pre> NDK=/cygdrive/d/Android/android-ndk-r6</pre>
|
||||
<p><b>Enabling OpenMP parallel computing mode</b></p>
|
||||
<p>
|
||||
SoundTouch supports OpenMP for parallel computing in multi-core
|
||||
environments, and these improvements can be enabled also in the Android
|
||||
build. See the SoundTouch main README.html file for generic notes about the
|
||||
OpenMP implementation.</p>
|
||||
<p>
|
||||
To enable OpenMP mode in Android compilation, edit file <strong>Android.mk</strong>
|
||||
and enable the "-fopenmp" flag in LOCAL_CFLAGS and LOCAL_LDFLAGS variables.
|
||||
This is done by removing hash # from before the following lines in the
|
||||
Android.mk file, before compiling the library:</p>
|
||||
<pre> LOCAL_CFLAGS += -fopenmp
|
||||
LOCAL_LDFLAGS += -fopenmp</pre>
|
||||
<p><strong>OpenMP COMPATIBILITY NOTE: </strong>Android NDK has a threading issue
|
||||
(at least until NDK v10) that causes the native library crash with fatal signal
|
||||
11 if calling OpenMP-improved routines from a background thread. SoundTouch has
|
||||
a workaround for this issue in soundtouch-jni.cpp, and this workaround requires
|
||||
calling function <strong>SoundTouch.getVersionString() </strong>from the Android
|
||||
application's main thread at least once before calling other SoundTouch
|
||||
processing routines. See the SoundTouch Android example application and comments
|
||||
in the <strong>soundtouch-jni.cpp </strong>source code file for more details.</p>
|
||||
<p>
|
||||
<strong>SoundTouch performance in Android</strong></p>
|
||||
<p>
|
||||
See external blog articles for more discussion about the
|
||||
<a href="http://www.softwarecoven.com/parallel-computing-in-embedded-mobile-devices/">
|
||||
SoundTouch OpenMP implementation</a> and the
|
||||
<a href="http://www.softwarecoven.com/parallel-computing-with-openmp-in-android/">
|
||||
SoundTouch performance benchmark tests in Android environment</a>.</p>
|
||||
<hr />
|
||||
<h2>
|
||||
Calling SoundTouch native routines from Android application</h2>
|
||||
<p>The NDK tools build the SoundTouch c++ routines into a native binary library, while
|
||||
Android applications are written in Java language. To call the SoundTouch and other c/c++
|
||||
routines from an Android java application code, you'll need to use Java Native
|
||||
Interface (JNI).</p>
|
||||
<p>
|
||||
The SoundTouch source code package provides source code example how to
|
||||
use JNI to call native c++ routines from a Java class, and provides source codes also for
|
||||
a simple example Android application:<ul>
|
||||
<li><b>ExampleActivity</b>: This is simple Android example application that
|
||||
utilizes SoundTouch native routines for processing WAV audio files. To build the example
|
||||
application, use Eclipse Android SDK environment to import the "ExampleActivity" project in the "Android-lib" folder into the Eclipse workspace.
|
||||
<li><b>Android-lib/jni/soundtouch-jni.cpp</b>: This file contains c/c++ wrapper routines
|
||||
for performing elementary audio file processing with adjusted tempo/pitch/speed parameters
|
||||
from the Android application. The wrapper interface is not complete, but provides example
|
||||
that is easy to extend when necessary. The NDK compiles this file along with the SoundTouch
|
||||
routines into the native binary library.</li>
|
||||
<li><b>Android-lib/src/net/surina/soundtouch/SoundTouch.java</b>: This file implements
|
||||
the Java interface class that loasd & accesses the JNI routines in the natively compiled library.
|
||||
The example Android application uses this class as interface for processing audio files
|
||||
with SoundTouch.</li>
|
||||
<li><b>Android-lib/build.gradle</b>: Top level build script file for Android Studio 3.1.4+</li>
|
||||
</ul>
|
||||
<p>
|
||||
Feel free to examine and extend the provided cpp/java source code example file pair to
|
||||
implement and integrate the desired SoundTouch library capabilities into your own Android application.</p>
|
||||
<hr />
|
||||
<h2>
|
||||
Android floating-point performance considerations</h2>
|
||||
<p>
|
||||
The make process will build dedicated binaries for each supported Android CPU hardware platform type.
|
||||
</p><p>SoundTouch uses floating-point algorithms for ideal sound quality on all other platform than in the lowest-end ARMv5. That is because lowest-end Android devices are not guaranteed to
|
||||
have floating-point hardware in their CPUs, so that the ARMv5 compilation uses by default software-emulation for floating-point calculations to allow running the binary executables also in low-end devices without floating-point hardware.<p>
|
||||
As floating point software-emulation is however several tens of times slower
|
||||
than real hardware-level floating-point calculations, that would make running
|
||||
floating-point-intensive applications such as SoundTouch infeasible in these low-end
|
||||
devices. As workaround, the SoundTouch Android compilation builds the ARMv5 version using integer algorithm versions. The integer
|
||||
algorithm version compromises the sound quality but provides good performance also
|
||||
with low-end devices without hardware floating-point support in the CPU level.</p>
|
||||
<p>When Android devices with more capable device is used, the device will automatically choose a proper library version for ideal sound quality.</p>
|
||||
<hr />
|
||||
<p style="text-align: center"><i>Copyright © Olli Parviainen</i></p>
|
||||
</body>
|
||||
</html>
|
||||
BIN
externals/soundtouch/source/Android-lib/gradle/wrapper/gradle-wrapper.jar
vendored
Normal file
BIN
externals/soundtouch/source/Android-lib/gradle/wrapper/gradle-wrapper.jar
vendored
Normal file
Binary file not shown.
6
externals/soundtouch/source/Android-lib/gradle/wrapper/gradle-wrapper.properties
vendored
Normal file
6
externals/soundtouch/source/Android-lib/gradle/wrapper/gradle-wrapper.properties
vendored
Normal file
@@ -0,0 +1,6 @@
|
||||
#Sat Jan 13 09:12:34 PST 2018
|
||||
distributionBase=GRADLE_USER_HOME
|
||||
distributionPath=wrapper/dists
|
||||
zipStoreBase=GRADLE_USER_HOME
|
||||
zipStorePath=wrapper/dists
|
||||
distributionUrl=https\://services.gradle.org/distributions/gradle-4.4.1-all.zip
|
||||
172
externals/soundtouch/source/Android-lib/gradlew
vendored
Normal file
172
externals/soundtouch/source/Android-lib/gradlew
vendored
Normal file
@@ -0,0 +1,172 @@
|
||||
#!/usr/bin/env sh
|
||||
|
||||
##############################################################################
|
||||
##
|
||||
## Gradle start up script for UN*X
|
||||
##
|
||||
##############################################################################
|
||||
|
||||
# Attempt to set APP_HOME
|
||||
# Resolve links: $0 may be a link
|
||||
PRG="$0"
|
||||
# Need this for relative symlinks.
|
||||
while [ -h "$PRG" ] ; do
|
||||
ls=`ls -ld "$PRG"`
|
||||
link=`expr "$ls" : '.*-> \(.*\)$'`
|
||||
if expr "$link" : '/.*' > /dev/null; then
|
||||
PRG="$link"
|
||||
else
|
||||
PRG=`dirname "$PRG"`"/$link"
|
||||
fi
|
||||
done
|
||||
SAVED="`pwd`"
|
||||
cd "`dirname \"$PRG\"`/" >/dev/null
|
||||
APP_HOME="`pwd -P`"
|
||||
cd "$SAVED" >/dev/null
|
||||
|
||||
APP_NAME="Gradle"
|
||||
APP_BASE_NAME=`basename "$0"`
|
||||
|
||||
# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
|
||||
DEFAULT_JVM_OPTS=""
|
||||
|
||||
# Use the maximum available, or set MAX_FD != -1 to use that value.
|
||||
MAX_FD="maximum"
|
||||
|
||||
warn () {
|
||||
echo "$*"
|
||||
}
|
||||
|
||||
die () {
|
||||
echo
|
||||
echo "$*"
|
||||
echo
|
||||
exit 1
|
||||
}
|
||||
|
||||
# OS specific support (must be 'true' or 'false').
|
||||
cygwin=false
|
||||
msys=false
|
||||
darwin=false
|
||||
nonstop=false
|
||||
case "`uname`" in
|
||||
CYGWIN* )
|
||||
cygwin=true
|
||||
;;
|
||||
Darwin* )
|
||||
darwin=true
|
||||
;;
|
||||
MINGW* )
|
||||
msys=true
|
||||
;;
|
||||
NONSTOP* )
|
||||
nonstop=true
|
||||
;;
|
||||
esac
|
||||
|
||||
CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar
|
||||
|
||||
# Determine the Java command to use to start the JVM.
|
||||
if [ -n "$JAVA_HOME" ] ; then
|
||||
if [ -x "$JAVA_HOME/jre/sh/java" ] ; then
|
||||
# IBM's JDK on AIX uses strange locations for the executables
|
||||
JAVACMD="$JAVA_HOME/jre/sh/java"
|
||||
else
|
||||
JAVACMD="$JAVA_HOME/bin/java"
|
||||
fi
|
||||
if [ ! -x "$JAVACMD" ] ; then
|
||||
die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME
|
||||
|
||||
Please set the JAVA_HOME variable in your environment to match the
|
||||
location of your Java installation."
|
||||
fi
|
||||
else
|
||||
JAVACMD="java"
|
||||
which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.
|
||||
|
||||
Please set the JAVA_HOME variable in your environment to match the
|
||||
location of your Java installation."
|
||||
fi
|
||||
|
||||
# Increase the maximum file descriptors if we can.
|
||||
if [ "$cygwin" = "false" -a "$darwin" = "false" -a "$nonstop" = "false" ] ; then
|
||||
MAX_FD_LIMIT=`ulimit -H -n`
|
||||
if [ $? -eq 0 ] ; then
|
||||
if [ "$MAX_FD" = "maximum" -o "$MAX_FD" = "max" ] ; then
|
||||
MAX_FD="$MAX_FD_LIMIT"
|
||||
fi
|
||||
ulimit -n $MAX_FD
|
||||
if [ $? -ne 0 ] ; then
|
||||
warn "Could not set maximum file descriptor limit: $MAX_FD"
|
||||
fi
|
||||
else
|
||||
warn "Could not query maximum file descriptor limit: $MAX_FD_LIMIT"
|
||||
fi
|
||||
fi
|
||||
|
||||
# For Darwin, add options to specify how the application appears in the dock
|
||||
if $darwin; then
|
||||
GRADLE_OPTS="$GRADLE_OPTS \"-Xdock:name=$APP_NAME\" \"-Xdock:icon=$APP_HOME/media/gradle.icns\""
|
||||
fi
|
||||
|
||||
# For Cygwin, switch paths to Windows format before running java
|
||||
if $cygwin ; then
|
||||
APP_HOME=`cygpath --path --mixed "$APP_HOME"`
|
||||
CLASSPATH=`cygpath --path --mixed "$CLASSPATH"`
|
||||
JAVACMD=`cygpath --unix "$JAVACMD"`
|
||||
|
||||
# We build the pattern for arguments to be converted via cygpath
|
||||
ROOTDIRSRAW=`find -L / -maxdepth 1 -mindepth 1 -type d 2>/dev/null`
|
||||
SEP=""
|
||||
for dir in $ROOTDIRSRAW ; do
|
||||
ROOTDIRS="$ROOTDIRS$SEP$dir"
|
||||
SEP="|"
|
||||
done
|
||||
OURCYGPATTERN="(^($ROOTDIRS))"
|
||||
# Add a user-defined pattern to the cygpath arguments
|
||||
if [ "$GRADLE_CYGPATTERN" != "" ] ; then
|
||||
OURCYGPATTERN="$OURCYGPATTERN|($GRADLE_CYGPATTERN)"
|
||||
fi
|
||||
# Now convert the arguments - kludge to limit ourselves to /bin/sh
|
||||
i=0
|
||||
for arg in "$@" ; do
|
||||
CHECK=`echo "$arg"|egrep -c "$OURCYGPATTERN" -`
|
||||
CHECK2=`echo "$arg"|egrep -c "^-"` ### Determine if an option
|
||||
|
||||
if [ $CHECK -ne 0 ] && [ $CHECK2 -eq 0 ] ; then ### Added a condition
|
||||
eval `echo args$i`=`cygpath --path --ignore --mixed "$arg"`
|
||||
else
|
||||
eval `echo args$i`="\"$arg\""
|
||||
fi
|
||||
i=$((i+1))
|
||||
done
|
||||
case $i in
|
||||
(0) set -- ;;
|
||||
(1) set -- "$args0" ;;
|
||||
(2) set -- "$args0" "$args1" ;;
|
||||
(3) set -- "$args0" "$args1" "$args2" ;;
|
||||
(4) set -- "$args0" "$args1" "$args2" "$args3" ;;
|
||||
(5) set -- "$args0" "$args1" "$args2" "$args3" "$args4" ;;
|
||||
(6) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" ;;
|
||||
(7) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" ;;
|
||||
(8) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" ;;
|
||||
(9) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" "$args8" ;;
|
||||
esac
|
||||
fi
|
||||
|
||||
# Escape application args
|
||||
save () {
|
||||
for i do printf %s\\n "$i" | sed "s/'/'\\\\''/g;1s/^/'/;\$s/\$/' \\\\/" ; done
|
||||
echo " "
|
||||
}
|
||||
APP_ARGS=$(save "$@")
|
||||
|
||||
# Collect all arguments for the java command, following the shell quoting and substitution rules
|
||||
eval set -- $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS "\"-Dorg.gradle.appname=$APP_BASE_NAME\"" -classpath "\"$CLASSPATH\"" org.gradle.wrapper.GradleWrapperMain "$APP_ARGS"
|
||||
|
||||
# by default we should be in the correct project dir, but when run from Finder on Mac, the cwd is wrong
|
||||
if [ "$(uname)" = "Darwin" ] && [ "$HOME" = "$PWD" ]; then
|
||||
cd "$(dirname "$0")"
|
||||
fi
|
||||
|
||||
exec "$JAVACMD" "$@"
|
||||
84
externals/soundtouch/source/Android-lib/gradlew.bat
vendored
Normal file
84
externals/soundtouch/source/Android-lib/gradlew.bat
vendored
Normal file
@@ -0,0 +1,84 @@
|
||||
@if "%DEBUG%" == "" @echo off
|
||||
@rem ##########################################################################
|
||||
@rem
|
||||
@rem Gradle startup script for Windows
|
||||
@rem
|
||||
@rem ##########################################################################
|
||||
|
||||
@rem Set local scope for the variables with windows NT shell
|
||||
if "%OS%"=="Windows_NT" setlocal
|
||||
|
||||
set DIRNAME=%~dp0
|
||||
if "%DIRNAME%" == "" set DIRNAME=.
|
||||
set APP_BASE_NAME=%~n0
|
||||
set APP_HOME=%DIRNAME%
|
||||
|
||||
@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
|
||||
set DEFAULT_JVM_OPTS=
|
||||
|
||||
@rem Find java.exe
|
||||
if defined JAVA_HOME goto findJavaFromJavaHome
|
||||
|
||||
set JAVA_EXE=java.exe
|
||||
%JAVA_EXE% -version >NUL 2>&1
|
||||
if "%ERRORLEVEL%" == "0" goto init
|
||||
|
||||
echo.
|
||||
echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.
|
||||
echo.
|
||||
echo Please set the JAVA_HOME variable in your environment to match the
|
||||
echo location of your Java installation.
|
||||
|
||||
goto fail
|
||||
|
||||
:findJavaFromJavaHome
|
||||
set JAVA_HOME=%JAVA_HOME:"=%
|
||||
set JAVA_EXE=%JAVA_HOME%/bin/java.exe
|
||||
|
||||
if exist "%JAVA_EXE%" goto init
|
||||
|
||||
echo.
|
||||
echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME%
|
||||
echo.
|
||||
echo Please set the JAVA_HOME variable in your environment to match the
|
||||
echo location of your Java installation.
|
||||
|
||||
goto fail
|
||||
|
||||
:init
|
||||
@rem Get command-line arguments, handling Windows variants
|
||||
|
||||
if not "%OS%" == "Windows_NT" goto win9xME_args
|
||||
|
||||
:win9xME_args
|
||||
@rem Slurp the command line arguments.
|
||||
set CMD_LINE_ARGS=
|
||||
set _SKIP=2
|
||||
|
||||
:win9xME_args_slurp
|
||||
if "x%~1" == "x" goto execute
|
||||
|
||||
set CMD_LINE_ARGS=%*
|
||||
|
||||
:execute
|
||||
@rem Setup the command line
|
||||
|
||||
set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar
|
||||
|
||||
@rem Execute Gradle
|
||||
"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %CMD_LINE_ARGS%
|
||||
|
||||
:end
|
||||
@rem End local scope for the variables with windows NT shell
|
||||
if "%ERRORLEVEL%"=="0" goto mainEnd
|
||||
|
||||
:fail
|
||||
rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of
|
||||
rem the _cmd.exe /c_ return code!
|
||||
if not "" == "%GRADLE_EXIT_CONSOLE%" exit 1
|
||||
exit /b 1
|
||||
|
||||
:mainEnd
|
||||
if "%OS%"=="Windows_NT" endlocal
|
||||
|
||||
:omega
|
||||
37
externals/soundtouch/source/Android-lib/jni/Android.mk
vendored
Normal file
37
externals/soundtouch/source/Android-lib/jni/Android.mk
vendored
Normal file
@@ -0,0 +1,37 @@
|
||||
LOCAL_PATH := $(call my-dir)
|
||||
|
||||
include $(CLEAR_VARS)
|
||||
|
||||
LOCAL_C_INCLUDES += $(LOCAL_PATH)/../../../include $(LOCAL_PATH)/../../SoundStretch
|
||||
# *** Remember: Change -O0 into -O2 in add-applications.mk ***
|
||||
|
||||
LOCAL_MODULE := soundtouch
|
||||
LOCAL_SRC_FILES := soundtouch-jni.cpp ../../SoundTouch/AAFilter.cpp ../../SoundTouch/FIFOSampleBuffer.cpp \
|
||||
../../SoundTouch/FIRFilter.cpp ../../SoundTouch/cpu_detect_x86.cpp \
|
||||
../../SoundTouch/sse_optimized.cpp ../../SoundStretch/WavFile.cpp \
|
||||
../../SoundTouch/RateTransposer.cpp ../../SoundTouch/SoundTouch.cpp \
|
||||
../../SoundTouch/InterpolateCubic.cpp ../../SoundTouch/InterpolateLinear.cpp \
|
||||
../../SoundTouch/InterpolateShannon.cpp ../../SoundTouch/TDStretch.cpp \
|
||||
../../SoundTouch/BPMDetect.cpp ../../SoundTouch/PeakFinder.cpp
|
||||
|
||||
# for native audio
|
||||
LOCAL_SHARED_LIBRARIES += -lgcc
|
||||
# --whole-archive -lgcc
|
||||
# for logging
|
||||
LOCAL_LDLIBS += -llog
|
||||
# for native asset manager
|
||||
#LOCAL_LDLIBS += -landroid
|
||||
|
||||
# Custom Flags:
|
||||
# -fvisibility=hidden : don't export all symbols
|
||||
LOCAL_CFLAGS += -fvisibility=hidden -fdata-sections -ffunction-sections -ffast-math
|
||||
|
||||
# OpenMP mode : enable these flags to enable using OpenMP for parallel computation
|
||||
#LOCAL_CFLAGS += -fopenmp
|
||||
#LOCAL_LDFLAGS += -fopenmp
|
||||
|
||||
|
||||
# Use ARM instruction set instead of Thumb for improved calculation performance in ARM CPUs
|
||||
LOCAL_ARM_MODE := arm
|
||||
|
||||
include $(BUILD_SHARED_LIBRARY)
|
||||
9
externals/soundtouch/source/Android-lib/jni/Application.mk
vendored
Normal file
9
externals/soundtouch/source/Android-lib/jni/Application.mk
vendored
Normal file
@@ -0,0 +1,9 @@
|
||||
#
|
||||
# Build library bilaries for all supported architectures
|
||||
#
|
||||
|
||||
APP_ABI := all #armeabi-v7a armeabi
|
||||
APP_OPTIM := release
|
||||
APP_STL := c++_static
|
||||
APP_CPPFLAGS := -fexceptions # -D SOUNDTOUCH_DISABLE_X86_OPTIMIZATIONS
|
||||
|
||||
258
externals/soundtouch/source/Android-lib/jni/soundtouch-jni.cpp
vendored
Normal file
258
externals/soundtouch/source/Android-lib/jni/soundtouch-jni.cpp
vendored
Normal file
@@ -0,0 +1,258 @@
|
||||
////////////////////////////////////////////////////////////////////////////////
|
||||
///
|
||||
/// Example Interface class for SoundTouch native compilation
|
||||
///
|
||||
/// Author : Copyright (c) Olli Parviainen
|
||||
/// Author e-mail : oparviai 'at' iki.fi
|
||||
/// WWW : http://www.surina.net
|
||||
///
|
||||
////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
#include <jni.h>
|
||||
#include <android/log.h>
|
||||
#include <stdexcept>
|
||||
#include <string>
|
||||
|
||||
using namespace std;
|
||||
|
||||
#include "../../../include/SoundTouch.h"
|
||||
#include "../source/SoundStretch/WavFile.h"
|
||||
|
||||
#define LOGV(...) __android_log_print((int)ANDROID_LOG_INFO, "SOUNDTOUCH", __VA_ARGS__)
|
||||
//#define LOGV(...)
|
||||
|
||||
|
||||
// String for keeping possible c++ exception error messages. Notice that this isn't
|
||||
// thread-safe but it's expected that exceptions are special situations that won't
|
||||
// occur in several threads in parallel.
|
||||
static string _errMsg = "";
|
||||
|
||||
|
||||
#define DLL_PUBLIC __attribute__ ((visibility ("default")))
|
||||
#define BUFF_SIZE 4096
|
||||
|
||||
|
||||
using namespace soundtouch;
|
||||
|
||||
|
||||
// Set error message to return
|
||||
static void _setErrmsg(const char *msg)
|
||||
{
|
||||
_errMsg = msg;
|
||||
}
|
||||
|
||||
#if 0 // apparently following workaround not needed any more with concurrent Android SDKs
|
||||
#ifdef _OPENMP
|
||||
|
||||
#include <pthread.h>
|
||||
extern pthread_key_t gomp_tls_key;
|
||||
static void * _p_gomp_tls = nullptr;
|
||||
|
||||
/// Function to initialize threading for OpenMP.
|
||||
///
|
||||
/// This is a workaround for bug in Android NDK v10 regarding OpenMP: OpenMP works only if
|
||||
/// called from the Android App main thread because in the main thread the gomp_tls storage is
|
||||
/// properly set, however, Android does not properly initialize gomp_tls storage for other threads.
|
||||
/// Thus if OpenMP routines are invoked from some other thread than the main thread,
|
||||
/// the OpenMP routine will crash the application due to nullptr access on uninitialized storage.
|
||||
///
|
||||
/// This workaround stores the gomp_tls storage from main thread, and copies to other threads.
|
||||
/// In order this to work, the Application main thread needws to call at least "getVersionString"
|
||||
/// routine.
|
||||
static int _init_threading(bool warn)
|
||||
{
|
||||
void *ptr = pthread_getspecific(gomp_tls_key);
|
||||
LOGV("JNI thread-specific TLS storage %ld", (long)ptr);
|
||||
if (ptr == nullptr)
|
||||
{
|
||||
LOGV("JNI set missing TLS storage to %ld", (long)_p_gomp_tls);
|
||||
pthread_setspecific(gomp_tls_key, _p_gomp_tls);
|
||||
}
|
||||
else
|
||||
{
|
||||
LOGV("JNI store this TLS storage");
|
||||
_p_gomp_tls = ptr;
|
||||
}
|
||||
// Where critical, show warning if storage still not properly initialized
|
||||
if ((warn) && (_p_gomp_tls == nullptr))
|
||||
{
|
||||
_setErrmsg("Error - OpenMP threading not properly initialized: Call SoundTouch.getVersionString() from the App main thread!");
|
||||
return -1;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
#else
|
||||
static int _init_threading(bool warn)
|
||||
{
|
||||
// do nothing if not OpenMP build
|
||||
return 0;
|
||||
}
|
||||
#endif
|
||||
|
||||
#endif
|
||||
|
||||
// Processes the sound file
|
||||
static void _processFile(SoundTouch *pSoundTouch, const char *inFileName, const char *outFileName)
|
||||
{
|
||||
int nSamples;
|
||||
int nChannels;
|
||||
int buffSizeSamples;
|
||||
SAMPLETYPE sampleBuffer[BUFF_SIZE];
|
||||
|
||||
// open input file
|
||||
WavInFile inFile(inFileName);
|
||||
int sampleRate = inFile.getSampleRate();
|
||||
int bits = inFile.getNumBits();
|
||||
nChannels = inFile.getNumChannels();
|
||||
|
||||
// create output file
|
||||
WavOutFile outFile(outFileName, sampleRate, bits, nChannels);
|
||||
|
||||
pSoundTouch->setSampleRate(sampleRate);
|
||||
pSoundTouch->setChannels(nChannels);
|
||||
|
||||
assert(nChannels > 0);
|
||||
buffSizeSamples = BUFF_SIZE / nChannels;
|
||||
|
||||
// Process samples read from the input file
|
||||
while (inFile.eof() == 0)
|
||||
{
|
||||
int num;
|
||||
|
||||
// Read a chunk of samples from the input file
|
||||
num = inFile.read(sampleBuffer, BUFF_SIZE);
|
||||
nSamples = num / nChannels;
|
||||
|
||||
// Feed the samples into SoundTouch processor
|
||||
pSoundTouch->putSamples(sampleBuffer, nSamples);
|
||||
|
||||
// Read ready samples from SoundTouch processor & write them output file.
|
||||
// NOTES:
|
||||
// - 'receiveSamples' doesn't necessarily return any samples at all
|
||||
// during some rounds!
|
||||
// - On the other hand, during some round 'receiveSamples' may have more
|
||||
// ready samples than would fit into 'sampleBuffer', and for this reason
|
||||
// the 'receiveSamples' call is iterated for as many times as it
|
||||
// outputs samples.
|
||||
do
|
||||
{
|
||||
nSamples = pSoundTouch->receiveSamples(sampleBuffer, buffSizeSamples);
|
||||
outFile.write(sampleBuffer, nSamples * nChannels);
|
||||
} while (nSamples != 0);
|
||||
}
|
||||
|
||||
// Now the input file is processed, yet 'flush' few last samples that are
|
||||
// hiding in the SoundTouch's internal processing pipeline.
|
||||
pSoundTouch->flush();
|
||||
do
|
||||
{
|
||||
nSamples = pSoundTouch->receiveSamples(sampleBuffer, buffSizeSamples);
|
||||
outFile.write(sampleBuffer, nSamples * nChannels);
|
||||
} while (nSamples != 0);
|
||||
}
|
||||
|
||||
|
||||
|
||||
extern "C" DLL_PUBLIC jstring Java_net_surina_soundtouch_SoundTouch_getVersionString(JNIEnv *env, jobject thiz)
|
||||
{
|
||||
const char *verStr;
|
||||
|
||||
LOGV("JNI call SoundTouch.getVersionString");
|
||||
|
||||
// Call example SoundTouch routine
|
||||
verStr = SoundTouch::getVersionString();
|
||||
|
||||
// gomp_tls storage bug workaround - see comments in _init_threading() function!
|
||||
// update: apparently this is not needed any more with concurrent Android SDKs
|
||||
// _init_threading(false);
|
||||
|
||||
int threads = 0;
|
||||
#pragma omp parallel
|
||||
{
|
||||
#pragma omp atomic
|
||||
threads ++;
|
||||
}
|
||||
LOGV("JNI thread count %d", threads);
|
||||
|
||||
// return version as string
|
||||
return env->NewStringUTF(verStr);
|
||||
}
|
||||
|
||||
|
||||
|
||||
extern "C" DLL_PUBLIC jlong Java_net_surina_soundtouch_SoundTouch_newInstance(JNIEnv *env, jobject thiz)
|
||||
{
|
||||
return (jlong)(new SoundTouch());
|
||||
}
|
||||
|
||||
|
||||
extern "C" DLL_PUBLIC void Java_net_surina_soundtouch_SoundTouch_deleteInstance(JNIEnv *env, jobject thiz, jlong handle)
|
||||
{
|
||||
SoundTouch *ptr = (SoundTouch*)handle;
|
||||
delete ptr;
|
||||
}
|
||||
|
||||
|
||||
extern "C" DLL_PUBLIC void Java_net_surina_soundtouch_SoundTouch_setTempo(JNIEnv *env, jobject thiz, jlong handle, jfloat tempo)
|
||||
{
|
||||
SoundTouch *ptr = (SoundTouch*)handle;
|
||||
ptr->setTempo(tempo);
|
||||
}
|
||||
|
||||
|
||||
extern "C" DLL_PUBLIC void Java_net_surina_soundtouch_SoundTouch_setPitchSemiTones(JNIEnv *env, jobject thiz, jlong handle, jfloat pitch)
|
||||
{
|
||||
SoundTouch *ptr = (SoundTouch*)handle;
|
||||
ptr->setPitchSemiTones(pitch);
|
||||
}
|
||||
|
||||
|
||||
extern "C" DLL_PUBLIC void Java_net_surina_soundtouch_SoundTouch_setSpeed(JNIEnv *env, jobject thiz, jlong handle, jfloat speed)
|
||||
{
|
||||
SoundTouch *ptr = (SoundTouch*)handle;
|
||||
ptr->setRate(speed);
|
||||
}
|
||||
|
||||
|
||||
extern "C" DLL_PUBLIC jstring Java_net_surina_soundtouch_SoundTouch_getErrorString(JNIEnv *env, jobject thiz)
|
||||
{
|
||||
jstring result = env->NewStringUTF(_errMsg.c_str());
|
||||
_errMsg.clear();
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
|
||||
extern "C" DLL_PUBLIC int Java_net_surina_soundtouch_SoundTouch_processFile(JNIEnv *env, jobject thiz, jlong handle, jstring jinputFile, jstring joutputFile)
|
||||
{
|
||||
SoundTouch *ptr = (SoundTouch*)handle;
|
||||
|
||||
const char *inputFile = env->GetStringUTFChars(jinputFile, 0);
|
||||
const char *outputFile = env->GetStringUTFChars(joutputFile, 0);
|
||||
|
||||
LOGV("JNI process file %s", inputFile);
|
||||
|
||||
/// gomp_tls storage bug workaround - see comments in _init_threading() function!
|
||||
// update: apparently this is not needed any more with concurrent Android SDKs
|
||||
// if (_init_threading(true)) return -1;
|
||||
|
||||
try
|
||||
{
|
||||
_processFile(ptr, inputFile, outputFile);
|
||||
}
|
||||
catch (const runtime_error &e)
|
||||
{
|
||||
const char *err = e.what();
|
||||
// An exception occurred during processing, return the error message
|
||||
LOGV("JNI exception in SoundTouch::processFile: %s", err);
|
||||
_setErrmsg(err);
|
||||
return -1;
|
||||
}
|
||||
|
||||
|
||||
env->ReleaseStringUTFChars(jinputFile, inputFile);
|
||||
env->ReleaseStringUTFChars(joutputFile, outputFile);
|
||||
|
||||
return 0;
|
||||
}
|
||||
3
externals/soundtouch/source/Android-lib/lint.xml
vendored
Normal file
3
externals/soundtouch/source/Android-lib/lint.xml
vendored
Normal file
@@ -0,0 +1,3 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<lint>
|
||||
</lint>
|
||||
20
externals/soundtouch/source/Android-lib/proguard-project.txt
vendored
Normal file
20
externals/soundtouch/source/Android-lib/proguard-project.txt
vendored
Normal file
@@ -0,0 +1,20 @@
|
||||
# To enable ProGuard in your project, edit project.properties
|
||||
# to define the proguard.config property as described in that file.
|
||||
#
|
||||
# Add project specific ProGuard rules here.
|
||||
# By default, the flags in this file are appended to flags specified
|
||||
# in ${sdk.dir}/tools/proguard/proguard-android.txt
|
||||
# You can edit the include path and order by changing the ProGuard
|
||||
# include property in project.properties.
|
||||
#
|
||||
# For more details, see
|
||||
# http://developer.android.com/guide/developing/tools/proguard.html
|
||||
|
||||
# Add any project specific keep options here:
|
||||
|
||||
# If your project uses WebView with JS, uncomment the following
|
||||
# and specify the fully qualified class name to the JavaScript interface
|
||||
# class:
|
||||
#-keepclassmembers class fqcn.of.javascript.interface.for.webview {
|
||||
# public *;
|
||||
#}
|
||||
14
externals/soundtouch/source/Android-lib/project.properties
vendored
Normal file
14
externals/soundtouch/source/Android-lib/project.properties
vendored
Normal file
@@ -0,0 +1,14 @@
|
||||
# This file is automatically generated by Android Tools.
|
||||
# Do not modify this file -- YOUR CHANGES WILL BE ERASED!
|
||||
#
|
||||
# This file must be checked in Version Control Systems.
|
||||
#
|
||||
# To customize properties used by the Ant build system edit
|
||||
# "ant.properties", and override values to adapt the script to your
|
||||
# project structure.
|
||||
#
|
||||
# To enable ProGuard to shrink and obfuscate your code, uncomment this (available properties: sdk.dir, user.home):
|
||||
#proguard.config=${sdk.dir}/tools/proguard/proguard-android.txt:proguard-project.txt
|
||||
|
||||
# Project target.
|
||||
target=android-19
|
||||
BIN
externals/soundtouch/source/Android-lib/res/drawable-hdpi/ic_launcher.png
vendored
Normal file
BIN
externals/soundtouch/source/Android-lib/res/drawable-hdpi/ic_launcher.png
vendored
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 7.5 KiB |
BIN
externals/soundtouch/source/Android-lib/res/drawable-mdpi/ic_launcher.png
vendored
Normal file
BIN
externals/soundtouch/source/Android-lib/res/drawable-mdpi/ic_launcher.png
vendored
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 3.7 KiB |
BIN
externals/soundtouch/source/Android-lib/res/drawable-xhdpi/ic_launcher.png
vendored
Normal file
BIN
externals/soundtouch/source/Android-lib/res/drawable-xhdpi/ic_launcher.png
vendored
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 12 KiB |
BIN
externals/soundtouch/source/Android-lib/res/drawable-xxhdpi/ic_launcher.png
vendored
Normal file
BIN
externals/soundtouch/source/Android-lib/res/drawable-xxhdpi/ic_launcher.png
vendored
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 24 KiB |
140
externals/soundtouch/source/Android-lib/res/layout/activity_example.xml
vendored
Normal file
140
externals/soundtouch/source/Android-lib/res/layout/activity_example.xml
vendored
Normal file
@@ -0,0 +1,140 @@
|
||||
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
xmlns:tools="http://schemas.android.com/tools"
|
||||
android:id="@+id/linearLayout1"
|
||||
android:layout_width="fill_parent"
|
||||
android:layout_height="fill_parent"
|
||||
android:orientation="vertical" >
|
||||
|
||||
<TableLayout
|
||||
android:layout_width="fill_parent"
|
||||
android:layout_height="wrap_content" >
|
||||
|
||||
<TableRow
|
||||
android:id="@+id/tableRow1"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content" >
|
||||
|
||||
<TextView
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:text="Tempo %:"
|
||||
android:textAppearance="?android:attr/textAppearanceMedium" />
|
||||
|
||||
<EditText
|
||||
android:id="@+id/editTextTempo"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:ems="5"
|
||||
android:inputType="text"
|
||||
android:text="100" >
|
||||
</EditText>
|
||||
</TableRow>
|
||||
|
||||
<TableRow
|
||||
android:id="@+id/tableRow2"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content" >
|
||||
|
||||
<TextView
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:text="Pitch half-steps:"
|
||||
android:textAppearance="?android:attr/textAppearanceMedium" />
|
||||
|
||||
<EditText
|
||||
android:id="@+id/editTextPitch"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:ems="5"
|
||||
android:inputType="text"
|
||||
android:text="-0.318" >
|
||||
</EditText>
|
||||
</TableRow>
|
||||
</TableLayout>
|
||||
|
||||
<LinearLayout
|
||||
android:layout_width="fill_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_marginTop="10dp" >
|
||||
|
||||
<TextView
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:text="Source file:"
|
||||
android:textAppearance="?android:attr/textAppearanceMedium" />
|
||||
|
||||
<EditText
|
||||
android:id="@+id/editTextSrcFileName"
|
||||
android:layout_width="fill_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:text="/sdcard/Download/test.wav"
|
||||
android:layout_weight="1" />
|
||||
|
||||
|
||||
<Button
|
||||
android:id="@+id/buttonSelectSrcFile"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:text="Select" />
|
||||
</LinearLayout>
|
||||
|
||||
<LinearLayout
|
||||
android:layout_width="fill_parent"
|
||||
android:layout_height="wrap_content" >
|
||||
|
||||
<TextView
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:text="Output file:"
|
||||
android:textAppearance="?android:attr/textAppearanceMedium" />
|
||||
|
||||
<EditText
|
||||
android:id="@+id/editTextOutFileName"
|
||||
android:layout_width="fill_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:text="/sdcard/Download/soundtouch-output.wav"
|
||||
android:layout_weight="1" />
|
||||
|
||||
<Button
|
||||
android:id="@+id/buttonSelectOutFile"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:text="Select" />
|
||||
</LinearLayout>
|
||||
|
||||
<CheckBox
|
||||
android:id="@+id/checkBoxPlay"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_marginTop="10dp"
|
||||
android:text="Play the output file after processing!" />
|
||||
|
||||
<Button
|
||||
android:id="@+id/buttonProcess"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_gravity="center"
|
||||
android:text="Process file!" />
|
||||
|
||||
<TextView
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_marginTop="10dp"
|
||||
android:text="Status console:"
|
||||
android:textAppearance="?android:attr/textAppearanceMedium" />
|
||||
|
||||
<ScrollView
|
||||
android:id="@+id/scrollView1"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content" >
|
||||
|
||||
<TextView
|
||||
android:id="@+id/textViewResult"
|
||||
android:layout_width="fill_parent"
|
||||
android:layout_height="fill_parent"
|
||||
android:text="@string/hello_world" />
|
||||
|
||||
|
||||
</ScrollView>
|
||||
|
||||
</LinearLayout>
|
||||
7
externals/soundtouch/source/Android-lib/res/values/strings.xml
vendored
Normal file
7
externals/soundtouch/source/Android-lib/res/values/strings.xml
vendored
Normal file
@@ -0,0 +1,7 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<resources>
|
||||
|
||||
<string name="app_name">SoundTouch Example</string>
|
||||
<string name="hello_world">Hello world!</string>
|
||||
|
||||
</resources>
|
||||
20
externals/soundtouch/source/Android-lib/res/values/styles.xml
vendored
Normal file
20
externals/soundtouch/source/Android-lib/res/values/styles.xml
vendored
Normal file
@@ -0,0 +1,20 @@
|
||||
<resources>
|
||||
|
||||
<!--
|
||||
Base application theme, dependent on API level. This theme is replaced
|
||||
by AppBaseTheme from res/values-vXX/styles.xml on newer devices.
|
||||
-->
|
||||
<style name="AppBaseTheme" parent="android:Theme.Holo.Light">
|
||||
<!--
|
||||
Theme customizations available in newer API levels can go in
|
||||
res/values-vXX/styles.xml, while customizations related to
|
||||
backward-compatibility can go here.
|
||||
-->
|
||||
</style>
|
||||
|
||||
<!-- Application theme. -->
|
||||
<style name="AppTheme" parent="AppBaseTheme">
|
||||
<!-- All customizations that are NOT specific to a particular API-level can go here. -->
|
||||
</style>
|
||||
|
||||
</resources>
|
||||
219
externals/soundtouch/source/Android-lib/src/net/surina/ExampleActivity.java
vendored
Normal file
219
externals/soundtouch/source/Android-lib/src/net/surina/ExampleActivity.java
vendored
Normal file
@@ -0,0 +1,219 @@
|
||||
/////////////////////////////////////////////////////////////////////////////
|
||||
///
|
||||
/// Example Android Application/Activity that allows processing WAV
|
||||
/// audio files with SoundTouch library
|
||||
///
|
||||
/// Copyright (c) Olli Parviainen
|
||||
///
|
||||
////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
package net.surina;
|
||||
|
||||
import java.io.File;
|
||||
|
||||
import net.surina.soundtouch.SoundTouch;
|
||||
import net.surina.soundtouchexample.R;
|
||||
import android.app.Activity;
|
||||
import android.content.Intent;
|
||||
import android.net.Uri;
|
||||
import android.os.AsyncTask;
|
||||
import android.os.Bundle;
|
||||
import android.util.Log;
|
||||
import android.view.View;
|
||||
import android.view.View.OnClickListener;
|
||||
import android.widget.Button;
|
||||
import android.widget.CheckBox;
|
||||
import android.widget.EditText;
|
||||
import android.widget.TextView;
|
||||
import android.widget.Toast;
|
||||
|
||||
public class ExampleActivity extends Activity implements OnClickListener
|
||||
{
|
||||
TextView textViewConsole = null;
|
||||
EditText editSourceFile = null;
|
||||
EditText editOutputFile = null;
|
||||
EditText editTempo = null;
|
||||
EditText editPitch = null;
|
||||
CheckBox checkBoxPlay = null;
|
||||
|
||||
StringBuilder consoleText = new StringBuilder();
|
||||
|
||||
|
||||
/// Called when the activity is created
|
||||
@Override
|
||||
protected void onCreate(Bundle savedInstanceState)
|
||||
{
|
||||
super.onCreate(savedInstanceState);
|
||||
setContentView(R.layout.activity_example);
|
||||
|
||||
textViewConsole = (TextView)findViewById(R.id.textViewResult);
|
||||
editSourceFile = (EditText)findViewById(R.id.editTextSrcFileName);
|
||||
editOutputFile = (EditText)findViewById(R.id.editTextOutFileName);
|
||||
|
||||
editTempo = (EditText)findViewById(R.id.editTextTempo);
|
||||
editPitch = (EditText)findViewById(R.id.editTextPitch);
|
||||
|
||||
Button buttonFileSrc = (Button)findViewById(R.id.buttonSelectSrcFile);
|
||||
Button buttonFileOutput = (Button)findViewById(R.id.buttonSelectOutFile);
|
||||
Button buttonProcess = (Button)findViewById(R.id.buttonProcess);
|
||||
buttonFileSrc.setOnClickListener(this);
|
||||
buttonFileOutput.setOnClickListener(this);
|
||||
buttonProcess.setOnClickListener(this);
|
||||
|
||||
checkBoxPlay = (CheckBox)findViewById(R.id.checkBoxPlay);
|
||||
|
||||
// Check soundtouch library presence & version
|
||||
checkLibVersion();
|
||||
}
|
||||
|
||||
|
||||
|
||||
/// Function to append status text onto "console box" on the Activity
|
||||
public void appendToConsole(final String text)
|
||||
{
|
||||
// run on UI thread to avoid conflicts
|
||||
runOnUiThread(new Runnable()
|
||||
{
|
||||
public void run()
|
||||
{
|
||||
consoleText.append(text);
|
||||
consoleText.append("\n");
|
||||
textViewConsole.setText(consoleText);
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
|
||||
|
||||
/// print SoundTouch native library version onto console
|
||||
protected void checkLibVersion()
|
||||
{
|
||||
String ver = SoundTouch.getVersionString();
|
||||
appendToConsole("SoundTouch native library version = " + ver);
|
||||
}
|
||||
|
||||
|
||||
|
||||
/// Button click handler
|
||||
@Override
|
||||
public void onClick(View arg0)
|
||||
{
|
||||
switch (arg0.getId())
|
||||
{
|
||||
case R.id.buttonSelectSrcFile:
|
||||
case R.id.buttonSelectOutFile:
|
||||
// one of the file select buttons clicked ... we've not just implemented them ;-)
|
||||
Toast.makeText(this, "File selector not implemented, sorry! Enter the file path manually ;-)", Toast.LENGTH_LONG).show();
|
||||
break;
|
||||
|
||||
case R.id.buttonProcess:
|
||||
// button "process" pushed
|
||||
process();
|
||||
break;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
||||
/// Play audio file
|
||||
protected void playWavFile(String fileName)
|
||||
{
|
||||
File file2play = new File(fileName);
|
||||
Intent i = new Intent();
|
||||
i.setAction(android.content.Intent.ACTION_VIEW);
|
||||
i.setDataAndType(Uri.fromFile(file2play), "audio/wav");
|
||||
startActivity(i);
|
||||
}
|
||||
|
||||
|
||||
|
||||
/// Helper class that will execute the SoundTouch processing. As the processing may take
|
||||
/// some time, run it in background thread to avoid hanging of the UI.
|
||||
protected class ProcessTask extends AsyncTask<ProcessTask.Parameters, Integer, Long>
|
||||
{
|
||||
/// Helper class to store the SoundTouch file processing parameters
|
||||
public final class Parameters
|
||||
{
|
||||
String inFileName;
|
||||
String outFileName;
|
||||
float tempo;
|
||||
float pitch;
|
||||
}
|
||||
|
||||
|
||||
|
||||
/// Function that does the SoundTouch processing
|
||||
public final long doSoundTouchProcessing(Parameters params)
|
||||
{
|
||||
|
||||
SoundTouch st = new SoundTouch();
|
||||
st.setTempo(params.tempo);
|
||||
st.setPitchSemiTones(params.pitch);
|
||||
Log.i("SoundTouch", "process file " + params.inFileName);
|
||||
long startTime = System.currentTimeMillis();
|
||||
int res = st.processFile(params.inFileName, params.outFileName);
|
||||
long endTime = System.currentTimeMillis();
|
||||
float duration = (endTime - startTime) * 0.001f;
|
||||
|
||||
Log.i("SoundTouch", "process file done, duration = " + duration);
|
||||
appendToConsole("Processing done, duration " + duration + " sec.");
|
||||
if (res != 0)
|
||||
{
|
||||
String err = SoundTouch.getErrorString();
|
||||
appendToConsole("Failure: " + err);
|
||||
return -1L;
|
||||
}
|
||||
|
||||
// Play file if so is desirable
|
||||
if (checkBoxPlay.isChecked())
|
||||
{
|
||||
playWavFile(params.outFileName);
|
||||
}
|
||||
return 0L;
|
||||
}
|
||||
|
||||
|
||||
|
||||
/// Overloaded function that get called by the system to perform the background processing
|
||||
@Override
|
||||
protected Long doInBackground(Parameters... aparams)
|
||||
{
|
||||
return doSoundTouchProcessing(aparams[0]);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
||||
/// process a file with SoundTouch. Do the processing using a background processing
|
||||
/// task to avoid hanging of the UI
|
||||
protected void process()
|
||||
{
|
||||
try
|
||||
{
|
||||
ProcessTask task = new ProcessTask();
|
||||
ProcessTask.Parameters params = task.new Parameters();
|
||||
// parse processing parameters
|
||||
params.inFileName = editSourceFile.getText().toString();
|
||||
params.outFileName = editOutputFile.getText().toString();
|
||||
params.tempo = 0.01f * Float.parseFloat(editTempo.getText().toString());
|
||||
params.pitch = Float.parseFloat(editPitch.getText().toString());
|
||||
|
||||
// update UI about status
|
||||
appendToConsole("Process audio file :" + params.inFileName +" => " + params.outFileName);
|
||||
appendToConsole("Tempo = " + params.tempo);
|
||||
appendToConsole("Pitch adjust = " + params.pitch);
|
||||
|
||||
Toast.makeText(this, "Starting to process file " + params.inFileName + "...", Toast.LENGTH_SHORT).show();
|
||||
|
||||
// start SoundTouch processing in a background thread
|
||||
task.execute(params);
|
||||
// task.doSoundTouchProcessing(params); // this would run processing in main thread
|
||||
|
||||
}
|
||||
catch (Exception exp)
|
||||
{
|
||||
exp.printStackTrace();
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
79
externals/soundtouch/source/Android-lib/src/net/surina/soundtouch/SoundTouch.java
vendored
Normal file
79
externals/soundtouch/source/Android-lib/src/net/surina/soundtouch/SoundTouch.java
vendored
Normal file
@@ -0,0 +1,79 @@
|
||||
////////////////////////////////////////////////////////////////////////////////
|
||||
///
|
||||
/// Example class that invokes native SoundTouch routines through the JNI
|
||||
/// interface.
|
||||
///
|
||||
/// Author : Copyright (c) Olli Parviainen
|
||||
/// Author e-mail : oparviai 'at' iki.fi
|
||||
/// WWW : http://www.surina.net
|
||||
///
|
||||
////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
package net.surina.soundtouch;
|
||||
|
||||
public final class SoundTouch
|
||||
{
|
||||
// Native interface function that returns SoundTouch version string.
|
||||
// This invokes the native c++ routine defined in "soundtouch-jni.cpp".
|
||||
public native final static String getVersionString();
|
||||
|
||||
private native final void setTempo(long handle, float tempo);
|
||||
|
||||
private native final void setPitchSemiTones(long handle, float pitch);
|
||||
|
||||
private native final void setSpeed(long handle, float speed);
|
||||
|
||||
private native final int processFile(long handle, String inputFile, String outputFile);
|
||||
|
||||
public native final static String getErrorString();
|
||||
|
||||
private native final static long newInstance();
|
||||
|
||||
private native final void deleteInstance(long handle);
|
||||
|
||||
long handle = 0;
|
||||
|
||||
|
||||
public SoundTouch()
|
||||
{
|
||||
handle = newInstance();
|
||||
}
|
||||
|
||||
|
||||
public void close()
|
||||
{
|
||||
deleteInstance(handle);
|
||||
handle = 0;
|
||||
}
|
||||
|
||||
|
||||
public void setTempo(float tempo)
|
||||
{
|
||||
setTempo(handle, tempo);
|
||||
}
|
||||
|
||||
|
||||
public void setPitchSemiTones(float pitch)
|
||||
{
|
||||
setPitchSemiTones(handle, pitch);
|
||||
}
|
||||
|
||||
|
||||
public void setSpeed(float speed)
|
||||
{
|
||||
setSpeed(handle, speed);
|
||||
}
|
||||
|
||||
|
||||
public int processFile(String inputFile, String outputFile)
|
||||
{
|
||||
return processFile(handle, inputFile, outputFile);
|
||||
}
|
||||
|
||||
|
||||
// Load the native library upon startup
|
||||
static
|
||||
{
|
||||
System.loadLibrary("soundtouch");
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user