From d2697435f07be89e25417e6c66412bdcadc82260 Mon Sep 17 00:00:00 2001 From: Paul Hunkin Date: Tue, 27 Jul 2010 21:21:24 +0200 Subject: [PATCH] - 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. --- Makefile.android | 2 +- android/testproject/jni/app-android.cpp | 35 ++++++- android/testproject/jni/lesson05.c | 94 ++++++++++++++++-- .../src/org/libsdl/android/SDLActivity.java | 51 +++++++++- include/SDL_config_android.h | 2 +- src/audio/SDL_audio.c | 2 + src/audio/android/SDL_androidaudio.o | Bin 8744 -> 8760 bytes src/video/android/SDL_androidgl.c | 8 +- 8 files changed, 174 insertions(+), 20 deletions(-) diff --git a/Makefile.android b/Makefile.android index 2ba3c8347..9cf9f2855 100755 --- a/Makefile.android +++ b/Makefile.android @@ -30,7 +30,7 @@ SOURCES = \ src/power/*.c \ src/audio/android/*.c \ src/video/android/*.c \ - src/joystick/dummy/*.c \ + src/joystick/android/*.c \ src/haptic/dummy/*.c \ src/atomic/dummy/*.c \ src/thread/pthread/*.c \ diff --git a/android/testproject/jni/app-android.cpp b/android/testproject/jni/app-android.cpp index 5a43bec4b..d8811caa6 100644 --- a/android/testproject/jni/app-android.cpp +++ b/android/testproject/jni/app-android.cpp @@ -34,6 +34,7 @@ jclass mActivityInstance; //method signatures jmethodID midCreateGLContext; jmethodID midFlipBuffers; +jmethodID midEnableFeature; extern "C" int SDL_main(); extern "C" int Android_OnKeyDown(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_OnResize(int width, int height, int format); 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 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 *******************************************************************************/ @@ -67,8 +76,9 @@ extern "C" jint JNI_OnLoad(JavaVM* vm, void* reserved){ mActivityInstance = cls; midCreateGLContext = mEnv->GetStaticMethodID(cls,"createGLContext","()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"); }else{ __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, __android_log_print(ANDROID_LOG_INFO, "SDL", "SDL: Native Init"); mEnv = env; - bRenderingEnabled = true; + Android_EnableFeature(FEATURE_ACCEL, true); + SDL_main(); } @@ -152,12 +163,20 @@ extern "C" void Java_org_libsdl_android_SDLActivity_onNativeResize( 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"); bRenderingEnabled = true; @@ -165,7 +184,7 @@ extern "C" void sdl_create_context(){ mEnv->CallStaticVoidMethod(mActivityInstance, midCreateGLContext ); } -extern "C" void sdl_render(){ +extern "C" void Android_Render(){ if(!bRenderingEnabled){ return; @@ -175,3 +194,9 @@ extern "C" void sdl_render(){ mEnv->CallStaticVoidMethod(mActivityInstance, midFlipBuffers ); } +extern "C" void Android_EnableFeature(int featureid, bool enabled){ + + mEnv->CallStaticVoidMethod(mActivityInstance, midFlipBuffers, + featureid, (int)enabled); +} + diff --git a/android/testproject/jni/lesson05.c b/android/testproject/jni/lesson05.c index 3188e015b..c53aab4c1 100644 --- a/android/testproject/jni/lesson05.c +++ b/android/testproject/jni/lesson05.c @@ -14,6 +14,8 @@ #include #include +#include + #include @@ -353,6 +355,89 @@ int drawGLScene( GLvoid ) 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 ) { @@ -425,13 +510,8 @@ int SDL_main( int argc, char **argv ) /* resize the initial window */ resizeWindow( SCREEN_WIDTH, SCREEN_HEIGHT ); - /* 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 (1); - }else{ - __android_log_print(ANDROID_LOG_INFO, "SDL","Init audio ok\n"); - } + + testAudio(); /* wait for events */ diff --git a/android/testproject/src/org/libsdl/android/SDLActivity.java b/android/testproject/src/org/libsdl/android/SDLActivity.java index e54fac128..d821f9ffe 100644 --- a/android/testproject/src/org/libsdl/android/SDLActivity.java +++ b/android/testproject/src/org/libsdl/android/SDLActivity.java @@ -12,6 +12,7 @@ import android.graphics.*; import android.text.method.*; import android.text.*; +import android.media.*; import java.lang.*; @@ -24,6 +25,12 @@ public class SDLActivity extends Activity { //Main components private static SDLActivity mSingleton; 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 static { @@ -41,11 +48,23 @@ protected void onCreate(Bundle savedInstanceState) { mSurface = new SDLSurface(getApplication()); setContentView(mSurface); 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 protected void onPause() { super.onPause(); @@ -81,6 +100,32 @@ public static void flipBuffers(){ 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 @@ Simple nativeInit() runnable */ class SDLRunner implements Runnable{ public void run(){ + //SDLActivity.initAudio(); + //Runs SDL_main() SDLActivity.nativeInit(); diff --git a/include/SDL_config_android.h b/include/SDL_config_android.h index a38270943..4651d9572 100755 --- a/include/SDL_config_android.h +++ b/include/SDL_config_android.h @@ -121,7 +121,7 @@ typedef unsigned int size_t; #define SDL_HAPTIC_DISABLED 1 -#define SDL_JOYSTICK_DISABLED 1 +#define SDL_JOYSTICK_ANDROID 1 #define SDL_LOADSO_DISABLED 1 diff --git a/src/audio/SDL_audio.c b/src/audio/SDL_audio.c index 572cdb4a7..66a0fb926 100644 --- a/src/audio/SDL_audio.c +++ b/src/audio/SDL_audio.c @@ -320,6 +320,8 @@ SDL_StreamDeinit(SDL_AudioStreamer * stream) } +#include + /* The general mixing thread function */ int SDLCALL SDL_RunAudio(void *devicep) diff --git a/src/audio/android/SDL_androidaudio.o b/src/audio/android/SDL_androidaudio.o index 2068b1a726b866209ac8f3ea3bc98740919ed2c1..2f8c45e8614f5d61cf60e417990692d7d44db5bd 100644 GIT binary patch delta 3157 zcmX|D3vg9e6+P$Xym#+=c_(@Ky}Upg(%vL5YWN7{m$BH^ly>+OFi_)%PcT7LgtVki z`LtJ=jxdte(95(PERx!c#t|VHv8mDzS_%b<47S*6>F5+3)Di5+`0H3)>)suid1vjl z_Bwl?bMCn}47H86_1EjZLpSz1!Sk+Cj^aO~PhixSij-O#E9zpDfWf$Jkc&*>i|c!p zqmzd<{Bz-Qrr!aNqrF#1oWvd$N+RpbT)~9nHX0~@Vm!N%qnG$y1a2uRI)QN?gTXP0 z6bd9v(zq!08>Ea%pyP~In9bX4KC7K!6T{YSgsyoJqqhr##;pW~Ufx(~mGY?IFajIfv0KMkV(X7a0DN z;rBlVhih)fnARN_i~Eo(u4mMONM+tfn0J5lF2JsZ;2xmv_{yG#f$UJsT)T?Be$2Lx@7WHVl{*r%w4F!xlgm*qV}F7DxraZB*^ZyJ&q8&7$|X5| zr7~QL`z)7fDw#R*Zwlsm07&aBniNL^*91KWA+s5Ahx@bV5!-b*CHI$O>)*u2FVoBA z@8uGY#Vl!$kiGJ9)YvOoeg7Ke9_OK8Q6=lT*DLo#T&2>!1W(|;8q>UegX=#Tvs(Ke zrnsl#GWB+l4Nr3=j^AvDn0qaDE>@*iKwm>D`zQ*g@Z_03!!4L<4BmuyF=iMJc@qv| zBetA!2OkX1U)eJVyw9?P-cS{} z2eiFT_r}Xnc2KJfsJhwnpM%SuqqX5xjNHs;=xn?gF=M|))|AFPUZ1_(XrVS@89NCZ z4!q`=X6?O@y${8#($3})eRyhQ&D-sq_>nkQYqzjyOU&x+BC?4wYp_0@lVa9vzr#&U zZjGw6l+9;{sXP#)Cpi9;vWHCoWm>G%QTZM%H^;&a6sEA=^jN5+@I#iI5ewrXsB%rh z?Z@w(Yj`T<`Z=gPhDaSt{VGaDv(c&81RUucGrWm?yXMcZr8Rd^Y%oB{0?IX?9?xV< zy$NxJcFimxreI|=dBG~P-aK9zy9%N=KfeCTZl_@ZoAb39$DIWWW9r#Em=u;#Wj~)Yr=rz#GPoiRe7Bja+4~v7(G`eH-4B%IR-yAseJFr6C&Rx%eq-yf?PSgX4NAc6k zyXcCVwy@q3h-!QTQw>qY(eQezxb?vQT|QlWXY==Q{XQSTcS-r-(LPW8Fn+3bGCQyN zEr?TydaDUY-y(+v^wMd^0r{}ilqv4^PpSWDB)YPE97i6k8E-m|W8=;^rOpWc zTJRmg=sy|AUlY!6CjAKk~K!jnzBZ4Od-xU0# z;59)9Z%K3%f^~u|f~|sg3Em^vC3t^?_-KDageL@t1aHGVWrL-Hs|9-m9};{-a8Phq z@CCusg1;5KD)>GzK!X%sIyR~nY!qx4Tp{=+!5+b{3T_qLCb&cJQNi7Udjy{r+z$*K zJlA0gz@JOv7_nNZQ^LOqqH(qe zA18v(72`a?WumVnVq&-O9?AC#J|Ow8OMa*De&KtB?-Tw5w=^zzP=q7l(>HGa9~irT A6#xJL delta 3133 zcmX|D4Qy5A8UDU=ztivB_I~98?d`p^wk4<7IzSo4p(HC)OWdHeYF%WyO9KM2QGOh# z8z?83Zft~U%^^ySn-#|>38EB1Br>-FT7Q8px`oXNnNG}NHa0htxh;F1bKb7WeV_Mv z-sgM2pYz?*d!%!ubFf(t9GJSniw;|*JjFkwk0I*!GfFK_74<<EP!ip8qf#eNJiaQbx}<87O~Xe)TlQz(1XU&7z|h8M_?@&-fWM z@J)rWXm$oA^DpR`FU^D5yvxb2>Sfx@blys&*1U`uJVG_Y0ULKR9Yi1V;L}Wpe1vWL znLY%A-|<(ZS*F@dzz!;A=?IWzuFX~|?VDk-<^;zqL??UQDW(^h?ztQeYvv$U>V=3^ z+fl2U#B2sKmHP+MqJ8EafGb0=`>A`Oa;G8LXN!nlXj}!^bDSjd!V32r(gUPkXx*)x zYn0P^Vc>4UDcFN4t8|@Y&!0_dIrkFwXAgx*)4baU)gI=Oys$)kwUiazDJ(y-ucx%ZCF^@5ZPV<2%n9FQYcFhb zPokZDD|Oz0J7hXAcEUNRufUOi2z|54aQXIa?!-()2%3J6m}5E;G>u?CE=PF@pAR3( zm{ySrZet5CEV{XvGFX~Uvd(>ttna&+#|t;OQDCr~wM;mm-QQTeJ*D5*ZV`G1D^j{$ zyVqa~R;F}NyFQM+gC~*+cWC!9t9K4U%!E55?Y468nnx4bk-O=kbJ}|eGj4$F(hSD&7VSX0ptUw(IoHNhXiHcW=G~o; zgUixljcaG|3)2&8(QW3y>1nOOtz**}DQk9}WHVFN;-=7fdCJ<{PHyUo_N2>Qx zY#xZwO>VG9v=n||A@;UP@YFQP4X zov7obv82S&|6wT!G>+HLV3*eX5w%LqH75=zS>%&6pA}DFT&+hwSzGf(Kf)H!Mg?}5+ILj&XQx5FzL=S5|M9G?eBIZ`3 zc|LvY?iU!J4W)PFrefvUmh=^1-1{s}OIhHSV{Gdu1bYm>(S zA-VLrd>jpn(QKBk;qy%XO1lFvTv4}Xov%V&uEIaP z)U#MT^&VEFZ%+0|&oDld@tF%}@jVc_) z`*QoWe-yp;#C_HG#^bv=lZ>?OmB0e_Z$$&}Uy0z;MF3b1&@o4Qly(Ipm zwnvY}UoLFYN8=X@p?|JHsj>KcA=EvwU)QQf;+aYOI--dmKzuIVjW`g$RoCiwRpWaR zpQ)Q1=Zblqk1r{<`u9O=PPA`AE5@s#JqGQ!@lY|;YvW_!TX>|2=il&biCwAHe;nF{ zMC&T$^^Uj~S=j;@WDH8$z~cuQkzG%DJwg1-`cPw->G&jfuu8TObgI8|_#;C#Vu z!Ls08f|~@lr5LFp5%vlm5KEUngns# zBM}A#pAwvh8_LFu1#c7V7ramKdxAd_+$;EkAYVc3^J~Eif}av26g*sd8uEgTf?a~Q z2;MH(FSu6l9>Gn5TLiZX{!lO$d|YrhFyb$yy%d1YOW|k4I^0v?Z%F-=;91cx2>wO% zzYG3X^c=pr$)h2nf4yK65&hdNew@%STZF5K;Pb_JonW`