Commit ef474722 authored by Paul Hunkin's avatar Paul Hunkin

- Cleaned up a bunch of code

- Added 'feature' enable/disable so we're not running accel/sound/whatever in Java when we don't need to be
- More work on the sound system. But it still crashes pretty horribly, not sure why yet.
parent 9ac4bd2a
...@@ -30,7 +30,7 @@ SOURCES = \ ...@@ -30,7 +30,7 @@ SOURCES = \
src/power/*.c \ src/power/*.c \
src/audio/android/*.c \ src/audio/android/*.c \
src/video/android/*.c \ src/video/android/*.c \
src/joystick/dummy/*.c \ src/joystick/android/*.c \
src/haptic/dummy/*.c \ src/haptic/dummy/*.c \
src/atomic/dummy/*.c \ src/atomic/dummy/*.c \
src/thread/pthread/*.c \ src/thread/pthread/*.c \
......
...@@ -34,6 +34,7 @@ jclass mActivityInstance; ...@@ -34,6 +34,7 @@ jclass mActivityInstance;
//method signatures //method signatures
jmethodID midCreateGLContext; jmethodID midCreateGLContext;
jmethodID midFlipBuffers; jmethodID midFlipBuffers;
jmethodID midEnableFeature;
extern "C" int SDL_main(); extern "C" int SDL_main();
extern "C" int Android_OnKeyDown(int keycode); extern "C" int Android_OnKeyDown(int keycode);
...@@ -41,10 +42,18 @@ extern "C" int Android_OnKeyUp(int keycode); ...@@ -41,10 +42,18 @@ extern "C" int Android_OnKeyUp(int keycode);
extern "C" void Android_SetScreenResolution(int width, int height); extern "C" void Android_SetScreenResolution(int width, int height);
extern "C" void Android_OnResize(int width, int height, int format); extern "C" void Android_OnResize(int width, int height, int format);
extern "C" int SDL_SendQuit(); extern "C" int SDL_SendQuit();
extern "C" void Android_EnableFeature(int featureid, bool enabled);
//If we're not the active app, don't try to render //If we're not the active app, don't try to render
bool bRenderingEnabled = false; bool bRenderingEnabled = false;
//Feature IDs
static const int FEATURE_SOUND = 1;
static const int FEATURE_ACCEL = 2;
//Accelerometer data storage
float fLastAccelerometer[3];
/******************************************************************************* /*******************************************************************************
Functions called by JNI Functions called by JNI
*******************************************************************************/ *******************************************************************************/
...@@ -67,8 +76,9 @@ extern "C" jint JNI_OnLoad(JavaVM* vm, void* reserved){ ...@@ -67,8 +76,9 @@ extern "C" jint JNI_OnLoad(JavaVM* vm, void* reserved){
mActivityInstance = cls; mActivityInstance = cls;
midCreateGLContext = mEnv->GetStaticMethodID(cls,"createGLContext","()V"); midCreateGLContext = mEnv->GetStaticMethodID(cls,"createGLContext","()V");
midFlipBuffers = mEnv->GetStaticMethodID(cls,"flipBuffers","()V"); midFlipBuffers = mEnv->GetStaticMethodID(cls,"flipBuffers","()V");
midEnableFeature = mEnv->GetStaticMethodID(cls,"enableFeature","(I, I)V");
if(!midCreateGLContext || !midFlipBuffers){ if(!midCreateGLContext || !midFlipBuffers || !midEnableFeature){
__android_log_print(ANDROID_LOG_INFO, "SDL", "SDL: Bad mids\n"); __android_log_print(ANDROID_LOG_INFO, "SDL", "SDL: Bad mids\n");
}else{ }else{
__android_log_print(ANDROID_LOG_INFO, "SDL", "SDL: Good mids\n"); __android_log_print(ANDROID_LOG_INFO, "SDL", "SDL: Good mids\n");
...@@ -84,9 +94,10 @@ extern "C" void Java_org_libsdl_android_SDLActivity_nativeInit( JNIEnv* env, ...@@ -84,9 +94,10 @@ extern "C" void Java_org_libsdl_android_SDLActivity_nativeInit( JNIEnv* env,
__android_log_print(ANDROID_LOG_INFO, "SDL", "SDL: Native Init"); __android_log_print(ANDROID_LOG_INFO, "SDL", "SDL: Native Init");
mEnv = env; mEnv = env;
bRenderingEnabled = true; bRenderingEnabled = true;
Android_EnableFeature(FEATURE_ACCEL, true);
SDL_main(); SDL_main();
} }
...@@ -152,12 +163,20 @@ extern "C" void Java_org_libsdl_android_SDLActivity_onNativeResize( ...@@ -152,12 +163,20 @@ extern "C" void Java_org_libsdl_android_SDLActivity_onNativeResize(
Android_OnResize(width, height, format); Android_OnResize(width, height, format);
} }
extern "C" void Java_org_libsdl_android_SDLActivity_onNativeAccel(
JNIEnv* env, jobject obj,
jfloat x, jfloat y, jfloat z){
fLastAccelerometer[0] = x;
fLastAccelerometer[1] = y;
fLastAccelerometer[2] = z;
}
/******************************************************************************* /*******************************************************************************
Functions called by SDL Functions called by SDL into Java
*******************************************************************************/ *******************************************************************************/
extern "C" void sdl_create_context(){ extern "C" void Android_CreateContext(){
__android_log_print(ANDROID_LOG_INFO, "SDL", "SDL: sdl_create_context()\n"); __android_log_print(ANDROID_LOG_INFO, "SDL", "SDL: sdl_create_context()\n");
bRenderingEnabled = true; bRenderingEnabled = true;
...@@ -165,7 +184,7 @@ extern "C" void sdl_create_context(){ ...@@ -165,7 +184,7 @@ extern "C" void sdl_create_context(){
mEnv->CallStaticVoidMethod(mActivityInstance, midCreateGLContext ); mEnv->CallStaticVoidMethod(mActivityInstance, midCreateGLContext );
} }
extern "C" void sdl_render(){ extern "C" void Android_Render(){
if(!bRenderingEnabled){ if(!bRenderingEnabled){
return; return;
...@@ -175,3 +194,9 @@ extern "C" void sdl_render(){ ...@@ -175,3 +194,9 @@ extern "C" void sdl_render(){
mEnv->CallStaticVoidMethod(mActivityInstance, midFlipBuffers ); mEnv->CallStaticVoidMethod(mActivityInstance, midFlipBuffers );
} }
extern "C" void Android_EnableFeature(int featureid, bool enabled){
mEnv->CallStaticVoidMethod(mActivityInstance, midFlipBuffers,
featureid, (int)enabled);
}
...@@ -14,6 +14,8 @@ ...@@ -14,6 +14,8 @@
#include <stdlib.h> #include <stdlib.h>
#include <math.h> #include <math.h>
#include <signal.h>
#include <android/log.h> #include <android/log.h>
...@@ -353,6 +355,89 @@ int drawGLScene( GLvoid ) ...@@ -353,6 +355,89 @@ int drawGLScene( GLvoid )
return( TRUE ); return( TRUE );
} }
struct
{
SDL_AudioSpec spec;
Uint8 *sound; /* Pointer to wave data */
Uint32 soundlen; /* Length of wave data */
int soundpos; /* Current play position */
} wave;
void SDLCALL
fillerup(void *unused, Uint8 * stream, int len)
{
__android_log_print(ANDROID_LOG_INFO, "SDL","FILLERUP\n");
Uint8 *waveptr;
int waveleft;
/* Set up the pointers */
waveptr = wave.sound + wave.soundpos;
waveleft = wave.soundlen - wave.soundpos;
/* Go! */
while (waveleft <= len) {
SDL_memcpy(stream, waveptr, waveleft);
stream += waveleft;
len -= waveleft;
waveptr = wave.sound;
waveleft = wave.soundlen;
wave.soundpos = 0;
}
SDL_memcpy(stream, waveptr, len);
wave.soundpos += len;
}
void testAudio(){
const char *file = "/sdcard/sample.wav";
/* Load the SDL library */
if (SDL_Init(SDL_INIT_AUDIO) < 0) {
__android_log_print(ANDROID_LOG_INFO, "SDL","Couldn't initialize SDL Audio: %s\n", SDL_GetError());
return;
}else{
__android_log_print(ANDROID_LOG_INFO, "SDL","Init audio ok\n");
}
/* Load the wave file into memory */
if (SDL_LoadWAV(file, &wave.spec, &wave.sound, &wave.soundlen) == NULL) {
__android_log_print(ANDROID_LOG_INFO, "SDL", "Couldn't load %s: %s\n", file, SDL_GetError());
return;
}
wave.spec.callback = fillerup;
__android_log_print(ANDROID_LOG_INFO, "SDL","Loaded: %d\n", wave.soundlen);
/* Initialize fillerup() variables */
if (SDL_OpenAudio(&wave.spec, NULL) < 0) {
__android_log_print(ANDROID_LOG_INFO, "SDL", "Couldn't open audio: %s\n", SDL_GetError());
SDL_FreeWAV(wave.sound);
return;
}
__android_log_print(ANDROID_LOG_INFO, "SDL","Using audio driver: %s\n", SDL_GetCurrentAudioDriver());
/* Let the audio run */
SDL_PauseAudio(0);
__android_log_print(ANDROID_LOG_INFO, "SDL","Playing\n");
while (SDL_GetAudioStatus() == SDL_AUDIO_PLAYING){
//__android_log_print(ANDROID_LOG_INFO, "SDL","Still playing\n");
//SDL_Delay(100);
}
__android_log_print(ANDROID_LOG_INFO, "SDL","Closing down\n");
/* Clean up on signal */
SDL_CloseAudio();
SDL_FreeWAV(wave.sound);
}
int SDL_main( int argc, char **argv ) int SDL_main( int argc, char **argv )
{ {
...@@ -425,13 +510,8 @@ int SDL_main( int argc, char **argv ) ...@@ -425,13 +510,8 @@ int SDL_main( int argc, char **argv )
/* resize the initial window */ /* resize the initial window */
resizeWindow( SCREEN_WIDTH, SCREEN_HEIGHT ); resizeWindow( SCREEN_WIDTH, SCREEN_HEIGHT );
/* Load the SDL library */
if (SDL_Init(SDL_INIT_AUDIO) < 0) { testAudio();
__android_log_print(ANDROID_LOG_INFO, "SDL","Couldn't initialize SDL Audio: %s\n", SDL_GetError());
return (1);
}else{
__android_log_print(ANDROID_LOG_INFO, "SDL","Init audio ok\n");
}
/* wait for events */ /* wait for events */
......
...@@ -12,6 +12,7 @@ import android.util.Log; ...@@ -12,6 +12,7 @@ import android.util.Log;
import android.graphics.*; import android.graphics.*;
import android.text.method.*; import android.text.method.*;
import android.text.*; import android.text.*;
import android.media.*;
import java.lang.*; import java.lang.*;
...@@ -24,6 +25,12 @@ public class SDLActivity extends Activity { ...@@ -24,6 +25,12 @@ public class SDLActivity extends Activity {
//Main components //Main components
private static SDLActivity mSingleton; private static SDLActivity mSingleton;
private static SDLSurface mSurface; private static SDLSurface mSurface;
private static AudioTrack mAudioTrack;
//feature IDs. Must match up on the C side as well.
private static int FEATURE_SOUND = 1;
private static int FEATURE_ACCEL = 2;
//Load the .so //Load the .so
static { static {
...@@ -41,11 +48,23 @@ public class SDLActivity extends Activity { ...@@ -41,11 +48,23 @@ public class SDLActivity extends Activity {
mSurface = new SDLSurface(getApplication()); mSurface = new SDLSurface(getApplication());
setContentView(mSurface); setContentView(mSurface);
SurfaceHolder holder = mSurface.getHolder(); SurfaceHolder holder = mSurface.getHolder();
holder.setType(SurfaceHolder.SURFACE_TYPE_GPU); holder.setType(SurfaceHolder.SURFACE_TYPE_GPU);
} }
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);
return true;
}
//Events //Events
protected void onPause() { protected void onPause() {
super.onPause(); super.onPause();
...@@ -81,6 +100,32 @@ public class SDLActivity extends Activity { ...@@ -81,6 +100,32 @@ public class SDLActivity extends Activity {
mSurface.flipEGL(); mSurface.flipEGL();
} }
public static void updateAudio(byte [] buf){
if(mAudioTrack == null){
return;
}
mAudioTrack.write(buf, 0, buf.length);
mAudioTrack.play();
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_SOUND){
if(enabled == 1){
initAudio();
}else{
//We don't have one of these yet...
//closeAudio();
}
}
}
...@@ -95,6 +140,8 @@ public class SDLActivity extends Activity { ...@@ -95,6 +140,8 @@ public class SDLActivity extends Activity {
*/ */
class SDLRunner implements Runnable{ class SDLRunner implements Runnable{
public void run(){ public void run(){
//SDLActivity.initAudio();
//Runs SDL_main() //Runs SDL_main()
SDLActivity.nativeInit(); SDLActivity.nativeInit();
......
...@@ -121,7 +121,7 @@ typedef unsigned int size_t; ...@@ -121,7 +121,7 @@ typedef unsigned int size_t;
#define SDL_HAPTIC_DISABLED 1 #define SDL_HAPTIC_DISABLED 1
#define SDL_JOYSTICK_DISABLED 1 #define SDL_JOYSTICK_ANDROID 1
#define SDL_LOADSO_DISABLED 1 #define SDL_LOADSO_DISABLED 1
......
...@@ -320,6 +320,8 @@ SDL_StreamDeinit(SDL_AudioStreamer * stream) ...@@ -320,6 +320,8 @@ SDL_StreamDeinit(SDL_AudioStreamer * stream)
} }
#include <android/log.h>
/* The general mixing thread function */ /* The general mixing thread function */
int SDLCALL int SDLCALL
SDL_RunAudio(void *devicep) SDL_RunAudio(void *devicep)
......
...@@ -41,8 +41,8 @@ ...@@ -41,8 +41,8 @@
/* /*
These things are in the JNI android support These things are in the JNI android support
*/ */
extern void sdl_create_context(); extern void Android_CreateContext();
extern void sdl_render(); extern void Android_Render();
/* GL functions */ /* GL functions */
int Android_GL_LoadLibrary(_THIS, const char *path){ int Android_GL_LoadLibrary(_THIS, const char *path){
...@@ -67,7 +67,7 @@ int *Android_GL_GetVisual(_THIS, Display * display, int screen){ ...@@ -67,7 +67,7 @@ int *Android_GL_GetVisual(_THIS, Display * display, int screen){
*/ */
SDL_GLContext Android_GL_CreateContext(_THIS, SDL_Window * window){ SDL_GLContext Android_GL_CreateContext(_THIS, SDL_Window * window){
sdl_create_context(); Android_CreateContext();
return 1; return 1;
} }
...@@ -88,7 +88,7 @@ int Android_GL_GetSwapInterval(_THIS){ ...@@ -88,7 +88,7 @@ int Android_GL_GetSwapInterval(_THIS){
} }
void Android_GL_SwapWindow(_THIS, SDL_Window * window){ void Android_GL_SwapWindow(_THIS, SDL_Window * window){
sdl_render(); Android_Render();
} }
void Android_GL_DeleteContext(_THIS, SDL_GLContext context){ void Android_GL_DeleteContext(_THIS, SDL_GLContext context){
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment