enable pause/resume on the java side
authorXeli
Thu, 26 Jan 2012 02:06:57 +0100
changeset 6599 1d3746138113
parent 6596 4c06ea12de1c (diff)
parent 6598 fa518383563b (current diff)
child 6600 5810e42d8375
enable pause/resume on the java side
project_files/Android-build/SDL-android-project/src/org/hedgewars/hedgeroid/SDLActivity.java
--- a/hedgewars/uGears.pas	Thu Jan 26 02:06:16 2012 +0100
+++ b/hedgewars/uGears.pas	Thu Jan 26 02:06:57 2012 +0100
@@ -418,10 +418,10 @@
                 and (not PlacingHogs)
                 and (CurrentHedgehog^.Gear <> nil)
                 and ((CurrentHedgehog^.Gear^.State and gstAttacked) = 0) then
-                    AddVoice(sndHurry, CurrentTeam^.voicepack);
+                    PlaySound(sndHurry, CurrentTeam^.voicepack);
             if ReadyTimeLeft > 0 then
                 begin
-                if ReadyTimeLeft = 2000 then
+                if (ReadyTimeLeft = 2000) and (LastVoice.snd = sndNone) then
                     AddVoice(sndComeonthen, CurrentTeam^.voicepack);
                 dec(ReadyTimeLeft)
                 end
--- a/project_files/Android-build/SDL-android-project/src/org/hedgewars/hedgeroid/SDLActivity.java	Thu Jan 26 02:06:16 2012 +0100
+++ b/project_files/Android-build/SDL-android-project/src/org/hedgewars/hedgeroid/SDLActivity.java	Thu Jan 26 02:06:57 2012 +0100
@@ -34,189 +34,196 @@
 
 /**
     SDL Activity
-*/
+ */
 public class SDLActivity extends Activity {
 
-    // Main components
-    public static SDLActivity mSingleton;
-    private static SDLSurface mSurface;
+	// Main components
+	public static SDLActivity mSingleton;
+	private static SDLSurface mSurface;
 
-    // This is what SDL runs in. It invokes SDL_main(), eventually
-    private static Thread mSDLThread;
+	// This is what SDL runs in. It invokes SDL_main(), eventually
+	private static Thread mSDLThread;
+
+	// Audio
+	private static Thread mAudioThread;
+	private static AudioTrack mAudioTrack;
 
-    // Audio
-    private static Thread mAudioThread;
-    private static AudioTrack mAudioTrack;
+	// EGL private objects
+	private static EGLContext  mEGLContext;
+	private static EGLSurface  mEGLSurface;
+	private static EGLDisplay  mEGLDisplay;
+	private static EGLConfig   mEGLConfig;
+	private static int mGLMajor, mGLMinor;
 
-    // EGL private objects
-    private static EGLContext  mEGLContext;
-    private static EGLSurface  mEGLSurface;
-    private static EGLDisplay  mEGLDisplay;
-    private static EGLConfig   mEGLConfig;
-    private static int mGLMajor, mGLMinor;
+	// Load the .so
+	static {
+		System.loadLibrary("SDL");
+		//System.loadLibrary("SDL_image");
+		//System.loadLibrary("SDL_mixer");
+		//System.loadLibrary("SDL_ttf");
+		System.loadLibrary("main");
+	}
 
-    // 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
+		GameConfig config = getIntent().getParcelableExtra("config");
 
-    // Setup
-    protected void onCreate(Bundle savedInstanceState) {
-        //Log.v("SDL", "onCreate()");
-        super.onCreate(savedInstanceState);
-        
-        // So we can call stuff from static callbacks
-        mSingleton = this;
+		mSurface = new SDLSurface(getApplication(), config);
+		setContentView(mSurface);
+		SurfaceHolder holder = mSurface.getHolder();
+	}
+
+	// Events
+	protected void onPause() {
+		Log.v("SDL", "onPause()");
+		super.onPause();
 
-        // Set up the surface
-        GameConfig config = getIntent().getParcelableExtra("config");
-        
-        mSurface = new SDLSurface(getApplication(), config);
-        setContentView(mSurface);
-        SurfaceHolder holder = mSurface.getHolder();
-    }
+		if(mEGLDisplay != null && mEGLContext != null){
+			EGL10 egl = (EGL10)EGLContext.getEGL();
+			egl.eglDestroyContext(mEGLDisplay, mEGLContext);
+			mEGLDisplay = null;
+			mEGLContext = null;
+		}
 
-    // Events
-    protected void onPause() {
-        Log.v("SDL", "onPause()");
-        super.onPause();
-        SDLActivity.nativePause();
-    }
+		SDLActivity.nativePause();
+	}
 
-    protected void onResume() {
-        Log.v("SDL", "onResume()");
-        super.onResume();
-        SDLActivity.nativeResume();
-    }
-    
-    public void onBackPressed(){
-    	super.onBackPressed();
-    	PascalExports.HWterminate(true);
-    }
+	protected void onResume() {
+		Log.v("SDL", "onResume()");
+		super.onResume();
+	}
+
+	public void onBackPressed(){
+		super.onBackPressed();
+		PascalExports.HWterminate(true);
+	}
 
-    protected void onDestroy() {
-        super.onDestroy();
-        Log.v("SDL", "onDestroy()");
-        // Send a quit message to the application
-        SDLActivity.nativeQuit();
+	protected void onDestroy() {
+		super.onDestroy();
+		Log.v("SDL", "onDestroy()");
+		// 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;
+		// 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");
-        }
-    }
+			//Log.v("SDL", "Finished waiting for SDL thread");
+		}
+	}
 
-    // Messages from the SDLMain thread
-    static int COMMAND_CHANGE_TITLE = 1;
+	// 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);
-            }
-        }
-    };
+	// 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);
-    }
+	// 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(String...args);
-    public static native void nativeQuit();
-    public static native void nativePause();
-    public static native void nativeResume();
-    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 touchDevId, int pointerFingerId,
-                                            int action, float x, 
-                                            float y, float p);
-    public static native void onNativeAccel(float x, float y, float z);
-    public static native void nativeRunAudioThread();
+	// C functions we call
+	public static native void nativeInit(String...args);
+	public static native void nativeQuit();
+	public static native void nativePause();
+	public static native void nativeResume();
+	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 touchDevId, int pointerFingerId,
+			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
+	// Java functions called from C
 
-    public static boolean createGLContext(int majorVersion, int minorVersion) {
-        return initEGL(majorVersion, minorVersion);
-    }
+	public static boolean createGLContext(int majorVersion, int minorVersion) {
+		return initEGL(majorVersion, minorVersion);
+	}
 
-    public static void flipBuffers() {
-        flipEGL();
-    }
+	public static void flipBuffers() {
+		flipEGL();
+	}
 
-    public static void setActivityTitle(String title) {
-        // Called from SDLMain() thread and can't directly affect the view
-        mSingleton.sendCommand(COMMAND_CHANGE_TITLE, title);
-    }
+	public static void setActivityTitle(String title) {
+		// Called from SDLMain() thread and can't directly affect the view
+		mSingleton.sendCommand(COMMAND_CHANGE_TITLE, title);
+	}
 
-    public static Context getContext() {
-        return mSingleton;
-    }
+	public static Context getContext() {
+		return mSingleton;
+	}
 
-    public static void startApp(int width, int height, GameConfig config) {
-        // Start up the C app thread
-        if (mSDLThread == null) {
-            mSDLThread = new Thread(new SDLMain(width, height, config), "SDLThread");
-            mSDLThread.start();
-        }
-        else {
-            SDLActivity.nativeResume();
-        }
-    }
+	public static void startApp(int width, int height, GameConfig config) {
+		// Start up the C app thread
+		if (mSDLThread == null) {
+			mSDLThread = new Thread(new SDLMain(width, height, config), "SDLThread");
+			mSDLThread.start();
+		}
+		else {
+			SDLActivity.nativeResume();
+		}
+	}
 
-    // EGL functions
-    public static boolean initEGL(int majorVersion, int minorVersion) {
-        if (SDLActivity.mEGLDisplay == null) {
-            //Log.v("SDL", "Starting up OpenGL ES " + majorVersion + "." + minorVersion);
+	// EGL functions
+	public static boolean initEGL(int majorVersion, int minorVersion) {
+		if (SDLActivity.mEGLDisplay == null) {
+			//Log.v("SDL", "Starting up OpenGL ES " + majorVersion + "." + minorVersion);
 
-            try {
-                EGL10 egl = (EGL10)EGLContext.getEGL();
+			try {
+				EGL10 egl = (EGL10)EGLContext.getEGL();
 
-                EGLDisplay dpy = egl.eglGetDisplay(EGL10.EGL_DEFAULT_DISPLAY);
+				EGLDisplay dpy = egl.eglGetDisplay(EGL10.EGL_DEFAULT_DISPLAY);
 
-                int[] version = new int[2];
-                egl.eglInitialize(dpy, version);
+				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];
+				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];
 
-                /*int EGL_CONTEXT_CLIENT_VERSION=0x3098;
+				/*int EGL_CONTEXT_CLIENT_VERSION=0x3098;
                 int contextAttrs[] = new int[] { EGL_CONTEXT_CLIENT_VERSION, majorVersion, EGL10.EGL_NONE };
                 EGLContext ctx = egl.eglCreateContext(dpy, config, EGL10.EGL_NO_CONTEXT, contextAttrs);
 
@@ -225,187 +232,187 @@
                     return false;
                 }
                 SDLActivity.mEGLContext = ctx;*/
-                SDLActivity.mEGLDisplay = dpy;
-                SDLActivity.mEGLConfig = config;
-                SDLActivity.mGLMajor = majorVersion;
-                SDLActivity.mGLMinor = minorVersion;
+				SDLActivity.mEGLDisplay = dpy;
+				SDLActivity.mEGLConfig = config;
+				SDLActivity.mGLMajor = majorVersion;
+				SDLActivity.mGLMinor = minorVersion;
 
-                SDLActivity.createEGLSurface();
-            } catch(Exception e) {
-                Log.v("SDL", e + "");
-                for (StackTraceElement s : e.getStackTrace()) {
-                    Log.v("SDL", s.toString());
-                }
-            }
-        }
-        else SDLActivity.createEGLSurface();
+				SDLActivity.createEGLSurface();
+			} catch(Exception e) {
+				Log.v("SDL", e + "");
+				for (StackTraceElement s : e.getStackTrace()) {
+					Log.v("SDL", s.toString());
+				}
+			}
+		}
+		else SDLActivity.createEGLSurface();
 
-        return true;
-    }
+		return true;
+	}
 
-    public static boolean createEGLContext() {
-        EGL10 egl = (EGL10)EGLContext.getEGL();
-        int EGL_CONTEXT_CLIENT_VERSION=0x3098;
-        int contextAttrs[] = new int[] { EGL_CONTEXT_CLIENT_VERSION, SDLActivity.mGLMajor, EGL10.EGL_NONE };
-        SDLActivity.mEGLContext = egl.eglCreateContext(SDLActivity.mEGLDisplay, SDLActivity.mEGLConfig, EGL10.EGL_NO_CONTEXT, contextAttrs);
-        if (SDLActivity.mEGLContext == EGL10.EGL_NO_CONTEXT) {
-            Log.e("SDL", "Couldn't create context");
-            return false;
-        }
-        return true;
-    }
+	public static boolean createEGLContext() {
+		EGL10 egl = (EGL10)EGLContext.getEGL();
+		int EGL_CONTEXT_CLIENT_VERSION=0x3098;
+		int contextAttrs[] = new int[] { EGL_CONTEXT_CLIENT_VERSION, SDLActivity.mGLMajor, EGL10.EGL_NONE };
+		SDLActivity.mEGLContext = egl.eglCreateContext(SDLActivity.mEGLDisplay, SDLActivity.mEGLConfig, EGL10.EGL_NO_CONTEXT, contextAttrs);
+		if (SDLActivity.mEGLContext == EGL10.EGL_NO_CONTEXT) {
+			Log.e("SDL", "Couldn't create context");
+			return false;
+		}
+		return true;
+	}
 
-    public static boolean createEGLSurface() {
-        if (SDLActivity.mEGLDisplay != null && SDLActivity.mEGLConfig != null) {
-            EGL10 egl = (EGL10)EGLContext.getEGL();
-            if (SDLActivity.mEGLContext == null) createEGLContext();
+	public static boolean createEGLSurface() {
+		if (SDLActivity.mEGLDisplay != null && SDLActivity.mEGLConfig != null) {
+			EGL10 egl = (EGL10)EGLContext.getEGL();
+			if (SDLActivity.mEGLContext == null) createEGLContext();
 
-            Log.v("SDL", "Creating new EGL Surface");
-            EGLSurface surface = egl.eglCreateWindowSurface(SDLActivity.mEGLDisplay, SDLActivity.mEGLConfig, SDLActivity.mSurface, null);
-            if (surface == EGL10.EGL_NO_SURFACE) {
-                Log.e("SDL", "Couldn't create surface");
-                return false;
-            }
+			Log.v("SDL", "Creating new EGL Surface");
+			EGLSurface surface = egl.eglCreateWindowSurface(SDLActivity.mEGLDisplay, SDLActivity.mEGLConfig, SDLActivity.mSurface, null);
+			if (surface == EGL10.EGL_NO_SURFACE) {
+				Log.e("SDL", "Couldn't create surface");
+				return false;
+			}
 
-            if (!egl.eglMakeCurrent(SDLActivity.mEGLDisplay, surface, surface, SDLActivity.mEGLContext)) {
-                Log.e("SDL", "Old EGL Context doesnt work, trying with a new one");
-                createEGLContext();
-                if (!egl.eglMakeCurrent(SDLActivity.mEGLDisplay, surface, surface, SDLActivity.mEGLContext)) {
-                    Log.e("SDL", "Failed making EGL Context current");
-                    return false;
-                }
-            }
-            SDLActivity.mEGLSurface = surface;
-            return true;
-        }
-        return false;
-    }
+			if (!egl.eglMakeCurrent(SDLActivity.mEGLDisplay, surface, surface, SDLActivity.mEGLContext)) {
+				Log.e("SDL", "Old EGL Context doesnt work, trying with a new one");
+				createEGLContext();
+				if (!egl.eglMakeCurrent(SDLActivity.mEGLDisplay, surface, surface, SDLActivity.mEGLContext)) {
+					Log.e("SDL", "Failed making EGL Context current");
+					return false;
+				}
+			}
+			SDLActivity.mEGLSurface = surface;
+			return true;
+		}
+		return false;
+	}
 
-    // EGL buffer flip
-    public static void flipEGL() {
-        try {
-            EGL10 egl = (EGL10)EGLContext.getEGL();
+	// EGL buffer flip
+	public static void flipEGL() {
+		try {
+			EGL10 egl = (EGL10)EGLContext.getEGL();
 
-            egl.eglWaitNative(EGL10.EGL_CORE_NATIVE_ENGINE, null);
+			egl.eglWaitNative(EGL10.EGL_CORE_NATIVE_ENGINE, null);
 
-            // drawing here
+			// drawing here
 
-            egl.eglWaitGL();
+			egl.eglWaitGL();
 
-            egl.eglSwapBuffers(SDLActivity.mEGLDisplay, SDLActivity.mEGLSurface);
+			egl.eglSwapBuffers(SDLActivity.mEGLDisplay, SDLActivity.mEGLSurface);
 
 
-        } catch(Exception e) {
-            Log.v("SDL", "flipEGL(): " + e);
-            for (StackTraceElement s : e.getStackTrace()) {
-                Log.v("SDL", s.toString());
-            }
-        }
-    }
+		} catch(Exception e) {
+			Log.v("SDL", "flipEGL(): " + e);
+			for (StackTraceElement s : e.getStackTrace()) {
+				Log.v("SDL", s.toString());
+			}
+		}
+	}
+
+	// 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();
+	}
 
-    // 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 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 audioQuit() {
-        if (mAudioThread != null) {
-            try {
-                mAudioThread.join();
-            } catch(Exception e) {
-                Log.v("SDL", "Problem stopping audio thread: " + e);
-            }
-            mAudioThread = null;
+	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;
+			}
+		}
+	}
 
-            //Log.v("SDL", "Finished waiting for audio thread");
-        }
+	public static void audioQuit() {
+		if (mAudioThread != null) {
+			try {
+				mAudioThread.join();
+			} catch(Exception e) {
+				Log.v("SDL", "Problem stopping audio thread: " + e);
+			}
+			mAudioThread = null;
 
-        if (mAudioTrack != null) {
-            mAudioTrack.stop();
-            mAudioTrack = null;
-        }
-    }
+			//Log.v("SDL", "Finished waiting for audio thread");
+		}
+
+		if (mAudioTrack != null) {
+			mAudioTrack.stop();
+			mAudioTrack = null;
+		}
+	}
 }
 
 /**
     Simple nativeInit() runnable
-*/
+ */
 class SDLMain implements Runnable {
-	
+
 	private int surfaceWidth, surfaceHeight;
 	private GameConfig config;
 
@@ -422,7 +429,7 @@
 		String path = Utils.getDataPath(SDLActivity.mSingleton);//This represents the data directory
 		path = path.substring(0, path.length()-1);//remove the trailing '/'
 
-		
+
 		// Runs SDL_main() with added parameters
 		SDLActivity.nativeInit(new String[] { String.valueOf(ipc.port),
 				String.valueOf(surfaceWidth), String.valueOf(surfaceHeight),
@@ -435,8 +442,8 @@
 			e.printStackTrace();
 		}
 		//Log.v("SDL", "SDL thread terminated");
-        //Log.v("SDL", "SDL thread terminated");
-    }
+		//Log.v("SDL", "SDL thread terminated");
+	}
 }
 
 
@@ -445,178 +452,178 @@
     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  {
+View.OnKeyListener, View.OnTouchListener, SensorEventListener  {
 
 	private GameConfig config;
-	
-    // Sensors
-    private static SensorManager mSensorManager;
+
+	// Sensors
+	private static SensorManager mSensorManager;
+
+	// Startup    
+	public SDLSurface(Context context, GameConfig _config) {
+		super(context);
+		getHolder().addCallback(this); 
 
-    // Startup    
-    public SDLSurface(Context context, GameConfig _config) {
-        super(context);
-        getHolder().addCallback(this); 
-    
-        setFocusable(true);
-        setFocusableInTouchMode(true);
-        requestFocus();
-        setOnKeyListener(this); 
-        setOnTouchListener(this);   
+		setFocusable(true);
+		setFocusableInTouchMode(true);
+		requestFocus();
+		setOnKeyListener(this); 
+		setOnTouchListener(this);   
 
-        mSensorManager = (SensorManager)context.getSystemService("sensor");
-        config = _config;
-    }
+		mSensorManager = (SensorManager)context.getSystemService("sensor");
+		config = _config;
+	}
 
-    // Called when we have a valid drawing surface
-    public void surfaceCreated(SurfaceHolder holder) {
-        Log.v("SDL", "surfaceCreated()");
-        holder.setType(SurfaceHolder.SURFACE_TYPE_GPU);
-        SDLActivity.createEGLSurface();
-        enableSensor(Sensor.TYPE_ACCELEROMETER, true);
-    }
+	// Called when we have a valid drawing surface
+	public void surfaceCreated(SurfaceHolder holder) {
+		Log.v("SDL", "surfaceCreated()");
+		holder.setType(SurfaceHolder.SURFACE_TYPE_GPU);
+		SDLActivity.createEGLSurface();
+		enableSensor(Sensor.TYPE_ACCELEROMETER, true);
+	}
 
-    // Called when we lose the surface
-    public void surfaceDestroyed(SurfaceHolder holder) {
-        Log.v("SDL", "surfaceDestroyed()");
-        SDLActivity.nativePause();
-        enableSensor(Sensor.TYPE_ACCELEROMETER, false);
-    }
+	// Called when we lose the surface
+	public void surfaceDestroyed(SurfaceHolder holder) {
+		Log.v("SDL", "surfaceDestroyed()");
+		SDLActivity.nativePause();
+		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()");
+	// 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);
-        Log.v("SDL", "Window size:" + width + "x"+height);
+		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);
+		Log.v("SDL", "Window size:" + width + "x"+height);
 
-        SDLActivity.startApp(width, height, config);
-    }
+		SDLActivity.startApp(width, height, config);
+	}
 
-    // unused
-    public void onDraw(Canvas canvas) {}
+	// unused
+	public void onDraw(Canvas canvas) {}
 
 
 
 
-    // Key events
-    public boolean onKey(View  v, int keyCode, KeyEvent event) {
-    	if(keyCode == KeyEvent.KEYCODE_BACK) return false;
-        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;
-    }
+	// Key events
+	public boolean onKey(View  v, int keyCode, KeyEvent event) {
+		if(keyCode == KeyEvent.KEYCODE_BACK) return false;
+		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;
+		}
 
-    // Touch events
-    public boolean onTouch(View v, MotionEvent event) {
-        {
-             final int touchDevId = event.getDeviceId();
-             final int pointerCount = event.getPointerCount();
-             // touchId, pointerId, action, x, y, pressure
-             int actionPointerIndex = event.getActionIndex();
-             int pointerFingerId = event.getPointerId(actionPointerIndex);
-             int action = event.getActionMasked();
+		return false;
+	}
 
-             float x = event.getX(actionPointerIndex);
-             float y = event.getY(actionPointerIndex);
-             float p = event.getPressure(actionPointerIndex);
+	// Touch events
+	public boolean onTouch(View v, MotionEvent event) {
+		{
+			final int touchDevId = event.getDeviceId();
+			final int pointerCount = event.getPointerCount();
+			// touchId, pointerId, action, x, y, pressure
+			int actionPointerIndex = event.getActionIndex();
+			int pointerFingerId = event.getPointerId(actionPointerIndex);
+			int action = event.getActionMasked();
+
+			float x = event.getX(actionPointerIndex);
+			float y = event.getY(actionPointerIndex);
+			float p = event.getPressure(actionPointerIndex);
 
-             if (action == MotionEvent.ACTION_MOVE && pointerCount > 1) {
-                // TODO send motion to every pointer if its position has
-                // changed since prev event.
-                for (int i = 0; i < pointerCount; i++) {
-                    pointerFingerId = event.getPointerId(i);
-                    x = event.getX(i);
-                    y = event.getY(i);
-                    p = event.getPressure(i);
-                    SDLActivity.onNativeTouch(touchDevId, pointerFingerId, action, x, y, p);
-                }
-             } else {
-                SDLActivity.onNativeTouch(touchDevId, pointerFingerId, action, x, y, p);
-             }
-        }
-      return true;
-   } 
+			if (action == MotionEvent.ACTION_MOVE && pointerCount > 1) {
+				// TODO send motion to every pointer if its position has
+				// changed since prev event.
+				for (int i = 0; i < pointerCount; i++) {
+					pointerFingerId = event.getPointerId(i);
+					x = event.getX(i);
+					y = event.getY(i);
+					p = event.getPressure(i);
+					SDLActivity.onNativeTouch(touchDevId, pointerFingerId, action, x, y, p);
+				}
+			} else {
+				SDLActivity.onNativeTouch(touchDevId, pointerFingerId, 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
-    }
+	// 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 onSensorChanged(SensorEvent event) {
-        if (event.sensor.getType() == Sensor.TYPE_ACCELEROMETER) {
-            SDLActivity.onNativeAccel(event.values[0] / SensorManager.GRAVITY_EARTH,
-                                      event.values[1] / SensorManager.GRAVITY_EARTH,
-                                      event.values[2] / SensorManager.GRAVITY_EARTH);
-        }
-    }
+	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] / SensorManager.GRAVITY_EARTH,
+					event.values[1] / SensorManager.GRAVITY_EARTH,
+					event.values[2] / SensorManager.GRAVITY_EARTH);
+		}
+	}
 
 }