Search code examples
androidc++qtopenalopenal-soft

How to build OpenAL-Soft and set up it in Qt Creator for Android


I didn't find a step by step guide how to build OpenAL-Soft to use it from Qt for Android.

I tried to make it by copying OpenAL-Soft sources into a project. I copied the OpenAL-Soft sources into my example. You can download my example here from DropBox. I use Qt 6.2.4 and OpenAL-Soft 1.23.1. Please guys download the example archive. Try to compile. Who is more experienced will be able to understand the errors. My example contains the archive openal-soft-1.23.1.zip I will distribute the examples on the forums. It helps a lot to motivate beginners. OpenAL contains functions for working with 3D audio, and this is very attractive. Installing via adding library sources should be easy (apart from some nuances that should be documented), because Qt Creator has the wonderful "Add existing directories..." and "Add existing files..." options. If this topic is closed, then answer in the topic at this link, or subscribe to it. I tried to build OpenAL-Soft for Android but I have these errors: https://github.com/DJLink/android-openal-soft/issues/1

I have already done this for Box2D and my app running on PC, emulator and android smartphone with the same codebase. This was the easiest and fastest way to install Box2D. I just copied the sources into the project and immediately switched between Android and Desktop to build APK and EXE. If I had included libraries, I would have spent a lot of time figuring out how to build for Android and how to switch between builds for Android and Desktop.

I can't ask a question on just one error because the errors can depend on each other. Perhaps someone also tried to add OpenAL-Soft to their project as sources and ran into the same errors.

enter image description here

Some of them:

In file included from ..\openal-with-source-using-android-qt6-cpp\core\converter.h:10,
                 from ..\openal-with-source-using-android-qt6-cpp\core\converter.cpp:4:
..\openal-with-source-using-android-qt6-cpp\core\mixer/defs.h:67:79: error: expected ',' or '...' before 'src'
   67 | using ResamplerFunc = void(*)(const InterpState *state, const float *RESTRICT src, uint frac,
      |                                                                               ^~~
..\openal-with-source-using-android-qt6-cpp\core\mixer/defs.h:74:64: error: expected ',' or '...' before 'src'

enter image description here

enter image description here

Added later:

I added #define RESTRICT and I see fewer errors. Some files have this line #include "config.h", but this file is not in the OpenAL-Soft source code. I added the empty config.h file. I think this file must be generated by CMake if you are compiling OpenAL-Soft from source. I found the config.h.in file that doesn't have the #define RESTRICT:

config..h.in

/* Define if deprecated EAX extensions are enabled */
#cmakedefine ALSOFT_EAX

/* Define if HRTF data is embedded in the library */
#cmakedefine ALSOFT_EMBED_HRTF_DATA

/* Define if we have the posix_memalign function */
#cmakedefine HAVE_POSIX_MEMALIGN

/* Define if we have the _aligned_malloc function */
#cmakedefine HAVE__ALIGNED_MALLOC

/* Define if we have the proc_pidpath function */
#cmakedefine HAVE_PROC_PIDPATH

/* Define if we have the getopt function */
#cmakedefine HAVE_GETOPT

/* Define if we have DBus/RTKit */
#cmakedefine HAVE_RTKIT

/* Define if we have SSE CPU extensions */
#cmakedefine HAVE_SSE
#cmakedefine HAVE_SSE2
#cmakedefine HAVE_SSE3
#cmakedefine HAVE_SSE4_1

/* Define if we have ARM Neon CPU extensions */
#cmakedefine HAVE_NEON

/* Define if we have the ALSA backend */
#cmakedefine HAVE_ALSA

/* Define if we have the OSS backend */
#cmakedefine HAVE_OSS

/* Define if we have the PipeWire backend */
#cmakedefine HAVE_PIPEWIRE

/* Define if we have the Solaris backend */
#cmakedefine HAVE_SOLARIS

/* Define if we have the SndIO backend */
#cmakedefine HAVE_SNDIO

/* Define if we have the WASAPI backend */
#cmakedefine HAVE_WASAPI

/* Define if we have the DSound backend */
#cmakedefine HAVE_DSOUND

/* Define if we have the Windows Multimedia backend */
#cmakedefine HAVE_WINMM

/* Define if we have the PortAudio backend */
#cmakedefine HAVE_PORTAUDIO

/* Define if we have the PulseAudio backend */
#cmakedefine HAVE_PULSEAUDIO

/* Define if we have the JACK backend */
#cmakedefine HAVE_JACK

/* Define if we have the CoreAudio backend */
#cmakedefine HAVE_COREAUDIO

/* Define if we have the OpenSL backend */
#cmakedefine HAVE_OPENSL

/* Define if we have the Oboe backend */
#cmakedefine HAVE_OBOE

/* Define if we have the Wave Writer backend */
#cmakedefine HAVE_WAVE

/* Define if we have the SDL2 backend */
#cmakedefine HAVE_SDL2

/* Define if we have dlfcn.h */
#cmakedefine HAVE_DLFCN_H

/* Define if we have pthread_np.h */
#cmakedefine HAVE_PTHREAD_NP_H

/* Define if we have malloc.h */
#cmakedefine HAVE_MALLOC_H

/* Define if we have cpuid.h */
#cmakedefine HAVE_CPUID_H

/* Define if we have intrin.h */
#cmakedefine HAVE_INTRIN_H

/* Define if we have guiddef.h */
#cmakedefine HAVE_GUIDDEF_H

/* Define if we have initguid.h */
#cmakedefine HAVE_INITGUID_H

/* Define if we have GCC's __get_cpuid() */
#cmakedefine HAVE_GCC_GET_CPUID

/* Define if we have the __cpuid() intrinsic */
#cmakedefine HAVE_CPUID_INTRINSIC

/* Define if we have SSE intrinsics */
#cmakedefine HAVE_SSE_INTRINSICS

/* Define if we have pthread_setschedparam() */
#cmakedefine HAVE_PTHREAD_SETSCHEDPARAM

/* Define if we have pthread_setname_np() */
#cmakedefine HAVE_PTHREAD_SETNAME_NP

/* Define if we have pthread_set_name_np() */
#cmakedefine HAVE_PTHREAD_SET_NAME_NP

/* Define the installation data directory */
#cmakedefine ALSOFT_INSTALL_DATADIR "@ALSOFT_INSTALL_DATADIR@"


Solution

  • I found the simples way! I just downloaded these sources: https://github.com/AerialX/openal-soft-android and built it using CMake. The libopenal.so library was created. I created the "Play" button. I built my first app that plays music using OpenAL! It works on my smartphone! It's cool!

    My step-by-step guide for Qt 6.2.4 MinGW 64-bit:

    • Download these sources: https://github.com/AerialX/openal-soft-android
    • Add CMake to the Path variable (CMake is distributed with Qt)
    • Go to the openal-soft-android-master folder and open CMD there
    • Copy the next commands to the console (don't forget to change the path to your android.toolchain.cmake)

    cmake -G "MinGW Makefiles" -S . -B ./build -DCMAKE_TOOLCHAIN_FILE=E:\AppData\Android\SDK\ndk\25.1.8937393\build\cmake\android.toolchain.cmake -DANDROID_ABI=armeabi-v7a -DANDROID_NATIVE_API_LEVEL=25

    cmake --build ./build -j 4

    The libopenal.so will be created. Create a new Qt project. Create the jniLibs/armeabi-v7a folder inside of your Qt project. And copy libopenal.so inside of jniLibs/armeabi-v7a.

    Create the libs\openal-soft\include folder inside of your Qt project and copy the AL folder there.

    Add these settings to your pro-file:

    INCLUDEPATH += $$PWD/libs/openal-soft/include
    
    contains(ANDROID_TARGET_ARCH, armeabi-v7a)
    {
        ANDROID_EXTRA_LIBS += $$PWD/jniLibs/armeabi-v7a/libopenal.so
    }
    

    Added 1/14/2024

    I use these settings to run on Windows, real device, and Android Emulator:

    CONFIG("windows") {
        INCLUDEPATH += $$PWD/libs/openal-soft-desktop-1.23.1/include
        LIBS += -L$$PWD/libs/openal-soft-desktop-1.23.1/lib/x64
        LIBS += -lOpenAL32.dll
    }
    
    CONFIG("armeabi-v7a") {
        INCLUDEPATH += $$PWD/libs/openal-soft-android/include
        contains(ANDROID_TARGET_ARCH, armeabi-v7a)
        {
            ANDROID_EXTRA_LIBS += $$PWD/jniLibs/armeabi-v7a/libopenal.so
        }
    }
    
    CONFIG("x86") {
        INCLUDEPATH += $$PWD/libs/openal-soft-android/include
        contains(ANDROID_TARGET_ARCH, x86)
        {
            ANDROID_EXTRA_LIBS += $$PWD/jniLibs/x86/libopenal.so
        }
    }