From 655c8937460eef3806998b358f909760f717787e Mon Sep 17 00:00:00 2001 From: Paul Hunkin Date: Sat, 14 Aug 2010 12:35:21 +1200 Subject: [PATCH] Working on the sound system --- android/config.cfg | 1 + android/testproject/jni/app-android.cpp | 36 ++++++++++++++++++++- android/testproject/jni/lesson05.c | 4 +-- src/audio/android/SDL_androidaudio.c | 40 ++++++++++++++++++++++-- src/audio/android/SDL_androidaudio.o | Bin 8760 -> 0 bytes 5 files changed, 75 insertions(+), 6 deletions(-) create mode 100644 android/config.cfg delete mode 100644 src/audio/android/SDL_androidaudio.o diff --git a/android/config.cfg b/android/config.cfg new file mode 100644 index 000000000..8164a5eb4 --- /dev/null +++ b/android/config.cfg @@ -0,0 +1 @@ +ANDROID_NDK=/home/paul/Projects/gsoc/sdk/android-ndk-r4 diff --git a/android/testproject/jni/app-android.cpp b/android/testproject/jni/app-android.cpp index 2df3706a1..ed8981e70 100644 --- a/android/testproject/jni/app-android.cpp +++ b/android/testproject/jni/app-android.cpp @@ -26,6 +26,7 @@ static long _getTime(void){ } JNIEnv* mEnv = NULL; +JNIEnv* mAudioThreadEnv = NULL; //See the note below for why this is necessary JavaVM* mVM = NULL; //Main activity @@ -35,6 +36,7 @@ jclass mActivityInstance; jmethodID midCreateGLContext; jmethodID midFlipBuffers; jmethodID midEnableFeature; +jmethodID midUpdateAudio; extern "C" int SDL_main(); extern "C" int Android_OnKeyDown(int keycode); @@ -54,6 +56,7 @@ static const int FEATURE_ACCEL = 2; //Accelerometer data storage float fLastAccelerometer[3]; + /******************************************************************************* Functions called by JNI *******************************************************************************/ @@ -77,8 +80,10 @@ extern "C" jint JNI_OnLoad(JavaVM* vm, void* reserved){ 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){ + if(!midCreateGLContext || !midFlipBuffers || !midEnableFeature || + !midUpdateAudio){ __android_log_print(ANDROID_LOG_INFO, "SDL", "SDL: Bad mids\n"); }else{ __android_log_print(ANDROID_LOG_INFO, "SDL", "SDL: Good mids\n"); @@ -200,3 +205,32 @@ extern "C" void Android_EnableFeature(int featureid, bool enabled){ featureid, (int)enabled); } +extern "C" void Android_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 + //java, we have to do some magic here to let the JVM know about the thread. + //Because everything it touches on the Java side is static anyway, it's + //not a big deal, just annoying. + if(!mAudioThreadEnv){ + __android_log_print(ANDROID_LOG_INFO, "SDL", "SDL: Need to set up audio thread env\n"); + + mJVM->AttachCurrentThread(&mAudioThreadEnv, NULL); + + __android_log_print(ANDROID_LOG_INFO, "SDL", "SDL: ok\n"); + } + + jbyteArray arr = mAudioThreadEnv->NewByteArray(len); + + //blah. We probably should rework this so we avoid the copy. + mAudioThreadEnv->SetByteArrayRegion(arr, 0, len, (jbyte *)buf); + + __android_log_print(ANDROID_LOG_INFO, "SDL", "SDL: copied\n"); + + mAudioThreadEnv->CallStaticVoidMethod( mActivityInstance, + midUpdateAudio, arr ); + + __android_log_print(ANDROID_LOG_INFO, "SDL", "SDL: invoked\n"); + +} + diff --git a/android/testproject/jni/lesson05.c b/android/testproject/jni/lesson05.c index 60ceb596b..92bb07153 100644 --- a/android/testproject/jni/lesson05.c +++ b/android/testproject/jni/lesson05.c @@ -428,7 +428,7 @@ void testAudio(){ while (SDL_GetAudioStatus() == SDL_AUDIO_PLAYING){ //__android_log_print(ANDROID_LOG_INFO, "SDL","Still playing\n"); - //SDL_Delay(100); + SDL_Delay(100); } __android_log_print(ANDROID_LOG_INFO, "SDL","Closing down\n"); @@ -511,7 +511,7 @@ int SDL_main( int argc, char **argv ) resizeWindow( SCREEN_WIDTH, SCREEN_HEIGHT ); - //testAudio(); + testAudio(); /* wait for events */ diff --git a/src/audio/android/SDL_androidaudio.c b/src/audio/android/SDL_androidaudio.c index 1b26d5170..cf22e4001 100644 --- a/src/audio/android/SDL_androidaudio.c +++ b/src/audio/android/SDL_androidaudio.c @@ -29,13 +29,38 @@ #include "../SDL_audio_c.h" #include "SDL_androidaudio.h" +extern void Android_UpdateAudioBuffer(unsigned char *buf, int len); + #include static int AndroidAUD_OpenDevice(_THIS, const char *devname, int iscapture) { + SDL_AudioFormat test_format = SDL_FirstAudioFormat(this->spec.format); + int valid_datatype = 0; + //TODO: Sample rates etc __android_log_print(ANDROID_LOG_INFO, "SDL", "AndroidAudio Open\n"); + + this->hidden = SDL_malloc(sizeof(*(this->hidden))); + if (!this->hidden) { + SDL_OutOfMemory(); + return 0; + } + SDL_memset(this->hidden, 0, (sizeof *this->hidden)); + + while ((!valid_datatype) && (test_format)) { + this->spec.format = test_format; + switch (test_format) { + case AUDIO_S8: + /*case AUDIO_S16LSB: */ + valid_datatype = 1; + break; + default: + test_format = SDL_NextAudioFormat(); + break; + } + } return 1; } @@ -45,13 +70,11 @@ AndroidAUD_PlayDevice(_THIS) { __android_log_print(ANDROID_LOG_INFO, "SDL", "AndroidAudio Play\n"); - //playGenericSound(this->hidden->mixbuf, this->hidden->mixlen); #if 0 -// sound->data = this->hidden->mixbuf;/* pointer to raw audio data */ -// sound->len = this->hidden->mixlen; /* size of raw data pointed to above */ + // sound->rate = 22050; /* sample rate = 22050Hz */ // sound->vol = 127; /* volume [0..127] for [min..max] */ // sound->pan = 64; /* balance [0..127] for [left..right] */ @@ -64,6 +87,15 @@ AndroidAUD_PlayDevice(_THIS) static Uint8 * AndroidAUD_GetDeviceBuf(_THIS) { + //__android_log_print(ANDROID_LOG_INFO, "SDL", "****** get device buf\n"); + + + // sound->data = this->hidden->mixbuf;/* pointer to raw audio data */ +// sound->len = this->hidden->mixlen; /* size of raw data pointed to above */ + + + Android_UpdateAudioBuffer(this->hidden->mixbuf, this->hidden->mixlen); + return this->hidden->mixbuf; /* is this right? */ } @@ -71,12 +103,14 @@ static void AndroidAUD_WaitDevice(_THIS) { /* stub */ + __android_log_print(ANDROID_LOG_INFO, "SDL", "****** wait device buf\n"); } static void AndroidAUD_CloseDevice(_THIS) { /* stub */ + __android_log_print(ANDROID_LOG_INFO, "SDL", "****** close device buf\n"); } static int diff --git a/src/audio/android/SDL_androidaudio.o b/src/audio/android/SDL_androidaudio.o deleted file mode 100644 index 2f8c45e8614f5d61cf60e417990692d7d44db5bd..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8760 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