Skip to content
This repository has been archived by the owner on Feb 11, 2021. It is now read-only.

Commit

Permalink
More Android cleanup:
Browse files Browse the repository at this point in the history
* Formalized the interface with Java methods in SDL_android.h
* We don't need the feature system, at least right now
* Fixed waiting for the SDLMain thread
  • Loading branch information
slouken committed Jan 13, 2011
1 parent 66c0883 commit 91a8755
Show file tree
Hide file tree
Showing 4 changed files with 99 additions and 150 deletions.
133 changes: 47 additions & 86 deletions android-project/src/org/libsdl/app/SDLActivity.java
Expand Up @@ -30,14 +30,6 @@ public class SDLActivity extends Activity {

// Audio
private static AudioTrack mAudioTrack;
private static boolean bAudioIsEnabled;

// Sensors
private static boolean bAccelIsEnabled;

// feature IDs. Must match up on the C side as well.
private static int FEATURE_AUDIO = 1;
private static int FEATURE_ACCEL = 2;

// Load the .so
static {
Expand All @@ -47,6 +39,7 @@ public class SDLActivity extends Activity {

// Setup
protected void onCreate(Bundle savedInstanceState) {
//Log.v("SDL", "onCreate()");
super.onCreate(savedInstanceState);

// So we can call stuff from static callbacks
Expand All @@ -57,44 +50,16 @@ protected void onCreate(Bundle savedInstanceState) {
setContentView(mSurface);
SurfaceHolder holder = mSurface.getHolder();
holder.setType(SurfaceHolder.SURFACE_TYPE_GPU);

}

// Audio
public static boolean initAudio(){

// blah. Hardcoded things are bad. FIXME when we have more sound stuff
// working properly.
mAudioTrack = new AudioTrack(AudioManager.STREAM_MUSIC,
11025,
AudioFormat.CHANNEL_CONFIGURATION_MONO,
AudioFormat.ENCODING_PCM_8BIT,
2048,
AudioTrack.MODE_STREAM);
bAudioIsEnabled = true;
return true;
}

// Accel
public static boolean initAccel(){
mSurface.enableSensor(Sensor.TYPE_ACCELEROMETER, true);
bAccelIsEnabled = true;
return true;
}

public static boolean closeAccel(){
mSurface.enableSensor(Sensor.TYPE_ACCELEROMETER, false);
bAccelIsEnabled = false;
return true;
}


// Events
protected void onPause() {
//Log.v("SDL", "onPause()");
super.onPause();
}

protected void onResume() {
//Log.v("SDL", "onResume()");
super.onResume();
}

Expand All @@ -121,39 +86,23 @@ public static void flipBuffers() {

public static void updateAudio(byte [] buf) {

if(mAudioTrack == null){
return;
if(mAudioTrack == null) {
// Hardcoded things are bad. FIXME when we have more sound stuff
// working properly.
mAudioTrack = new AudioTrack(AudioManager.STREAM_MUSIC,
11025,
AudioFormat.CHANNEL_CONFIGURATION_MONO,
AudioFormat.ENCODING_PCM_8BIT,
2048,
AudioTrack.MODE_STREAM);
}

mAudioTrack.write(buf, 0, buf.length);
mAudioTrack.play();

Log.v("SDL","Played some audio");
Log.v("SDL", "Played some audio");
}

public static void enableFeature(int featureid, int enabled) {
Log.v("SDL","Feature " + featureid + " = " + enabled);

// Yuck. This is all horribly inelegent. If it gets to more than a few
// 'features' I'll rip this out and make something nicer, I promise :)
if(featureid == FEATURE_AUDIO){
if(enabled == 1){
initAudio();
}else{
// We don't have one of these yet...
//closeAudio();
}
}

else if(featureid == FEATURE_ACCEL){
if(enabled == 1){
initAccel();
}else{
closeAccel();
}
}
}

}

/**
Expand All @@ -164,7 +113,7 @@ public void run() {
// Runs SDL_main()
SDLActivity.nativeInit();

Log.v("SDL","SDL thread terminated");
//Log.v("SDL", "SDL thread terminated");
}
}

Expand Down Expand Up @@ -205,66 +154,77 @@ public SDLSurface(Context context) {

// 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.wait();
} catch(Exception e) {
Log.v("SDL","Problem stopping thread: " + e);
}
//synchronized (mSDLThread) {
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","Surface resized");
//Log.v("SDL", "surfaceChanged()");

int sdlFormat = 0;
switch (format) {
case PixelFormat.A_8:
Log.v("SDL","pixel format A_8");
Log.v("SDL", "pixel format A_8");
break;
case PixelFormat.LA_88:
Log.v("SDL","pixel format LA_88");
Log.v("SDL", "pixel format LA_88");
break;
case PixelFormat.L_8:
Log.v("SDL","pixel format L_8");
Log.v("SDL", "pixel format L_8");
break;
case PixelFormat.RGBA_4444:
Log.v("SDL","pixel format 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");
Log.v("SDL", "pixel format RGBA_5551");
sdlFormat = 0x85441002; // SDL_PIXELFORMAT_RGBA5551
break;
case PixelFormat.RGBA_8888:
Log.v("SDL","pixel format 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");
Log.v("SDL", "pixel format RGBX_8888");
sdlFormat = 0x86262004; // SDL_PIXELFORMAT_RGBX8888
break;
case PixelFormat.RGB_332:
Log.v("SDL","pixel format 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");
Log.v("SDL", "pixel format RGB_565");
sdlFormat = 0x85151002; // SDL_PIXELFORMAT_RGB565
break;
case PixelFormat.RGB_888:
Log.v("SDL","pixel format 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;
Expand Down Expand Up @@ -316,7 +276,7 @@ public boolean initEGL() {

} catch(Exception e) {
Log.v("SDL", e + "");
for(StackTraceElement s : e.getStackTrace()){
for(StackTraceElement s : e.getStackTrace()) {
Log.v("SDL", s.toString());
}
}
Expand All @@ -328,7 +288,6 @@ public boolean initEGL() {
public void flipEGL() {
try {
EGL10 egl = (EGL10)EGLContext.getEGL();
GL10 gl = (GL10)mEGLContext.getGL();

egl.eglWaitNative(EGL10.EGL_NATIVE_RENDERABLE, null);

Expand All @@ -341,20 +300,22 @@ public void flipEGL() {

} catch(Exception e) {
Log.v("SDL", "flipEGL(): " + e);
for(StackTraceElement s : e.getStackTrace()){
for(StackTraceElement s : e.getStackTrace()) {
Log.v("SDL", s.toString());
}
}
}

// Key events
public boolean onKey(View v, int keyCode, KeyEvent event){
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;
}
Expand Down
36 changes: 7 additions & 29 deletions src/SDL_android.cpp
Expand Up @@ -21,6 +21,8 @@
*/
#include "SDL_config.h"

#include "SDL_android.h"

extern "C" {
#include "events/SDL_events_c.h"
#include "video/android/SDL_androidkeyboard.h"
Expand All @@ -47,12 +49,8 @@ jclass mActivityInstance;
//method signatures
jmethodID midCreateGLContext;
jmethodID midFlipBuffers;
jmethodID midEnableFeature;
jmethodID midUpdateAudio;

//If we're not the active app, don't try to render
bool bRenderingEnabled = false;

//Feature IDs
static const int FEATURE_AUDIO = 1;
static const int FEATURE_ACCEL = 2;
Expand Down Expand Up @@ -84,11 +82,9 @@ extern "C" void SDL_Android_Init(JNIEnv* env)
mActivityInstance = cls;
midCreateGLContext = mEnv->GetStaticMethodID(cls,"createGLContext","()V");
midFlipBuffers = mEnv->GetStaticMethodID(cls,"flipBuffers","()V");
midEnableFeature = mEnv->GetStaticMethodID(cls,"enableFeature","(II)V");
midUpdateAudio = mEnv->GetStaticMethodID(cls,"updateAudio","([B)V");

if(!midCreateGLContext || !midFlipBuffers || !midEnableFeature ||
!midUpdateAudio) {
if(!midCreateGLContext || !midFlipBuffers || !midUpdateAudio) {
__android_log_print(ANDROID_LOG_INFO, "SDL", "SDL: Bad mids\n");
} else {
#ifdef DEBUG
Expand Down Expand Up @@ -136,9 +132,6 @@ extern "C" void Java_org_libsdl_app_SDLActivity_onNativeTouch(JNIEnv* env,
extern "C" void Java_org_libsdl_app_SDLActivity_nativeQuit( JNIEnv* env,
jobject obj )
{
// Stop rendering as we're no longer in the foreground
bRenderingEnabled = false;

// Inject a SDL_QUIT event
SDL_SendQuit();
}
Expand All @@ -165,32 +158,17 @@ extern "C" void Java_org_libsdl_app_SDLActivity_onNativeAccel(
/*******************************************************************************
Functions called by SDL into Java
*******************************************************************************/
extern "C" void Android_CreateContext()
extern "C" void Android_JNI_CreateContext()
{
__android_log_print(ANDROID_LOG_INFO, "SDL", "SDL: sdl_create_context()\n");

bRenderingEnabled = true;

mEnv->CallStaticVoidMethod(mActivityInstance, midCreateGLContext );
mEnv->CallStaticVoidMethod(mActivityInstance, midCreateGLContext);
}

extern "C" void Android_Render()
extern "C" void Android_JNI_SwapWindow()
{
if (!bRenderingEnabled) {
return;
}

// When we get here, we've accumulated a full frame
mEnv->CallStaticVoidMethod(mActivityInstance, midFlipBuffers);
}

extern "C" void Android_EnableFeature(int featureid, bool enabled)
{
mEnv->CallStaticVoidMethod(mActivityInstance, midEnableFeature,
featureid, (int)enabled);
}

extern "C" void Android_UpdateAudioBuffer(unsigned char *buf, int len)
extern "C" void Android_JNI_UpdateAudioBuffer(unsigned char *buf, int len)
{
//Annoyingly we can't just call into Java from any thread. Because the audio
//callback is dispatched from the SDL audio thread (that wasn't made from
Expand Down
5 changes: 2 additions & 3 deletions src/audio/android/SDL_androidaudio.c
Expand Up @@ -28,8 +28,7 @@
#include "SDL_audio.h"
#include "../SDL_audio_c.h"
#include "SDL_androidaudio.h"

extern void Android_UpdateAudioBuffer(unsigned char *buf, int len);
#include "../../SDL_android.h"

#include <android/log.h>

Expand Down Expand Up @@ -94,7 +93,7 @@ AndroidAUD_GetDeviceBuf(_THIS)
// sound->len = this->hidden->mixlen; /* size of raw data pointed to above */


Android_UpdateAudioBuffer(this->hidden->mixbuf, this->hidden->mixlen);
Android_JNI_UpdateAudioBuffer(this->hidden->mixbuf, this->hidden->mixlen);

return this->hidden->mixbuf; /* is this right? */
}
Expand Down

0 comments on commit 91a8755

Please sign in to comment.