This posting is for future reference, if I ever have to get OpenAL working again under Android's NDK. It will also be useful to my peer game developers who intend to do the same.
Step 1
Get an Android port of openal-soft.
Step 2
I like to build static libraries for android game dev, instead of dynamic ones. So I replaced the jni/Android.mk with my own:
LOCAL_PATH := $(call my-dir) include $(CLEAR_VARS) OPENAL_DIR := OpenAL AL_SOURCES := \ $(OPENAL_DIR)/Alc/android.c \ $(OPENAL_DIR)/OpenAL32/alAuxEffectSlot.c \ $(OPENAL_DIR)/OpenAL32/alBuffer.c \ $(OPENAL_DIR)/OpenAL32/alDatabuffer.c \ $(OPENAL_DIR)/OpenAL32/alEffect.c \ $(OPENAL_DIR)/OpenAL32/alError.c \ $(OPENAL_DIR)/OpenAL32/alExtension.c \ $(OPENAL_DIR)/OpenAL32/alFilter.c \ $(OPENAL_DIR)/OpenAL32/alListener.c \ $(OPENAL_DIR)/OpenAL32/alSource.c \ $(OPENAL_DIR)/OpenAL32/alState.c \ $(OPENAL_DIR)/OpenAL32/alThunk.c \ $(OPENAL_DIR)/Alc/ALc.c \ $(OPENAL_DIR)/Alc/alcConfig.c \ $(OPENAL_DIR)/Alc/alcEcho.c \ $(OPENAL_DIR)/Alc/alcModulator.c \ $(OPENAL_DIR)/Alc/alcReverb.c \ $(OPENAL_DIR)/Alc/alcRing.c \ $(OPENAL_DIR)/Alc/alcThread.c \ $(OPENAL_DIR)/Alc/ALu.c \ $(OPENAL_DIR)/Alc/bs2b.c \ $(OPENAL_DIR)/Alc/null.c \ $(OPENAL_DIR)/Alc/panning.c \ $(OPENAL_DIR)/Alc/mixer.c \ $(OPENAL_DIR)/Alc/audiotrack.c \ $(OPENAL_DIR)/Alc/opensles.c LOCAL_MODULE := openal LOCAL_SRC_FILES := $(AL_SOURCES) LOCAL_C_INCLUDES := \ $(HOME)/src/openal-soft/jni/OpenAL \ $(HOME)/src/openal-soft/jni/OpenAL/include \ $(HOME)/src/openal-soft/jni/OpenAL/OpenAL32/Include \ LOCAL_CFLAGS += \ -DAL_ALEXT_PROTOTYPES \ MAX_SOURCES_LOW ?= 4 MAX_SOURCES_START ?= 8 MAX_SOURCES_HIGH ?= 64 LOCAL_CFLAGS += -DMAX_SOURCES_LOW=$(MAX_SOURCES_LOW) -DMAX_SOURCES_START=$(MAX_SOURCES_START) -DMAX_SOURCES_HIGH=$(MAX_SOURCES_HIGH) LOCAL_CFLAGS += -DPOST_FROYO include $(BUILD_STATIC_LIBRARY)
Step 3
Get an Android port of freealut.
Step 4
Add an Android.mk file to src/ directory containing:
LOCAL_PATH := $(call my-dir) include $(CLEAR_VARS) LOCAL_MODULE := alut LOCAL_SRC_FILES := \ alutBufferData.c \ alutCodec.c \ alutError.c \ alutInit.c \ alutInputStream.c \ alutLoader.c \ alutOutputStream.c \ alutUtil.c \ alutVersion.c \ alutWaveform.c LOCAL_C_INCLUDES := \ $(HOME)/src/freealut/include \ $(HOME)/src/openal-soft/jni/OpenAL/include \ #LOCAL_CFLAGS += include $(BUILD_STATIC_LIBRARY)
Step 5
Some config.h stuff does not properly make it into the source. Not sure why, so I manually edited alutInputStream.c alutInternal.h and alutUtil.c to overcome this.
Step 6
Now you can pull these static libraries into your build by adding to your project's Android.mk file something like this:
LOCAL_STATIC_LIBRARIES += alut openal ... $(call import-module,openal-soft/jni) $(call import-module,freealut/src)
UPDATE #1
When porting to MSWindows, I found that OpenAL is pretty tricky there as well. Some info for future reference:- You need to link against libOpenAL32.dll.a
- You need to supply soft_oal.dll with your game, renamed as OpenAL32.dll
- As with Android and OSX, the CMake stuff of freealut is horribly broken, so you need to pull in the sources to your project and hack around the platform specific stuff.
Still some work left to do, because I see this in the logs when I play a lot of sources: "Skipping starting source 2072467088 due to lack of CPU time."
ReplyDelete