- Added SDL, libjpeg and libpng
- Added Android project and Java files
This commit is contained in:
@@ -0,0 +1,15 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
package="org.libsdl.app"
|
||||
android:versionCode="1"
|
||||
android:versionName="1.0">
|
||||
<application android:label="@string/app_name" android:icon="@drawable/icon">
|
||||
<activity android:name="SDLActivity"
|
||||
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>
|
||||
@@ -0,0 +1,17 @@
|
||||
# This file is used to override default values used by the Ant build system.
|
||||
#
|
||||
# This file must be checked in Version Control Systems, as it is
|
||||
# integral to the build system of your project.
|
||||
|
||||
# This file is only used by the Ant script.
|
||||
|
||||
# You can use this to override default values such as
|
||||
# 'source.dir' for the location of your java source folder and
|
||||
# 'out.dir' for the location of your output folder.
|
||||
|
||||
# You can also use it define how the release builds are signed by declaring
|
||||
# the following properties:
|
||||
# 'key.store' for the location of your keystore and
|
||||
# 'key.alias' for the name of the key to use.
|
||||
# The password will be asked during the build when you use the 'release' target.
|
||||
|
||||
@@ -0,0 +1,67 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<project name="Wagic" default="help">
|
||||
|
||||
<!-- The local.properties file is created and updated by the 'android' tool.
|
||||
It contains the path to the SDK. It should *NOT* be checked in in Version
|
||||
Control Systems. -->
|
||||
<property file="local.properties" />
|
||||
|
||||
<!-- The build.properties file can be created by you and is never touched
|
||||
by the 'android' tool. This is the place to change some of the default property values
|
||||
used by the Ant rules.
|
||||
Here are some properties you may want to change/update:
|
||||
|
||||
application.package
|
||||
the name of your application package as defined in the manifest. Used by the
|
||||
'uninstall' rule.
|
||||
source.dir
|
||||
the name of the source directory. Default is 'src'.
|
||||
out.dir
|
||||
the name of the output directory. Default is 'bin'.
|
||||
|
||||
Properties related to the SDK location or the project target should be updated
|
||||
using the 'android' tool with the 'update' action.
|
||||
|
||||
This file is an integral part of the build system for your application and
|
||||
should be checked in in Version Control Systems.
|
||||
|
||||
-->
|
||||
<property file="build.properties" />
|
||||
|
||||
<!-- The default.properties file is created and updated by the 'android' tool, as well
|
||||
as ADT.
|
||||
This file is an integral part of the build system for your application and
|
||||
should be checked in in Version Control Systems. -->
|
||||
<property file="default.properties" />
|
||||
|
||||
<!-- Custom Android task to deal with the project target, and import the proper rules.
|
||||
This requires ant 1.6.0 or above. -->
|
||||
<path id="android.antlibs">
|
||||
<pathelement path="${sdk.dir}/tools/lib/anttasks.jar" />
|
||||
<pathelement path="${sdk.dir}/tools/lib/sdklib.jar" />
|
||||
<pathelement path="${sdk.dir}/tools/lib/androidprefs.jar" />
|
||||
<pathelement path="${sdk.dir}/tools/lib/apkbuilder.jar" />
|
||||
<pathelement path="${sdk.dir}/tools/lib/jarutils.jar" />
|
||||
</path>
|
||||
|
||||
<taskdef name="setup"
|
||||
classname="com.android.ant.SetupTask"
|
||||
classpathref="android.antlibs" />
|
||||
|
||||
<!-- Execute the Android Setup task that will setup some properties specific to the target,
|
||||
and import the build rules files.
|
||||
|
||||
The rules file is imported from
|
||||
<SDK>/platforms/<target_platform>/templates/android_rules.xml
|
||||
|
||||
To customize some build steps for your project:
|
||||
- copy the content of the main node <project> from android_rules.xml
|
||||
- paste it in this build.xml below the <setup /> task.
|
||||
- disable the import by changing the setup task below to <setup import="false" />
|
||||
|
||||
This will ensure that the properties are setup correctly but that your customized
|
||||
build steps are used.
|
||||
-->
|
||||
<setup />
|
||||
|
||||
</project>
|
||||
@@ -0,0 +1,11 @@
|
||||
# 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 use,
|
||||
# "build.properties", and override values to adapt the script to your
|
||||
# project structure.
|
||||
|
||||
# Project target.
|
||||
target=Samsung Electronics Co., Ltd.:GALAXY Tab Addon:8
|
||||
@@ -0,0 +1,185 @@
|
||||
LOCAL_PATH := $(call my-dir)
|
||||
include $(CLEAR_VARS)
|
||||
|
||||
MY_LOCAL_PATH := $(LOCAL_PATH)
|
||||
LOCAL_MODULE := main
|
||||
|
||||
MY_WAGIC_ROOT := ../../../..
|
||||
JGE_PATH := $(MY_WAGIC_ROOT)/JGE
|
||||
MTG_PATH := $(MY_WAGIC_ROOT)/projects/mtg/
|
||||
SDL_PATH := $(JGE_PATH)/Dependencies/SDL
|
||||
BOOST_PATH := $(MY_WAGIC_ROOT)/Boost
|
||||
JPEG_PATH := $(JGE_PATH)/Dependencies/libjpeg
|
||||
PNG_PATH := $(JGE_PATH)/Dependencies/libpng
|
||||
|
||||
LOCAL_CFLAGS += -DLINUX -DANDROID -DSDL_CONFIG -D_DEBUG
|
||||
LOCAL_CFLAGS += -D_STLP_USE_SIMPLE_NODE_ALLOC
|
||||
LOCAL_CFLAGS += -D__arm__ -D_REENTRANT -D_GLIBCXX__PTHREADS
|
||||
LOCAL_STATIC_LIBRARIES := libpng libjpeg
|
||||
LOCAL_SHARED_LIBRARIES := SDL
|
||||
|
||||
LOCAL_C_INCLUDES := \
|
||||
$(LOCAL_PATH)/$(SDL_PATH)/include \
|
||||
$(LOCAL_PATH)/$(MTG_PATH)/include \
|
||||
$(LOCAL_PATH)/$(JGE_PATH)/include \
|
||||
$(LOCAL_PATH)/$(BOOST_PATH) \
|
||||
$(LOCAL_PATH)/$(JPEG_PATH) \
|
||||
$(LOCAL_PATH)/$(PNG_PATH) \
|
||||
|
||||
LOCAL_SRC_FILES := $(SDL_PATH)/src/main/android/SDL_android_main.cpp \
|
||||
$(MTG_PATH)/src/ActionElement.cpp \
|
||||
$(MTG_PATH)/src/ActionLayer.cpp \
|
||||
$(MTG_PATH)/src/ActionStack.cpp \
|
||||
$(MTG_PATH)/src/AIMomirPlayer.cpp \
|
||||
$(MTG_PATH)/src/AIPlayer.cpp \
|
||||
$(MTG_PATH)/src/AIStats.cpp \
|
||||
$(MTG_PATH)/src/AllAbilities.cpp \
|
||||
$(MTG_PATH)/src/CardDescriptor.cpp \
|
||||
$(MTG_PATH)/src/CardDisplay.cpp \
|
||||
$(MTG_PATH)/src/CardEffect.cpp \
|
||||
$(MTG_PATH)/src/CardGui.cpp \
|
||||
$(MTG_PATH)/src/CardPrimitive.cpp \
|
||||
$(MTG_PATH)/src/CardSelector.cpp \
|
||||
$(MTG_PATH)/src/CardSelectorSingleton.cpp \
|
||||
$(MTG_PATH)/src/Counters.cpp \
|
||||
$(MTG_PATH)/src/Credits.cpp \
|
||||
$(MTG_PATH)/src/Damage.cpp \
|
||||
$(MTG_PATH)/src/DamagerDamaged.cpp \
|
||||
$(MTG_PATH)/src/DeckDataWrapper.cpp \
|
||||
$(MTG_PATH)/src/DeckEditorMenu.cpp \
|
||||
$(MTG_PATH)/src/DeckManager.cpp \
|
||||
$(MTG_PATH)/src/DeckMenu.cpp \
|
||||
$(MTG_PATH)/src/DeckMenuItem.cpp \
|
||||
$(MTG_PATH)/src/DeckMetaData.cpp \
|
||||
$(MTG_PATH)/src/DeckStats.cpp \
|
||||
$(MTG_PATH)/src/DuelLayers.cpp \
|
||||
$(MTG_PATH)/src/Effects.cpp \
|
||||
$(MTG_PATH)/src/ExtraCost.cpp \
|
||||
$(MTG_PATH)/src/GameApp.cpp \
|
||||
$(MTG_PATH)/src/GameLauncher.cpp \
|
||||
$(MTG_PATH)/src/GameObserver.cpp \
|
||||
$(MTG_PATH)/src/GameOptions.cpp \
|
||||
$(MTG_PATH)/src/GameStateAwards.cpp \
|
||||
$(MTG_PATH)/src/GameState.cpp \
|
||||
$(MTG_PATH)/src/GameStateDeckViewer.cpp \
|
||||
$(MTG_PATH)/src/GameStateDuel.cpp \
|
||||
$(MTG_PATH)/src/GameStateMenu.cpp \
|
||||
$(MTG_PATH)/src/GameStateOptions.cpp \
|
||||
$(MTG_PATH)/src/GameStateShop.cpp \
|
||||
$(MTG_PATH)/src/GameStateStory.cpp \
|
||||
$(MTG_PATH)/src/GameStateTransitions.cpp \
|
||||
$(MTG_PATH)/src/GuiAvatars.cpp \
|
||||
$(MTG_PATH)/src/GuiBackground.cpp \
|
||||
$(MTG_PATH)/src/GuiCardsController.cpp \
|
||||
$(MTG_PATH)/src/GuiCombat.cpp \
|
||||
$(MTG_PATH)/src/GuiFrame.cpp \
|
||||
$(MTG_PATH)/src/GuiHand.cpp \
|
||||
$(MTG_PATH)/src/GuiLayers.cpp \
|
||||
$(MTG_PATH)/src/GuiMana.cpp \
|
||||
$(MTG_PATH)/src/GuiPhaseBar.cpp \
|
||||
$(MTG_PATH)/src/GuiPlay.cpp \
|
||||
$(MTG_PATH)/src/GuiStatic.cpp \
|
||||
$(MTG_PATH)/src/ManaCost.cpp \
|
||||
$(MTG_PATH)/src/ManaCostHybrid.cpp \
|
||||
$(MTG_PATH)/src/MenuItem.cpp \
|
||||
$(MTG_PATH)/src/MTGAbility.cpp \
|
||||
$(MTG_PATH)/src/MTGCard.cpp \
|
||||
$(MTG_PATH)/src/MTGCardInstance.cpp \
|
||||
$(MTG_PATH)/src/MTGDeck.cpp \
|
||||
$(MTG_PATH)/src/MTGDefinitions.cpp \
|
||||
$(MTG_PATH)/src/MTGGamePhase.cpp \
|
||||
$(MTG_PATH)/src/MTGGameZones.cpp \
|
||||
$(MTG_PATH)/src/MTGPack.cpp \
|
||||
$(MTG_PATH)/src/MTGRules.cpp \
|
||||
$(MTG_PATH)/src/ObjectAnalytics.cpp \
|
||||
$(MTG_PATH)/src/OptionItem.cpp \
|
||||
$(MTG_PATH)/src/PhaseRing.cpp \
|
||||
$(MTG_PATH)/src/Player.cpp \
|
||||
$(MTG_PATH)/src/PlayerData.cpp \
|
||||
$(MTG_PATH)/src/PlayGuiObject.cpp \
|
||||
$(MTG_PATH)/src/PlayGuiObjectController.cpp \
|
||||
$(MTG_PATH)/src/PlayRestrictions.cpp \
|
||||
$(MTG_PATH)/src/Pos.cpp \
|
||||
$(MTG_PATH)/src/PriceList.cpp \
|
||||
$(MTG_PATH)/src/ReplacementEffects.cpp \
|
||||
$(MTG_PATH)/src/Rules.cpp \
|
||||
$(MTG_PATH)/src/SimpleMenu.cpp \
|
||||
$(MTG_PATH)/src/SimpleMenuItem.cpp \
|
||||
$(MTG_PATH)/src/SimplePad.cpp \
|
||||
$(MTG_PATH)/src/SimplePopup.cpp \
|
||||
$(MTG_PATH)/src/StoryFlow.cpp \
|
||||
$(MTG_PATH)/src/Subtypes.cpp \
|
||||
$(MTG_PATH)/src/StyleManager.cpp \
|
||||
$(MTG_PATH)/src/TargetChooser.cpp \
|
||||
$(MTG_PATH)/src/TargetsList.cpp \
|
||||
$(MTG_PATH)/src/Tasks.cpp \
|
||||
$(MTG_PATH)/src/TestSuiteAI.cpp \
|
||||
$(MTG_PATH)/src/TextScroller.cpp \
|
||||
$(MTG_PATH)/src/ThisDescriptor.cpp \
|
||||
$(MTG_PATH)/src/Token.cpp \
|
||||
$(MTG_PATH)/src/Translate.cpp \
|
||||
$(MTG_PATH)/src/TranslateKeys.cpp \
|
||||
$(MTG_PATH)/src/Trash.cpp \
|
||||
$(MTG_PATH)/src/utils.cpp \
|
||||
$(MTG_PATH)/src/WCachedResource.cpp \
|
||||
$(MTG_PATH)/src/WDataSrc.cpp \
|
||||
$(MTG_PATH)/src/WEvent.cpp \
|
||||
$(MTG_PATH)/src/WFilter.cpp \
|
||||
$(MTG_PATH)/src/WFont.cpp \
|
||||
$(MTG_PATH)/src/WGui.cpp \
|
||||
$(MTG_PATH)/src/WResourceManager.cpp \
|
||||
$(MTG_PATH)/src/NetworkPlayer.cpp \
|
||||
$(JGE_PATH)/src/SDLmain.cpp \
|
||||
$(JGE_PATH)/src/Encoding.cpp \
|
||||
$(JGE_PATH)/src/JAnimator.cpp \
|
||||
$(JGE_PATH)/src/JApp.cpp \
|
||||
$(JGE_PATH)/src/JDistortionMesh.cpp \
|
||||
$(JGE_PATH)/src/JFileSystem.cpp \
|
||||
$(JGE_PATH)/src/JGameObject.cpp \
|
||||
$(JGE_PATH)/src/JGE.cpp \
|
||||
$(JGE_PATH)/src/JGui.cpp \
|
||||
$(JGE_PATH)/src/JLogger.cpp \
|
||||
$(JGE_PATH)/src/JLBFont.cpp \
|
||||
$(JGE_PATH)/src/JMD2Model.cpp \
|
||||
$(JGE_PATH)/src/JOBJModel.cpp \
|
||||
$(JGE_PATH)/src/JParticle.cpp \
|
||||
$(JGE_PATH)/src/JParticleEffect.cpp \
|
||||
$(JGE_PATH)/src/JParticleEmitter.cpp \
|
||||
$(JGE_PATH)/src/JParticleSystem.cpp \
|
||||
$(JGE_PATH)/src/JResourceManager.cpp \
|
||||
$(JGE_PATH)/src/JSpline.cpp \
|
||||
$(JGE_PATH)/src/JSprite.cpp \
|
||||
$(JGE_PATH)/src/Vector2D.cpp \
|
||||
$(JGE_PATH)/src/tinyxml/tinystr.cpp \
|
||||
$(JGE_PATH)/src/tinyxml/tinyxml.cpp \
|
||||
$(JGE_PATH)/src/tinyxml/tinyxmlerror.cpp \
|
||||
$(JGE_PATH)/src/tinyxml/tinyxmlparser.cpp \
|
||||
$(JGE_PATH)/src/hge/hgecolor.cpp \
|
||||
$(JGE_PATH)/src/hge/hgedistort.cpp \
|
||||
$(JGE_PATH)/src/hge/hgefont.cpp \
|
||||
$(JGE_PATH)/src/hge/hgeparticle.cpp \
|
||||
$(JGE_PATH)/src/hge/hgerect.cpp \
|
||||
$(JGE_PATH)/src/hge/hgevector.cpp \
|
||||
$(JGE_PATH)/src/unzip/ioapi.c \
|
||||
$(JGE_PATH)/src/unzip/mztools.c \
|
||||
$(JGE_PATH)/src/unzip/unzip.c \
|
||||
$(JGE_PATH)/src/pc/JSfx.cpp \
|
||||
$(JGE_PATH)/src/pc/JGfx.cpp \
|
||||
$(JGE_PATH)/src/JNetwork.cpp \
|
||||
$(JGE_PATH)/src/pc/JSocket.cpp
|
||||
|
||||
LOCAL_LDLIBS := -lGLESv1_CM -llog -lz
|
||||
|
||||
include $(BUILD_SHARED_LIBRARY)
|
||||
|
||||
# PNG static lib
|
||||
include $(MY_LOCAL_PATH)/$(PNG_PATH)/Android.mk
|
||||
include $(CLEAR_VARS)
|
||||
|
||||
# JPEG static lib
|
||||
include $(MY_LOCAL_PATH)/$(JPEG_PATH)/Android.mk
|
||||
include $(CLEAR_VARS)
|
||||
|
||||
# SDL dynamic lib
|
||||
include $(MY_LOCAL_PATH)/$(SDL_PATH)/Android.mk
|
||||
include $(CLEAR_VARS)
|
||||
@@ -0,0 +1,5 @@
|
||||
APP_PROJECT_PATH := $(call my-dir)/..
|
||||
APP_CPPFLAGS += -frtti -fexceptions
|
||||
APP_ABI := armeabi armeabi-v7a
|
||||
APP_STL := gnustl_static
|
||||
APP_MODULES := libpng libjpeg main SDL
|
||||
Binary file not shown.
|
After Width: | Height: | Size: 8.5 KiB |
Binary file not shown.
|
After Width: | Height: | Size: 2.8 KiB |
Binary file not shown.
|
After Width: | Height: | Size: 4.4 KiB |
@@ -0,0 +1,13 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
android:orientation="vertical"
|
||||
android:layout_width="fill_parent"
|
||||
android:layout_height="fill_parent"
|
||||
>
|
||||
<TextView
|
||||
android:layout_width="fill_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:text="Hello World, Wagic"
|
||||
/>
|
||||
</LinearLayout>
|
||||
|
||||
@@ -0,0 +1,4 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<resources>
|
||||
<string name="app_name">Wagic</string>
|
||||
</resources>
|
||||
@@ -0,0 +1,495 @@
|
||||
package org.libsdl.app;
|
||||
|
||||
import javax.microedition.khronos.egl.EGLConfig;
|
||||
import javax.microedition.khronos.opengles.GL10;
|
||||
import javax.microedition.khronos.egl.*;
|
||||
|
||||
import android.app.*;
|
||||
import android.content.*;
|
||||
import android.view.*;
|
||||
import android.os.*;
|
||||
import android.util.Log;
|
||||
import android.graphics.*;
|
||||
import android.text.method.*;
|
||||
import android.text.*;
|
||||
import android.media.*;
|
||||
import android.hardware.*;
|
||||
import android.content.*;
|
||||
|
||||
import java.lang.*;
|
||||
|
||||
|
||||
/**
|
||||
SDL Activity
|
||||
*/
|
||||
public class SDLActivity extends Activity {
|
||||
|
||||
// Main components
|
||||
private static SDLActivity mSingleton;
|
||||
private static SDLSurface mSurface;
|
||||
|
||||
// Audio
|
||||
private static Thread mAudioThread;
|
||||
private static AudioTrack mAudioTrack;
|
||||
|
||||
// Load the .so
|
||||
static {
|
||||
System.loadLibrary("SDL");
|
||||
//System.loadLibrary("SDL_image");
|
||||
//System.loadLibrary("SDL_mixer");
|
||||
//System.loadLibrary("SDL_ttf");
|
||||
System.loadLibrary("main");
|
||||
}
|
||||
|
||||
// Setup
|
||||
protected void onCreate(Bundle savedInstanceState) {
|
||||
//Log.v("SDL", "onCreate()");
|
||||
super.onCreate(savedInstanceState);
|
||||
|
||||
// So we can call stuff from static callbacks
|
||||
mSingleton = this;
|
||||
|
||||
// Set up the surface
|
||||
mSurface = new SDLSurface(getApplication());
|
||||
setContentView(mSurface);
|
||||
SurfaceHolder holder = mSurface.getHolder();
|
||||
holder.setType(SurfaceHolder.SURFACE_TYPE_GPU);
|
||||
}
|
||||
|
||||
// Events
|
||||
protected void onPause() {
|
||||
//Log.v("SDL", "onPause()");
|
||||
super.onPause();
|
||||
}
|
||||
|
||||
protected void onResume() {
|
||||
//Log.v("SDL", "onResume()");
|
||||
super.onResume();
|
||||
}
|
||||
|
||||
// Messages from the SDLMain thread
|
||||
static int COMMAND_CHANGE_TITLE = 1;
|
||||
|
||||
// Handler for the messages
|
||||
Handler commandHandler = new Handler() {
|
||||
public void handleMessage(Message msg) {
|
||||
if (msg.arg1 == COMMAND_CHANGE_TITLE) {
|
||||
setTitle((String)msg.obj);
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
// Send a message from the SDLMain thread
|
||||
void sendCommand(int command, Object data) {
|
||||
Message msg = commandHandler.obtainMessage();
|
||||
msg.arg1 = command;
|
||||
msg.obj = data;
|
||||
commandHandler.sendMessage(msg);
|
||||
}
|
||||
|
||||
// C functions we call
|
||||
public static native void nativeInit();
|
||||
public static native void nativeQuit();
|
||||
public static native void onNativeResize(int x, int y, int format);
|
||||
public static native void onNativeKeyDown(int keycode);
|
||||
public static native void onNativeKeyUp(int keycode);
|
||||
public static native void onNativeTouch(int action, float x,
|
||||
float y, float p);
|
||||
public static native void onNativeAccel(float x, float y, float z);
|
||||
public static native void nativeRunAudioThread();
|
||||
|
||||
|
||||
// Java functions called from C
|
||||
|
||||
public static boolean createGLContext(int majorVersion, int minorVersion) {
|
||||
return mSurface.initEGL(majorVersion, minorVersion);
|
||||
}
|
||||
|
||||
public static void flipBuffers() {
|
||||
mSurface.flipEGL();
|
||||
}
|
||||
|
||||
public static void setActivityTitle(String title) {
|
||||
// Called from SDLMain() thread and can't directly affect the view
|
||||
mSingleton.sendCommand(COMMAND_CHANGE_TITLE, title);
|
||||
}
|
||||
|
||||
// Audio
|
||||
private static Object buf;
|
||||
|
||||
public static Object audioInit(int sampleRate, boolean is16Bit, boolean isStereo, int desiredFrames) {
|
||||
int channelConfig = isStereo ? AudioFormat.CHANNEL_CONFIGURATION_STEREO : AudioFormat.CHANNEL_CONFIGURATION_MONO;
|
||||
int audioFormat = is16Bit ? AudioFormat.ENCODING_PCM_16BIT : AudioFormat.ENCODING_PCM_8BIT;
|
||||
int frameSize = (isStereo ? 2 : 1) * (is16Bit ? 2 : 1);
|
||||
|
||||
Log.v("SDL", "SDL audio: wanted " + (isStereo ? "stereo" : "mono") + " " + (is16Bit ? "16-bit" : "8-bit") + " " + ((float)sampleRate / 1000f) + "kHz, " + desiredFrames + " frames buffer");
|
||||
|
||||
// Let the user pick a larger buffer if they really want -- but ye
|
||||
// gods they probably shouldn't, the minimums are horrifyingly high
|
||||
// latency already
|
||||
desiredFrames = Math.max(desiredFrames, (AudioTrack.getMinBufferSize(sampleRate, channelConfig, audioFormat) + frameSize - 1) / frameSize);
|
||||
|
||||
mAudioTrack = new AudioTrack(AudioManager.STREAM_MUSIC, sampleRate,
|
||||
channelConfig, audioFormat, desiredFrames * frameSize, AudioTrack.MODE_STREAM);
|
||||
|
||||
audioStartThread();
|
||||
|
||||
Log.v("SDL", "SDL audio: got " + ((mAudioTrack.getChannelCount() >= 2) ? "stereo" : "mono") + " " + ((mAudioTrack.getAudioFormat() == AudioFormat.ENCODING_PCM_16BIT) ? "16-bit" : "8-bit") + " " + ((float)mAudioTrack.getSampleRate() / 1000f) + "kHz, " + desiredFrames + " frames buffer");
|
||||
|
||||
if (is16Bit) {
|
||||
buf = new short[desiredFrames * (isStereo ? 2 : 1)];
|
||||
} else {
|
||||
buf = new byte[desiredFrames * (isStereo ? 2 : 1)];
|
||||
}
|
||||
return buf;
|
||||
}
|
||||
|
||||
public static void audioStartThread() {
|
||||
mAudioThread = new Thread(new Runnable() {
|
||||
public void run() {
|
||||
mAudioTrack.play();
|
||||
nativeRunAudioThread();
|
||||
}
|
||||
});
|
||||
|
||||
// I'd take REALTIME if I could get it!
|
||||
mAudioThread.setPriority(Thread.MAX_PRIORITY);
|
||||
mAudioThread.start();
|
||||
}
|
||||
|
||||
public static void audioWriteShortBuffer(short[] buffer) {
|
||||
for (int i = 0; i < buffer.length; ) {
|
||||
int result = mAudioTrack.write(buffer, i, buffer.length - i);
|
||||
if (result > 0) {
|
||||
i += result;
|
||||
} else if (result == 0) {
|
||||
try {
|
||||
Thread.sleep(1);
|
||||
} catch(InterruptedException e) {
|
||||
// Nom nom
|
||||
}
|
||||
} else {
|
||||
Log.w("SDL", "SDL audio: error return from write(short)");
|
||||
return;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public static void audioWriteByteBuffer(byte[] buffer) {
|
||||
for (int i = 0; i < buffer.length; ) {
|
||||
int result = mAudioTrack.write(buffer, i, buffer.length - i);
|
||||
if (result > 0) {
|
||||
i += result;
|
||||
} else if (result == 0) {
|
||||
try {
|
||||
Thread.sleep(1);
|
||||
} catch(InterruptedException e) {
|
||||
// Nom nom
|
||||
}
|
||||
} else {
|
||||
Log.w("SDL", "SDL audio: error return from write(short)");
|
||||
return;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public static void audioQuit() {
|
||||
if (mAudioThread != null) {
|
||||
try {
|
||||
mAudioThread.join();
|
||||
} catch(Exception e) {
|
||||
Log.v("SDL", "Problem stopping audio thread: " + e);
|
||||
}
|
||||
mAudioThread = null;
|
||||
|
||||
//Log.v("SDL", "Finished waiting for audio thread");
|
||||
}
|
||||
|
||||
if (mAudioTrack != null) {
|
||||
mAudioTrack.stop();
|
||||
mAudioTrack = null;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
Simple nativeInit() runnable
|
||||
*/
|
||||
class SDLMain implements Runnable {
|
||||
public void run() {
|
||||
// Runs SDL_main()
|
||||
SDLActivity.nativeInit();
|
||||
|
||||
//Log.v("SDL", "SDL thread terminated");
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
SDLSurface. This is what we draw on, so we need to know when it's created
|
||||
in order to do anything useful.
|
||||
|
||||
Because of this, that's where we set up the SDL thread
|
||||
*/
|
||||
class SDLSurface extends SurfaceView implements SurfaceHolder.Callback,
|
||||
View.OnKeyListener, View.OnTouchListener, SensorEventListener {
|
||||
|
||||
// This is what SDL runs in. It invokes SDL_main(), eventually
|
||||
private Thread mSDLThread;
|
||||
|
||||
// EGL private objects
|
||||
private EGLContext mEGLContext;
|
||||
private EGLSurface mEGLSurface;
|
||||
private EGLDisplay mEGLDisplay;
|
||||
|
||||
// Sensors
|
||||
private static SensorManager mSensorManager;
|
||||
|
||||
// Startup
|
||||
public SDLSurface(Context context) {
|
||||
super(context);
|
||||
getHolder().addCallback(this);
|
||||
|
||||
setFocusable(true);
|
||||
setFocusableInTouchMode(true);
|
||||
requestFocus();
|
||||
setOnKeyListener(this);
|
||||
setOnTouchListener(this);
|
||||
|
||||
mSensorManager = (SensorManager)context.getSystemService("sensor");
|
||||
}
|
||||
|
||||
// Called when we have a valid drawing surface
|
||||
public void surfaceCreated(SurfaceHolder holder) {
|
||||
//Log.v("SDL", "surfaceCreated()");
|
||||
|
||||
enableSensor(Sensor.TYPE_ACCELEROMETER, true);
|
||||
}
|
||||
|
||||
// Called when we lose the surface
|
||||
public void surfaceDestroyed(SurfaceHolder holder) {
|
||||
//Log.v("SDL", "surfaceDestroyed()");
|
||||
|
||||
// Send a quit message to the application
|
||||
SDLActivity.nativeQuit();
|
||||
|
||||
// Now wait for the SDL thread to quit
|
||||
if (mSDLThread != null) {
|
||||
try {
|
||||
mSDLThread.join();
|
||||
} catch(Exception e) {
|
||||
Log.v("SDL", "Problem stopping thread: " + e);
|
||||
}
|
||||
mSDLThread = null;
|
||||
|
||||
//Log.v("SDL", "Finished waiting for SDL thread");
|
||||
}
|
||||
|
||||
enableSensor(Sensor.TYPE_ACCELEROMETER, false);
|
||||
}
|
||||
|
||||
// Called when the surface is resized
|
||||
public void surfaceChanged(SurfaceHolder holder,
|
||||
int format, int width, int height) {
|
||||
//Log.v("SDL", "surfaceChanged()");
|
||||
|
||||
int sdlFormat = 0x85151002; // SDL_PIXELFORMAT_RGB565 by default
|
||||
switch (format) {
|
||||
case PixelFormat.A_8:
|
||||
Log.v("SDL", "pixel format A_8");
|
||||
break;
|
||||
case PixelFormat.LA_88:
|
||||
Log.v("SDL", "pixel format LA_88");
|
||||
break;
|
||||
case PixelFormat.L_8:
|
||||
Log.v("SDL", "pixel format L_8");
|
||||
break;
|
||||
case PixelFormat.RGBA_4444:
|
||||
Log.v("SDL", "pixel format RGBA_4444");
|
||||
sdlFormat = 0x85421002; // SDL_PIXELFORMAT_RGBA4444
|
||||
break;
|
||||
case PixelFormat.RGBA_5551:
|
||||
Log.v("SDL", "pixel format RGBA_5551");
|
||||
sdlFormat = 0x85441002; // SDL_PIXELFORMAT_RGBA5551
|
||||
break;
|
||||
case PixelFormat.RGBA_8888:
|
||||
Log.v("SDL", "pixel format RGBA_8888");
|
||||
sdlFormat = 0x86462004; // SDL_PIXELFORMAT_RGBA8888
|
||||
break;
|
||||
case PixelFormat.RGBX_8888:
|
||||
Log.v("SDL", "pixel format RGBX_8888");
|
||||
sdlFormat = 0x86262004; // SDL_PIXELFORMAT_RGBX8888
|
||||
break;
|
||||
case PixelFormat.RGB_332:
|
||||
Log.v("SDL", "pixel format RGB_332");
|
||||
sdlFormat = 0x84110801; // SDL_PIXELFORMAT_RGB332
|
||||
break;
|
||||
case PixelFormat.RGB_565:
|
||||
Log.v("SDL", "pixel format RGB_565");
|
||||
sdlFormat = 0x85151002; // SDL_PIXELFORMAT_RGB565
|
||||
break;
|
||||
case PixelFormat.RGB_888:
|
||||
Log.v("SDL", "pixel format RGB_888");
|
||||
// Not sure this is right, maybe SDL_PIXELFORMAT_RGB24 instead?
|
||||
sdlFormat = 0x86161804; // SDL_PIXELFORMAT_RGB888
|
||||
break;
|
||||
default:
|
||||
Log.v("SDL", "pixel format unknown " + format);
|
||||
break;
|
||||
}
|
||||
SDLActivity.onNativeResize(width, height, sdlFormat);
|
||||
|
||||
// Now start up the C app thread
|
||||
if (mSDLThread == null) {
|
||||
mSDLThread = new Thread(new SDLMain(), "SDLThread");
|
||||
mSDLThread.start();
|
||||
}
|
||||
}
|
||||
|
||||
// unused
|
||||
public void onDraw(Canvas canvas) {}
|
||||
|
||||
|
||||
// EGL functions
|
||||
public boolean initEGL(int majorVersion, int minorVersion) {
|
||||
Log.v("SDL", "Starting up OpenGL ES " + majorVersion + "." + minorVersion);
|
||||
|
||||
try {
|
||||
EGL10 egl = (EGL10)EGLContext.getEGL();
|
||||
|
||||
EGLDisplay dpy = egl.eglGetDisplay(EGL10.EGL_DEFAULT_DISPLAY);
|
||||
|
||||
int[] version = new int[2];
|
||||
egl.eglInitialize(dpy, version);
|
||||
|
||||
int EGL_OPENGL_ES_BIT = 1;
|
||||
int EGL_OPENGL_ES2_BIT = 4;
|
||||
int renderableType = 0;
|
||||
if (majorVersion == 2) {
|
||||
renderableType = EGL_OPENGL_ES2_BIT;
|
||||
} else if (majorVersion == 1) {
|
||||
renderableType = EGL_OPENGL_ES_BIT;
|
||||
}
|
||||
int[] configSpec = {
|
||||
//EGL10.EGL_DEPTH_SIZE, 16,
|
||||
EGL10.EGL_RENDERABLE_TYPE, renderableType,
|
||||
EGL10.EGL_NONE
|
||||
};
|
||||
EGLConfig[] configs = new EGLConfig[1];
|
||||
int[] num_config = new int[1];
|
||||
if (!egl.eglChooseConfig(dpy, configSpec, configs, 1, num_config) || num_config[0] == 0) {
|
||||
Log.e("SDL", "No EGL config available");
|
||||
return false;
|
||||
}
|
||||
EGLConfig config = configs[0];
|
||||
|
||||
EGLContext ctx = egl.eglCreateContext(dpy, config, EGL10.EGL_NO_CONTEXT, null);
|
||||
if (ctx == EGL10.EGL_NO_CONTEXT) {
|
||||
Log.e("SDL", "Couldn't create context");
|
||||
return false;
|
||||
}
|
||||
|
||||
EGLSurface surface = egl.eglCreateWindowSurface(dpy, config, this, null);
|
||||
if (surface == EGL10.EGL_NO_SURFACE) {
|
||||
Log.e("SDL", "Couldn't create surface");
|
||||
return false;
|
||||
}
|
||||
|
||||
if (!egl.eglMakeCurrent(dpy, surface, surface, ctx)) {
|
||||
Log.e("SDL", "Couldn't make context current");
|
||||
return false;
|
||||
}
|
||||
|
||||
mEGLContext = ctx;
|
||||
mEGLDisplay = dpy;
|
||||
mEGLSurface = surface;
|
||||
|
||||
} catch(Exception e) {
|
||||
Log.v("SDL", e + "");
|
||||
for (StackTraceElement s : e.getStackTrace()) {
|
||||
Log.v("SDL", s.toString());
|
||||
}
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
// EGL buffer flip
|
||||
public void flipEGL() {
|
||||
try {
|
||||
EGL10 egl = (EGL10)EGLContext.getEGL();
|
||||
|
||||
egl.eglWaitNative(EGL10.EGL_NATIVE_RENDERABLE, null);
|
||||
|
||||
// drawing here
|
||||
|
||||
egl.eglWaitGL();
|
||||
|
||||
egl.eglSwapBuffers(mEGLDisplay, mEGLSurface);
|
||||
|
||||
|
||||
} catch(Exception e) {
|
||||
Log.v("SDL", "flipEGL(): " + e);
|
||||
for (StackTraceElement s : e.getStackTrace()) {
|
||||
Log.v("SDL", s.toString());
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Key events
|
||||
public boolean onKey(View v, int keyCode, KeyEvent event) {
|
||||
|
||||
if (event.getAction() == KeyEvent.ACTION_DOWN) {
|
||||
//Log.v("SDL", "key down: " + keyCode);
|
||||
SDLActivity.onNativeKeyDown(keyCode);
|
||||
return true;
|
||||
}
|
||||
else if (event.getAction() == KeyEvent.ACTION_UP) {
|
||||
//Log.v("SDL", "key up: " + keyCode);
|
||||
SDLActivity.onNativeKeyUp(keyCode);
|
||||
return true;
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
// Touch events
|
||||
public boolean onTouch(View v, MotionEvent event) {
|
||||
|
||||
int action = event.getAction();
|
||||
float x = event.getX();
|
||||
float y = event.getY();
|
||||
float p = event.getPressure();
|
||||
|
||||
// TODO: Anything else we need to pass?
|
||||
SDLActivity.onNativeTouch(action, x, y, p);
|
||||
return true;
|
||||
}
|
||||
|
||||
// Sensor events
|
||||
public void enableSensor(int sensortype, boolean enabled) {
|
||||
// TODO: This uses getDefaultSensor - what if we have >1 accels?
|
||||
if (enabled) {
|
||||
mSensorManager.registerListener(this,
|
||||
mSensorManager.getDefaultSensor(sensortype),
|
||||
SensorManager.SENSOR_DELAY_GAME, null);
|
||||
} else {
|
||||
mSensorManager.unregisterListener(this,
|
||||
mSensorManager.getDefaultSensor(sensortype));
|
||||
}
|
||||
}
|
||||
|
||||
public void onAccuracyChanged(Sensor sensor, int accuracy) {
|
||||
// TODO
|
||||
}
|
||||
|
||||
public void onSensorChanged(SensorEvent event) {
|
||||
if (event.sensor.getType() == Sensor.TYPE_ACCELEROMETER) {
|
||||
SDLActivity.onNativeAccel(event.values[0],
|
||||
event.values[1],
|
||||
event.values[2]);
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user