ソースを参照

Updated openal-soft to version 1.15.1

fysx 12 年 前
コミット
f0fa37f4ad
100 ファイル変更16289 行追加12338 行削除
  1. 2 0
      jni/Application.mk
  2. 5 0
      jni/openal-soft-android/.gitignore
  3. 656 294
      jni/openal-soft-android/Alc/ALc.c
  4. 539 457
      jni/openal-soft-android/Alc/ALu.c
  5. 165 142
      jni/openal-soft-android/Alc/alcConfig.c
  6. 0 112
      jni/openal-soft-android/Alc/alcDedicated.c
  7. 0 191
      jni/openal-soft-android/Alc/alcEcho.c
  8. 0 209
      jni/openal-soft-android/Alc/alcModulator.c
  9. 1 0
      jni/openal-soft-android/Alc/alcRing.c
  10. 0 128
      jni/openal-soft-android/Alc/alcThread.c
  11. 180 0
      jni/openal-soft-android/Alc/atomic.h
  12. 526 402
      jni/openal-soft-android/Alc/backends/alsa.c
  13. 0 270
      jni/openal-soft-android/Alc/backends/android.c
  14. 230 0
      jni/openal-soft-android/Alc/backends/base.c
  15. 133 0
      jni/openal-soft-android/Alc/backends/base.h
  16. 69 74
      jni/openal-soft-android/Alc/backends/coreaudio.c
  17. 587 161
      jni/openal-soft-android/Alc/backends/dsound.c
  18. 91 28
      jni/openal-soft-android/Alc/backends/loopback.c
  19. 431 167
      jni/openal-soft-android/Alc/backends/mmdevapi.c
  20. 128 70
      jni/openal-soft-android/Alc/backends/null.c
  21. 77 30
      jni/openal-soft-android/Alc/backends/opensl.c
  22. 304 201
      jni/openal-soft-android/Alc/backends/oss.c
  23. 112 87
      jni/openal-soft-android/Alc/backends/portaudio.c
  24. 445 465
      jni/openal-soft-android/Alc/backends/pulseaudio.c
  25. 1169 0
      jni/openal-soft-android/Alc/backends/qsa.c
  26. 35 121
      jni/openal-soft-android/Alc/backends/sndio.c
  27. 55 49
      jni/openal-soft-android/Alc/backends/solaris.c
  28. 55 38
      jni/openal-soft-android/Alc/backends/wave.c
  29. 327 322
      jni/openal-soft-android/Alc/backends/winmm.c
  30. 2 18
      jni/openal-soft-android/Alc/bs2b.c
  31. 65 0
      jni/openal-soft-android/Alc/compat.h
  32. 275 0
      jni/openal-soft-android/Alc/effects/autowah.c
  33. 381 0
      jni/openal-soft-android/Alc/effects/chorus.c
  34. 223 0
      jni/openal-soft-android/Alc/effects/compressor.c
  35. 167 0
      jni/openal-soft-android/Alc/effects/dedicated.c
  36. 300 0
      jni/openal-soft-android/Alc/effects/distortion.c
  37. 296 0
      jni/openal-soft-android/Alc/effects/echo.c
  38. 337 0
      jni/openal-soft-android/Alc/effects/equalizer.c
  39. 380 0
      jni/openal-soft-android/Alc/effects/flanger.c
  40. 306 0
      jni/openal-soft-android/Alc/effects/modulator.c
  41. 155 0
      jni/openal-soft-android/Alc/effects/null.c
  42. 776 312
      jni/openal-soft-android/Alc/effects/reverb.c
  43. 31 0
      jni/openal-soft-android/Alc/evtqueue.h
  44. 295 31
      jni/openal-soft-android/Alc/helpers.c
  45. 610 253
      jni/openal-soft-android/Alc/hrtf.c
  46. 835 836
      jni/openal-soft-android/Alc/hrtf_tables.inc
  47. 278 0
      jni/openal-soft-android/Alc/midi/base.c
  48. 128 0
      jni/openal-soft-android/Alc/midi/base.h
  49. 95 0
      jni/openal-soft-android/Alc/midi/dummy.c
  50. 843 0
      jni/openal-soft-android/Alc/midi/fluidsynth.c
  51. 1436 0
      jni/openal-soft-android/Alc/midi/sf2load.c
  52. 204 607
      jni/openal-soft-android/Alc/mixer.c
  53. 125 0
      jni/openal-soft-android/Alc/mixer_c.c
  54. 33 0
      jni/openal-soft-android/Alc/mixer_defs.h
  55. 140 0
      jni/openal-soft-android/Alc/mixer_inc.c
  56. 130 0
      jni/openal-soft-android/Alc/mixer_neon.c
  57. 164 0
      jni/openal-soft-android/Alc/mixer_sse.c
  58. 280 144
      jni/openal-soft-android/Alc/panning.c
  59. 21 0
      jni/openal-soft-android/Alc/rwlock.h
  60. 200 0
      jni/openal-soft-android/Alc/threads.c
  61. 34 0
      jni/openal-soft-android/Alc/uintmap.h
  62. 18 8
      jni/openal-soft-android/Android.mk
  63. 0 498
      jni/openal-soft-android/CMakeCache.txt
  64. 0 44
      jni/openal-soft-android/CMakeFiles/CMakeCCompiler.cmake
  65. 0 26
      jni/openal-soft-android/CMakeFiles/CMakeDirectoryInformation.cmake
  66. 0 437
      jni/openal-soft-android/CMakeFiles/CMakeError.log
  67. 0 755
      jni/openal-soft-android/CMakeFiles/CMakeOutput.log
  68. 0 15
      jni/openal-soft-android/CMakeFiles/CMakeSystem.cmake
  69. BIN
      jni/openal-soft-android/CMakeFiles/CheckTypeSize/SIZEOF_LONG.bin
  70. 0 40
      jni/openal-soft-android/CMakeFiles/CheckTypeSize/SIZEOF_LONG.c
  71. BIN
      jni/openal-soft-android/CMakeFiles/CheckTypeSize/SIZEOF_LONG_LONG.bin
  72. 0 40
      jni/openal-soft-android/CMakeFiles/CheckTypeSize/SIZEOF_LONG_LONG.c
  73. 0 220
      jni/openal-soft-android/CMakeFiles/CompilerIdC/CMakeCCompilerId.c
  74. 0 53
      jni/openal-soft-android/CMakeFiles/Makefile.cmake
  75. 0 152
      jni/openal-soft-android/CMakeFiles/Makefile2
  76. 0 2
      jni/openal-soft-android/CMakeFiles/TargetDirectories.txt
  77. 0 1
      jni/openal-soft-android/CMakeFiles/cmake.check_cache
  78. 0 32
      jni/openal-soft-android/CMakeFiles/openal-info.dir/C.includecache
  79. 0 19
      jni/openal-soft-android/CMakeFiles/openal-info.dir/DependInfo.cmake
  80. 0 122
      jni/openal-soft-android/CMakeFiles/openal-info.dir/build.make
  81. 0 12
      jni/openal-soft-android/CMakeFiles/openal-info.dir/cmake_clean.cmake
  82. 0 9
      jni/openal-soft-android/CMakeFiles/openal-info.dir/depend.internal
  83. 0 9
      jni/openal-soft-android/CMakeFiles/openal-info.dir/depend.make
  84. 0 8
      jni/openal-soft-android/CMakeFiles/openal-info.dir/flags.make
  85. 0 1
      jni/openal-soft-android/CMakeFiles/openal-info.dir/link.txt
  86. 0 2
      jni/openal-soft-android/CMakeFiles/openal-info.dir/progress.make
  87. 0 1
      jni/openal-soft-android/CMakeFiles/openal-info.dir/relink.txt
  88. 0 684
      jni/openal-soft-android/CMakeFiles/openal.dir/C.includecache
  89. 0 54
      jni/openal-soft-android/CMakeFiles/openal.dir/DependInfo.cmake
  90. 0 913
      jni/openal-soft-android/CMakeFiles/openal.dir/build.make
  91. 0 43
      jni/openal-soft-android/CMakeFiles/openal.dir/cmake_clean.cmake
  92. 0 491
      jni/openal-soft-android/CMakeFiles/openal.dir/depend.internal
  93. 0 491
      jni/openal-soft-android/CMakeFiles/openal.dir/depend.make
  94. 0 10
      jni/openal-soft-android/CMakeFiles/openal.dir/flags.make
  95. 0 1
      jni/openal-soft-android/CMakeFiles/openal.dir/link.txt
  96. 0 29
      jni/openal-soft-android/CMakeFiles/openal.dir/progress.make
  97. 0 1
      jni/openal-soft-android/CMakeFiles/openal.dir/relink.txt
  98. 0 1
      jni/openal-soft-android/CMakeFiles/progress.marks
  99. 404 168
      jni/openal-soft-android/CMakeLists.txt
  100. 0 727
      jni/openal-soft-android/Makefile

+ 2 - 0
jni/Application.mk

@@ -4,4 +4,6 @@
 APP_STL := gnustl_shared
 APP_ABI := armeabi armeabi-v7a
 APP_CPPFLAGS := -frtti
+APP_LDFLAGS := -llog -landroid -lz -lOpenSLES
+
 # APP_OPTIM := debug

+ 5 - 0
jni/openal-soft-android/.gitignore

@@ -1 +1,6 @@
 build
+winbuild
+win64build
+include/sndio.h
+include/sys
+openal-soft.kdev4

ファイルの差分が大きいため隠しています
+ 656 - 294
jni/openal-soft-android/Alc/ALc.c


ファイルの差分が大きいため隠しています
+ 539 - 457
jni/openal-soft-android/Alc/ALu.c


+ 165 - 142
jni/openal-soft-android/Alc/alcConfig.c

@@ -19,7 +19,7 @@
  */
 
 #ifdef _WIN32
-#ifdef __MINGW64__
+#ifdef __MINGW32__
 #define _WIN32_IE 0x501
 #else
 #define _WIN32_IE 0x400
@@ -45,161 +45,133 @@ typedef struct ConfigEntry {
 } ConfigEntry;
 
 typedef struct ConfigBlock {
-    char *name;
     ConfigEntry *entries;
     unsigned int entryCount;
 } ConfigBlock;
 
-static ConfigBlock *cfgBlocks;
-static unsigned int cfgCount;
+static ConfigBlock cfgBlock;
 
 static char buffer[1024];
 
+static char *lstrip(char *line)
+{
+    while(isspace(line[0]))
+        line++;
+    return line;
+}
+
+static char *rstrip(char *line)
+{
+    size_t len = strlen(line);
+    while(len > 0 && isspace(line[len-1]))
+        len--;
+    line[len] = 0;
+    return line;
+}
+
 static void LoadConfigFromFile(FILE *f)
 {
-    ConfigBlock *curBlock = cfgBlocks;
+    char curSection[128] = "";
     ConfigEntry *ent;
 
     while(fgets(buffer, sizeof(buffer), f))
     {
-        int i = 0;
+        char *line, *comment;
+        char key[256] = "";
+        char value[256] = "";
 
-        while(isspace(buffer[i]))
-            i++;
-        if(!buffer[i] || buffer[i] == '#')
-            continue;
+        comment = strchr(buffer, '#');
+        if(comment)
+        {
+            *(comment++) = 0;
+            comment = rstrip(lstrip(comment));
+        }
 
-        memmove(buffer, buffer+i, strlen(buffer+i)+1);
+        line = rstrip(lstrip(buffer));
+        if(!line[0])
+            continue;
 
-        if(buffer[0] == '[')
+        if(line[0] == '[')
         {
-            ConfigBlock *nextBlock;
-            unsigned int i;
+            char *section = line+1;
+            char *endsection;
 
-            i = 1;
-            while(buffer[i] && buffer[i] != ']')
-                i++;
-
-            if(!buffer[i])
+            endsection = strchr(section, ']');
+            if(!endsection || section == endsection || endsection[1] != 0)
             {
-                 ERR("config parse error: bad line \"%s\"\n", buffer);
+                 ERR("config parse error: bad line \"%s\"\n", line);
                  continue;
             }
-            buffer[i] = 0;
-
-            do {
-                i++;
-                if(buffer[i] && !isspace(buffer[i]))
-                {
-                    if(buffer[i] != '#')
-                        WARN("config warning: extra data after block: \"%s\"\n", buffer+i);
-                    break;
-                }
-            } while(buffer[i]);
-
-            nextBlock = NULL;
-            for(i = 0;i < cfgCount;i++)
-            {
-                if(strcasecmp(cfgBlocks[i].name, buffer+1) == 0)
-                {
-                    nextBlock = cfgBlocks+i;
-                    TRACE("found block '%s'\n", nextBlock->name);
-                    break;
-                }
-            }
+            *endsection = 0;
 
-            if(!nextBlock)
+            if(strcasecmp(section, "general") == 0)
+                curSection[0] = 0;
+            else
             {
-                nextBlock = realloc(cfgBlocks, (cfgCount+1)*sizeof(ConfigBlock));
-                if(!nextBlock)
-                {
-                     ERR("config parse error: error reallocating config blocks\n");
-                     continue;
-                }
-                cfgBlocks = nextBlock;
-                nextBlock = cfgBlocks+cfgCount;
-                cfgCount++;
-
-                nextBlock->name = strdup(buffer+1);
-                nextBlock->entries = NULL;
-                nextBlock->entryCount = 0;
-
-                TRACE("found new block '%s'\n", nextBlock->name);
+                strncpy(curSection, section, sizeof(curSection)-1);
+                curSection[sizeof(curSection)-1] = 0;
             }
-            curBlock = nextBlock;
-            continue;
-        }
 
-        /* Look for the option name */
-        i = 0;
-        while(buffer[i] && buffer[i] != '#' && buffer[i] != '=' &&
-              !isspace(buffer[i]))
-            i++;
-
-        if(!buffer[i] || buffer[i] == '#' || i == 0)
-        {
-            ERR("config parse error: malformed option line: \"%s\"\n", buffer);
             continue;
         }
 
-        /* Seperate the option */
-        if(buffer[i] != '=')
+        if(sscanf(line, "%255[^=] = \"%255[^\"]\"", key, value) == 2 ||
+           sscanf(line, "%255[^=] = '%255[^\']'", key, value) == 2 ||
+           sscanf(line, "%255[^=] = %255[^\n]", key, value) == 2)
         {
-            buffer[i++] = 0;
-
-            while(isspace(buffer[i]))
-                i++;
-            if(buffer[i] != '=')
-            {
-                ERR("config parse error: option without a value: \"%s\"\n", buffer);
-                continue;
-            }
-        }
-        /* Find the start of the value */
-        buffer[i++] = 0;
-        while(isspace(buffer[i]))
-            i++;
+            /* sscanf doesn't handle '' or "" as empty values, so clip it
+             * manually. */
+            if(strcmp(value, "\"\"") == 0 || strcmp(value, "''") == 0)
+                value[0] = 0;
+         }
+         else if(sscanf(line, "%255[^=] %255[=]", key, value) == 2)
+         {
+             /* Special case for 'key =' */
+             value[0] = 0;
+         }
+         else
+         {
+             ERR("config parse error: malformed option line: \"%s\"\n\n", line);
+             continue;
+         }
+         rstrip(key);
+
+         if(curSection[0] != 0)
+         {
+             size_t len = strlen(curSection);
+             memmove(&key[len+1], key, sizeof(key)-1-len);
+             key[len] = '/';
+             memcpy(key, curSection, len);
+         }
 
         /* Check if we already have this option set */
-        ent = curBlock->entries;
-        while((unsigned int)(ent-curBlock->entries) < curBlock->entryCount)
+        ent = cfgBlock.entries;
+        while((unsigned int)(ent-cfgBlock.entries) < cfgBlock.entryCount)
         {
-            if(strcasecmp(ent->key, buffer) == 0)
+            if(strcasecmp(ent->key, key) == 0)
                 break;
             ent++;
         }
 
-        if((unsigned int)(ent-curBlock->entries) >= curBlock->entryCount)
+        if((unsigned int)(ent-cfgBlock.entries) >= cfgBlock.entryCount)
         {
             /* Allocate a new option entry */
-            ent = realloc(curBlock->entries, (curBlock->entryCount+1)*sizeof(ConfigEntry));
+            ent = realloc(cfgBlock.entries, (cfgBlock.entryCount+1)*sizeof(ConfigEntry));
             if(!ent)
             {
                  ERR("config parse error: error reallocating config entries\n");
                  continue;
             }
-            curBlock->entries = ent;
-            ent = curBlock->entries + curBlock->entryCount;
-            curBlock->entryCount++;
+            cfgBlock.entries = ent;
+            ent = cfgBlock.entries + cfgBlock.entryCount;
+            cfgBlock.entryCount++;
 
-            ent->key = strdup(buffer);
+            ent->key = strdup(key);
             ent->value = NULL;
         }
 
-        /* Look for the end of the line (Null term, new-line, or #-symbol) and
-           eat up the trailing whitespace */
-        memmove(buffer, buffer+i, strlen(buffer+i)+1);
-
-        i = 0;
-        while(buffer[i] && buffer[i] != '#' && buffer[i] != '\n')
-            i++;
-        do {
-            i--;
-        } while(i >= 0 && isspace(buffer[i]));
-        buffer[++i] = 0;
-
         free(ent->value);
-        ent->value = strdup(buffer);
+        ent->value = strdup(value);
 
         TRACE("found '%s' = '%s'\n", ent->key, ent->value);
     }
@@ -210,15 +182,13 @@ void ReadALConfig(void)
     const char *str;
     FILE *f;
 
-    cfgBlocks = calloc(1, sizeof(ConfigBlock));
-    cfgBlocks->name = strdup("general");
-    cfgCount = 1;
-
 #ifdef _WIN32
     if(SHGetSpecialFolderPathA(NULL, buffer, CSIDL_APPDATA, FALSE) != FALSE)
     {
         size_t p = strlen(buffer);
         snprintf(buffer+p, sizeof(buffer)-p, "\\alsoft.ini");
+
+        TRACE("Loading config %s...\n", buffer);
         f = fopen(buffer, "rt");
         if(f)
         {
@@ -227,15 +197,75 @@ void ReadALConfig(void)
         }
     }
 #else
-    f = fopen("/etc/openal/alsoft.conf", "r");
+    str = "/etc/openal/alsoft.conf";
+
+    TRACE("Loading config %s...\n", str);
+    f = fopen(str, "r");
     if(f)
     {
         LoadConfigFromFile(f);
         fclose(f);
     }
+
+    if(!(str=getenv("XDG_CONFIG_DIRS")) || str[0] == 0)
+        str = "/etc/xdg";
+    strncpy(buffer, str, sizeof(buffer)-1);
+    buffer[sizeof(buffer)-1] = 0;
+    /* Go through the list in reverse, since "the order of base directories
+     * denotes their importance; the first directory listed is the most
+     * important". Ergo, we need to load the settings from the later dirs
+     * first so that the settings in the earlier dirs override them.
+     */
+    while(1)
+    {
+        char *next = strrchr(buffer, ':');
+        if(next) *(next++) = 0;
+        else next = buffer;
+
+        if(next[0] != '/')
+            WARN("Ignoring XDG config dir: %s\n", next);
+        else
+        {
+            size_t len = strlen(next);
+            strncpy(next+len, "/alsoft.conf", buffer+sizeof(buffer)-next-len);
+            buffer[sizeof(buffer)-1] = 0;
+
+            TRACE("Loading config %s...\n", next);
+            f = fopen(next, "r");
+            if(f)
+            {
+                LoadConfigFromFile(f);
+                fclose(f);
+            }
+        }
+        if(next == buffer)
+            break;
+    }
+
     if((str=getenv("HOME")) != NULL && *str)
     {
         snprintf(buffer, sizeof(buffer), "%s/.alsoftrc", str);
+
+        TRACE("Loading config %s...\n", buffer);
+        f = fopen(buffer, "r");
+        if(f)
+        {
+            LoadConfigFromFile(f);
+            fclose(f);
+        }
+    }
+
+    if((str=getenv("XDG_CONFIG_HOME")) != NULL && str[0] != 0)
+        snprintf(buffer, sizeof(buffer), "%s/%s", str, "alsoft.conf");
+    else
+    {
+        buffer[0] = 0;
+        if((str=getenv("HOME")) != NULL && str[0] != 0)
+            snprintf(buffer, sizeof(buffer), "%s/.config/%s", str, "alsoft.conf");
+    }
+    if(buffer[0] != 0)
+    {
+        TRACE("Loading config %s...\n", buffer);
         f = fopen(buffer, "r");
         if(f)
         {
@@ -244,8 +274,10 @@ void ReadALConfig(void)
         }
     }
 #endif
+
     if((str=getenv("ALSOFT_CONF")) != NULL && *str)
     {
+        TRACE("Loading config %s...\n", str);
         f = fopen(str, "r");
         if(f)
         {
@@ -259,51 +291,42 @@ void FreeALConfig(void)
 {
     unsigned int i;
 
-    for(i = 0;i < cfgCount;i++)
+    for(i = 0;i < cfgBlock.entryCount;i++)
     {
-        unsigned int j;
-        for(j = 0;j < cfgBlocks[i].entryCount;j++)
-        {
-           free(cfgBlocks[i].entries[j].key);
-           free(cfgBlocks[i].entries[j].value);
-        }
-        free(cfgBlocks[i].entries);
-        free(cfgBlocks[i].name);
+        free(cfgBlock.entries[i].key);
+        free(cfgBlock.entries[i].value);
     }
-    free(cfgBlocks);
-    cfgBlocks = NULL;
-    cfgCount = 0;
+    free(cfgBlock.entries);
 }
 
 const char *GetConfigValue(const char *blockName, const char *keyName, const char *def)
 {
-    unsigned int i, j;
+    unsigned int i;
+    char key[256];
 
     if(!keyName)
         return def;
 
-    if(!blockName)
-        blockName = "general";
-
-    for(i = 0;i < cfgCount;i++)
+    if(blockName && strcasecmp(blockName, "general") != 0)
+        snprintf(key, sizeof(key), "%s/%s", blockName, keyName);
+    else
     {
-        if(strcasecmp(cfgBlocks[i].name, blockName) != 0)
-            continue;
+        strncpy(key, keyName, sizeof(key)-1);
+        key[sizeof(key)-1] = 0;
+    }
 
-        for(j = 0;j < cfgBlocks[i].entryCount;j++)
+    for(i = 0;i < cfgBlock.entryCount;i++)
+    {
+        if(strcasecmp(cfgBlock.entries[i].key, key) == 0)
         {
-            if(strcasecmp(cfgBlocks[i].entries[j].key, keyName) == 0)
-            {
-                TRACE("Found %s:%s = \"%s\"\n", blockName, keyName,
-                      cfgBlocks[i].entries[j].value);
-                if(cfgBlocks[i].entries[j].value[0])
-                    return cfgBlocks[i].entries[j].value;
-                return def;
-            }
+            TRACE("Found %s = \"%s\"\n", key, cfgBlock.entries[i].value);
+            if(cfgBlock.entries[i].value[0])
+                return cfgBlock.entries[i].value;
+            return def;
         }
     }
 
-    TRACE("Key %s:%s not found\n", blockName, keyName);
+    TRACE("Key %s not found\n", key);
     return def;
 }
 

+ 0 - 112
jni/openal-soft-android/Alc/alcDedicated.c

@@ -1,112 +0,0 @@
-/**
- * OpenAL cross platform audio library
- * Copyright (C) 2011 by Chris Robinson.
- * This library is free software; you can redistribute it and/or
- *  modify it under the terms of the GNU Library General Public
- *  License as published by the Free Software Foundation; either
- *  version 2 of the License, or (at your option) any later version.
- *
- * This library is distributed in the hope that it will be useful,
- *  but WITHOUT ANY WARRANTY; without even the implied warranty of
- *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- *  Library General Public License for more details.
- *
- * You should have received a copy of the GNU Library General Public
- *  License along with this library; if not, write to the
- *  Free Software Foundation, Inc., 59 Temple Place - Suite 330,
- *  Boston, MA  02111-1307, USA.
- * Or go to http://www.gnu.org/copyleft/lgpl.html
- */
-
-#include "config.h"
-
-#include <stdlib.h>
-
-#include "alMain.h"
-#include "alFilter.h"
-#include "alAuxEffectSlot.h"
-#include "alError.h"
-#include "alu.h"
-
-
-typedef struct ALdedicatedState {
-    // Must be first in all effects!
-    ALeffectState state;
-
-    ALfloat gains[MAXCHANNELS];
-} ALdedicatedState;
-
-
-static ALvoid DedicatedDestroy(ALeffectState *effect)
-{
-    ALdedicatedState *state = (ALdedicatedState*)effect;
-    free(state);
-}
-
-static ALboolean DedicatedDeviceUpdate(ALeffectState *effect, ALCdevice *Device)
-{
-    (void)effect;
-    (void)Device;
-    return AL_TRUE;
-}
-
-static ALvoid DedicatedUpdate(ALeffectState *effect, ALCcontext *Context, const ALeffectslot *Slot)
-{
-    ALdedicatedState *state = (ALdedicatedState*)effect;
-    ALCdevice *device = Context->Device;
-    const ALfloat *SpeakerGain;
-    ALfloat Gain;
-    ALint pos;
-    ALsizei s;
-
-    Gain = Slot->Gain * Slot->effect.Dedicated.Gain;
-    for(s = 0;s < MAXCHANNELS;s++)
-        state->gains[s] = 0.0f;
-
-    if(Slot->effect.type == AL_EFFECT_DEDICATED_DIALOGUE)
-    {
-        pos = aluCart2LUTpos(1.0f, 0.0f);
-        SpeakerGain = device->PanningLUT[pos];
-
-        for(s = 0;s < MAXCHANNELS;s++)
-            state->gains[s] = SpeakerGain[s] * Gain;
-    }
-    else if(Slot->effect.type == AL_EFFECT_DEDICATED_LOW_FREQUENCY_EFFECT)
-        state->gains[LFE] = Gain;
-}
-
-static ALvoid DedicatedProcess(ALeffectState *effect, ALuint SamplesToDo, const ALfloat *SamplesIn, ALfloat (*SamplesOut)[MAXCHANNELS])
-{
-    ALdedicatedState *state = (ALdedicatedState*)effect;
-    const ALfloat *gains = state->gains;
-    ALuint i, s;
-
-    for(i = 0;i < SamplesToDo;i++)
-    {
-        ALfloat sample;
-
-        sample = SamplesIn[i];
-        for(s = 0;s < MAXCHANNELS;s++)
-            SamplesOut[i][s] = sample * gains[s];
-    }
-}
-
-ALeffectState *DedicatedCreate(void)
-{
-    ALdedicatedState *state;
-    ALsizei s;
-
-    state = malloc(sizeof(*state));
-    if(!state)
-        return NULL;
-
-    state->state.Destroy = DedicatedDestroy;
-    state->state.DeviceUpdate = DedicatedDeviceUpdate;
-    state->state.Update = DedicatedUpdate;
-    state->state.Process = DedicatedProcess;
-
-    for(s = 0;s < MAXCHANNELS;s++)
-        state->gains[s] = 0.0f;
-
-    return &state->state;
-}

+ 0 - 191
jni/openal-soft-android/Alc/alcEcho.c

@@ -1,191 +0,0 @@
-/**
- * OpenAL cross platform audio library
- * Copyright (C) 2009 by Chris Robinson.
- * This library is free software; you can redistribute it and/or
- *  modify it under the terms of the GNU Library General Public
- *  License as published by the Free Software Foundation; either
- *  version 2 of the License, or (at your option) any later version.
- *
- * This library is distributed in the hope that it will be useful,
- *  but WITHOUT ANY WARRANTY; without even the implied warranty of
- *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- *  Library General Public License for more details.
- *
- * You should have received a copy of the GNU Library General Public
- *  License along with this library; if not, write to the
- *  Free Software Foundation, Inc., 59 Temple Place - Suite 330,
- *  Boston, MA  02111-1307, USA.
- * Or go to http://www.gnu.org/copyleft/lgpl.html
- */
-
-#include "config.h"
-
-#include <math.h>
-#include <stdlib.h>
-
-#include "alMain.h"
-#include "alFilter.h"
-#include "alAuxEffectSlot.h"
-#include "alError.h"
-#include "alu.h"
-
-
-typedef struct ALechoState {
-    // Must be first in all effects!
-    ALeffectState state;
-
-    ALfloat *SampleBuffer;
-    ALuint BufferLength;
-
-    // The echo is two tap. The delay is the number of samples from before the
-    // current offset
-    struct {
-        ALuint delay;
-    } Tap[2];
-    ALuint Offset;
-    // The LR gains for the first tap. The second tap uses the reverse
-    ALfloat GainL;
-    ALfloat GainR;
-
-    ALfloat FeedGain;
-
-    ALfloat Gain[MAXCHANNELS];
-
-    FILTER iirFilter;
-    ALfloat history[2];
-} ALechoState;
-
-static ALvoid EchoDestroy(ALeffectState *effect)
-{
-    ALechoState *state = (ALechoState*)effect;
-    if(state)
-    {
-        free(state->SampleBuffer);
-        state->SampleBuffer = NULL;
-        free(state);
-    }
-}
-
-static ALboolean EchoDeviceUpdate(ALeffectState *effect, ALCdevice *Device)
-{
-    ALechoState *state = (ALechoState*)effect;
-    ALuint maxlen, i;
-
-    // Use the next power of 2 for the buffer length, so the tap offsets can be
-    // wrapped using a mask instead of a modulo
-    maxlen  = fastf2u(AL_ECHO_MAX_DELAY * Device->Frequency) + 1;
-    maxlen += fastf2u(AL_ECHO_MAX_LRDELAY * Device->Frequency) + 1;
-    maxlen  = NextPowerOf2(maxlen);
-
-    if(maxlen != state->BufferLength)
-    {
-        void *temp;
-
-        temp = realloc(state->SampleBuffer, maxlen * sizeof(ALfloat));
-        if(!temp)
-            return AL_FALSE;
-        state->SampleBuffer = temp;
-        state->BufferLength = maxlen;
-    }
-    for(i = 0;i < state->BufferLength;i++)
-        state->SampleBuffer[i] = 0.0f;
-
-    return AL_TRUE;
-}
-
-static ALvoid EchoUpdate(ALeffectState *effect, ALCcontext *Context, const ALeffectslot *Slot)
-{
-    ALechoState *state = (ALechoState*)effect;
-    ALCdevice *Device = Context->Device;
-    ALuint frequency = Device->Frequency;
-    ALfloat lrpan, cw, g, gain;
-    ALuint i;
-
-    state->Tap[0].delay = fastf2u(Slot->effect.Echo.Delay * frequency) + 1;
-    state->Tap[1].delay = fastf2u(Slot->effect.Echo.LRDelay * frequency);
-    state->Tap[1].delay += state->Tap[0].delay;
-
-    lrpan = Slot->effect.Echo.Spread*0.5f + 0.5f;
-    state->GainL = aluSqrt(     lrpan);
-    state->GainR = aluSqrt(1.0f-lrpan);
-
-    state->FeedGain = Slot->effect.Echo.Feedback;
-
-    cw = aluCos(F_PI*2.0f * LOWPASSFREQREF / frequency);
-    g = 1.0f - Slot->effect.Echo.Damping;
-    state->iirFilter.coeff = lpCoeffCalc(g, cw);
-
-    gain = Slot->Gain;
-    for(i = 0;i < MAXCHANNELS;i++)
-        state->Gain[i] = 0.0f;
-    for(i = 0;i < Device->NumChan;i++)
-    {
-        enum Channel chan = Device->Speaker2Chan[i];
-        state->Gain[chan] = gain;
-    }
-}
-
-static ALvoid EchoProcess(ALeffectState *effect, ALuint SamplesToDo, const ALfloat *SamplesIn, ALfloat (*SamplesOut)[MAXCHANNELS])
-{
-    ALechoState *state = (ALechoState*)effect;
-    const ALuint mask = state->BufferLength-1;
-    const ALuint tap1 = state->Tap[0].delay;
-    const ALuint tap2 = state->Tap[1].delay;
-    ALuint offset = state->Offset;
-    ALfloat samp[2], smp;
-    ALuint i;
-
-    for(i = 0;i < SamplesToDo;i++,offset++)
-    {
-        // Sample first tap
-        smp = state->SampleBuffer[(offset-tap1) & mask];
-        samp[0] = smp * state->GainL;
-        samp[1] = smp * state->GainR;
-        // Sample second tap. Reverse LR panning
-        smp = state->SampleBuffer[(offset-tap2) & mask];
-        samp[0] += smp * state->GainR;
-        samp[1] += smp * state->GainL;
-
-        // Apply damping and feedback gain to the second tap, and mix in the
-        // new sample
-        smp = lpFilter2P(&state->iirFilter, 0, smp+SamplesIn[i]);
-        state->SampleBuffer[offset&mask] = smp * state->FeedGain;
-
-        SamplesOut[i][FRONT_LEFT]  += state->Gain[FRONT_LEFT]  * samp[0];
-        SamplesOut[i][FRONT_RIGHT] += state->Gain[FRONT_RIGHT] * samp[1];
-        SamplesOut[i][SIDE_LEFT]   += state->Gain[SIDE_LEFT]   * samp[0];
-        SamplesOut[i][SIDE_RIGHT]  += state->Gain[SIDE_RIGHT]  * samp[1];
-        SamplesOut[i][BACK_LEFT]   += state->Gain[BACK_LEFT]   * samp[0];
-        SamplesOut[i][BACK_RIGHT]  += state->Gain[BACK_RIGHT]  * samp[1];
-    }
-    state->Offset = offset;
-}
-
-ALeffectState *EchoCreate(void)
-{
-    ALechoState *state;
-
-    state = malloc(sizeof(*state));
-    if(!state)
-        return NULL;
-
-    state->state.Destroy = EchoDestroy;
-    state->state.DeviceUpdate = EchoDeviceUpdate;
-    state->state.Update = EchoUpdate;
-    state->state.Process = EchoProcess;
-
-    state->BufferLength = 0;
-    state->SampleBuffer = NULL;
-
-    state->Tap[0].delay = 0;
-    state->Tap[1].delay = 0;
-    state->Offset = 0;
-    state->GainL = 0.0f;
-    state->GainR = 0.0f;
-
-    state->iirFilter.coeff = 0.0f;
-    state->iirFilter.history[0] = 0.0f;
-    state->iirFilter.history[1] = 0.0f;
-
-    return &state->state;
-}

+ 0 - 209
jni/openal-soft-android/Alc/alcModulator.c

@@ -1,209 +0,0 @@
-/**
- * OpenAL cross platform audio library
- * Copyright (C) 2009 by Chris Robinson.
- * This library is free software; you can redistribute it and/or
- *  modify it under the terms of the GNU Library General Public
- *  License as published by the Free Software Foundation; either
- *  version 2 of the License, or (at your option) any later version.
- *
- * This library is distributed in the hope that it will be useful,
- *  but WITHOUT ANY WARRANTY; without even the implied warranty of
- *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- *  Library General Public License for more details.
- *
- * You should have received a copy of the GNU Library General Public
- *  License along with this library; if not, write to the
- *  Free Software Foundation, Inc., 59 Temple Place - Suite 330,
- *  Boston, MA  02111-1307, USA.
- * Or go to http://www.gnu.org/copyleft/lgpl.html
- */
-
-#include "config.h"
-
-#include <math.h>
-#include <stdlib.h>
-
-#include "alMain.h"
-#include "alFilter.h"
-#include "alAuxEffectSlot.h"
-#include "alError.h"
-#include "alu.h"
-
-
-typedef struct ALmodulatorState {
-    // Must be first in all effects!
-    ALeffectState state;
-
-    enum {
-        SINUSOID,
-        SAWTOOTH,
-        SQUARE
-    } Waveform;
-
-    ALuint index;
-    ALuint step;
-
-    ALfloat Gain[MAXCHANNELS];
-
-    FILTER iirFilter;
-    ALfloat history[1];
-} ALmodulatorState;
-
-#define WAVEFORM_FRACBITS  16
-#define WAVEFORM_FRACONE   (1<<WAVEFORM_FRACBITS)
-#define WAVEFORM_FRACMASK  (WAVEFORM_FRACONE-1)
-
-static __inline ALfloat Sin(ALuint index)
-{
-    return aluSin(index * (F_PI*2.0f / WAVEFORM_FRACONE));
-}
-
-static __inline ALfloat Saw(ALuint index)
-{
-    return index*(2.0f/WAVEFORM_FRACONE) - 1.0f;
-}
-
-static __inline ALfloat Square(ALuint index)
-{
-    return ((index>>(WAVEFORM_FRACBITS-1))&1)*2.0f - 1.0f;
-}
-
-
-static __inline ALfloat hpFilter1P(FILTER *iir, ALuint offset, ALfloat input)
-{
-    ALfloat *history = &iir->history[offset];
-    ALfloat a = iir->coeff;
-    ALfloat output = input;
-
-    output = output + (history[0]-output)*a;
-    history[0] = output;
-
-    return input - output;
-}
-
-
-#define DECL_TEMPLATE(func)                                                   \
-static void Process##func(ALmodulatorState *state, ALuint SamplesToDo,        \
-  const ALfloat *SamplesIn, ALfloat (*SamplesOut)[MAXCHANNELS])               \
-{                                                                             \
-    const ALuint step = state->step;                                          \
-    ALuint index = state->index;                                              \
-    ALfloat samp;                                                             \
-    ALuint i;                                                                 \
-                                                                              \
-    for(i = 0;i < SamplesToDo;i++)                                            \
-    {                                                                         \
-        samp = SamplesIn[i];                                                  \
-                                                                              \
-        index += step;                                                        \
-        index &= WAVEFORM_FRACMASK;                                           \
-        samp *= func(index);                                                  \
-                                                                              \
-        samp = hpFilter1P(&state->iirFilter, 0, samp);                        \
-                                                                              \
-        SamplesOut[i][FRONT_LEFT]   += state->Gain[FRONT_LEFT]   * samp;      \
-        SamplesOut[i][FRONT_RIGHT]  += state->Gain[FRONT_RIGHT]  * samp;      \
-        SamplesOut[i][FRONT_CENTER] += state->Gain[FRONT_CENTER] * samp;      \
-        SamplesOut[i][SIDE_LEFT]    += state->Gain[SIDE_LEFT]    * samp;      \
-        SamplesOut[i][SIDE_RIGHT]   += state->Gain[SIDE_RIGHT]   * samp;      \
-        SamplesOut[i][BACK_LEFT]    += state->Gain[BACK_LEFT]    * samp;      \
-        SamplesOut[i][BACK_RIGHT]   += state->Gain[BACK_RIGHT]   * samp;      \
-        SamplesOut[i][BACK_CENTER]  += state->Gain[BACK_CENTER]  * samp;      \
-    }                                                                         \
-    state->index = index;                                                     \
-}
-
-DECL_TEMPLATE(Sin)
-DECL_TEMPLATE(Saw)
-DECL_TEMPLATE(Square)
-
-#undef DECL_TEMPLATE
-
-
-static ALvoid ModulatorDestroy(ALeffectState *effect)
-{
-    ALmodulatorState *state = (ALmodulatorState*)effect;
-    free(state);
-}
-
-static ALboolean ModulatorDeviceUpdate(ALeffectState *effect, ALCdevice *Device)
-{
-    return AL_TRUE;
-    (void)effect;
-    (void)Device;
-}
-
-static ALvoid ModulatorUpdate(ALeffectState *effect, ALCcontext *Context, const ALeffectslot *Slot)
-{
-    ALmodulatorState *state = (ALmodulatorState*)effect;
-    ALCdevice *Device = Context->Device;
-    ALfloat gain, cw, a = 0.0f;
-    ALuint index;
-
-    if(Slot->effect.Modulator.Waveform == AL_RING_MODULATOR_SINUSOID)
-        state->Waveform = SINUSOID;
-    else if(Slot->effect.Modulator.Waveform == AL_RING_MODULATOR_SAWTOOTH)
-        state->Waveform = SAWTOOTH;
-    else if(Slot->effect.Modulator.Waveform == AL_RING_MODULATOR_SQUARE)
-        state->Waveform = SQUARE;
-
-    state->step = fastf2u(Slot->effect.Modulator.Frequency*WAVEFORM_FRACONE /
-                          Device->Frequency);
-    if(state->step == 0) state->step = 1;
-
-    cw = aluCos(F_PI*2.0f * Slot->effect.Modulator.HighPassCutoff /
-                            Device->Frequency);
-    a = (2.0f-cw) - aluSqrt(aluPow(2.0f-cw, 2.0f) - 1.0f);
-    state->iirFilter.coeff = a;
-
-    gain = Slot->Gain;
-    for(index = 0;index < MAXCHANNELS;index++)
-        state->Gain[index] = 0.0f;
-    for(index = 0;index < Device->NumChan;index++)
-    {
-        enum Channel chan = Device->Speaker2Chan[index];
-        state->Gain[chan] = gain;
-    }
-}
-
-static ALvoid ModulatorProcess(ALeffectState *effect, ALuint SamplesToDo, const ALfloat *SamplesIn, ALfloat (*SamplesOut)[MAXCHANNELS])
-{
-    ALmodulatorState *state = (ALmodulatorState*)effect;
-
-    switch(state->Waveform)
-    {
-        case SINUSOID:
-            ProcessSin(state, SamplesToDo, SamplesIn, SamplesOut);
-            break;
-
-        case SAWTOOTH:
-            ProcessSaw(state, SamplesToDo, SamplesIn, SamplesOut);
-            break;
-
-        case SQUARE:
-            ProcessSquare(state, SamplesToDo, SamplesIn, SamplesOut);
-            break;
-    }
-}
-
-ALeffectState *ModulatorCreate(void)
-{
-    ALmodulatorState *state;
-
-    state = malloc(sizeof(*state));
-    if(!state)
-        return NULL;
-
-    state->state.Destroy = ModulatorDestroy;
-    state->state.DeviceUpdate = ModulatorDeviceUpdate;
-    state->state.Update = ModulatorUpdate;
-    state->state.Process = ModulatorProcess;
-
-    state->index = 0;
-    state->step = 1;
-
-    state->iirFilter.coeff = 0.0f;
-    state->iirFilter.history[0] = 0.0f;
-
-    return &state->state;
-}

+ 1 - 0
jni/openal-soft-android/Alc/alcRing.c

@@ -24,6 +24,7 @@
 #include <stdlib.h>
 
 #include "alMain.h"
+#include "compat.h"
 
 
 struct RingBuffer {

+ 0 - 128
jni/openal-soft-android/Alc/alcThread.c

@@ -1,128 +0,0 @@
-/**
- * OpenAL cross platform audio library
- * Copyright (C) 1999-2007 by authors.
- * This library is free software; you can redistribute it and/or
- *  modify it under the terms of the GNU Library General Public
- *  License as published by the Free Software Foundation; either
- *  version 2 of the License, or (at your option) any later version.
- *
- * This library is distributed in the hope that it will be useful,
- *  but WITHOUT ANY WARRANTY; without even the implied warranty of
- *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- *  Library General Public License for more details.
- *
- * You should have received a copy of the GNU Library General Public
- *  License along with this library; if not, write to the
- *  Free Software Foundation, Inc., 59 Temple Place - Suite 330,
- *  Boston, MA  02111-1307, USA.
- * Or go to http://www.gnu.org/copyleft/lgpl.html
- */
-
-#include "config.h"
-
-#include <stdlib.h>
-
-#include "alMain.h"
-#include "alThunk.h"
-
-
-#ifdef _WIN32
-
-typedef struct {
-    ALuint (*func)(ALvoid*);
-    ALvoid *ptr;
-    HANDLE thread;
-} ThreadInfo;
-
-static DWORD CALLBACK StarterFunc(void *ptr)
-{
-    ThreadInfo *inf = (ThreadInfo*)ptr;
-    ALint ret;
-
-    ret = inf->func(inf->ptr);
-    ExitThread((DWORD)ret);
-
-    return (DWORD)ret;
-}
-
-ALvoid *StartThread(ALuint (*func)(ALvoid*), ALvoid *ptr)
-{
-    DWORD dummy;
-    ThreadInfo *inf = malloc(sizeof(ThreadInfo));
-    if(!inf) return 0;
-
-    inf->func = func;
-    inf->ptr = ptr;
-
-    inf->thread = CreateThread(NULL, 0, StarterFunc, inf, 0, &dummy);
-    if(!inf->thread)
-    {
-        free(inf);
-        return NULL;
-    }
-
-    return inf;
-}
-
-ALuint StopThread(ALvoid *thread)
-{
-    ThreadInfo *inf = thread;
-    DWORD ret = 0;
-
-    WaitForSingleObject(inf->thread, INFINITE);
-    GetExitCodeThread(inf->thread, &ret);
-    CloseHandle(inf->thread);
-
-    free(inf);
-
-    return (ALuint)ret;
-}
-
-#else
-
-#include <pthread.h>
-
-typedef struct {
-    ALuint (*func)(ALvoid*);
-    ALvoid *ptr;
-    ALuint ret;
-    pthread_t thread;
-} ThreadInfo;
-
-static void *StarterFunc(void *ptr)
-{
-    ThreadInfo *inf = (ThreadInfo*)ptr;
-    inf->ret = inf->func(inf->ptr);
-    return NULL;
-}
-
-ALvoid *StartThread(ALuint (*func)(ALvoid*), ALvoid *ptr)
-{
-    ThreadInfo *inf = malloc(sizeof(ThreadInfo));
-    if(!inf) return NULL;
-
-    inf->func = func;
-    inf->ptr = ptr;
-    if(pthread_create(&inf->thread, NULL, StarterFunc, inf) != 0)
-    {
-        free(inf);
-        return NULL;
-    }
-
-    return inf;
-}
-
-ALuint StopThread(ALvoid *thread)
-{
-    ThreadInfo *inf = thread;
-    ALuint ret;
-
-    pthread_join(inf->thread, NULL);
-    ret = inf->ret;
-
-    free(inf);
-
-    return ret;
-}
-
-#endif

+ 180 - 0
jni/openal-soft-android/Alc/atomic.h

@@ -0,0 +1,180 @@
+#ifndef AL_ATOMIC_H
+#define AL_ATOMIC_H
+
+
+typedef void *volatile XchgPtr;
+
+#if defined(__GNUC__) && (__GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 1)) && !defined(__QNXNTO__)
+typedef unsigned int RefCount;
+inline RefCount IncrementRef(volatile RefCount *ptr)
+{ return __sync_add_and_fetch(ptr, 1); }
+inline RefCount DecrementRef(volatile RefCount *ptr)
+{ return __sync_sub_and_fetch(ptr, 1); }
+
+inline int ExchangeInt(volatile int *ptr, int newval)
+{
+    return __sync_lock_test_and_set(ptr, newval);
+}
+inline void *ExchangePtr(XchgPtr *ptr, void *newval)
+{
+    return __sync_lock_test_and_set(ptr, newval);
+}
+inline ALboolean CompExchangeInt(volatile int *ptr, int oldval, int newval)
+{
+    return __sync_bool_compare_and_swap(ptr, oldval, newval);
+}
+inline ALboolean CompExchangePtr(XchgPtr *ptr, void *oldval, void *newval)
+{
+    return __sync_bool_compare_and_swap(ptr, oldval, newval);
+}
+
+#elif defined(__GNUC__) && (defined(__i386__) || defined(__x86_64__))
+
+inline unsigned int xaddl(volatile unsigned int *dest, int incr)
+{
+    unsigned int ret;
+    __asm__ __volatile__("lock; xaddl %0,(%1)"
+                         : "=r" (ret)
+                         : "r" (dest), "0" (incr)
+                         : "memory");
+    return ret;
+}
+
+typedef unsigned int RefCount;
+inline RefCount IncrementRef(volatile RefCount *ptr)
+{ return xaddl(ptr, 1)+1; }
+inline RefCount DecrementRef(volatile RefCount *ptr)
+{ return xaddl(ptr, -1)-1; }
+
+inline int ExchangeInt(volatile int *dest, int newval)
+{
+    int ret;
+    __asm__ __volatile__("lock; xchgl %0,(%1)"
+                         : "=r" (ret)
+                         : "r" (dest), "0" (newval)
+                         : "memory");
+    return ret;
+}
+
+inline ALboolean CompExchangeInt(volatile int *dest, int oldval, int newval)
+{
+    int ret;
+    __asm__ __volatile__("lock; cmpxchgl %2,(%1)"
+                         : "=a" (ret)
+                         : "r" (dest), "r" (newval), "0" (oldval)
+                         : "memory");
+    return ret == oldval;
+}
+
+inline void *ExchangePtr(XchgPtr *dest, void *newval)
+{
+    void *ret;
+    __asm__ __volatile__(
+#ifdef __i386__
+                         "lock; xchgl %0,(%1)"
+#else
+                         "lock; xchgq %0,(%1)"
+#endif
+                         : "=r" (ret)
+                         : "r" (dest), "0" (newval)
+                         : "memory"
+    );
+    return ret;
+}
+
+inline ALboolean CompExchangePtr(XchgPtr *dest, void *oldval, void *newval)
+{
+    void *ret;
+    __asm__ __volatile__(
+#ifdef __i386__
+                         "lock; cmpxchgl %2,(%1)"
+#else
+                         "lock; cmpxchgq %2,(%1)"
+#endif
+                         : "=a" (ret)
+                         : "r" (dest), "r" (newval), "0" (oldval)
+                         : "memory"
+    );
+    return ret == oldval;
+}
+
+#elif defined(_WIN32)
+
+#define WIN32_LEAN_AND_MEAN
+#include <windows.h>
+
+typedef LONG RefCount;
+inline RefCount IncrementRef(volatile RefCount *ptr)
+{ return InterlockedIncrement(ptr); }
+inline RefCount DecrementRef(volatile RefCount *ptr)
+{ return InterlockedDecrement(ptr); }
+
+extern ALbyte LONG_size_does_not_match_int[(sizeof(LONG)==sizeof(int))?1:-1];
+
+inline int ExchangeInt(volatile int *ptr, int newval)
+{
+    union {
+        volatile int *i;
+        volatile LONG *l;
+    } u = { ptr };
+    return InterlockedExchange(u.l, newval);
+}
+inline void *ExchangePtr(XchgPtr *ptr, void *newval)
+{
+    return InterlockedExchangePointer(ptr, newval);
+}
+inline ALboolean CompExchangeInt(volatile int *ptr, int oldval, int newval)
+{
+    union {
+        volatile int *i;
+        volatile LONG *l;
+    } u = { ptr };
+    return InterlockedCompareExchange(u.l, newval, oldval) == oldval;
+}
+inline ALboolean CompExchangePtr(XchgPtr *ptr, void *oldval, void *newval)
+{
+    return InterlockedCompareExchangePointer(ptr, newval, oldval) == oldval;
+}
+
+#elif defined(__APPLE__)
+
+#include <libkern/OSAtomic.h>
+
+typedef int32_t RefCount;
+inline RefCount IncrementRef(volatile RefCount *ptr)
+{ return OSAtomicIncrement32Barrier(ptr); }
+inline RefCount DecrementRef(volatile RefCount *ptr)
+{ return OSAtomicDecrement32Barrier(ptr); }
+
+inline int ExchangeInt(volatile int *ptr, int newval)
+{
+    /* Really? No regular old atomic swap? */
+    int oldval;
+    do {
+        oldval = *ptr;
+    } while(!OSAtomicCompareAndSwap32Barrier(oldval, newval, ptr));
+    return oldval;
+}
+inline void *ExchangePtr(XchgPtr *ptr, void *newval)
+{
+    void *oldval;
+    do {
+        oldval = *ptr;
+    } while(!OSAtomicCompareAndSwapPtrBarrier(oldval, newval, ptr));
+    return oldval;
+}
+inline ALboolean CompExchangeInt(volatile int *ptr, int oldval, int newval)
+{
+    return OSAtomicCompareAndSwap32Barrier(oldval, newval, ptr);
+}
+inline ALboolean CompExchangePtr(XchgPtr *ptr, void *oldval, void *newval)
+{
+    return OSAtomicCompareAndSwapPtrBarrier(oldval, newval, ptr);
+}
+
+#else
+#error "No atomic functions available on this platform!"
+typedef ALuint RefCount;
+#endif
+
+#endif /* AL_ATOMIC_H */

ファイルの差分が大きいため隠しています
+ 526 - 402
jni/openal-soft-android/Alc/backends/alsa.c


+ 0 - 270
jni/openal-soft-android/Alc/backends/android.c

@@ -1,270 +0,0 @@
-/**
- * OpenAL cross platform audio library
- * Copyright (C) 2010 by Chris Robinson
- * This library is free software; you can redistribute it and/or
- *  modify it under the terms of the GNU Library General Public
- *  License as published by the Free Software Foundation; either
- *  version 2 of the License, or (at your option) any later version.
- *
- * This library is distributed in the hope that it will be useful,
- *  but WITHOUT ANY WARRANTY; without even the implied warranty of
- *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- *  Library General Public License for more details.
- *
- * You should have received a copy of the GNU Library General Public
- *  License along with this library; if not, write to the
- *  Free Software Foundation, Inc., 59 Temple Place - Suite 330,
- *  Boston, MA  02111-1307, USA.
- * Or go to http://www.gnu.org/copyleft/lgpl.html
- */
-
-#include "config.h"
-
-#include <stdlib.h>
-#include <jni.h>
-#include <pthread.h>
-#include "alMain.h"
-#include "AL/al.h"
-#include "AL/alc.h"
-
-static const ALCchar android_device[] = "Android Legacy";
-
-static JavaVM* javaVM = NULL;
-
-static jclass cAudioTrack = NULL;
-
-static jmethodID mAudioTrack;
-static jmethodID mGetMinBufferSize;
-static jmethodID mPlay;
-static jmethodID mStop;
-static jmethodID mRelease;
-static jmethodID mWrite;
-
-__attribute__((visibility("default"))) jint JNI_OnLoad(JavaVM* vm, void* reserved)
-{
-	(void)reserved;
-    javaVM = vm;
-    return JNI_VERSION_1_2;
-}
-
-static JNIEnv* GetEnv()
-{
-    JNIEnv* env = NULL;
-    if (javaVM) (*javaVM)->GetEnv(javaVM, (void**)&env, JNI_VERSION_1_2);
-    return env;
-}
-
-typedef struct
-{
-    pthread_t thread;
-    volatile int running;
-} AndroidData;
-
-#define STREAM_MUSIC 3
-#define CHANNEL_CONFIGURATION_MONO 2
-#define CHANNEL_CONFIGURATION_STEREO 3
-#define ENCODING_PCM_8BIT 3
-#define ENCODING_PCM_16BIT 2
-#define MODE_STREAM 1
-
-static void* thread_function(void* arg)
-{
-    ALCdevice* device = (ALCdevice*)arg;
-    AndroidData* data = (AndroidData*)device->ExtraData;
-
-    JNIEnv* env;
-    (*javaVM)->AttachCurrentThread(javaVM, &env, NULL);
-
-    (*env)->PushLocalFrame(env, 2);
-
-    int sampleRateInHz = device->Frequency;
-    int channelConfig = ChannelsFromDevFmt(device->FmtChans) == 1 ? CHANNEL_CONFIGURATION_MONO : CHANNEL_CONFIGURATION_STEREO;
-    int audioFormat = BytesFromDevFmt(device->FmtType) == 1 ? ENCODING_PCM_8BIT : ENCODING_PCM_16BIT;
-
-    int bufferSizeInBytes = (*env)->CallStaticIntMethod(env, cAudioTrack, 
-        mGetMinBufferSize, sampleRateInHz, channelConfig, audioFormat);
-
-    int bufferSizeInSamples = bufferSizeInBytes / FrameSizeFromDevFmt(device->FmtChans, device->FmtType);
-
-    jobject track = (*env)->NewObject(env, cAudioTrack, mAudioTrack,
-        STREAM_MUSIC, sampleRateInHz, channelConfig, audioFormat, device->NumUpdates * bufferSizeInBytes, MODE_STREAM);
-
-#ifdef HAVE_ANDROID_LOW_LATENCY
-    int started = 0;
-    size_t overallBytes = 0;
-#else
-    (*env)->CallNonvirtualVoidMethod(env, track, cAudioTrack, mPlay);
-#endif
-
-    jarray buffer = (*env)->NewByteArray(env, bufferSizeInBytes);
-
-    while (data->running)
-    {
-        void* pBuffer = (*env)->GetPrimitiveArrayCritical(env, buffer, NULL);
-
-        if (pBuffer)
-        {
-            aluMixData(device, pBuffer, bufferSizeInSamples);
-            (*env)->ReleasePrimitiveArrayCritical(env, buffer, pBuffer, 0);
-
-#ifdef HAVE_ANDROID_LOW_LATENCY
-            if (bufferSizeInBytes >= 0)
-            {
-                if (started)
-                {
-#endif
-                    (*env)->CallNonvirtualIntMethod(env, track, cAudioTrack, mWrite, buffer, 0, bufferSizeInBytes);
-#ifdef HAVE_ANDROID_LOW_LATENCY
-                }
-                else
-                {
-                    overallBytes += (*env)->CallNonvirtualIntMethod(env, track, cAudioTrack, mWrite, buffer, 0, bufferSizeInBytes);
-                    if (overallBytes >= (device->NumUpdates * bufferSizeInBytes))
-                    {
-                        (*env)->CallNonvirtualVoidMethod(env, track, cAudioTrack, mPlay);
-                        started = 1;
-                    }
-                }
-            }
-#endif
-        }
-        else
-        {
-            AL_PRINT("Failed to get pointer to array bytes");
-        }
-    }
-    
-    (*env)->CallNonvirtualVoidMethod(env, track, cAudioTrack, mStop);
-    (*env)->CallNonvirtualVoidMethod(env, track, cAudioTrack, mRelease);
-
-    (*env)->PopLocalFrame(env, NULL);
-
-    (*javaVM)->DetachCurrentThread(javaVM);
-    return NULL;
-}
-
-static ALCenum android_open_playback(ALCdevice *device, const ALCchar *deviceName)
-{
-    JNIEnv* env = GetEnv();
-    AndroidData* data;
-
-    if (!cAudioTrack)
-    {
-        /* Cache AudioTrack class and it's method id's
-         * And do this only once!
-         */
-
-        cAudioTrack = (*env)->FindClass(env, "android/media/AudioTrack");
-        if (!cAudioTrack)
-        {
-            AL_PRINT("android.media.AudioTrack class is not found. Are you running at least 1.5 version?");
-            return ALC_INVALID_VALUE;
-        }
-
-        cAudioTrack = (*env)->NewGlobalRef(env, cAudioTrack);
-
-        mAudioTrack = (*env)->GetMethodID(env, cAudioTrack, "<init>", "(IIIIII)V");
-        mGetMinBufferSize = (*env)->GetStaticMethodID(env, cAudioTrack, "getMinBufferSize", "(III)I");
-        mPlay = (*env)->GetMethodID(env, cAudioTrack, "play", "()V");
-        mStop = (*env)->GetMethodID(env, cAudioTrack, "stop", "()V");
-        mRelease = (*env)->GetMethodID(env, cAudioTrack, "release", "()V");
-        mWrite = (*env)->GetMethodID(env, cAudioTrack, "write", "([BII)I");
-    }
-
-    if (!deviceName)
-    {
-        deviceName = android_device;
-    }
-    else if (strcmp(deviceName, android_device) != 0)
-    {
-        return ALC_INVALID_VALUE;
-    }
-
-    data = (AndroidData*)calloc(1, sizeof(*data));
-    device->szDeviceName = strdup(deviceName);
-    device->ExtraData = data;
-
-#ifdef HAVE_ANDROID_LOW_LATENCY
-    device->Frequency = 22050;
-    device->NumUpdates = 1;
-#endif
-
-    return ALC_NO_ERROR;
-}
-
-static void android_close_playback(ALCdevice *device)
-{
-    AndroidData* data = (AndroidData*)device->ExtraData;
-    if (data != NULL)
-    {
-        free(data);
-        device->ExtraData = NULL;
-    }
-}
-
-static ALCboolean android_reset_playback(ALCdevice *device)
-{
-    AndroidData* data = (AndroidData*)device->ExtraData;
-
-    device->FmtChans = ChannelsFromDevFmt(device->FmtChans) >= 2 ? DevFmtStereo : DevFmtMono;
-
-    SetDefaultChannelOrder(device);
-
-    data->running = 1;
-    pthread_create(&data->thread, NULL, thread_function, device);
-
-    return ALC_TRUE;
-}
-
-static void android_stop_playback(ALCdevice *device)
-{
-    AndroidData* data = (AndroidData*)device->ExtraData;
-
-    if (data->running)
-    {
-        data->running = 0;
-        pthread_join(data->thread, NULL);
-    }
-}
-
-static const BackendFuncs android_funcs = {
-    android_open_playback,
-    android_close_playback,
-    android_reset_playback,
-    android_stop_playback,
-    NULL,
-    NULL,
-    NULL,
-    NULL,
-    NULL,
-    NULL
-};
-
-ALCboolean alc_android_init(BackendFuncs *func_list)
-{
-    *func_list = android_funcs;
-    return ALC_TRUE;
-}
-
-void alc_android_deinit(void)
-{
-    JNIEnv* env = GetEnv();
-
-    /* release cached AudioTrack class */
-    (*env)->DeleteGlobalRef(env, cAudioTrack);
-}
-
-void alc_android_probe(enum DevProbe type)
-{
-    switch(type)
-    {
-        case DEVICE_PROBE:
-            AppendDeviceList(android_device);
-            break;
-        case ALL_DEVICE_PROBE:
-            AppendAllDeviceList(android_device);
-            break;
-        case CAPTURE_DEVICE_PROBE:
-            break;
-    }
-}

+ 230 - 0
jni/openal-soft-android/Alc/backends/base.c

@@ -0,0 +1,230 @@
+
+#include "config.h"
+
+#include <stdlib.h>
+
+#include "alMain.h"
+
+#include "backends/base.h"
+
+
+/* Base ALCbackend method implementations. */
+void ALCbackend_Construct(ALCbackend *self, ALCdevice *device)
+{
+    self->mDevice = device;
+    InitializeCriticalSection(&self->mMutex);
+}
+
+void ALCbackend_Destruct(ALCbackend *self)
+{
+    DeleteCriticalSection(&self->mMutex);
+}
+
+ALCboolean ALCbackend_reset(ALCbackend* UNUSED(self))
+{
+    return ALC_FALSE;
+}
+
+ALCenum ALCbackend_captureSamples(ALCbackend* UNUSED(self), void* UNUSED(buffer), ALCuint UNUSED(samples))
+{
+    return ALC_INVALID_DEVICE;
+}
+
+ALCuint ALCbackend_availableSamples(ALCbackend* UNUSED(self))
+{
+    return 0;
+}
+
+ALint64 ALCbackend_getLatency(ALCbackend* UNUSED(self))
+{
+    return 0;
+}
+
+void ALCbackend_lock(ALCbackend *self)
+{
+    EnterCriticalSection(&self->mMutex);
+}
+
+void ALCbackend_unlock(ALCbackend *self)
+{
+    LeaveCriticalSection(&self->mMutex);
+}
+
+
+/* Base ALCbackendFactory method implementations. */
+void ALCbackendFactory_deinit(ALCbackendFactory* UNUSED(self))
+{
+}
+
+
+/* Wrappers to use an old-style backend with the new interface. */
+typedef struct PlaybackWrapper {
+    DERIVE_FROM_TYPE(ALCbackend);
+} PlaybackWrapper;
+
+static void PlaybackWrapper_Construct(PlaybackWrapper *self, ALCdevice *device);
+static DECLARE_FORWARD(PlaybackWrapper, ALCbackend, void, Destruct)
+static ALCenum PlaybackWrapper_open(PlaybackWrapper *self, const ALCchar *name);
+static void PlaybackWrapper_close(PlaybackWrapper *self);
+static ALCboolean PlaybackWrapper_reset(PlaybackWrapper *self);
+static ALCboolean PlaybackWrapper_start(PlaybackWrapper *self);
+static void PlaybackWrapper_stop(PlaybackWrapper *self);
+static DECLARE_FORWARD2(PlaybackWrapper, ALCbackend, ALCenum, captureSamples, void*, ALCuint)
+static DECLARE_FORWARD(PlaybackWrapper, ALCbackend, ALCuint, availableSamples)
+static ALint64 PlaybackWrapper_getLatency(PlaybackWrapper *self);
+static DECLARE_FORWARD(PlaybackWrapper, ALCbackend, void, lock)
+static DECLARE_FORWARD(PlaybackWrapper, ALCbackend, void, unlock)
+static void PlaybackWrapper_Delete(PlaybackWrapper *self);
+DEFINE_ALCBACKEND_VTABLE(PlaybackWrapper);
+
+static void PlaybackWrapper_Construct(PlaybackWrapper *self, ALCdevice *device)
+{
+    ALCbackend_Construct(STATIC_CAST(ALCbackend, self), device);
+    SET_VTABLE2(PlaybackWrapper, ALCbackend, self);
+}
+
+static ALCenum PlaybackWrapper_open(PlaybackWrapper *self, const ALCchar *name)
+{
+    ALCdevice *device = STATIC_CAST(ALCbackend, self)->mDevice;
+    return device->Funcs->OpenPlayback(device, name);
+}
+
+static void PlaybackWrapper_close(PlaybackWrapper *self)
+{
+    ALCdevice *device = STATIC_CAST(ALCbackend, self)->mDevice;
+    device->Funcs->ClosePlayback(device);
+}
+
+static ALCboolean PlaybackWrapper_reset(PlaybackWrapper *self)
+{
+    ALCdevice *device = STATIC_CAST(ALCbackend, self)->mDevice;
+    return device->Funcs->ResetPlayback(device);
+}
+
+static ALCboolean PlaybackWrapper_start(PlaybackWrapper *self)
+{
+    ALCdevice *device = STATIC_CAST(ALCbackend, self)->mDevice;
+    return device->Funcs->StartPlayback(device);
+}
+
+static void PlaybackWrapper_stop(PlaybackWrapper *self)
+{
+    ALCdevice *device = STATIC_CAST(ALCbackend, self)->mDevice;
+    device->Funcs->StopPlayback(device);
+}
+
+static ALint64 PlaybackWrapper_getLatency(PlaybackWrapper *self)
+{
+    ALCdevice *device = STATIC_CAST(ALCbackend, self)->mDevice;
+    return device->Funcs->GetLatency(device);
+}
+
+static void PlaybackWrapper_Delete(PlaybackWrapper *self)
+{
+    free(self);
+}
+
+
+typedef struct CaptureWrapper {
+    DERIVE_FROM_TYPE(ALCbackend);
+} CaptureWrapper;
+
+static void CaptureWrapper_Construct(CaptureWrapper *self, ALCdevice *device);
+static DECLARE_FORWARD(CaptureWrapper, ALCbackend, void, Destruct)
+static ALCenum CaptureWrapper_open(CaptureWrapper *self, const ALCchar *name);
+static void CaptureWrapper_close(CaptureWrapper *self);
+static DECLARE_FORWARD(CaptureWrapper, ALCbackend, ALCboolean, reset)
+static ALCboolean CaptureWrapper_start(CaptureWrapper *self);
+static void CaptureWrapper_stop(CaptureWrapper *self);
+static ALCenum CaptureWrapper_captureSamples(CaptureWrapper *self, void *buffer, ALCuint samples);
+static ALCuint CaptureWrapper_availableSamples(CaptureWrapper *self);
+static ALint64 CaptureWrapper_getLatency(CaptureWrapper *self);
+static DECLARE_FORWARD(CaptureWrapper, ALCbackend, void, lock)
+static DECLARE_FORWARD(CaptureWrapper, ALCbackend, void, unlock)
+static void CaptureWrapper_Delete(CaptureWrapper *self);
+DEFINE_ALCBACKEND_VTABLE(CaptureWrapper);
+
+
+static void CaptureWrapper_Construct(CaptureWrapper *self, ALCdevice *device)
+{
+    ALCbackend_Construct(STATIC_CAST(ALCbackend, self), device);
+    SET_VTABLE2(CaptureWrapper, ALCbackend, self);
+}
+
+static ALCenum CaptureWrapper_open(CaptureWrapper *self, const ALCchar *name)
+{
+    ALCdevice *device = STATIC_CAST(ALCbackend, self)->mDevice;
+    return device->Funcs->OpenCapture(device, name);
+}
+
+static void CaptureWrapper_close(CaptureWrapper *self)
+{
+    ALCdevice *device = STATIC_CAST(ALCbackend, self)->mDevice;
+    device->Funcs->CloseCapture(device);
+}
+
+static ALCboolean CaptureWrapper_start(CaptureWrapper *self)
+{
+    ALCdevice *device = STATIC_CAST(ALCbackend, self)->mDevice;
+    device->Funcs->StartCapture(device);
+    return ALC_TRUE;
+}
+
+static void CaptureWrapper_stop(CaptureWrapper *self)
+{
+    ALCdevice *device = STATIC_CAST(ALCbackend, self)->mDevice;
+    device->Funcs->StopCapture(device);
+}
+
+static ALCenum CaptureWrapper_captureSamples(CaptureWrapper *self, void *buffer, ALCuint samples)
+{
+    ALCdevice *device = STATIC_CAST(ALCbackend, self)->mDevice;
+    return device->Funcs->CaptureSamples(device, buffer, samples);
+}
+
+static ALCuint CaptureWrapper_availableSamples(CaptureWrapper *self)
+{
+    ALCdevice *device = STATIC_CAST(ALCbackend, self)->mDevice;
+    return device->Funcs->AvailableSamples(device);
+}
+
+static ALint64 CaptureWrapper_getLatency(CaptureWrapper *self)
+{
+    ALCdevice *device = STATIC_CAST(ALCbackend, self)->mDevice;
+    return device->Funcs->GetLatency(device);
+}
+
+static void CaptureWrapper_Delete(CaptureWrapper *self)
+{
+    free(self);
+}
+
+
+ALCbackend *create_backend_wrapper(ALCdevice *device, ALCbackend_Type type)
+{
+    if(type == ALCbackend_Playback)
+    {
+        PlaybackWrapper *backend;
+
+        backend = malloc(sizeof(*backend));
+        if(!backend) return NULL;
+
+        PlaybackWrapper_Construct(backend, device);
+
+        return STATIC_CAST(ALCbackend, backend);
+    }
+
+    if(type == ALCbackend_Capture)
+    {
+        CaptureWrapper *backend;
+
+        backend = malloc(sizeof(*backend));
+        if(!backend) return NULL;
+
+        CaptureWrapper_Construct(backend, device);
+
+        return STATIC_CAST(ALCbackend, backend);
+    }
+
+    return NULL;
+}

+ 133 - 0
jni/openal-soft-android/Alc/backends/base.h

@@ -0,0 +1,133 @@
+#ifndef AL_BACKENDS_BASE_H
+#define AL_BACKENDS_BASE_H
+
+#include "alMain.h"
+#include "compat.h"
+
+
+struct ALCbackendVtable;
+
+typedef struct ALCbackend {
+    const struct ALCbackendVtable *vtbl;
+
+    ALCdevice *mDevice;
+
+    CRITICAL_SECTION mMutex;
+} ALCbackend;
+
+void ALCbackend_Construct(ALCbackend *self, ALCdevice *device);
+void ALCbackend_Destruct(ALCbackend *self);
+ALCboolean ALCbackend_reset(ALCbackend *self);
+ALCenum ALCbackend_captureSamples(ALCbackend *self, void *buffer, ALCuint samples);
+ALCuint ALCbackend_availableSamples(ALCbackend *self);
+ALint64 ALCbackend_getLatency(ALCbackend *self);
+void ALCbackend_lock(ALCbackend *self);
+void ALCbackend_unlock(ALCbackend *self);
+
+struct ALCbackendVtable {
+    void (*const Destruct)(ALCbackend*);
+
+    ALCenum (*const open)(ALCbackend*, const ALCchar*);
+    void (*const close)(ALCbackend*);
+
+    ALCboolean (*const reset)(ALCbackend*);
+    ALCboolean (*const start)(ALCbackend*);
+    void (*const stop)(ALCbackend*);
+
+    ALCenum (*const captureSamples)(ALCbackend*, void*, ALCuint);
+    ALCuint (*const availableSamples)(ALCbackend*);
+
+    ALint64 (*const getLatency)(ALCbackend*);
+
+    void (*const lock)(ALCbackend*);
+    void (*const unlock)(ALCbackend*);
+
+    void (*const Delete)(ALCbackend*);
+};
+
+#define DECLARE_ALCBACKEND_VTABLE(T)                                          \
+static const struct ALCbackendVtable T##_ALCbackend_vtable
+
+#define DEFINE_ALCBACKEND_VTABLE(T)                                           \
+DECLARE_THUNK(T, ALCbackend, void, Destruct)                                  \
+DECLARE_THUNK1(T, ALCbackend, ALCenum, open, const ALCchar*)                  \
+DECLARE_THUNK(T, ALCbackend, void, close)                                     \
+DECLARE_THUNK(T, ALCbackend, ALCboolean, reset)                               \
+DECLARE_THUNK(T, ALCbackend, ALCboolean, start)                               \
+DECLARE_THUNK(T, ALCbackend, void, stop)                                      \
+DECLARE_THUNK2(T, ALCbackend, ALCenum, captureSamples, void*, ALCuint)        \
+DECLARE_THUNK(T, ALCbackend, ALCuint, availableSamples)                       \
+DECLARE_THUNK(T, ALCbackend, ALint64, getLatency)                             \
+DECLARE_THUNK(T, ALCbackend, void, lock)                                      \
+DECLARE_THUNK(T, ALCbackend, void, unlock)                                    \
+DECLARE_THUNK(T, ALCbackend, void, Delete)                                    \
+                                                                              \
+DECLARE_ALCBACKEND_VTABLE(T) = {                                              \
+    T##_ALCbackend_Destruct,                                                  \
+                                                                              \
+    T##_ALCbackend_open,                                                      \
+    T##_ALCbackend_close,                                                     \
+    T##_ALCbackend_reset,                                                     \
+    T##_ALCbackend_start,                                                     \
+    T##_ALCbackend_stop,                                                      \
+    T##_ALCbackend_captureSamples,                                            \
+    T##_ALCbackend_availableSamples,                                          \
+    T##_ALCbackend_getLatency,                                                \
+    T##_ALCbackend_lock,                                                      \
+    T##_ALCbackend_unlock,                                                    \
+                                                                              \
+    T##_ALCbackend_Delete,                                                    \
+}
+
+
+typedef enum ALCbackend_Type {
+    ALCbackend_Playback,
+    ALCbackend_Capture,
+    ALCbackend_Loopback
+} ALCbackend_Type;
+
+
+struct ALCbackendFactoryVtable;
+
+typedef struct ALCbackendFactory {
+    const struct ALCbackendFactoryVtable *vtbl;
+} ALCbackendFactory;
+
+void ALCbackendFactory_deinit(ALCbackendFactory *self);
+
+struct ALCbackendFactoryVtable {
+    ALCboolean (*const init)(ALCbackendFactory *self);
+    void (*const deinit)(ALCbackendFactory *self);
+
+    ALCboolean (*const querySupport)(ALCbackendFactory *self, ALCbackend_Type type);
+
+    void (*const probe)(ALCbackendFactory *self, enum DevProbe type);
+
+    ALCbackend* (*const createBackend)(ALCbackendFactory *self, ALCdevice *device, ALCbackend_Type type);
+};
+
+#define DEFINE_ALCBACKENDFACTORY_VTABLE(T)                                    \
+DECLARE_THUNK(T, ALCbackendFactory, ALCboolean, init)                         \
+DECLARE_THUNK(T, ALCbackendFactory, void, deinit)                             \
+DECLARE_THUNK1(T, ALCbackendFactory, ALCboolean, querySupport, ALCbackend_Type) \
+DECLARE_THUNK1(T, ALCbackendFactory, void, probe, enum DevProbe)              \
+DECLARE_THUNK2(T, ALCbackendFactory, ALCbackend*, createBackend, ALCdevice*, ALCbackend_Type) \
+                                                                              \
+static const struct ALCbackendFactoryVtable T##_ALCbackendFactory_vtable = {  \
+    T##_ALCbackendFactory_init,                                               \
+    T##_ALCbackendFactory_deinit,                                             \
+    T##_ALCbackendFactory_querySupport,                                       \
+    T##_ALCbackendFactory_probe,                                              \
+    T##_ALCbackendFactory_createBackend,                                      \
+}
+
+
+ALCbackendFactory *ALCpulseBackendFactory_getFactory(void);
+ALCbackendFactory *ALCalsaBackendFactory_getFactory(void);
+ALCbackendFactory *ALCossBackendFactory_getFactory(void);
+ALCbackendFactory *ALCnullBackendFactory_getFactory(void);
+ALCbackendFactory *ALCloopbackFactory_getFactory(void);
+
+ALCbackend *create_backend_wrapper(ALCdevice *device, ALCbackend_Type type);
+
+#endif /* AL_BACKENDS_BASE_H */

+ 69 - 74
jni/openal-soft-android/Alc/backends/coreaudio.c

@@ -25,8 +25,7 @@
 #include <string.h>
 
 #include "alMain.h"
-#include "AL/al.h"
-#include "AL/alc.h"
+#include "alu.h"
 
 #include <CoreServices/CoreServices.h>
 #include <unistd.h>
@@ -162,17 +161,27 @@ static ALCenum ca_open_playback(ALCdevice *device, const ALCchar *deviceName)
     }
 
     data = calloc(1, sizeof(*data));
-    device->ExtraData = data;
 
     err = OpenAComponent(comp, &data->audioUnit);
     if(err != noErr)
     {
         ERR("OpenAComponent failed\n");
         free(data);
-        device->ExtraData = NULL;
         return ALC_INVALID_VALUE;
     }
 
+    /* init and start the default audio unit... */
+    err = AudioUnitInitialize(data->audioUnit);
+    if(err != noErr)
+    {
+        ERR("AudioUnitInitialize failed\n");
+        CloseComponent(data->audioUnit);
+        free(data);
+        return ALC_INVALID_VALUE;
+    }
+
+    device->DeviceName = strdup(deviceName);
+    device->ExtraData = data;
     return ALC_NO_ERROR;
 }
 
@@ -180,6 +189,7 @@ static void ca_close_playback(ALCdevice *device)
 {
     ca_data *data = (ca_data*)device->ExtraData;
 
+    AudioUnitUninitialize(data->audioUnit);
     CloseComponent(data->audioUnit);
 
     free(data);
@@ -194,20 +204,9 @@ static ALCboolean ca_reset_playback(ALCdevice *device)
     OSStatus err;
     UInt32 size;
 
-    /* init and start the default audio unit... */
-    err = AudioUnitInitialize(data->audioUnit);
-    if(err != noErr)
-    {
-        ERR("AudioUnitInitialize failed\n");
-        return ALC_FALSE;
-    }
-
-    err = AudioOutputUnitStart(data->audioUnit);
+    err = AudioUnitUninitialize(data->audioUnit);
     if(err != noErr)
-    {
-        ERR("AudioOutputUnitStart failed\n");
-        return ALC_FALSE;
-    }
+        ERR("-- AudioUnitUninitialize failed.\n");
 
     /* retrieve default output unit's properties (output side) */
     size = sizeof(AudioStreamBasicDescription);
@@ -238,10 +237,6 @@ static ALCboolean ca_reset_playback(ALCdevice *device)
 
     if(device->Frequency != streamFormat.mSampleRate)
     {
-        if((device->Flags&DEVICE_FREQUENCY_REQUEST))
-            ERR("CoreAudio does not support changing sample rates (wanted %dhz, got %dhz)\n", device->Frequency, streamFormat.mSampleRate);
-        device->Flags &= ~DEVICE_FREQUENCY_REQUEST;
-
         device->UpdateSize = (ALuint)((ALuint64)device->UpdateSize *
                                       streamFormat.mSampleRate /
                                       device->Frequency);
@@ -253,62 +248,25 @@ static ALCboolean ca_reset_playback(ALCdevice *device)
     switch(streamFormat.mChannelsPerFrame)
     {
         case 1:
-            if((device->Flags&DEVICE_CHANNELS_REQUEST) &&
-               device->FmtChans != DevFmtMono)
-            {
-                ERR("Failed to set %s, got Mono instead\n", DevFmtChannelsString(device->FmtChans));
-                device->Flags &= ~DEVICE_CHANNELS_REQUEST;
-            }
             device->FmtChans = DevFmtMono;
             break;
         case 2:
-            if((device->Flags&DEVICE_CHANNELS_REQUEST) &&
-               device->FmtChans != DevFmtStereo)
-            {
-                ERR("Failed to set %s, got Stereo instead\n", DevFmtChannelsString(device->FmtChans));
-                device->Flags &= ~DEVICE_CHANNELS_REQUEST;
-            }
             device->FmtChans = DevFmtStereo;
             break;
         case 4:
-            if((device->Flags&DEVICE_CHANNELS_REQUEST) &&
-               device->FmtChans != DevFmtQuad)
-            {
-                ERR("Failed to set %s, got Quad instead\n", DevFmtChannelsString(device->FmtChans));
-                device->Flags &= ~DEVICE_CHANNELS_REQUEST;
-            }
             device->FmtChans = DevFmtQuad;
             break;
         case 6:
-            if((device->Flags&DEVICE_CHANNELS_REQUEST) &&
-               device->FmtChans != DevFmtX51)
-            {
-                ERR("Failed to set %s, got 5.1 Surround instead\n", DevFmtChannelsString(device->FmtChans));
-                device->Flags &= ~DEVICE_CHANNELS_REQUEST;
-            }
             device->FmtChans = DevFmtX51;
             break;
         case 7:
-            if((device->Flags&DEVICE_CHANNELS_REQUEST) &&
-               device->FmtChans != DevFmtX61)
-            {
-                ERR("Failed to set %s, got 6.1 Surround instead\n", DevFmtChannelsString(device->FmtChans));
-                device->Flags &= ~DEVICE_CHANNELS_REQUEST;
-            }
             device->FmtChans = DevFmtX61;
             break;
         case 8:
-            if((device->Flags&DEVICE_CHANNELS_REQUEST) &&
-               device->FmtChans != DevFmtX71)
-            {
-                ERR("Failed to set %s, got 7.1 Surround instead\n", DevFmtChannelsString(device->FmtChans));
-                device->Flags &= ~DEVICE_CHANNELS_REQUEST;
-            }
             device->FmtChans = DevFmtX71;
             break;
         default:
             ERR("Unhandled channel count (%d), using Stereo\n", streamFormat.mChannelsPerFrame);
-            device->Flags &= ~DEVICE_CHANNELS_REQUEST;
             device->FmtChans = DevFmtStereo;
             streamFormat.mChannelsPerFrame = 2;
             break;
@@ -318,30 +276,41 @@ static ALCboolean ca_reset_playback(ALCdevice *device)
     /* use channel count and sample rate from the default output unit's current
      * parameters, but reset everything else */
     streamFormat.mFramesPerPacket = 1;
+    streamFormat.mFormatFlags = 0;
     switch(device->FmtType)
     {
         case DevFmtUByte:
             device->FmtType = DevFmtByte;
             /* fall-through */
         case DevFmtByte:
+            streamFormat.mFormatFlags = kLinearPCMFormatFlagIsSignedInteger;
             streamFormat.mBitsPerChannel = 8;
-            streamFormat.mBytesPerPacket = streamFormat.mChannelsPerFrame;
-            streamFormat.mBytesPerFrame = streamFormat.mChannelsPerFrame;
             break;
         case DevFmtUShort:
-        case DevFmtFloat:
             device->FmtType = DevFmtShort;
             /* fall-through */
         case DevFmtShort:
+            streamFormat.mFormatFlags = kLinearPCMFormatFlagIsSignedInteger;
             streamFormat.mBitsPerChannel = 16;
-            streamFormat.mBytesPerPacket = 2 * streamFormat.mChannelsPerFrame;
-            streamFormat.mBytesPerFrame = 2 * streamFormat.mChannelsPerFrame;
+            break;
+        case DevFmtUInt:
+            device->FmtType = DevFmtInt;
+            /* fall-through */
+        case DevFmtInt:
+            streamFormat.mFormatFlags = kLinearPCMFormatFlagIsSignedInteger;
+            streamFormat.mBitsPerChannel = 32;
+            break;
+        case DevFmtFloat:
+            streamFormat.mFormatFlags = kLinearPCMFormatFlagIsFloat;
+            streamFormat.mBitsPerChannel = 32;
             break;
     }
+    streamFormat.mBytesPerFrame = streamFormat.mChannelsPerFrame *
+                                  streamFormat.mBitsPerChannel / 8;
+    streamFormat.mBytesPerPacket = streamFormat.mBytesPerFrame;
     streamFormat.mFormatID = kAudioFormatLinearPCM;
-    streamFormat.mFormatFlags = kLinearPCMFormatFlagIsSignedInteger |
-                                kAudioFormatFlagsNativeEndian |
-                                kLinearPCMFormatFlagIsPacked;
+    streamFormat.mFormatFlags |= kAudioFormatFlagsNativeEndian |
+                                 kLinearPCMFormatFlagIsPacked;
 
     err = AudioUnitSetProperty(data->audioUnit, kAudioUnitProperty_StreamFormat, kAudioUnitScope_Input, 0, &streamFormat, sizeof(AudioStreamBasicDescription));
     if(err != noErr)
@@ -362,6 +331,29 @@ static ALCboolean ca_reset_playback(ALCdevice *device)
         return ALC_FALSE;
     }
 
+    /* init the default audio unit... */
+    err = AudioUnitInitialize(data->audioUnit);
+    if(err != noErr)
+    {
+        ERR("AudioUnitInitialize failed\n");
+        return ALC_FALSE;
+    }
+
+    return ALC_TRUE;
+}
+
+static ALCboolean ca_start_playback(ALCdevice *device)
+{
+    ca_data *data = (ca_data*)device->ExtraData;
+    OSStatus err;
+
+    err = AudioOutputUnitStart(data->audioUnit);
+    if(err != noErr)
+    {
+        ERR("AudioOutputUnitStart failed\n");
+        return ALC_FALSE;
+    }
+
     return ALC_TRUE;
 }
 
@@ -370,10 +362,9 @@ static void ca_stop_playback(ALCdevice *device)
     ca_data *data = (ca_data*)device->ExtraData;
     OSStatus err;
 
-    AudioOutputUnitStop(data->audioUnit);
-    err = AudioUnitUninitialize(data->audioUnit);
+    err = AudioOutputUnitStop(data->audioUnit);
     if(err != noErr)
-        ERR("-- AudioUnitUninitialize failed.\n");
+        ERR("AudioOutputUnitStop failed\n");
 }
 
 static ALCenum ca_open_capture(ALCdevice *device, const ALCchar *deviceName)
@@ -496,12 +487,17 @@ static ALCenum ca_open_capture(ALCdevice *device, const ALCchar *deviceName)
             requestedFormat.mBitsPerChannel = 16;
             requestedFormat.mFormatFlags = kAudioFormatFlagIsSignedInteger | kAudioFormatFlagsNativeEndian | kAudioFormatFlagIsPacked;
             break;
+        case DevFmtInt:
+            requestedFormat.mBitsPerChannel = 32;
+            requestedFormat.mFormatFlags = kAudioFormatFlagIsSignedInteger | kAudioFormatFlagsNativeEndian | kAudioFormatFlagIsPacked;
+            break;
         case DevFmtFloat:
             requestedFormat.mBitsPerChannel = 32;
             requestedFormat.mFormatFlags = kAudioFormatFlagIsPacked;
             break;
         case DevFmtByte:
         case DevFmtUShort:
+        case DevFmtUInt:
             ERR("%s samples not supported\n", DevFmtTypeString(device->FmtType));
             goto error;
     }
@@ -673,13 +669,15 @@ static const BackendFuncs ca_funcs = {
     ca_open_playback,
     ca_close_playback,
     ca_reset_playback,
+    ca_start_playback,
     ca_stop_playback,
     ca_open_capture,
     ca_close_capture,
     ca_start_capture,
     ca_stop_capture,
     ca_capture_samples,
-    ca_available_samples
+    ca_available_samples,
+    ALCdevice_GetLatencyDefault
 };
 
 ALCboolean alc_ca_init(BackendFuncs *func_list)
@@ -696,11 +694,8 @@ void alc_ca_probe(enum DevProbe type)
 {
     switch(type)
     {
-        case DEVICE_PROBE:
-            AppendDeviceList(ca_device);
-            break;
         case ALL_DEVICE_PROBE:
-            AppendAllDeviceList(ca_device);
+            AppendAllDevicesList(ca_device);
             break;
         case CAPTURE_DEVICE_PROBE:
             AppendCaptureDeviceList(ca_device);

+ 587 - 161
jni/openal-soft-android/Alc/backends/dsound.c

@@ -33,39 +33,60 @@
 #endif
 
 #include "alMain.h"
-#include "AL/al.h"
-#include "AL/alc.h"
+#include "alu.h"
+#include "threads.h"
+#include "compat.h"
 
 #ifndef DSSPEAKER_5POINT1
-#define DSSPEAKER_5POINT1       6
+#   define DSSPEAKER_5POINT1          0x00000006
 #endif
 #ifndef DSSPEAKER_7POINT1
-#define DSSPEAKER_7POINT1       7
+#   define DSSPEAKER_7POINT1          0x00000007
+#endif
+#ifndef DSSPEAKER_7POINT1_SURROUND
+#   define DSSPEAKER_7POINT1_SURROUND 0x00000008
+#endif
+#ifndef DSSPEAKER_5POINT1_SURROUND
+#   define DSSPEAKER_5POINT1_SURROUND 0x00000009
 #endif
 
+
 DEFINE_GUID(KSDATAFORMAT_SUBTYPE_PCM, 0x00000001, 0x0000, 0x0010, 0x80, 0x00, 0x00, 0xaa, 0x00, 0x38, 0x9b, 0x71);
 DEFINE_GUID(KSDATAFORMAT_SUBTYPE_IEEE_FLOAT, 0x00000003, 0x0000, 0x0010, 0x80, 0x00, 0x00, 0xaa, 0x00, 0x38, 0x9b, 0x71);
 
 
-static HMODULE ds_handle;
+static void *ds_handle;
 static HRESULT (WINAPI *pDirectSoundCreate)(LPCGUID pcGuidDevice, IDirectSound **ppDS, IUnknown *pUnkOuter);
 static HRESULT (WINAPI *pDirectSoundEnumerateA)(LPDSENUMCALLBACKA pDSEnumCallback, void *pContext);
+static HRESULT (WINAPI *pDirectSoundCaptureCreate)(LPCGUID pcGuidDevice, IDirectSoundCapture **ppDSC, IUnknown *pUnkOuter);
+static HRESULT (WINAPI *pDirectSoundCaptureEnumerateA)(LPDSENUMCALLBACKA pDSEnumCallback, void *pContext);
 
-#define DirectSoundCreate     pDirectSoundCreate
-#define DirectSoundEnumerateA pDirectSoundEnumerateA
+#define DirectSoundCreate            pDirectSoundCreate
+#define DirectSoundEnumerateA        pDirectSoundEnumerateA
+#define DirectSoundCaptureCreate     pDirectSoundCaptureCreate
+#define DirectSoundCaptureEnumerateA pDirectSoundCaptureEnumerateA
 
 
 typedef struct {
     // DirectSound Playback Device
-    IDirectSound       *lpDS;
-    IDirectSoundBuffer *DSpbuffer;
-    IDirectSoundBuffer *DSsbuffer;
-    IDirectSoundNotify *DSnotify;
-    HANDLE             hNotifyEvent;
+    IDirectSound       *DS;
+    IDirectSoundBuffer *PrimaryBuffer;
+    IDirectSoundBuffer *Buffer;
+    IDirectSoundNotify *Notifies;
+    HANDLE             NotifyEvent;
 
     volatile int killNow;
-    ALvoid *thread;
-} DSoundData;
+    althread_t thread;
+} DSoundPlaybackData;
+
+typedef struct {
+    // DirectSound Capture Device
+    IDirectSoundCapture *DSC;
+    IDirectSoundCaptureBuffer *DSCbuffer;
+    DWORD BufferBytes;
+    DWORD Cursor;
+    RingBuffer *Ring;
+} DSoundCaptureData;
 
 
 typedef struct {
@@ -73,54 +94,98 @@ typedef struct {
     GUID guid;
 } DevMap;
 
-static const ALCchar dsDevice[] = "DirectSound Default";
-static DevMap *DeviceList;
-static ALuint NumDevices;
+static DevMap *PlaybackDeviceList;
+static ALuint NumPlaybackDevices;
+static DevMap *CaptureDeviceList;
+static ALuint NumCaptureDevices;
 
 #define MAX_UPDATES 128
 
 static ALCboolean DSoundLoad(void)
 {
-    ALCboolean ok = ALC_TRUE;
     if(!ds_handle)
     {
-        ds_handle = LoadLibraryA("dsound.dll");
+        ds_handle = LoadLib("dsound.dll");
         if(ds_handle == NULL)
         {
             ERR("Failed to load dsound.dll\n");
             return ALC_FALSE;
         }
 
-#define LOAD_FUNC(x) do {                                                     \
-    if((p##x = (void*)GetProcAddress(ds_handle, #x)) == NULL) {               \
-        ERR("Could not load %s from dsound.dll\n", #x);                       \
-        ok = ALC_FALSE;                                                       \
+#define LOAD_FUNC(f) do {                                                     \
+    p##f = GetSymbol(ds_handle, #f);                                          \
+    if(p##f == NULL) {                                                        \
+        CloseLib(ds_handle);                                                  \
+        ds_handle = NULL;                                                     \
+        return ALC_FALSE;                                                     \
     }                                                                         \
 } while(0)
         LOAD_FUNC(DirectSoundCreate);
         LOAD_FUNC(DirectSoundEnumerateA);
+        LOAD_FUNC(DirectSoundCaptureCreate);
+        LOAD_FUNC(DirectSoundCaptureEnumerateA);
 #undef LOAD_FUNC
+    }
+    return ALC_TRUE;
+}
+
+
+static BOOL CALLBACK DSoundEnumPlaybackDevices(LPGUID guid, LPCSTR desc, LPCSTR UNUSED(drvname), LPVOID UNUSED(data))
+{
+    LPOLESTR guidstr = NULL;
+    char str[1024];
+    HRESULT hr;
+    void *temp;
+    int count;
+    ALuint i;
+
+    if(!guid)
+        return TRUE;
+
+    count = 0;
+    do {
+        if(count == 0)
+            snprintf(str, sizeof(str), "%s", desc);
+        else
+            snprintf(str, sizeof(str), "%s #%d", desc, count+1);
+        count++;
 
-        if(!ok)
+        for(i = 0;i < NumPlaybackDevices;i++)
         {
-            FreeLibrary(ds_handle);
-            ds_handle = NULL;
+            if(strcmp(str, PlaybackDeviceList[i].name) == 0)
+                break;
         }
+    } while(i != NumPlaybackDevices);
+
+    hr = StringFromCLSID(guid, &guidstr);
+    if(SUCCEEDED(hr))
+    {
+        TRACE("Got device \"%s\", GUID \"%ls\"\n", str, guidstr);
+        CoTaskMemFree(guidstr);
+    }
+
+    temp = realloc(PlaybackDeviceList, sizeof(DevMap) * (NumPlaybackDevices+1));
+    if(temp)
+    {
+        PlaybackDeviceList = temp;
+        PlaybackDeviceList[NumPlaybackDevices].name = strdup(str);
+        PlaybackDeviceList[NumPlaybackDevices].guid = *guid;
+        NumPlaybackDevices++;
     }
-    return ok;
+
+    return TRUE;
 }
 
 
-static BOOL CALLBACK DSoundEnumDevices(LPGUID guid, LPCSTR desc, LPCSTR drvname, LPVOID data)
+static BOOL CALLBACK DSoundEnumCaptureDevices(LPGUID guid, LPCSTR desc, LPCSTR UNUSED(drvname), LPVOID UNUSED(data))
 {
+    LPOLESTR guidstr = NULL;
     char str[1024];
+    HRESULT hr;
     void *temp;
     int count;
     ALuint i;
 
-    (void)data;
-    (void)drvname;
-
     if(!guid)
         return TRUE;
 
@@ -132,30 +197,37 @@ static BOOL CALLBACK DSoundEnumDevices(LPGUID guid, LPCSTR desc, LPCSTR drvname,
             snprintf(str, sizeof(str), "%s #%d", desc, count+1);
         count++;
 
-        for(i = 0;i < NumDevices;i++)
+        for(i = 0;i < NumCaptureDevices;i++)
         {
-            if(strcmp(str, DeviceList[i].name) == 0)
+            if(strcmp(str, CaptureDeviceList[i].name) == 0)
                 break;
         }
-    } while(i != NumDevices);
+    } while(i != NumCaptureDevices);
 
-    temp = realloc(DeviceList, sizeof(DevMap) * (NumDevices+1));
+    hr = StringFromCLSID(guid, &guidstr);
+    if(SUCCEEDED(hr))
+    {
+        TRACE("Got device \"%s\", GUID \"%ls\"\n", str, guidstr);
+        CoTaskMemFree(guidstr);
+    }
+
+    temp = realloc(CaptureDeviceList, sizeof(DevMap) * (NumCaptureDevices+1));
     if(temp)
     {
-        DeviceList = temp;
-        DeviceList[NumDevices].name = strdup(str);
-        DeviceList[NumDevices].guid = *guid;
-        NumDevices++;
+        CaptureDeviceList = temp;
+        CaptureDeviceList[NumCaptureDevices].name = strdup(str);
+        CaptureDeviceList[NumCaptureDevices].guid = *guid;
+        NumCaptureDevices++;
     }
 
     return TRUE;
 }
 
 
-static ALuint DSoundProc(ALvoid *ptr)
+FORCE_ALIGN static ALuint DSoundPlaybackProc(ALvoid *ptr)
 {
-    ALCdevice *pDevice = (ALCdevice*)ptr;
-    DSoundData *pData = (DSoundData*)pDevice->ExtraData;
+    ALCdevice *Device = (ALCdevice*)ptr;
+    DSoundPlaybackData *data = (DSoundPlaybackData*)Device->ExtraData;
     DSBCAPS DSBCaps;
     DWORD LastCursor = 0;
     DWORD PlayCursor;
@@ -168,42 +240,47 @@ static ALuint DSoundProc(ALvoid *ptr)
     HRESULT err;
 
     SetRTPriority();
+    SetThreadName(MIXER_THREAD_NAME);
 
     memset(&DSBCaps, 0, sizeof(DSBCaps));
     DSBCaps.dwSize = sizeof(DSBCaps);
-    err = IDirectSoundBuffer_GetCaps(pData->DSsbuffer, &DSBCaps);
+    err = IDirectSoundBuffer_GetCaps(data->Buffer, &DSBCaps);
     if(FAILED(err))
     {
         ERR("Failed to get buffer caps: 0x%lx\n", err);
-        aluHandleDisconnect(pDevice);
+        ALCdevice_Lock(Device);
+        aluHandleDisconnect(Device);
+        ALCdevice_Unlock(Device);
         return 1;
     }
 
-    FrameSize = FrameSizeFromDevFmt(pDevice->FmtChans, pDevice->FmtType);
-    FragSize = pDevice->UpdateSize * FrameSize;
+    FrameSize = FrameSizeFromDevFmt(Device->FmtChans, Device->FmtType);
+    FragSize = Device->UpdateSize * FrameSize;
 
-    IDirectSoundBuffer_GetCurrentPosition(pData->DSsbuffer, &LastCursor, NULL);
-    while(!pData->killNow)
+    IDirectSoundBuffer_GetCurrentPosition(data->Buffer, &LastCursor, NULL);
+    while(!data->killNow)
     {
         // Get current play cursor
-        IDirectSoundBuffer_GetCurrentPosition(pData->DSsbuffer, &PlayCursor, NULL);
+        IDirectSoundBuffer_GetCurrentPosition(data->Buffer, &PlayCursor, NULL);
         avail = (PlayCursor-LastCursor+DSBCaps.dwBufferBytes) % DSBCaps.dwBufferBytes;
 
         if(avail < FragSize)
         {
             if(!Playing)
             {
-                err = IDirectSoundBuffer_Play(pData->DSsbuffer, 0, 0, DSBPLAY_LOOPING);
+                err = IDirectSoundBuffer_Play(data->Buffer, 0, 0, DSBPLAY_LOOPING);
                 if(FAILED(err))
                 {
                     ERR("Failed to play buffer: 0x%lx\n", err);
-                    aluHandleDisconnect(pDevice);
+                    ALCdevice_Lock(Device);
+                    aluHandleDisconnect(Device);
+                    ALCdevice_Unlock(Device);
                     return 1;
                 }
                 Playing = TRUE;
             }
 
-            avail = WaitForSingleObjectEx(pData->hNotifyEvent, 2000, FALSE);
+            avail = WaitForSingleObjectEx(data->NotifyEvent, 2000, FALSE);
             if(avail != WAIT_OBJECT_0)
                 ERR("WaitForSingleObjectEx error: 0x%lx\n", avail);
             continue;
@@ -213,18 +290,18 @@ static ALuint DSoundProc(ALvoid *ptr)
         // Lock output buffer
         WriteCnt1 = 0;
         WriteCnt2 = 0;
-        err = IDirectSoundBuffer_Lock(pData->DSsbuffer, LastCursor, avail, &WritePtr1, &WriteCnt1, &WritePtr2, &WriteCnt2, 0);
+        err = IDirectSoundBuffer_Lock(data->Buffer, LastCursor, avail, &WritePtr1, &WriteCnt1, &WritePtr2, &WriteCnt2, 0);
 
         // If the buffer is lost, restore it and lock
         if(err == DSERR_BUFFERLOST)
         {
             WARN("Buffer lost, restoring...\n");
-            err = IDirectSoundBuffer_Restore(pData->DSsbuffer);
+            err = IDirectSoundBuffer_Restore(data->Buffer);
             if(SUCCEEDED(err))
             {
                 Playing = FALSE;
                 LastCursor = 0;
-                err = IDirectSoundBuffer_Lock(pData->DSsbuffer, 0, DSBCaps.dwBufferBytes, &WritePtr1, &WriteCnt1, &WritePtr2, &WriteCnt2, 0);
+                err = IDirectSoundBuffer_Lock(data->Buffer, 0, DSBCaps.dwBufferBytes, &WritePtr1, &WriteCnt1, &WritePtr2, &WriteCnt2, 0);
             }
         }
 
@@ -232,16 +309,18 @@ static ALuint DSoundProc(ALvoid *ptr)
         if(SUCCEEDED(err))
         {
             // If we have an active context, mix data directly into output buffer otherwise fill with silence
-            aluMixData(pDevice, WritePtr1, WriteCnt1/FrameSize);
-            aluMixData(pDevice, WritePtr2, WriteCnt2/FrameSize);
+            aluMixData(Device, WritePtr1, WriteCnt1/FrameSize);
+            aluMixData(Device, WritePtr2, WriteCnt2/FrameSize);
 
             // Unlock output buffer only when successfully locked
-            IDirectSoundBuffer_Unlock(pData->DSsbuffer, WritePtr1, WriteCnt1, WritePtr2, WriteCnt2);
+            IDirectSoundBuffer_Unlock(data->Buffer, WritePtr1, WriteCnt1, WritePtr2, WriteCnt2);
         }
         else
         {
             ERR("Buffer lock error: %#lx\n", err);
-            aluHandleDisconnect(pDevice);
+            ALCdevice_Lock(Device);
+            aluHandleDisconnect(Device);
+            ALCdevice_Unlock(Device);
             return 1;
         }
 
@@ -255,79 +334,92 @@ static ALuint DSoundProc(ALvoid *ptr)
 
 static ALCenum DSoundOpenPlayback(ALCdevice *device, const ALCchar *deviceName)
 {
-    DSoundData *pData = NULL;
+    DSoundPlaybackData *data = NULL;
     LPGUID guid = NULL;
     HRESULT hr;
 
-    if(!deviceName)
-        deviceName = dsDevice;
-    else if(strcmp(deviceName, dsDevice) != 0)
+    if(!PlaybackDeviceList)
     {
-        ALuint i;
+        hr = DirectSoundEnumerateA(DSoundEnumPlaybackDevices, NULL);
+        if(FAILED(hr))
+            ERR("Error enumerating DirectSound devices (%#x)!\n", (unsigned int)hr);
+    }
 
-        if(!DeviceList)
-        {
-            hr = DirectSoundEnumerateA(DSoundEnumDevices, NULL);
-            if(FAILED(hr))
-                ERR("Error enumerating DirectSound devices (%#x)!\n", (unsigned int)hr);
-        }
+    if(!deviceName && NumPlaybackDevices > 0)
+    {
+        deviceName = PlaybackDeviceList[0].name;
+        guid = &PlaybackDeviceList[0].guid;
+    }
+    else
+    {
+        ALuint i;
 
-        for(i = 0;i < NumDevices;i++)
+        for(i = 0;i < NumPlaybackDevices;i++)
         {
-            if(strcmp(deviceName, DeviceList[i].name) == 0)
+            if(strcmp(deviceName, PlaybackDeviceList[i].name) == 0)
             {
-                guid = &DeviceList[i].guid;
+                guid = &PlaybackDeviceList[i].guid;
                 break;
             }
         }
-        if(i == NumDevices)
+        if(i == NumPlaybackDevices)
             return ALC_INVALID_VALUE;
     }
 
     //Initialise requested device
-    pData = calloc(1, sizeof(DSoundData));
-    if(!pData)
+    data = calloc(1, sizeof(DSoundPlaybackData));
+    if(!data)
         return ALC_OUT_OF_MEMORY;
 
     hr = DS_OK;
-    pData->hNotifyEvent = CreateEvent(NULL, FALSE, FALSE, NULL);
-    if(pData->hNotifyEvent == NULL)
+    data->NotifyEvent = CreateEvent(NULL, FALSE, FALSE, NULL);
+    if(data->NotifyEvent == NULL)
         hr = E_FAIL;
 
     //DirectSound Init code
     if(SUCCEEDED(hr))
-        hr = DirectSoundCreate(guid, &pData->lpDS, NULL);
+        hr = DirectSoundCreate(guid, &data->DS, NULL);
     if(SUCCEEDED(hr))
-        hr = IDirectSound_SetCooperativeLevel(pData->lpDS, GetForegroundWindow(), DSSCL_PRIORITY);
+        hr = IDirectSound_SetCooperativeLevel(data->DS, GetForegroundWindow(), DSSCL_PRIORITY);
     if(FAILED(hr))
     {
-        if(pData->lpDS)
-            IDirectSound_Release(pData->lpDS);
-        if(pData->hNotifyEvent)
-            CloseHandle(pData->hNotifyEvent);
-        free(pData);
+        if(data->DS)
+            IDirectSound_Release(data->DS);
+        if(data->NotifyEvent)
+            CloseHandle(data->NotifyEvent);
+        free(data);
         ERR("Device init failed: 0x%08lx\n", hr);
         return ALC_INVALID_VALUE;
     }
 
-    device->szDeviceName = strdup(deviceName);
-    device->ExtraData = pData;
+    device->DeviceName = strdup(deviceName);
+    device->ExtraData = data;
     return ALC_NO_ERROR;
 }
 
 static void DSoundClosePlayback(ALCdevice *device)
 {
-    DSoundData *pData = device->ExtraData;
-
-    IDirectSound_Release(pData->lpDS);
-    CloseHandle(pData->hNotifyEvent);
-    free(pData);
+    DSoundPlaybackData *data = device->ExtraData;
+
+    if(data->Notifies)
+        IDirectSoundNotify_Release(data->Notifies);
+    data->Notifies = NULL;
+    if(data->Buffer)
+        IDirectSoundBuffer_Release(data->Buffer);
+    data->Buffer = NULL;
+    if(data->PrimaryBuffer != NULL)
+        IDirectSoundBuffer_Release(data->PrimaryBuffer);
+    data->PrimaryBuffer = NULL;
+
+    IDirectSound_Release(data->DS);
+    CloseHandle(data->NotifyEvent);
+    free(data);
     device->ExtraData = NULL;
 }
 
 static ALCboolean DSoundResetPlayback(ALCdevice *device)
 {
-    DSoundData *pData = (DSoundData*)device->ExtraData;
+    DSoundPlaybackData *data = (DSoundPlaybackData*)device->ExtraData;
     DSBUFFERDESC DSBDescription;
     WAVEFORMATEXTENSIBLE OutputType;
     DWORD speakers;
@@ -335,21 +427,38 @@ static ALCboolean DSoundResetPlayback(ALCdevice *device)
 
     memset(&OutputType, 0, sizeof(OutputType));
 
+    if(data->Notifies)
+        IDirectSoundNotify_Release(data->Notifies);
+    data->Notifies = NULL;
+    if(data->Buffer)
+        IDirectSoundBuffer_Release(data->Buffer);
+    data->Buffer = NULL;
+    if(data->PrimaryBuffer != NULL)
+        IDirectSoundBuffer_Release(data->PrimaryBuffer);
+    data->PrimaryBuffer = NULL;
+
     switch(device->FmtType)
     {
         case DevFmtByte:
             device->FmtType = DevFmtUByte;
             break;
+        case DevFmtFloat:
+            if((device->Flags&DEVICE_SAMPLE_TYPE_REQUEST))
+                break;
+            /* fall-through */
         case DevFmtUShort:
             device->FmtType = DevFmtShort;
             break;
+        case DevFmtUInt:
+            device->FmtType = DevFmtInt;
+            break;
         case DevFmtUByte:
         case DevFmtShort:
-        case DevFmtFloat:
+        case DevFmtInt:
             break;
     }
 
-    hr = IDirectSound_GetSpeakerConfig(pData->lpDS, &speakers);
+    hr = IDirectSound_GetSpeakerConfig(data->DS, &speakers);
     if(SUCCEEDED(hr))
     {
         if(!(device->Flags&DEVICE_CHANNELS_REQUEST))
@@ -361,9 +470,9 @@ static ALCboolean DSoundResetPlayback(ALCdevice *device)
                 device->FmtChans = DevFmtStereo;
             else if(speakers == DSSPEAKER_QUAD)
                 device->FmtChans = DevFmtQuad;
-            else if(speakers == DSSPEAKER_5POINT1)
+            else if(speakers == DSSPEAKER_5POINT1 || speakers == DSSPEAKER_5POINT1_SURROUND)
                 device->FmtChans = DevFmtX51;
-            else if(speakers == DSSPEAKER_7POINT1)
+            else if(speakers == DSSPEAKER_7POINT1 || speakers == DSSPEAKER_7POINT1_SURROUND)
                 device->FmtChans = DevFmtX71;
             else
                 ERR("Unknown system speaker config: 0x%lx\n", speakers);
@@ -421,6 +530,8 @@ static ALCboolean DSoundResetPlayback(ALCdevice *device)
                 break;
         }
 
+retry_open:
+        hr = S_OK;
         OutputType.Format.wFormatTag = WAVE_FORMAT_PCM;
         OutputType.Format.nChannels = ChannelsFromDevFmt(device->FmtChans);
         OutputType.Format.wBitsPerSample = BytesFromDevFmt(device->FmtType) * 8;
@@ -439,18 +550,22 @@ static ALCboolean DSoundResetPlayback(ALCdevice *device)
             OutputType.SubFormat = KSDATAFORMAT_SUBTYPE_IEEE_FLOAT;
         else
             OutputType.SubFormat = KSDATAFORMAT_SUBTYPE_PCM;
+
+        if(data->PrimaryBuffer)
+            IDirectSoundBuffer_Release(data->PrimaryBuffer);
+        data->PrimaryBuffer = NULL;
     }
     else
     {
-        if(SUCCEEDED(hr))
+        if(SUCCEEDED(hr) && !data->PrimaryBuffer)
         {
             memset(&DSBDescription,0,sizeof(DSBUFFERDESC));
             DSBDescription.dwSize=sizeof(DSBUFFERDESC);
             DSBDescription.dwFlags=DSBCAPS_PRIMARYBUFFER;
-            hr = IDirectSound_CreateSoundBuffer(pData->lpDS, &DSBDescription, &pData->DSpbuffer, NULL);
+            hr = IDirectSound_CreateSoundBuffer(data->DS, &DSBDescription, &data->PrimaryBuffer, NULL);
         }
         if(SUCCEEDED(hr))
-            hr = IDirectSoundBuffer_SetFormat(pData->DSpbuffer,&OutputType.Format);
+            hr = IDirectSoundBuffer_SetFormat(data->PrimaryBuffer,&OutputType.Format);
     }
 
     if(SUCCEEDED(hr))
@@ -468,12 +583,17 @@ static ALCboolean DSoundResetPlayback(ALCdevice *device)
         DSBDescription.dwBufferBytes=device->UpdateSize * device->NumUpdates *
                                      OutputType.Format.nBlockAlign;
         DSBDescription.lpwfxFormat=&OutputType.Format;
-        hr = IDirectSound_CreateSoundBuffer(pData->lpDS, &DSBDescription, &pData->DSsbuffer, NULL);
+        hr = IDirectSound_CreateSoundBuffer(data->DS, &DSBDescription, &data->Buffer, NULL);
+        if(FAILED(hr) && device->FmtType == DevFmtFloat)
+        {
+            device->FmtType = DevFmtShort;
+            goto retry_open;
+        }
     }
 
     if(SUCCEEDED(hr))
     {
-        hr = IDirectSoundBuffer_QueryInterface(pData->DSsbuffer, &IID_IDirectSoundNotify, (LPVOID *)&pData->DSnotify);
+        hr = IDirectSoundBuffer_QueryInterface(data->Buffer, &IID_IDirectSoundNotify, (LPVOID *)&data->Notifies);
         if(SUCCEEDED(hr))
         {
             DSBPOSITIONNOTIFY notifies[MAX_UPDATES];
@@ -483,59 +603,343 @@ static ALCboolean DSoundResetPlayback(ALCdevice *device)
             {
                 notifies[i].dwOffset = i * device->UpdateSize *
                                        OutputType.Format.nBlockAlign;
-                notifies[i].hEventNotify = pData->hNotifyEvent;
+                notifies[i].hEventNotify = data->NotifyEvent;
             }
-            if(IDirectSoundNotify_SetNotificationPositions(pData->DSnotify, device->NumUpdates, notifies) != DS_OK)
+            if(IDirectSoundNotify_SetNotificationPositions(data->Notifies, device->NumUpdates, notifies) != DS_OK)
                 hr = E_FAIL;
         }
     }
 
-    if(SUCCEEDED(hr))
-    {
-        ResetEvent(pData->hNotifyEvent);
-        SetDefaultWFXChannelOrder(device);
-        pData->thread = StartThread(DSoundProc, device);
-        if(pData->thread == NULL)
-            hr = E_FAIL;
-    }
-
     if(FAILED(hr))
     {
-        if(pData->DSnotify != NULL)
-            IDirectSoundNotify_Release(pData->DSnotify);
-        pData->DSnotify = NULL;
-        if(pData->DSsbuffer != NULL)
-            IDirectSoundBuffer_Release(pData->DSsbuffer);
-        pData->DSsbuffer = NULL;
-        if(pData->DSpbuffer != NULL)
-            IDirectSoundBuffer_Release(pData->DSpbuffer);
-        pData->DSpbuffer = NULL;
+        if(data->Notifies != NULL)
+            IDirectSoundNotify_Release(data->Notifies);
+        data->Notifies = NULL;
+        if(data->Buffer != NULL)
+            IDirectSoundBuffer_Release(data->Buffer);
+        data->Buffer = NULL;
+        if(data->PrimaryBuffer != NULL)
+            IDirectSoundBuffer_Release(data->PrimaryBuffer);
+        data->PrimaryBuffer = NULL;
         return ALC_FALSE;
     }
 
+    ResetEvent(data->NotifyEvent);
+    SetDefaultWFXChannelOrder(device);
+
+    return ALC_TRUE;
+}
+
+static ALCboolean DSoundStartPlayback(ALCdevice *device)
+{
+    DSoundPlaybackData *data = (DSoundPlaybackData*)device->ExtraData;
+
+    if(!StartThread(&data->thread, DSoundPlaybackProc, device))
+        return ALC_FALSE;
+
     return ALC_TRUE;
 }
 
 static void DSoundStopPlayback(ALCdevice *device)
 {
-    DSoundData *pData = device->ExtraData;
+    DSoundPlaybackData *data = device->ExtraData;
 
-    if(!pData->thread)
+    if(!data->thread)
         return;
 
-    pData->killNow = 1;
-    StopThread(pData->thread);
-    pData->thread = NULL;
+    data->killNow = 1;
+    StopThread(data->thread);
+    data->thread = NULL;
+
+    data->killNow = 0;
+    IDirectSoundBuffer_Stop(data->Buffer);
+}
+
+
+static ALCenum DSoundOpenCapture(ALCdevice *device, const ALCchar *deviceName)
+{
+    DSoundCaptureData *data = NULL;
+    WAVEFORMATEXTENSIBLE InputType;
+    DSCBUFFERDESC DSCBDescription;
+    LPGUID guid = NULL;
+    HRESULT hr, hrcom;
+    ALuint samples;
+
+    if(!CaptureDeviceList)
+    {
+        /* Initialize COM to prevent name truncation */
+        hrcom = CoInitialize(NULL);
+        hr = DirectSoundCaptureEnumerateA(DSoundEnumCaptureDevices, NULL);
+        if(FAILED(hr))
+            ERR("Error enumerating DirectSound devices (%#x)!\n", (unsigned int)hr);
+        if(SUCCEEDED(hrcom))
+            CoUninitialize();
+    }
+
+    if(!deviceName && NumCaptureDevices > 0)
+    {
+        deviceName = CaptureDeviceList[0].name;
+        guid = &CaptureDeviceList[0].guid;
+    }
+    else
+    {
+        ALuint i;
+
+        for(i = 0;i < NumCaptureDevices;i++)
+        {
+            if(strcmp(deviceName, CaptureDeviceList[i].name) == 0)
+            {
+                guid = &CaptureDeviceList[i].guid;
+                break;
+            }
+        }
+        if(i == NumCaptureDevices)
+            return ALC_INVALID_VALUE;
+    }
+
+    switch(device->FmtType)
+    {
+        case DevFmtByte:
+        case DevFmtUShort:
+        case DevFmtUInt:
+            WARN("%s capture samples not supported\n", DevFmtTypeString(device->FmtType));
+            return ALC_INVALID_ENUM;
+
+        case DevFmtUByte:
+        case DevFmtShort:
+        case DevFmtInt:
+        case DevFmtFloat:
+            break;
+    }
+
+    //Initialise requested device
+    data = calloc(1, sizeof(DSoundCaptureData));
+    if(!data)
+        return ALC_OUT_OF_MEMORY;
+
+    hr = DS_OK;
+
+    //DirectSoundCapture Init code
+    if(SUCCEEDED(hr))
+        hr = DirectSoundCaptureCreate(guid, &data->DSC, NULL);
+    if(SUCCEEDED(hr))
+    {
+        memset(&InputType, 0, sizeof(InputType));
+
+        switch(device->FmtChans)
+        {
+            case DevFmtMono:
+                InputType.dwChannelMask = SPEAKER_FRONT_CENTER;
+                break;
+            case DevFmtStereo:
+                InputType.dwChannelMask = SPEAKER_FRONT_LEFT |
+                                          SPEAKER_FRONT_RIGHT;
+                break;
+            case DevFmtQuad:
+                InputType.dwChannelMask = SPEAKER_FRONT_LEFT |
+                                          SPEAKER_FRONT_RIGHT |
+                                          SPEAKER_BACK_LEFT |
+                                          SPEAKER_BACK_RIGHT;
+                break;
+            case DevFmtX51:
+                InputType.dwChannelMask = SPEAKER_FRONT_LEFT |
+                                          SPEAKER_FRONT_RIGHT |
+                                          SPEAKER_FRONT_CENTER |
+                                          SPEAKER_LOW_FREQUENCY |
+                                          SPEAKER_BACK_LEFT |
+                                          SPEAKER_BACK_RIGHT;
+                break;
+            case DevFmtX51Side:
+                InputType.dwChannelMask = SPEAKER_FRONT_LEFT |
+                                          SPEAKER_FRONT_RIGHT |
+                                          SPEAKER_FRONT_CENTER |
+                                          SPEAKER_LOW_FREQUENCY |
+                                          SPEAKER_SIDE_LEFT |
+                                          SPEAKER_SIDE_RIGHT;
+                break;
+            case DevFmtX61:
+                InputType.dwChannelMask = SPEAKER_FRONT_LEFT |
+                                          SPEAKER_FRONT_RIGHT |
+                                          SPEAKER_FRONT_CENTER |
+                                          SPEAKER_LOW_FREQUENCY |
+                                          SPEAKER_BACK_CENTER |
+                                          SPEAKER_SIDE_LEFT |
+                                          SPEAKER_SIDE_RIGHT;
+                break;
+            case DevFmtX71:
+                InputType.dwChannelMask = SPEAKER_FRONT_LEFT |
+                                          SPEAKER_FRONT_RIGHT |
+                                          SPEAKER_FRONT_CENTER |
+                                          SPEAKER_LOW_FREQUENCY |
+                                          SPEAKER_BACK_LEFT |
+                                          SPEAKER_BACK_RIGHT |
+                                          SPEAKER_SIDE_LEFT |
+                                          SPEAKER_SIDE_RIGHT;
+                break;
+        }
+
+        InputType.Format.wFormatTag = WAVE_FORMAT_PCM;
+        InputType.Format.nChannels = ChannelsFromDevFmt(device->FmtChans);
+        InputType.Format.wBitsPerSample = BytesFromDevFmt(device->FmtType) * 8;
+        InputType.Format.nBlockAlign = InputType.Format.nChannels*InputType.Format.wBitsPerSample/8;
+        InputType.Format.nSamplesPerSec = device->Frequency;
+        InputType.Format.nAvgBytesPerSec = InputType.Format.nSamplesPerSec*InputType.Format.nBlockAlign;
+        InputType.Format.cbSize = 0;
+
+        if(InputType.Format.nChannels > 2 || device->FmtType == DevFmtFloat)
+        {
+            InputType.Format.wFormatTag = WAVE_FORMAT_EXTENSIBLE;
+            InputType.Format.cbSize = sizeof(WAVEFORMATEXTENSIBLE) - sizeof(WAVEFORMATEX);
+            InputType.Samples.wValidBitsPerSample = InputType.Format.wBitsPerSample;
+            if(device->FmtType == DevFmtFloat)
+                InputType.SubFormat = KSDATAFORMAT_SUBTYPE_IEEE_FLOAT;
+            else
+                InputType.SubFormat = KSDATAFORMAT_SUBTYPE_PCM;
+        }
+
+        samples = device->UpdateSize * device->NumUpdates;
+        samples = maxu(samples, 100 * device->Frequency / 1000);
+
+        memset(&DSCBDescription, 0, sizeof(DSCBUFFERDESC));
+        DSCBDescription.dwSize = sizeof(DSCBUFFERDESC);
+        DSCBDescription.dwFlags = 0;
+        DSCBDescription.dwBufferBytes = samples * InputType.Format.nBlockAlign;
+        DSCBDescription.lpwfxFormat = &InputType.Format;
+
+        hr = IDirectSoundCapture_CreateCaptureBuffer(data->DSC, &DSCBDescription, &data->DSCbuffer, NULL);
+    }
+    if(SUCCEEDED(hr))
+    {
+         data->Ring = CreateRingBuffer(InputType.Format.nBlockAlign, device->UpdateSize * device->NumUpdates);
+         if(data->Ring == NULL)
+             hr = DSERR_OUTOFMEMORY;
+    }
+
+    if(FAILED(hr))
+    {
+        ERR("Device init failed: 0x%08lx\n", hr);
+
+        DestroyRingBuffer(data->Ring);
+        data->Ring = NULL;
+        if(data->DSCbuffer != NULL)
+            IDirectSoundCaptureBuffer_Release(data->DSCbuffer);
+        data->DSCbuffer = NULL;
+        if(data->DSC)
+            IDirectSoundCapture_Release(data->DSC);
+        data->DSC = NULL;
+
+        free(data);
+        return ALC_INVALID_VALUE;
+    }
+
+    data->BufferBytes = DSCBDescription.dwBufferBytes;
+    SetDefaultWFXChannelOrder(device);
+
+    device->DeviceName = strdup(deviceName);
+    device->ExtraData = data;
+
+    return ALC_NO_ERROR;
+}
+
+static void DSoundCloseCapture(ALCdevice *device)
+{
+    DSoundCaptureData *data = device->ExtraData;
+
+    DestroyRingBuffer(data->Ring);
+    data->Ring = NULL;
+
+    if(data->DSCbuffer != NULL)
+    {
+        IDirectSoundCaptureBuffer_Stop(data->DSCbuffer);
+        IDirectSoundCaptureBuffer_Release(data->DSCbuffer);
+        data->DSCbuffer = NULL;
+    }
+
+    IDirectSoundCapture_Release(data->DSC);
+    data->DSC = NULL;
+
+    free(data);
+    device->ExtraData = NULL;
+}
+
+static void DSoundStartCapture(ALCdevice *device)
+{
+    DSoundCaptureData *data = device->ExtraData;
+    HRESULT hr;
+
+    hr = IDirectSoundCaptureBuffer_Start(data->DSCbuffer, DSCBSTART_LOOPING);
+    if(FAILED(hr))
+    {
+        ERR("start failed: 0x%08lx\n", hr);
+        aluHandleDisconnect(device);
+    }
+}
+
+static void DSoundStopCapture(ALCdevice *device)
+{
+    DSoundCaptureData *data = device->ExtraData;
+    HRESULT hr;
+
+    hr = IDirectSoundCaptureBuffer_Stop(data->DSCbuffer);
+    if(FAILED(hr))
+    {
+        ERR("stop failed: 0x%08lx\n", hr);
+        aluHandleDisconnect(device);
+    }
+}
+
+static ALCenum DSoundCaptureSamples(ALCdevice *Device, ALCvoid *pBuffer, ALCuint lSamples)
+{
+    DSoundCaptureData *data = Device->ExtraData;
+    ReadRingBuffer(data->Ring, pBuffer, lSamples);
+    return ALC_NO_ERROR;
+}
+
+static ALCuint DSoundAvailableSamples(ALCdevice *Device)
+{
+    DSoundCaptureData *data = Device->ExtraData;
+    DWORD ReadCursor, LastCursor, BufferBytes, NumBytes;
+    VOID *ReadPtr1, *ReadPtr2;
+    DWORD ReadCnt1,  ReadCnt2;
+    DWORD FrameSize;
+    HRESULT hr;
 
-    pData->killNow = 0;
+    if(!Device->Connected)
+        goto done;
 
-    IDirectSoundNotify_Release(pData->DSnotify);
-    pData->DSnotify = NULL;
-    IDirectSoundBuffer_Release(pData->DSsbuffer);
-    pData->DSsbuffer = NULL;
-    if(pData->DSpbuffer != NULL)
-        IDirectSoundBuffer_Release(pData->DSpbuffer);
-    pData->DSpbuffer = NULL;
+    FrameSize = FrameSizeFromDevFmt(Device->FmtChans, Device->FmtType);
+    BufferBytes = data->BufferBytes;
+    LastCursor = data->Cursor;
+
+    hr = IDirectSoundCaptureBuffer_GetCurrentPosition(data->DSCbuffer, NULL, &ReadCursor);
+    if(SUCCEEDED(hr))
+    {
+        NumBytes = (ReadCursor-LastCursor + BufferBytes) % BufferBytes;
+        if(NumBytes == 0)
+            goto done;
+        hr = IDirectSoundCaptureBuffer_Lock(data->DSCbuffer, LastCursor, NumBytes,
+                                            &ReadPtr1, &ReadCnt1,
+                                            &ReadPtr2, &ReadCnt2, 0);
+    }
+    if(SUCCEEDED(hr))
+    {
+        WriteRingBuffer(data->Ring, ReadPtr1, ReadCnt1/FrameSize);
+        if(ReadPtr2 != NULL)
+            WriteRingBuffer(data->Ring, ReadPtr2, ReadCnt2/FrameSize);
+        hr = IDirectSoundCaptureBuffer_Unlock(data->DSCbuffer,
+                                              ReadPtr1, ReadCnt1,
+                                              ReadPtr2, ReadCnt2);
+        data->Cursor = (LastCursor+ReadCnt1+ReadCnt2) % BufferBytes;
+    }
+
+    if(FAILED(hr))
+    {
+        ERR("update failed: 0x%08lx\n", hr);
+        aluHandleDisconnect(Device);
+    }
+
+done:
+    return RingBufferSize(data->Ring);
 }
 
 
@@ -543,13 +947,15 @@ static const BackendFuncs DSoundFuncs = {
     DSoundOpenPlayback,
     DSoundClosePlayback,
     DSoundResetPlayback,
+    DSoundStartPlayback,
     DSoundStopPlayback,
-    NULL,
-    NULL,
-    NULL,
-    NULL,
-    NULL,
-    NULL
+    DSoundOpenCapture,
+    DSoundCloseCapture,
+    DSoundStartCapture,
+    DSoundStopCapture,
+    DSoundCaptureSamples,
+    DSoundAvailableSamples,
+    ALCdevice_GetLatencyDefault
 };
 
 
@@ -565,46 +971,66 @@ void alcDSoundDeinit(void)
 {
     ALuint i;
 
-    for(i = 0;i < NumDevices;++i)
-        free(DeviceList[i].name);
-    free(DeviceList);
-    DeviceList = NULL;
-    NumDevices = 0;
+    for(i = 0;i < NumPlaybackDevices;++i)
+        free(PlaybackDeviceList[i].name);
+    free(PlaybackDeviceList);
+    PlaybackDeviceList = NULL;
+    NumPlaybackDevices = 0;
+
+    for(i = 0;i < NumCaptureDevices;++i)
+        free(CaptureDeviceList[i].name);
+    free(CaptureDeviceList);
+    CaptureDeviceList = NULL;
+    NumCaptureDevices = 0;
 
     if(ds_handle)
-        FreeLibrary(ds_handle);
+        CloseLib(ds_handle);
     ds_handle = NULL;
 }
 
 void alcDSoundProbe(enum DevProbe type)
 {
-    HRESULT hr;
+    HRESULT hr, hrcom;
     ALuint i;
 
     switch(type)
     {
-        case DEVICE_PROBE:
-            AppendDeviceList(dsDevice);
-            break;
-
         case ALL_DEVICE_PROBE:
-            for(i = 0;i < NumDevices;++i)
-                free(DeviceList[i].name);
-            free(DeviceList);
-            DeviceList = NULL;
-            NumDevices = 0;
+            for(i = 0;i < NumPlaybackDevices;++i)
+                free(PlaybackDeviceList[i].name);
+            free(PlaybackDeviceList);
+            PlaybackDeviceList = NULL;
+            NumPlaybackDevices = 0;
 
-            hr = DirectSoundEnumerateA(DSoundEnumDevices, NULL);
+            hr = DirectSoundEnumerateA(DSoundEnumPlaybackDevices, NULL);
             if(FAILED(hr))
-                ERR("Error enumerating DirectSound devices (%#x)!\n", (unsigned int)hr);
+                ERR("Error enumerating DirectSound playback devices (%#x)!\n", (unsigned int)hr);
             else
             {
-                for(i = 0;i < NumDevices;i++)
-                    AppendAllDeviceList(DeviceList[i].name);
+                for(i = 0;i < NumPlaybackDevices;i++)
+                    AppendAllDevicesList(PlaybackDeviceList[i].name);
             }
             break;
 
         case CAPTURE_DEVICE_PROBE:
+            for(i = 0;i < NumCaptureDevices;++i)
+                free(CaptureDeviceList[i].name);
+            free(CaptureDeviceList);
+            CaptureDeviceList = NULL;
+            NumCaptureDevices = 0;
+
+            /* Initialize COM to prevent name truncation */
+            hrcom = CoInitialize(NULL);
+            hr = DirectSoundCaptureEnumerateA(DSoundEnumCaptureDevices, NULL);
+            if(FAILED(hr))
+                ERR("Error enumerating DirectSound capture devices (%#x)!\n", (unsigned int)hr);
+            else
+            {
+                for(i = 0;i < NumCaptureDevices;i++)
+                    AppendCaptureDeviceList(CaptureDeviceList[i].name);
+            }
+            if(SUCCEEDED(hrcom))
+                CoUninitialize();
             break;
     }
 }

+ 91 - 28
jni/openal-soft-android/Alc/backends/loopback.c

@@ -21,57 +21,120 @@
 #include "config.h"
 
 #include <stdlib.h>
+
 #include "alMain.h"
-#include "AL/al.h"
-#include "AL/alc.h"
+#include "alu.h"
+
+#include "backends/base.h"
+
+
+typedef struct ALCloopback {
+    DERIVE_FROM_TYPE(ALCbackend);
+} ALCloopback;
+
+static void ALCloopback_Construct(ALCloopback *self, ALCdevice *device);
+static DECLARE_FORWARD(ALCloopback, ALCbackend, void, Destruct)
+static ALCenum ALCloopback_open(ALCloopback *self, const ALCchar *name);
+static void ALCloopback_close(ALCloopback *self);
+static ALCboolean ALCloopback_reset(ALCloopback *self);
+static ALCboolean ALCloopback_start(ALCloopback *self);
+static void ALCloopback_stop(ALCloopback *self);
+static DECLARE_FORWARD2(ALCloopback, ALCbackend, ALCenum, captureSamples, void*, ALCuint)
+static DECLARE_FORWARD(ALCloopback, ALCbackend, ALCuint, availableSamples)
+static DECLARE_FORWARD(ALCloopback, ALCbackend, ALint64, getLatency)
+static DECLARE_FORWARD(ALCloopback, ALCbackend, void, lock)
+static DECLARE_FORWARD(ALCloopback, ALCbackend, void, unlock)
+static void ALCloopback_Delete(ALCloopback *self);
+DEFINE_ALCBACKEND_VTABLE(ALCloopback);
+
+
+static void ALCloopback_Construct(ALCloopback *self, ALCdevice *device)
+{
+    ALCbackend_Construct(STATIC_CAST(ALCbackend, self), device);
+    SET_VTABLE2(ALCloopback, ALCbackend, self);
+}
 
 
-static ALCenum loopback_open_playback(ALCdevice *device, const ALCchar *deviceName)
+static ALCenum ALCloopback_open(ALCloopback *self, const ALCchar *name)
 {
-    device->szDeviceName = strdup(deviceName);
+    ALCdevice *device = STATIC_CAST(ALCbackend, self)->mDevice;
+
+    device->DeviceName = strdup(name);
     return ALC_NO_ERROR;
 }
 
-static void loopback_close_playback(ALCdevice *device)
+static void ALCloopback_close(ALCloopback* UNUSED(self))
+{
+}
+
+static ALCboolean ALCloopback_reset(ALCloopback *self)
 {
-    (void)device;
+    SetDefaultWFXChannelOrder(STATIC_CAST(ALCbackend, self)->mDevice);
+    return ALC_TRUE;
 }
 
-static ALCboolean loopback_reset_playback(ALCdevice *device)
+static ALCboolean ALCloopback_start(ALCloopback* UNUSED(self))
 {
-    SetDefaultWFXChannelOrder(device);
     return ALC_TRUE;
 }
 
-static void loopback_stop_playback(ALCdevice *device)
+static void ALCloopback_stop(ALCloopback* UNUSED(self))
+{
+}
+
+
+static void ALCloopback_Delete(ALCloopback *self)
+{
+    free(self);
+}
+
+
+typedef struct ALCloopbackFactory {
+    DERIVE_FROM_TYPE(ALCbackendFactory);
+} ALCloopbackFactory;
+#define ALCNULLBACKENDFACTORY_INITIALIZER { { GET_VTABLE2(ALCloopbackFactory, ALCbackendFactory) } }
+
+ALCbackendFactory *ALCloopbackFactory_getFactory(void);
+static ALCboolean ALCloopbackFactory_init(ALCloopbackFactory *self);
+static DECLARE_FORWARD(ALCloopbackFactory, ALCbackendFactory, void, deinit)
+static ALCboolean ALCloopbackFactory_querySupport(ALCloopbackFactory *self, ALCbackend_Type type);
+static void ALCloopbackFactory_probe(ALCloopbackFactory *self, enum DevProbe type);
+static ALCbackend* ALCloopbackFactory_createBackend(ALCloopbackFactory *self, ALCdevice *device, ALCbackend_Type type);
+DEFINE_ALCBACKENDFACTORY_VTABLE(ALCloopbackFactory);
+
+
+ALCbackendFactory *ALCloopbackFactory_getFactory(void)
 {
-    (void)device;
+    static ALCloopbackFactory factory = ALCNULLBACKENDFACTORY_INITIALIZER;
+    return STATIC_CAST(ALCbackendFactory, &factory);
 }
 
-static const BackendFuncs loopback_funcs = {
-    loopback_open_playback,
-    loopback_close_playback,
-    loopback_reset_playback,
-    loopback_stop_playback,
-    NULL,
-    NULL,
-    NULL,
-    NULL,
-    NULL,
-    NULL
-};
-
-ALCboolean alc_loopback_init(BackendFuncs *func_list)
+static ALCboolean ALCloopbackFactory_init(ALCloopbackFactory* UNUSED(self))
 {
-    *func_list = loopback_funcs;
     return ALC_TRUE;
 }
 
-void alc_loopback_deinit(void)
+static ALCboolean ALCloopbackFactory_querySupport(ALCloopbackFactory* UNUSED(self), ALCbackend_Type type)
+{
+    if(type == ALCbackend_Loopback)
+        return ALC_TRUE;
+    return ALC_FALSE;
+}
+
+static void ALCloopbackFactory_probe(ALCloopbackFactory* UNUSED(self), enum DevProbe UNUSED(type))
 {
 }
 
-void alc_loopback_probe(enum DevProbe type)
+static ALCbackend* ALCloopbackFactory_createBackend(ALCloopbackFactory* UNUSED(self), ALCdevice *device, ALCbackend_Type type)
 {
-    (void)type;
+    ALCloopback *backend;
+
+    assert(type == ALCbackend_Loopback);
+
+    backend = calloc(1, sizeof(*backend));
+    if(!backend) return NULL;
+
+    ALCloopback_Construct(backend, device);
+
+    return STATIC_CAST(ALCbackend, backend);
 }

+ 431 - 167
jni/openal-soft-android/Alc/backends/mmdevapi.c

@@ -28,20 +28,27 @@
 #include <mmdeviceapi.h>
 #include <audioclient.h>
 #include <cguid.h>
+#include <devpropdef.h>
 #include <mmreg.h>
+#include <propsys.h>
+#include <propkey.h>
+#include <devpkey.h>
 #ifndef _WAVEFORMATEXTENSIBLE_
 #include <ks.h>
 #include <ksmedia.h>
 #endif
 
 #include "alMain.h"
-#include "AL/al.h"
-#include "AL/alc.h"
+#include "alu.h"
+#include "threads.h"
+#include "compat.h"
 
 
 DEFINE_GUID(KSDATAFORMAT_SUBTYPE_PCM, 0x00000001, 0x0000, 0x0010, 0x80, 0x00, 0x00, 0xaa, 0x00, 0x38, 0x9b, 0x71);
 DEFINE_GUID(KSDATAFORMAT_SUBTYPE_IEEE_FLOAT, 0x00000003, 0x0000, 0x0010, 0x80, 0x00, 0x00, 0xaa, 0x00, 0x38, 0x9b, 0x71);
 
+DEFINE_DEVPROPKEY(DEVPKEY_Device_FriendlyName, 0xa45c254e, 0xdf1c, 0x4efd, 0x80,0x20, 0x67,0xd1,0x46,0xa8,0x50,0xe0, 14);
+
 #define MONO SPEAKER_FRONT_CENTER
 #define STEREO (SPEAKER_FRONT_LEFT|SPEAKER_FRONT_RIGHT)
 #define QUAD (SPEAKER_FRONT_LEFT|SPEAKER_FRONT_RIGHT|SPEAKER_BACK_LEFT|SPEAKER_BACK_RIGHT)
@@ -52,18 +59,31 @@ DEFINE_GUID(KSDATAFORMAT_SUBTYPE_IEEE_FLOAT, 0x00000003, 0x0000, 0x0010, 0x80, 0
 
 
 typedef struct {
+    WCHAR *devid;
+
     IMMDevice *mmdev;
     IAudioClient *client;
-    HANDLE hNotifyEvent;
+    IAudioRenderClient *render;
+    HANDLE NotifyEvent;
 
     HANDLE MsgEvent;
 
+    volatile UINT32 Padding;
+
     volatile int killNow;
-    ALvoid *thread;
+    althread_t thread;
 } MMDevApiData;
 
 
-static const ALCchar mmDevice[] = "WASAPI Default";
+typedef struct {
+    ALCchar *name;
+    WCHAR *devid;
+} DevMap;
+
+static DevMap *PlaybackDeviceList;
+static ALuint NumPlaybackDevices;
+static DevMap *CaptureDeviceList;
+static ALuint NumCaptureDevices;
 
 
 static HANDLE ThreadHdl;
@@ -74,10 +94,14 @@ typedef struct {
     HRESULT result;
 } ThreadRequest;
 
+#define WM_USER_First       (WM_USER+0)
 #define WM_USER_OpenDevice  (WM_USER+0)
 #define WM_USER_ResetDevice (WM_USER+1)
-#define WM_USER_StopDevice  (WM_USER+2)
-#define WM_USER_CloseDevice (WM_USER+3)
+#define WM_USER_StartDevice (WM_USER+2)
+#define WM_USER_StopDevice  (WM_USER+3)
+#define WM_USER_CloseDevice (WM_USER+4)
+#define WM_USER_Enumerate   (WM_USER+5)
+#define WM_USER_Last        (WM_USER+5)
 
 static HRESULT WaitForResponse(ThreadRequest *req)
 {
@@ -88,15 +112,120 @@ static HRESULT WaitForResponse(ThreadRequest *req)
 }
 
 
-static ALuint MMDevApiProc(ALvoid *ptr)
+static ALCchar *get_device_name(IMMDevice *device)
+{
+    ALCchar *name = NULL;
+    IPropertyStore *ps;
+    PROPVARIANT pvname;
+    HRESULT hr;
+    int len;
+
+    hr = IMMDevice_OpenPropertyStore(device, STGM_READ, &ps);
+    if(FAILED(hr))
+    {
+        WARN("OpenPropertyStore failed: 0x%08lx\n", hr);
+        return calloc(1, 1);
+    }
+
+    PropVariantInit(&pvname);
+
+    hr = IPropertyStore_GetValue(ps, (const PROPERTYKEY*)&DEVPKEY_Device_FriendlyName, &pvname);
+    if(FAILED(hr))
+    {
+        WARN("GetValue failed: 0x%08lx\n", hr);
+        name = calloc(1, 1);
+    }
+    else
+    {
+        if((len=WideCharToMultiByte(CP_ACP, 0, pvname.pwszVal, -1, NULL, 0, NULL, NULL)) > 0)
+        {
+            name = calloc(1, len);
+            WideCharToMultiByte(CP_ACP, 0, pvname.pwszVal, -1, name, len, NULL, NULL);
+        }
+    }
+
+    PropVariantClear(&pvname);
+    IPropertyStore_Release(ps);
+
+    return name;
+}
+
+static void add_device(IMMDevice *device, DevMap *devmap)
+{
+    LPWSTR devid;
+    HRESULT hr;
+
+    hr = IMMDevice_GetId(device, &devid);
+    if(SUCCEEDED(hr))
+    {
+        devmap->devid = strdupW(devid);
+        devmap->name = get_device_name(device);
+        TRACE("Got device \"%s\", \"%ls\"\n", devmap->name, devmap->devid);
+        CoTaskMemFree(devid);
+    }
+}
+
+static DevMap *ProbeDevices(IMMDeviceEnumerator *devenum, EDataFlow flowdir, ALuint *numdevs)
+{
+    IMMDeviceCollection *coll;
+    IMMDevice *defdev = NULL;
+    DevMap *devlist = NULL;
+    HRESULT hr;
+    UINT count;
+    UINT idx;
+    UINT i;
+
+    hr = IMMDeviceEnumerator_EnumAudioEndpoints(devenum, flowdir, DEVICE_STATE_ACTIVE, &coll);
+    if(FAILED(hr))
+    {
+        ERR("Failed to enumerate audio endpoints: 0x%08lx\n", hr);
+        return NULL;
+    }
+
+    idx = count = 0;
+    hr = IMMDeviceCollection_GetCount(coll, &count);
+    if(SUCCEEDED(hr) && count > 0)
+    {
+        devlist = calloc(count, sizeof(*devlist));
+        if(!devlist)
+        {
+            IMMDeviceCollection_Release(coll);
+            return NULL;
+        }
+
+        hr = IMMDeviceEnumerator_GetDefaultAudioEndpoint(devenum, flowdir,
+                                                         eMultimedia, &defdev);
+    }
+    if(SUCCEEDED(hr) && defdev != NULL)
+        add_device(defdev, &devlist[idx++]);
+
+    for(i = 0;i < count && idx < count;++i)
+    {
+        IMMDevice *device;
+
+        if(FAILED(IMMDeviceCollection_Item(coll, i, &device)))
+            continue;
+
+        if(device != defdev)
+            add_device(device, &devlist[idx++]);
+
+        IMMDevice_Release(device);
+    }
+
+    if(defdev) IMMDevice_Release(defdev);
+    IMMDeviceCollection_Release(coll);
+
+    *numdevs = idx;
+    return devlist;
+}
+
+
+FORCE_ALIGN static ALuint MMDevApiProc(ALvoid *ptr)
 {
     ALCdevice *device = ptr;
     MMDevApiData *data = device->ExtraData;
-    union {
-        IAudioRenderClient *iface;
-        void *ptr;
-    } render;
-    UINT32 written, len;
+    UINT32 buffer_len, written;
+    ALuint update_size, len;
     BYTE *buffer;
     HRESULT hr;
 
@@ -104,56 +233,60 @@ static ALuint MMDevApiProc(ALvoid *ptr)
     if(FAILED(hr))
     {
         ERR("CoInitialize(NULL) failed: 0x%08lx\n", hr);
+        ALCdevice_Lock(device);
         aluHandleDisconnect(device);
-        return 0;
-    }
-
-    hr = IAudioClient_GetService(data->client, &IID_IAudioRenderClient, &render.ptr);
-    if(FAILED(hr))
-    {
-        ERR("Failed to get AudioRenderClient service: 0x%08lx\n", hr);
-        aluHandleDisconnect(device);
+        ALCdevice_Unlock(device);
         return 0;
     }
 
     SetRTPriority();
+    SetThreadName(MIXER_THREAD_NAME);
 
+    update_size = device->UpdateSize;
+    buffer_len = update_size * device->NumUpdates;
     while(!data->killNow)
     {
         hr = IAudioClient_GetCurrentPadding(data->client, &written);
         if(FAILED(hr))
         {
             ERR("Failed to get padding: 0x%08lx\n", hr);
+            ALCdevice_Lock(device);
             aluHandleDisconnect(device);
+            ALCdevice_Unlock(device);
             break;
         }
+        data->Padding = written;
 
-        len = device->UpdateSize*device->NumUpdates - written;
-        if(len < device->UpdateSize)
+        len = buffer_len - written;
+        if(len < update_size)
         {
             DWORD res;
-            res = WaitForSingleObjectEx(data->hNotifyEvent, 2000, FALSE);
+            res = WaitForSingleObjectEx(data->NotifyEvent, 2000, FALSE);
             if(res != WAIT_OBJECT_0)
                 ERR("WaitForSingleObjectEx error: 0x%lx\n", res);
             continue;
         }
-        len -= len%device->UpdateSize;
+        len -= len%update_size;
 
-        hr = IAudioRenderClient_GetBuffer(render.iface, len, &buffer);
+        hr = IAudioRenderClient_GetBuffer(data->render, len, &buffer);
         if(SUCCEEDED(hr))
         {
+            ALCdevice_Lock(device);
             aluMixData(device, buffer, len);
-            hr = IAudioRenderClient_ReleaseBuffer(render.iface, len, 0);
+            data->Padding = written + len;
+            ALCdevice_Unlock(device);
+            hr = IAudioRenderClient_ReleaseBuffer(data->render, len, 0);
         }
         if(FAILED(hr))
         {
             ERR("Failed to buffer data: 0x%08lx\n", hr);
+            ALCdevice_Lock(device);
             aluHandleDisconnect(device);
+            ALCdevice_Unlock(device);
             break;
         }
     }
-
-    IAudioRenderClient_Release(render.iface);
+    data->Padding = 0;
 
     CoUninitialize();
     return 0;
@@ -164,7 +297,7 @@ static ALCboolean MakeExtensible(WAVEFORMATEXTENSIBLE *out, const WAVEFORMATEX *
 {
     memset(out, 0, sizeof(*out));
     if(in->wFormatTag == WAVE_FORMAT_EXTENSIBLE)
-        *out = *(WAVEFORMATEXTENSIBLE*)in;
+        *out = *(const WAVEFORMATEXTENSIBLE*)in;
     else if(in->wFormatTag == WAVE_FORMAT_PCM)
     {
         out->Format = *in;
@@ -204,7 +337,7 @@ static HRESULT DoReset(ALCdevice *device)
     MMDevApiData *data = device->ExtraData;
     WAVEFORMATEXTENSIBLE OutputType;
     WAVEFORMATEX *wfx = NULL;
-    REFERENCE_TIME min_per;
+    REFERENCE_TIME min_per, buf_time;
     UINT32 buffer_len, min_len;
     HRESULT hr;
 
@@ -223,6 +356,9 @@ static HRESULT DoReset(ALCdevice *device)
     CoTaskMemFree(wfx);
     wfx = NULL;
 
+    buf_time = ((REFERENCE_TIME)device->UpdateSize*device->NumUpdates*10000000 +
+                                device->Frequency-1) / device->Frequency;
+
     if(!(device->Flags&DEVICE_FREQUENCY_REQUEST))
         device->Frequency = OutputType.Format.nSamplesPerSec;
     if(!(device->Flags&DEVICE_CHANNELS_REQUEST))
@@ -294,6 +430,14 @@ static HRESULT DoReset(ALCdevice *device)
             OutputType.Samples.wValidBitsPerSample = 16;
             OutputType.SubFormat = KSDATAFORMAT_SUBTYPE_PCM;
             break;
+        case DevFmtUInt:
+            device->FmtType = DevFmtInt;
+            /* fall-through */
+        case DevFmtInt:
+            OutputType.Format.wBitsPerSample = 32;
+            OutputType.Samples.wValidBitsPerSample = 32;
+            OutputType.SubFormat = KSDATAFORMAT_SUBTYPE_PCM;
+            break;
         case DevFmtFloat:
             OutputType.Format.wBitsPerSample = 32;
             OutputType.Samples.wValidBitsPerSample = 32;
@@ -329,153 +473,91 @@ static HRESULT DoReset(ALCdevice *device)
         CoTaskMemFree(wfx);
         wfx = NULL;
 
-        if(device->Frequency != OutputType.Format.nSamplesPerSec)
-        {
-            if((device->Flags&DEVICE_FREQUENCY_REQUEST))
-                ERR("Failed to set %dhz, got %ldhz instead\n", device->Frequency, OutputType.Format.nSamplesPerSec);
-            device->Flags &= ~DEVICE_FREQUENCY_REQUEST;
-            device->Frequency = OutputType.Format.nSamplesPerSec;
-        }
-
-        if(!((device->FmtChans == DevFmtMono && OutputType.Format.nChannels == 1 && OutputType.dwChannelMask == MONO) ||
-             (device->FmtChans == DevFmtStereo && OutputType.Format.nChannels == 2 && OutputType.dwChannelMask == STEREO) ||
-             (device->FmtChans == DevFmtQuad && OutputType.Format.nChannels == 4 && OutputType.dwChannelMask == QUAD) ||
-             (device->FmtChans == DevFmtX51 && OutputType.Format.nChannels == 6 && OutputType.dwChannelMask == X5DOT1) ||
-             (device->FmtChans == DevFmtX51Side && OutputType.Format.nChannels == 6 && OutputType.dwChannelMask == X5DOT1SIDE) ||
-             (device->FmtChans == DevFmtX61 && OutputType.Format.nChannels == 7 && OutputType.dwChannelMask == X6DOT1) ||
-             (device->FmtChans == DevFmtX71 && OutputType.Format.nChannels == 8 && OutputType.dwChannelMask == X7DOT1)))
+        device->Frequency = OutputType.Format.nSamplesPerSec;
+        if(OutputType.Format.nChannels == 1 && OutputType.dwChannelMask == MONO)
+            device->FmtChans = DevFmtMono;
+        else if(OutputType.Format.nChannels == 2 && OutputType.dwChannelMask == STEREO)
+            device->FmtChans = DevFmtStereo;
+        else if(OutputType.Format.nChannels == 4 && OutputType.dwChannelMask == QUAD)
+            device->FmtChans = DevFmtQuad;
+        else if(OutputType.Format.nChannels == 6 && OutputType.dwChannelMask == X5DOT1)
+            device->FmtChans = DevFmtX51;
+        else if(OutputType.Format.nChannels == 6 && OutputType.dwChannelMask == X5DOT1SIDE)
+            device->FmtChans = DevFmtX51Side;
+        else if(OutputType.Format.nChannels == 7 && OutputType.dwChannelMask == X6DOT1)
+            device->FmtChans = DevFmtX61;
+        else if(OutputType.Format.nChannels == 8 && OutputType.dwChannelMask == X7DOT1)
+            device->FmtChans = DevFmtX71;
+        else
         {
-            if((device->Flags&DEVICE_CHANNELS_REQUEST))
-                ERR("Failed to set %s, got %d channels (0x%08lx) instead\n", DevFmtChannelsString(device->FmtChans), OutputType.Format.nChannels, OutputType.dwChannelMask);
-            device->Flags &= ~DEVICE_CHANNELS_REQUEST;
-
-            if(OutputType.Format.nChannels == 1 && OutputType.dwChannelMask == MONO)
-                device->FmtChans = DevFmtMono;
-            else if(OutputType.Format.nChannels == 2 && OutputType.dwChannelMask == STEREO)
-                device->FmtChans = DevFmtStereo;
-            else if(OutputType.Format.nChannels == 4 && OutputType.dwChannelMask == QUAD)
-                device->FmtChans = DevFmtQuad;
-            else if(OutputType.Format.nChannels == 6 && OutputType.dwChannelMask == X5DOT1)
-                device->FmtChans = DevFmtX51;
-            else if(OutputType.Format.nChannels == 6 && OutputType.dwChannelMask == X5DOT1SIDE)
-                device->FmtChans = DevFmtX51Side;
-            else if(OutputType.Format.nChannels == 7 && OutputType.dwChannelMask == X6DOT1)
-                device->FmtChans = DevFmtX61;
-            else if(OutputType.Format.nChannels == 8 && OutputType.dwChannelMask == X7DOT1)
-                device->FmtChans = DevFmtX71;
-            else
-            {
-                ERR("Unhandled extensible channels: %d -- 0x%08lx\n", OutputType.Format.nChannels, OutputType.dwChannelMask);
-                device->FmtChans = DevFmtStereo;
-                OutputType.Format.nChannels = 2;
-                OutputType.dwChannelMask = STEREO;
-            }
+            ERR("Unhandled extensible channels: %d -- 0x%08lx\n", OutputType.Format.nChannels, OutputType.dwChannelMask);
+            device->FmtChans = DevFmtStereo;
+            OutputType.Format.nChannels = 2;
+            OutputType.dwChannelMask = STEREO;
         }
 
         if(IsEqualGUID(&OutputType.SubFormat, &KSDATAFORMAT_SUBTYPE_PCM))
         {
-            if(OutputType.Samples.wValidBitsPerSample == 0)
-                OutputType.Samples.wValidBitsPerSample = OutputType.Format.wBitsPerSample;
-            if(OutputType.Samples.wValidBitsPerSample != OutputType.Format.wBitsPerSample ||
-               !((device->FmtType == DevFmtUByte && OutputType.Format.wBitsPerSample == 8) ||
-                 (device->FmtType == DevFmtShort && OutputType.Format.wBitsPerSample == 16)))
+            if(OutputType.Format.wBitsPerSample == 8)
+                device->FmtType = DevFmtUByte;
+            else if(OutputType.Format.wBitsPerSample == 16)
+                device->FmtType = DevFmtShort;
+            else if(OutputType.Format.wBitsPerSample == 32)
+                device->FmtType = DevFmtInt;
+            else
             {
-                ERR("Failed to set %s samples, got %d/%d-bit instead\n", DevFmtTypeString(device->FmtType), OutputType.Samples.wValidBitsPerSample, OutputType.Format.wBitsPerSample);
-                if(OutputType.Format.wBitsPerSample == 8)
-                    device->FmtType = DevFmtUByte;
-                else if(OutputType.Format.wBitsPerSample == 16)
-                    device->FmtType = DevFmtShort;
-                else
-                {
-                    device->FmtType = DevFmtShort;
-                    OutputType.Format.wBitsPerSample = 16;
-                }
-                OutputType.Samples.wValidBitsPerSample = OutputType.Format.wBitsPerSample;
+                device->FmtType = DevFmtShort;
+                OutputType.Format.wBitsPerSample = 16;
             }
         }
         else if(IsEqualGUID(&OutputType.SubFormat, &KSDATAFORMAT_SUBTYPE_IEEE_FLOAT))
         {
-            if(OutputType.Samples.wValidBitsPerSample == 0)
-                OutputType.Samples.wValidBitsPerSample = OutputType.Format.wBitsPerSample;
-            if(OutputType.Samples.wValidBitsPerSample != OutputType.Format.wBitsPerSample ||
-               !((device->FmtType == DevFmtFloat && OutputType.Format.wBitsPerSample == 32)))
-            {
-                ERR("Failed to set %s samples, got %d/%d-bit instead\n", DevFmtTypeString(device->FmtType), OutputType.Samples.wValidBitsPerSample, OutputType.Format.wBitsPerSample);
-                if(OutputType.Format.wBitsPerSample != 32)
-                {
-                    device->FmtType = DevFmtFloat;
-                    OutputType.Format.wBitsPerSample = 32;
-                }
-                OutputType.Samples.wValidBitsPerSample = OutputType.Format.wBitsPerSample;
-            }
+            device->FmtType = DevFmtFloat;
+            OutputType.Format.wBitsPerSample = 32;
         }
         else
         {
             ERR("Unhandled format sub-type\n");
             device->FmtType = DevFmtShort;
             OutputType.Format.wBitsPerSample = 16;
-            OutputType.Samples.wValidBitsPerSample = OutputType.Format.wBitsPerSample;
             OutputType.SubFormat = KSDATAFORMAT_SUBTYPE_PCM;
         }
+        OutputType.Samples.wValidBitsPerSample = OutputType.Format.wBitsPerSample;
     }
 
     SetDefaultWFXChannelOrder(device);
 
-    hr = IAudioClient_GetDevicePeriod(data->client, &min_per, NULL);
-    if(SUCCEEDED(hr))
-    {
-        min_len = (min_per*device->Frequency + 10000000-1) / 10000000;
-        if(min_len < device->UpdateSize)
-            min_len *= (device->UpdateSize + min_len/2)/min_len;
-
-        device->NumUpdates = (device->NumUpdates*device->UpdateSize + min_len/2) /
-                             min_len;
-        device->NumUpdates = maxu(device->NumUpdates, 2);
-        device->UpdateSize = min_len;
-
-        hr = IAudioClient_Initialize(data->client, AUDCLNT_SHAREMODE_SHARED,
-                                     AUDCLNT_STREAMFLAGS_EVENTCALLBACK,
-                                     ((REFERENCE_TIME)device->UpdateSize*
-                                      device->NumUpdates*10000000 +
-                                      device->Frequency-1) / device->Frequency,
-                                     0, &OutputType.Format, NULL);
-    }
+    hr = IAudioClient_Initialize(data->client, AUDCLNT_SHAREMODE_SHARED,
+                                 AUDCLNT_STREAMFLAGS_EVENTCALLBACK,
+                                 buf_time, 0, &OutputType.Format, NULL);
     if(FAILED(hr))
     {
         ERR("Failed to initialize audio client: 0x%08lx\n", hr);
         return hr;
     }
 
-    hr = IAudioClient_GetBufferSize(data->client, &buffer_len);
+    hr = IAudioClient_GetDevicePeriod(data->client, &min_per, NULL);
+    if(SUCCEEDED(hr))
+    {
+        min_len = (UINT32)((min_per*device->Frequency + 10000000-1) / 10000000);
+        /* Find the nearest multiple of the period size to the update size */
+        if(min_len < device->UpdateSize)
+            min_len *= (device->UpdateSize + min_len/2)/min_len;
+        hr = IAudioClient_GetBufferSize(data->client, &buffer_len);
+    }
     if(FAILED(hr))
     {
         ERR("Failed to get audio buffer info: 0x%08lx\n", hr);
         return hr;
     }
 
+    device->UpdateSize = min_len;
     device->NumUpdates = buffer_len / device->UpdateSize;
     if(device->NumUpdates <= 1)
     {
-        device->NumUpdates = 1;
         ERR("Audio client returned buffer_len < period*2; expect break up\n");
-    }
-
-    ResetEvent(data->hNotifyEvent);
-    hr = IAudioClient_SetEventHandle(data->client, data->hNotifyEvent);
-    if(SUCCEEDED(hr))
-        hr = IAudioClient_Start(data->client);
-    if(FAILED(hr))
-    {
-        ERR("Failed to start audio client: 0x%08lx\n", hr);
-        return hr;
-    }
-
-    data->thread = StartThread(MMDevApiProc, device);
-    if(!data->thread)
-    {
-        IAudioClient_Stop(data->client);
-        ERR("Failed to start thread\n");
-        return E_FAIL;
+        device->NumUpdates = 2;
+        device->UpdateSize = buffer_len / device->NumUpdates;
     }
 
     return hr;
@@ -489,16 +571,16 @@ static DWORD CALLBACK MMDevApiMsgProc(void *ptr)
     ALuint deviceCount = 0;
     MMDevApiData *data;
     ALCdevice *device;
-    HRESULT hr;
+    HRESULT hr, cohr;
     MSG msg;
 
     TRACE("Starting message thread\n");
 
-    hr = CoInitialize(NULL);
-    if(FAILED(hr))
+    cohr = CoInitialize(NULL);
+    if(FAILED(cohr))
     {
-        WARN("Failed to initialize COM: 0x%08lx\n", hr);
-        req->result = hr;
+        WARN("Failed to initialize COM: 0x%08lx\n", cohr);
+        req->result = cohr;
         SetEvent(req->FinishedEvt);
         return 0;
     }
@@ -522,7 +604,7 @@ static DWORD CALLBACK MMDevApiMsgProc(void *ptr)
     SetEvent(req->FinishedEvt);
 
     TRACE("Starting message loop\n");
-    while(GetMessage(&msg, NULL, 0, 0))
+    while(GetMessage(&msg, NULL, WM_USER_First, WM_USER_Last))
     {
         TRACE("Got message %u\n", msg.message);
         switch(msg.message)
@@ -532,28 +614,36 @@ static DWORD CALLBACK MMDevApiMsgProc(void *ptr)
             device = (ALCdevice*)msg.lParam;
             data = device->ExtraData;
 
-            hr = S_OK;
+            hr = cohr = S_OK;
             if(++deviceCount == 1)
-                hr = CoInitialize(NULL);
+                hr = cohr = CoInitialize(NULL);
             if(SUCCEEDED(hr))
                 hr = CoCreateInstance(&CLSID_MMDeviceEnumerator, NULL, CLSCTX_INPROC_SERVER, &IID_IMMDeviceEnumerator, &ptr);
             if(SUCCEEDED(hr))
             {
                 Enumerator = ptr;
-                hr = IMMDeviceEnumerator_GetDefaultAudioEndpoint(Enumerator, eRender, eMultimedia, &data->mmdev);
+                if(!data->devid)
+                    hr = IMMDeviceEnumerator_GetDefaultAudioEndpoint(Enumerator, eRender, eMultimedia, &data->mmdev);
+                else
+                    hr = IMMDeviceEnumerator_GetDevice(Enumerator, data->devid, &data->mmdev);
                 IMMDeviceEnumerator_Release(Enumerator);
                 Enumerator = NULL;
             }
             if(SUCCEEDED(hr))
                 hr = IMMDevice_Activate(data->mmdev, &IID_IAudioClient, CLSCTX_INPROC_SERVER, NULL, &ptr);
             if(SUCCEEDED(hr))
+            {
                 data->client = ptr;
+                device->DeviceName = get_device_name(data->mmdev);
+            }
 
             if(FAILED(hr))
             {
                 if(data->mmdev)
                     IMMDevice_Release(data->mmdev);
                 data->mmdev = NULL;
+                if(--deviceCount == 0 && SUCCEEDED(cohr))
+                    CoUninitialize();
             }
 
             req->result = hr;
@@ -568,6 +658,42 @@ static DWORD CALLBACK MMDevApiMsgProc(void *ptr)
             SetEvent(req->FinishedEvt);
             continue;
 
+        case WM_USER_StartDevice:
+            req = (ThreadRequest*)msg.wParam;
+            device = (ALCdevice*)msg.lParam;
+            data = device->ExtraData;
+
+            ResetEvent(data->NotifyEvent);
+            hr = IAudioClient_SetEventHandle(data->client, data->NotifyEvent);
+            if(FAILED(hr))
+                ERR("Failed to set event handle: 0x%08lx\n", hr);
+            else
+            {
+                hr = IAudioClient_Start(data->client);
+                if(FAILED(hr))
+                    ERR("Failed to start audio client: 0x%08lx\n", hr);
+            }
+
+            if(SUCCEEDED(hr))
+                hr = IAudioClient_GetService(data->client, &IID_IAudioRenderClient, &ptr);
+            if(SUCCEEDED(hr))
+            {
+                data->render = ptr;
+                if(!StartThread(&data->thread, MMDevApiProc, device))
+                {
+                    if(data->render)
+                        IAudioRenderClient_Release(data->render);
+                    data->render = NULL;
+                    IAudioClient_Stop(data->client);
+                    ERR("Failed to start thread\n");
+                    hr = E_FAIL;
+                }
+            }
+
+            req->result = hr;
+            SetEvent(req->FinishedEvt);
+            continue;
+
         case WM_USER_StopDevice:
             req = (ThreadRequest*)msg.wParam;
             device = (ALCdevice*)msg.lParam;
@@ -581,6 +707,8 @@ static DWORD CALLBACK MMDevApiMsgProc(void *ptr)
 
                 data->killNow = 0;
 
+                IAudioRenderClient_Release(data->render);
+                data->render = NULL;
                 IAudioClient_Stop(data->client);
             }
 
@@ -606,6 +734,57 @@ static DWORD CALLBACK MMDevApiMsgProc(void *ptr)
             SetEvent(req->FinishedEvt);
             continue;
 
+        case WM_USER_Enumerate:
+            req = (ThreadRequest*)msg.wParam;
+
+            hr = cohr = S_OK;
+            if(++deviceCount == 1)
+                hr = cohr = CoInitialize(NULL);
+            if(SUCCEEDED(hr))
+                hr = CoCreateInstance(&CLSID_MMDeviceEnumerator, NULL, CLSCTX_INPROC_SERVER, &IID_IMMDeviceEnumerator, &ptr);
+            if(SUCCEEDED(hr))
+            {
+                EDataFlow flowdir;
+                DevMap **devlist;
+                ALuint *numdevs;
+                ALuint i;
+
+                Enumerator = ptr;
+                if(msg.lParam == CAPTURE_DEVICE_PROBE)
+                {
+                    flowdir = eCapture;
+                    devlist = &CaptureDeviceList;
+                    numdevs = &NumCaptureDevices;
+                }
+                else
+                {
+                    flowdir = eRender;
+                    devlist = &PlaybackDeviceList;
+                    numdevs = &NumPlaybackDevices;
+                }
+
+                for(i = 0;i < *numdevs;i++)
+                {
+                    free((*devlist)[i].name);
+                    free((*devlist)[i].devid);
+                }
+                free(*devlist);
+                *devlist = NULL;
+                *numdevs = 0;
+
+                *devlist = ProbeDevices(Enumerator, flowdir, numdevs);
+
+                IMMDeviceEnumerator_Release(Enumerator);
+                Enumerator = NULL;
+            }
+
+            if(--deviceCount == 0 && SUCCEEDED(cohr))
+                CoUninitialize();
+
+            req->result = S_OK;
+            SetEvent(req->FinishedEvt);
+            continue;
+
         default:
             ERR("Unexpected message: %u\n", msg.message);
             continue;
@@ -645,11 +824,6 @@ static ALCenum MMDevApiOpenPlayback(ALCdevice *device, const ALCchar *deviceName
     MMDevApiData *data = NULL;
     HRESULT hr;
 
-    if(!deviceName)
-        deviceName = mmDevice;
-    else if(strcmp(deviceName, mmDevice) != 0)
-        return ALC_INVALID_VALUE;
-
     //Initialise requested device
     data = calloc(1, sizeof(MMDevApiData));
     if(!data)
@@ -657,11 +831,37 @@ static ALCenum MMDevApiOpenPlayback(ALCdevice *device, const ALCchar *deviceName
     device->ExtraData = data;
 
     hr = S_OK;
-    data->hNotifyEvent = CreateEvent(NULL, FALSE, FALSE, NULL);
+    data->NotifyEvent = CreateEvent(NULL, FALSE, FALSE, NULL);
     data->MsgEvent = CreateEvent(NULL, FALSE, FALSE, NULL);
-    if(data->hNotifyEvent == NULL || data->MsgEvent == NULL)
+    if(data->NotifyEvent == NULL || data->MsgEvent == NULL)
         hr = E_FAIL;
 
+    if(SUCCEEDED(hr))
+    {
+        if(deviceName)
+        {
+            ALuint i;
+
+            if(!PlaybackDeviceList)
+            {
+                ThreadRequest req = { data->MsgEvent, 0 };
+                if(PostThreadMessage(ThreadID, WM_USER_Enumerate, (WPARAM)&req, ALL_DEVICE_PROBE))
+                    (void)WaitForResponse(&req);
+            }
+
+            hr = E_FAIL;
+            for(i = 0;i < NumPlaybackDevices;i++)
+            {
+                if(strcmp(deviceName, PlaybackDeviceList[i].name) == 0)
+                {
+                    data->devid = strdupW(PlaybackDeviceList[i].devid);
+                    hr = S_OK;
+                    break;
+                }
+            }
+        }
+    }
+
     if(SUCCEEDED(hr))
     {
         ThreadRequest req = { data->MsgEvent, 0 };
@@ -673,13 +873,16 @@ static ALCenum MMDevApiOpenPlayback(ALCdevice *device, const ALCchar *deviceName
 
     if(FAILED(hr))
     {
-        if(data->hNotifyEvent != NULL)
-            CloseHandle(data->hNotifyEvent);
-        data->hNotifyEvent = NULL;
+        if(data->NotifyEvent != NULL)
+            CloseHandle(data->NotifyEvent);
+        data->NotifyEvent = NULL;
         if(data->MsgEvent != NULL)
             CloseHandle(data->MsgEvent);
         data->MsgEvent = NULL;
 
+        free(data->devid);
+        data->devid = NULL;
+
         free(data);
         device->ExtraData = NULL;
 
@@ -687,7 +890,6 @@ static ALCenum MMDevApiOpenPlayback(ALCdevice *device, const ALCchar *deviceName
         return ALC_INVALID_VALUE;
     }
 
-    device->szDeviceName = strdup(deviceName);
     return ALC_NO_ERROR;
 }
 
@@ -702,8 +904,11 @@ static void MMDevApiClosePlayback(ALCdevice *device)
     CloseHandle(data->MsgEvent);
     data->MsgEvent = NULL;
 
-    CloseHandle(data->hNotifyEvent);
-    data->hNotifyEvent = NULL;
+    CloseHandle(data->NotifyEvent);
+    data->NotifyEvent = NULL;
+
+    free(data->devid);
+    data->devid = NULL;
 
     free(data);
     device->ExtraData = NULL;
@@ -721,6 +926,18 @@ static ALCboolean MMDevApiResetPlayback(ALCdevice *device)
     return SUCCEEDED(hr) ? ALC_TRUE : ALC_FALSE;
 }
 
+static ALCboolean MMDevApiStartPlayback(ALCdevice *device)
+{
+    MMDevApiData *data = device->ExtraData;
+    ThreadRequest req = { data->MsgEvent, 0 };
+    HRESULT hr = E_FAIL;
+
+    if(PostThreadMessage(ThreadID, WM_USER_StartDevice, (WPARAM)&req, (LPARAM)device))
+        hr = WaitForResponse(&req);
+
+    return SUCCEEDED(hr) ? ALC_TRUE : ALC_FALSE;
+}
+
 static void MMDevApiStopPlayback(ALCdevice *device)
 {
     MMDevApiData *data = device->ExtraData;
@@ -731,17 +948,27 @@ static void MMDevApiStopPlayback(ALCdevice *device)
 }
 
 
+static ALint64 MMDevApiGetLatency(ALCdevice *device)
+{
+    MMDevApiData *data = device->ExtraData;
+
+    return (ALint64)data->Padding * 1000000000 / device->Frequency;
+}
+
+
 static const BackendFuncs MMDevApiFuncs = {
     MMDevApiOpenPlayback,
     MMDevApiClosePlayback,
     MMDevApiResetPlayback,
+    MMDevApiStartPlayback,
     MMDevApiStopPlayback,
     NULL,
     NULL,
     NULL,
     NULL,
     NULL,
-    NULL
+    NULL,
+    MMDevApiGetLatency
 };
 
 
@@ -755,6 +982,26 @@ ALCboolean alcMMDevApiInit(BackendFuncs *FuncList)
 
 void alcMMDevApiDeinit(void)
 {
+    ALuint i;
+
+    for(i = 0;i < NumPlaybackDevices;i++)
+    {
+        free(PlaybackDeviceList[i].name);
+        free(PlaybackDeviceList[i].devid);
+    }
+    free(PlaybackDeviceList);
+    PlaybackDeviceList = NULL;
+    NumPlaybackDevices = 0;
+
+    for(i = 0;i < NumCaptureDevices;i++)
+    {
+        free(CaptureDeviceList[i].name);
+        free(CaptureDeviceList[i].devid);
+    }
+    free(CaptureDeviceList);
+    CaptureDeviceList = NULL;
+    NumCaptureDevices = 0;
+
     if(ThreadHdl)
     {
         TRACE("Sending WM_QUIT to Thread %04lx\n", ThreadID);
@@ -766,15 +1013,32 @@ void alcMMDevApiDeinit(void)
 
 void alcMMDevApiProbe(enum DevProbe type)
 {
+    ThreadRequest req = { NULL, 0 };
+    HRESULT hr = E_FAIL;
+
     switch(type)
     {
-        case DEVICE_PROBE:
-            AppendDeviceList(mmDevice);
-            break;
         case ALL_DEVICE_PROBE:
-            AppendAllDeviceList(mmDevice);
+            req.FinishedEvt = CreateEvent(NULL, FALSE, FALSE, NULL);
+            if(req.FinishedEvt == NULL)
+                ERR("Failed to create event: %lu\n", GetLastError());
+            else if(PostThreadMessage(ThreadID, WM_USER_Enumerate, (WPARAM)&req, type))
+                hr = WaitForResponse(&req);
+            if(SUCCEEDED(hr))
+            {
+                ALuint i;
+                for(i = 0;i < NumPlaybackDevices;i++)
+                {
+                    if(PlaybackDeviceList[i].name)
+                        AppendAllDevicesList(PlaybackDeviceList[i].name);
+                }
+            }
             break;
+
         case CAPTURE_DEVICE_PROBE:
             break;
     }
+    if(req.FinishedEvt != NULL)
+        CloseHandle(req.FinishedEvt);
+    req.FinishedEvt = NULL;
 }

+ 128 - 70
jni/openal-soft-android/Alc/backends/null.c

@@ -21,144 +21,202 @@
 #include "config.h"
 
 #include <stdlib.h>
+#ifdef HAVE_WINDOWS_H
+#include <windows.h>
+#endif
+
 #include "alMain.h"
-#include "AL/al.h"
-#include "AL/alc.h"
+#include "alu.h"
+#include "threads.h"
+#include "compat.h"
 
+#include "backends/base.h"
 
-typedef struct {
-    volatile int killNow;
-    ALvoid *thread;
-} null_data;
 
+typedef struct ALCnullBackend {
+    DERIVE_FROM_TYPE(ALCbackend);
+
+    volatile int killNow;
+    althread_t thread;
+} ALCnullBackend;
+DECLARE_ALCBACKEND_VTABLE(ALCnullBackend);
+
+static ALuint ALCnullBackend_mixerProc(ALvoid *ptr);
+
+static void ALCnullBackend_Construct(ALCnullBackend *self, ALCdevice *device);
+static DECLARE_FORWARD(ALCnullBackend, ALCbackend, void, Destruct)
+static ALCenum ALCnullBackend_open(ALCnullBackend *self, const ALCchar *name);
+static void ALCnullBackend_close(ALCnullBackend *self);
+static ALCboolean ALCnullBackend_reset(ALCnullBackend *self);
+static ALCboolean ALCnullBackend_start(ALCnullBackend *self);
+static void ALCnullBackend_stop(ALCnullBackend *self);
+static DECLARE_FORWARD2(ALCnullBackend, ALCbackend, ALCenum, captureSamples, void*, ALCuint)
+static DECLARE_FORWARD(ALCnullBackend, ALCbackend, ALCuint, availableSamples)
+static DECLARE_FORWARD(ALCnullBackend, ALCbackend, ALint64, getLatency)
+static DECLARE_FORWARD(ALCnullBackend, ALCbackend, void, lock)
+static DECLARE_FORWARD(ALCnullBackend, ALCbackend, void, unlock)
 
 static const ALCchar nullDevice[] = "No Output";
 
-static ALuint NullProc(ALvoid *ptr)
+
+static void ALCnullBackend_Construct(ALCnullBackend *self, ALCdevice *device)
 {
-    ALCdevice *Device = (ALCdevice*)ptr;
-    null_data *data = (null_data*)Device->ExtraData;
+    ALCbackend_Construct(STATIC_CAST(ALCbackend, self), device);
+    SET_VTABLE2(ALCnullBackend, ALCbackend, self);
+}
+
+
+static ALuint ALCnullBackend_mixerProc(ALvoid *ptr)
+{
+    ALCnullBackend *self = (ALCnullBackend*)ptr;
+    ALCdevice *device = STATIC_CAST(ALCbackend, self)->mDevice;
     ALuint now, start;
     ALuint64 avail, done;
-    const ALuint restTime = (ALuint64)Device->UpdateSize * 1000 /
-                            Device->Frequency / 2;
+
+    SetRTPriority();
+    SetThreadName(MIXER_THREAD_NAME);
 
     done = 0;
     start = timeGetTime();
-    while(!data->killNow && Device->Connected)
+    while(!self->killNow && device->Connected)
     {
         now = timeGetTime();
 
-        avail = (ALuint64)(now-start) * Device->Frequency / 1000;
+        avail = (ALuint64)(now-start) * device->Frequency / 1000;
         if(avail < done)
         {
-            /* Timer wrapped. Add the remainder of the cycle to the available
-             * count and reset the number of samples done */
-            avail += (ALuint64)0xFFFFFFFFu*Device->Frequency/1000 - done;
+            /* Timer wrapped (50 days???). Add the remainder of the cycle to
+             * the available count and reset the number of samples done */
+            avail += (U64(1)<<32)*device->Frequency/1000 - done;
             done = 0;
         }
-        if(avail-done < Device->UpdateSize)
+        if(avail-done < device->UpdateSize)
         {
+            ALuint restTime = (ALuint)((device->UpdateSize - (avail-done)) * 1000 /
+                                       device->Frequency);
             Sleep(restTime);
             continue;
         }
 
-        while(avail-done >= Device->UpdateSize)
-        {
-            aluMixData(Device, NULL, Device->UpdateSize);
-            done += Device->UpdateSize;
-        }
+        do {
+            aluMixData(device, NULL, device->UpdateSize);
+            done += device->UpdateSize;
+        } while(avail-done >= device->UpdateSize);
     }
 
     return 0;
 }
 
-static ALCenum null_open_playback(ALCdevice *device, const ALCchar *deviceName)
+
+static ALCenum ALCnullBackend_open(ALCnullBackend *self, const ALCchar *name)
 {
-    null_data *data;
+    ALCdevice *device;
 
-    if(!deviceName)
-        deviceName = nullDevice;
-    else if(strcmp(deviceName, nullDevice) != 0)
+    if(!name)
+        name = nullDevice;
+    else if(strcmp(name, nullDevice) != 0)
         return ALC_INVALID_VALUE;
 
-    data = (null_data*)calloc(1, sizeof(*data));
+    device = STATIC_CAST(ALCbackend, self)->mDevice;
+    device->DeviceName = strdup(name);
 
-    device->szDeviceName = strdup(deviceName);
-    device->ExtraData = data;
     return ALC_NO_ERROR;
 }
 
-static void null_close_playback(ALCdevice *device)
+static void ALCnullBackend_close(ALCnullBackend* UNUSED(self))
 {
-    null_data *data = (null_data*)device->ExtraData;
+}
 
-    free(data);
-    device->ExtraData = NULL;
+static ALCboolean ALCnullBackend_reset(ALCnullBackend *self)
+{
+    SetDefaultWFXChannelOrder(STATIC_CAST(ALCbackend, self)->mDevice);
+    return ALC_TRUE;
 }
 
-static ALCboolean null_reset_playback(ALCdevice *device)
+static ALCboolean ALCnullBackend_start(ALCnullBackend *self)
 {
-    null_data *data = (null_data*)device->ExtraData;
+    if(!StartThread(&self->thread, ALCnullBackend_mixerProc, self))
+        return ALC_FALSE;
+    return ALC_TRUE;
+}
 
-    SetDefaultWFXChannelOrder(device);
+static void ALCnullBackend_stop(ALCnullBackend *self)
+{
+    if(!self->thread)
+        return;
 
-    data->thread = StartThread(NullProc, device);
-    if(data->thread == NULL)
-        return ALC_FALSE;
+    self->killNow = 1;
+    StopThread(self->thread);
+    self->thread = NULL;
 
-    return ALC_TRUE;
+    self->killNow = 0;
 }
 
-static void null_stop_playback(ALCdevice *device)
+
+static void ALCnullBackend_Delete(ALCnullBackend *self)
 {
-    null_data *data = (null_data*)device->ExtraData;
+    free(self);
+}
 
-    if(!data->thread)
-        return;
+DEFINE_ALCBACKEND_VTABLE(ALCnullBackend);
+
+
+typedef struct ALCnullBackendFactory {
+    DERIVE_FROM_TYPE(ALCbackendFactory);
+} ALCnullBackendFactory;
+#define ALCNULLBACKENDFACTORY_INITIALIZER { { GET_VTABLE2(ALCnullBackendFactory, ALCbackendFactory) } }
+
+ALCbackendFactory *ALCnullBackendFactory_getFactory(void);
+
+static ALCboolean ALCnullBackendFactory_init(ALCnullBackendFactory *self);
+static DECLARE_FORWARD(ALCnullBackendFactory, ALCbackendFactory, void, deinit)
+static ALCboolean ALCnullBackendFactory_querySupport(ALCnullBackendFactory *self, ALCbackend_Type type);
+static void ALCnullBackendFactory_probe(ALCnullBackendFactory *self, enum DevProbe type);
+static ALCbackend* ALCnullBackendFactory_createBackend(ALCnullBackendFactory *self, ALCdevice *device, ALCbackend_Type type);
+DEFINE_ALCBACKENDFACTORY_VTABLE(ALCnullBackendFactory);
 
-    data->killNow = 1;
-    StopThread(data->thread);
-    data->thread = NULL;
 
-    data->killNow = 0;
+ALCbackendFactory *ALCnullBackendFactory_getFactory(void)
+{
+    static ALCnullBackendFactory factory = ALCNULLBACKENDFACTORY_INITIALIZER;
+    return STATIC_CAST(ALCbackendFactory, &factory);
 }
 
 
-static const BackendFuncs null_funcs = {
-    null_open_playback,
-    null_close_playback,
-    null_reset_playback,
-    null_stop_playback,
-    NULL,
-    NULL,
-    NULL,
-    NULL,
-    NULL,
-    NULL
-};
-
-ALCboolean alc_null_init(BackendFuncs *func_list)
+static ALCboolean ALCnullBackendFactory_init(ALCnullBackendFactory* UNUSED(self))
 {
-    *func_list = null_funcs;
     return ALC_TRUE;
 }
 
-void alc_null_deinit(void)
+static ALCboolean ALCnullBackendFactory_querySupport(ALCnullBackendFactory* UNUSED(self), ALCbackend_Type type)
 {
+    if(type == ALCbackend_Playback)
+        return ALC_TRUE;
+    return ALC_FALSE;
 }
 
-void alc_null_probe(enum DevProbe type)
+static void ALCnullBackendFactory_probe(ALCnullBackendFactory* UNUSED(self), enum DevProbe type)
 {
     switch(type)
     {
-        case DEVICE_PROBE:
-            AppendDeviceList(nullDevice);
-            break;
         case ALL_DEVICE_PROBE:
-            AppendAllDeviceList(nullDevice);
+            AppendAllDevicesList(nullDevice);
             break;
         case CAPTURE_DEVICE_PROBE:
             break;
     }
 }
+
+static ALCbackend* ALCnullBackendFactory_createBackend(ALCnullBackendFactory* UNUSED(self), ALCdevice *device, ALCbackend_Type type)
+{
+    ALCnullBackend *backend;
+
+    assert(type == ALCbackend_Playback);
+
+    backend = calloc(1, sizeof(*backend));
+    if(!backend) return NULL;
+
+    ALCnullBackend_Construct(backend, device);
+
+    return STATIC_CAST(ALCbackend, backend);
+}

+ 77 - 30
jni/openal-soft-android/Alc/backends/opensl.c

@@ -22,13 +22,13 @@
 #include "config.h"
 
 #include <stdlib.h>
+
 #include "alMain.h"
-#include "AL/al.h"
-#include "AL/alc.h"
+#include "alu.h"
 
 
 #include <SLES/OpenSLES.h>
-#ifdef HAVE_ANDROID
+#if 1
 #include <SLES/OpenSLES_Android.h>
 #else
 extern SLAPIENTRY const SLInterfaceID SL_IID_ANDROIDSIMPLEBUFFERQUEUE;
@@ -83,6 +83,10 @@ typedef struct SLDataLocator_AndroidSimpleBufferQueue {
 
 #define SLPlayItf_SetPlayState(a,b) ((*(a))->SetPlayState((a),(b)))
 
+/* Should start using these generic callers instead of the name-specific ones above. */
+#define VCALL(obj, func)  ((*(obj))->func((obj), EXTRACT_VCALL_ARGS
+#define VCALL0(obj, func)  ((*(obj))->func((obj) EXTRACT_VCALL_ARGS
+
 
 typedef struct {
     /* engine interfaces */
@@ -97,6 +101,7 @@ typedef struct {
 
     void *buffer;
     ALuint bufferSize;
+    ALuint curBuffer;
 
     ALuint frameSize;
 } osl_data;
@@ -152,9 +157,13 @@ static const char *res_str(SLresult result)
         case SL_RESULT_UNKNOWN_ERROR: return "Unknown error";
         case SL_RESULT_OPERATION_ABORTED: return "Operation aborted";
         case SL_RESULT_CONTROL_LOST: return "Control lost";
-#ifdef HAVE_OPENSL_1_1
+#ifdef SL_RESULT_READONLY
         case SL_RESULT_READONLY: return "ReadOnly";
+#endif
+#ifdef SL_RESULT_ENGINEOPTION_UNSUPPORTED
         case SL_RESULT_ENGINEOPTION_UNSUPPORTED: return "Engine option unsupported";
+#endif
+#ifdef SL_RESULT_SOURCE_SINK_INCOMPATIBLE
         case SL_RESULT_SOURCE_SINK_INCOMPATIBLE: return "Source/Sink incompatible";
 #endif
     }
@@ -171,12 +180,16 @@ static void opensl_callback(SLAndroidSimpleBufferQueueItf bq, void *context)
 {
     ALCdevice *Device = context;
     osl_data *data = Device->ExtraData;
+    ALvoid *buf;
     SLresult result;
 
-    aluMixData(Device, data->buffer, data->bufferSize/data->frameSize);
+    buf = (ALbyte*)data->buffer + data->curBuffer*data->bufferSize;
+    aluMixData(Device, buf, data->bufferSize/data->frameSize);
 
-    result = (*bq)->Enqueue(bq, data->buffer, data->bufferSize);
+    result = (*bq)->Enqueue(bq, buf, data->bufferSize);
     PRINTERR(result, "bq->Enqueue");
+
+    data->curBuffer = (data->curBuffer+1) % Device->NumUpdates;
 }
 
 
@@ -233,7 +246,7 @@ static ALCenum opensl_open_playback(ALCdevice *Device, const ALCchar *deviceName
         return ALC_INVALID_VALUE;
     }
 
-    Device->szDeviceName = strdup(deviceName);
+    Device->DeviceName = strdup(deviceName);
     Device->ExtraData = data;
 
     return ALC_NO_ERROR;
@@ -244,6 +257,10 @@ static void opensl_close_playback(ALCdevice *Device)
 {
     osl_data *data = Device->ExtraData;
 
+    if(data->bufferQueueObject != NULL)
+        SLObjectItf_Destroy(data->bufferQueueObject);
+    data->bufferQueueObject = NULL;
+
     SLObjectItf_Destroy(data->outputMix);
     data->outputMix = NULL;
 
@@ -259,16 +276,13 @@ static ALCboolean opensl_reset_playback(ALCdevice *Device)
 {
     osl_data *data = Device->ExtraData;
     SLDataLocator_AndroidSimpleBufferQueue loc_bufq;
-    SLAndroidSimpleBufferQueueItf bufferQueue;
     SLDataLocator_OutputMix loc_outmix;
     SLDataFormat_PCM format_pcm;
     SLDataSource audioSrc;
     SLDataSink audioSnk;
-    SLPlayItf player;
     SLInterfaceID id;
     SLboolean req;
     SLresult result;
-    ALuint i;
 
 
     Device->UpdateSize = (ALuint64)Device->UpdateSize * 44100 / Device->Frequency;
@@ -294,13 +308,8 @@ static ALCboolean opensl_reset_playback(ALCdevice *Device)
     format_pcm.bitsPerSample = BytesFromDevFmt(Device->FmtType) * 8;
     format_pcm.containerSize = format_pcm.bitsPerSample;
     format_pcm.channelMask = GetChannelMask(Device->FmtChans);
-#ifdef HAVE_OPENSL_1_1
-    format_pcm.endianness = SL_BYTEORDER_NATIVE;
-#elif _BYTE_ORDER == _BIG_ENDIAN
-    format_pcm.endianness = SL_BYTEORDER_BIGENDIAN;
-#else
-    format_pcm.endianness = SL_BYTEORDER_LITTLEENDIAN;
-#endif
+    format_pcm.endianness = IS_LITTLE_ENDIAN ? SL_BYTEORDER_LITTLEENDIAN :
+                                               SL_BYTEORDER_BIGENDIAN;
 
     audioSrc.pLocator = &loc_bufq;
     audioSrc.pFormat = &format_pcm;
@@ -311,6 +320,10 @@ static ALCboolean opensl_reset_playback(ALCdevice *Device)
     audioSnk.pFormat = NULL;
 
 
+    if(data->bufferQueueObject != NULL)
+        SLObjectItf_Destroy(data->bufferQueueObject);
+    data->bufferQueueObject = NULL;
+
     result = SLEngineItf_CreateAudioPlayer(data->engine, &data->bufferQueueObject, &audioSrc, &audioSnk, 1, &id, &req);
     PRINTERR(result, "engine->CreateAudioPlayer");
     if(SL_RESULT_SUCCESS == result)
@@ -318,11 +331,29 @@ static ALCboolean opensl_reset_playback(ALCdevice *Device)
         result = SLObjectItf_Realize(data->bufferQueueObject, SL_BOOLEAN_FALSE);
         PRINTERR(result, "bufferQueue->Realize");
     }
-    if(SL_RESULT_SUCCESS == result)
+
+    if(SL_RESULT_SUCCESS != result)
     {
-        result = SLObjectItf_GetInterface(data->bufferQueueObject, SL_IID_BUFFERQUEUE, &bufferQueue);
-        PRINTERR(result, "bufferQueue->GetInterface");
+        if(data->bufferQueueObject != NULL)
+            SLObjectItf_Destroy(data->bufferQueueObject);
+        data->bufferQueueObject = NULL;
+
+        return ALC_FALSE;
     }
+
+    return ALC_TRUE;
+}
+
+static ALCboolean opensl_start_playback(ALCdevice *Device)
+{
+    osl_data *data = Device->ExtraData;
+    SLAndroidSimpleBufferQueueItf bufferQueue;
+    SLPlayItf player;
+    SLresult result;
+    ALuint i;
+
+    result = SLObjectItf_GetInterface(data->bufferQueueObject, SL_IID_BUFFERQUEUE, &bufferQueue);
+    PRINTERR(result, "bufferQueue->GetInterface");
     if(SL_RESULT_SUCCESS == result)
     {
         result = (*bufferQueue)->RegisterCallback(bufferQueue, opensl_callback, Device);
@@ -332,7 +363,7 @@ static ALCboolean opensl_reset_playback(ALCdevice *Device)
     {
         data->frameSize = FrameSizeFromDevFmt(Device->FmtChans, Device->FmtType);
         data->bufferSize = Device->UpdateSize * data->frameSize;
-        data->buffer = calloc(1, data->bufferSize);
+        data->buffer = calloc(Device->NumUpdates, data->bufferSize);
         if(!data->buffer)
         {
             result = SL_RESULT_MEMORY_FAILURE;
@@ -344,10 +375,12 @@ static ALCboolean opensl_reset_playback(ALCdevice *Device)
     {
         if(SL_RESULT_SUCCESS == result)
         {
-            result = (*bufferQueue)->Enqueue(bufferQueue, data->buffer, data->bufferSize);
+            ALvoid *buf = (ALbyte*)data->buffer + i*data->bufferSize;
+            result = (*bufferQueue)->Enqueue(bufferQueue, buf, data->bufferSize);
             PRINTERR(result, "bufferQueue->Enqueue");
         }
     }
+    data->curBuffer = 0;
     if(SL_RESULT_SUCCESS == result)
     {
         result = SLObjectItf_GetInterface(data->bufferQueueObject, SL_IID_PLAY, &player);
@@ -379,10 +412,25 @@ static ALCboolean opensl_reset_playback(ALCdevice *Device)
 static void opensl_stop_playback(ALCdevice *Device)
 {
     osl_data *data = Device->ExtraData;
+    SLPlayItf player;
+    SLAndroidSimpleBufferQueueItf bufferQueue;
+    SLresult result;
 
-    if(data->bufferQueueObject != NULL)
-        SLObjectItf_Destroy(data->bufferQueueObject);
-    data->bufferQueueObject = NULL;
+    result = VCALL(data->bufferQueueObject,GetInterface)(SL_IID_PLAY, &player);
+    PRINTERR(result, "bufferQueue->GetInterface");
+    if(SL_RESULT_SUCCESS == result)
+    {
+        result = VCALL(player,SetPlayState)(SL_PLAYSTATE_STOPPED);
+        PRINTERR(result, "player->SetPlayState");
+    }
+
+    result = VCALL(data->bufferQueueObject,GetInterface)(SL_IID_BUFFERQUEUE, &bufferQueue);
+    PRINTERR(result, "bufferQueue->GetInterface");
+    if(SL_RESULT_SUCCESS == result)
+    {
+        result = VCALL0(bufferQueue,Clear)();
+        PRINTERR(result, "bufferQueue->Clear");
+    }
 
     free(data->buffer);
     data->buffer = NULL;
@@ -394,13 +442,15 @@ static const BackendFuncs opensl_funcs = {
     opensl_open_playback,
     opensl_close_playback,
     opensl_reset_playback,
+    opensl_start_playback,
     opensl_stop_playback,
     NULL,
     NULL,
     NULL,
     NULL,
     NULL,
-    NULL
+    NULL,
+    ALCdevice_GetLatencyDefault
 };
 
 
@@ -418,11 +468,8 @@ void alc_opensl_probe(enum DevProbe type)
 {
     switch(type)
     {
-        case DEVICE_PROBE:
-            AppendDeviceList(opensl_device);
-            break;
         case ALL_DEVICE_PROBE:
-            AppendAllDeviceList(opensl_device);
+            AppendAllDevicesList(opensl_device);
             break;
         case CAPTURE_DEVICE_PROBE:
             break;

+ 304 - 201
jni/openal-soft-android/Alc/backends/oss.c

@@ -30,9 +30,13 @@
 #include <unistd.h>
 #include <errno.h>
 #include <math.h>
+
 #include "alMain.h"
-#include "AL/al.h"
-#include "AL/alc.h"
+#include "alu.h"
+#include "threads.h"
+#include "compat.h"
+
+#include "backends/base.h"
 
 #include <sys/soundcard.h>
 
@@ -47,20 +51,11 @@
 #define SOUND_MIXER_WRITE MIXER_WRITE
 #endif
 
-static const ALCchar oss_device[] = "OSS Default";
-
-typedef struct {
-    int fd;
-    volatile int killNow;
-    ALvoid *thread;
-
-    ALubyte *mix_data;
-    int data_size;
 
-    RingBuffer *ring;
-    int doCapture;
-} oss_data;
+static const ALCchar oss_device[] = "OSS Default";
 
+static const char *oss_driver = "/dev/dsp";
+static const char *oss_capture = "/dev/dsp";
 
 static int log2i(ALCuint x)
 {
@@ -74,32 +69,65 @@ static int log2i(ALCuint x)
 }
 
 
-static ALuint OSSProc(ALvoid *ptr)
+typedef struct ALCplaybackOSS {
+    DERIVE_FROM_TYPE(ALCbackend);
+
+    int fd;
+
+    ALubyte *mix_data;
+    int data_size;
+
+    volatile int killNow;
+    althread_t thread;
+} ALCplaybackOSS;
+
+static ALuint ALCplaybackOSS_mixerProc(ALvoid *ptr);
+
+static void ALCplaybackOSS_Construct(ALCplaybackOSS *self, ALCdevice *device);
+static DECLARE_FORWARD(ALCplaybackOSS, ALCbackend, void, Destruct)
+static ALCenum ALCplaybackOSS_open(ALCplaybackOSS *self, const ALCchar *name);
+static void ALCplaybackOSS_close(ALCplaybackOSS *self);
+static ALCboolean ALCplaybackOSS_reset(ALCplaybackOSS *self);
+static ALCboolean ALCplaybackOSS_start(ALCplaybackOSS *self);
+static void ALCplaybackOSS_stop(ALCplaybackOSS *self);
+static DECLARE_FORWARD2(ALCplaybackOSS, ALCbackend, ALCenum, captureSamples, ALCvoid*, ALCuint)
+static DECLARE_FORWARD(ALCplaybackOSS, ALCbackend, ALCuint, availableSamples)
+static DECLARE_FORWARD(ALCplaybackOSS, ALCbackend, ALint64, getLatency)
+static DECLARE_FORWARD(ALCplaybackOSS, ALCbackend, void, lock)
+static DECLARE_FORWARD(ALCplaybackOSS, ALCbackend, void, unlock)
+static void ALCplaybackOSS_Delete(ALCplaybackOSS *self);
+DEFINE_ALCBACKEND_VTABLE(ALCplaybackOSS);
+
+
+static ALuint ALCplaybackOSS_mixerProc(ALvoid *ptr)
 {
-    ALCdevice *pDevice = (ALCdevice*)ptr;
-    oss_data *data = (oss_data*)pDevice->ExtraData;
+    ALCplaybackOSS *self = (ALCplaybackOSS*)ptr;
+    ALCdevice *device = STATIC_CAST(ALCbackend, self)->mDevice;
     ALint frameSize;
     ssize_t wrote;
 
     SetRTPriority();
+    SetThreadName(MIXER_THREAD_NAME);
 
-    frameSize = FrameSizeFromDevFmt(pDevice->FmtChans, pDevice->FmtType);
+    frameSize = FrameSizeFromDevFmt(device->FmtChans, device->FmtType);
 
-    while(!data->killNow && pDevice->Connected)
+    while(!self->killNow && device->Connected)
     {
-        ALint len = data->data_size;
-        ALubyte *WritePtr = data->mix_data;
+        ALint len = self->data_size;
+        ALubyte *WritePtr = self->mix_data;
 
-        aluMixData(pDevice, WritePtr, len/frameSize);
-        while(len > 0 && !data->killNow)
+        aluMixData(device, WritePtr, len/frameSize);
+        while(len > 0 && !self->killNow)
         {
-            wrote = write(data->fd, WritePtr, len);
+            wrote = write(self->fd, WritePtr, len);
             if(wrote < 0)
             {
                 if(errno != EAGAIN && errno != EWOULDBLOCK && errno != EINTR)
                 {
                     ERR("write failed: %s\n", strerror(errno));
-                    aluHandleDisconnect(pDevice);
+                    ALCplaybackOSS_lock(self);
+                    aluHandleDisconnect(device);
+                    ALCplaybackOSS_unlock(self);
                     break;
                 }
 
@@ -115,78 +143,45 @@ static ALuint OSSProc(ALvoid *ptr)
     return 0;
 }
 
-static ALuint OSSCaptureProc(ALvoid *ptr)
-{
-    ALCdevice *pDevice = (ALCdevice*)ptr;
-    oss_data *data = (oss_data*)pDevice->ExtraData;
-    int frameSize;
-    int amt;
-
-    SetRTPriority();
-
-    frameSize = FrameSizeFromDevFmt(pDevice->FmtChans, pDevice->FmtType);
 
-    while(!data->killNow)
-    {
-        amt = read(data->fd, data->mix_data, data->data_size);
-        if(amt < 0)
-        {
-            ERR("read failed: %s\n", strerror(errno));
-            aluHandleDisconnect(pDevice);
-            break;
-        }
-        if(amt == 0)
-        {
-            Sleep(1);
-            continue;
-        }
-        if(data->doCapture)
-            WriteRingBuffer(data->ring, data->mix_data, amt/frameSize);
-    }
-
-    return 0;
+static void ALCplaybackOSS_Construct(ALCplaybackOSS *self, ALCdevice *device)
+{
+    ALCbackend_Construct(STATIC_CAST(ALCbackend, self), device);
+    SET_VTABLE2(ALCplaybackOSS, ALCbackend, self);
 }
 
-static ALCenum oss_open_playback(ALCdevice *device, const ALCchar *deviceName)
+static ALCenum ALCplaybackOSS_open(ALCplaybackOSS *self, const ALCchar *name)
 {
-    char driver[64];
-    oss_data *data;
-
-    strncpy(driver, GetConfigValue("oss", "device", "/dev/dsp"), sizeof(driver)-1);
-    driver[sizeof(driver)-1] = 0;
-    if(!deviceName)
-        deviceName = oss_device;
-    else if(strcmp(deviceName, oss_device) != 0)
+    ALCdevice *device = STATIC_CAST(ALCbackend, self)->mDevice;
+
+    if(!name)
+        name = oss_device;
+    else if(strcmp(name, oss_device) != 0)
         return ALC_INVALID_VALUE;
 
-    data = (oss_data*)calloc(1, sizeof(oss_data));
-    data->killNow = 0;
+    self->killNow = 0;
 
-    data->fd = open(driver, O_WRONLY);
-    if(data->fd == -1)
+    self->fd = open(oss_driver, O_WRONLY);
+    if(self->fd == -1)
     {
-        free(data);
-        ERR("Could not open %s: %s\n", driver, strerror(errno));
+        ERR("Could not open %s: %s\n", oss_driver, strerror(errno));
         return ALC_INVALID_VALUE;
     }
 
-    device->szDeviceName = strdup(deviceName);
-    device->ExtraData = data;
+    device->DeviceName = strdup(name);
+
     return ALC_NO_ERROR;
 }
 
-static void oss_close_playback(ALCdevice *device)
+static void ALCplaybackOSS_close(ALCplaybackOSS *self)
 {
-    oss_data *data = (oss_data*)device->ExtraData;
-
-    close(data->fd);
-    free(data);
-    device->ExtraData = NULL;
+    close(self->fd);
+    self->fd = -1;
 }
 
-static ALCboolean oss_reset_playback(ALCdevice *device)
+static ALCboolean ALCplaybackOSS_reset(ALCplaybackOSS *self)
 {
-    oss_data *data = (oss_data*)device->ExtraData;
+    ALCdevice *device = STATIC_CAST(ALCbackend, self)->mDevice;
     int numFragmentsLogSize;
     int log2FragmentSize;
     unsigned int periods;
@@ -206,6 +201,8 @@ static ALCboolean oss_reset_playback(ALCdevice *device)
             ossFormat = AFMT_U8;
             break;
         case DevFmtUShort:
+        case DevFmtInt:
+        case DevFmtUInt:
         case DevFmtFloat:
             device->FmtType = DevFmtShort;
             /* fall-through */
@@ -235,11 +232,11 @@ static ALCboolean oss_reset_playback(ALCdevice *device)
 }
     /* Don't fail if SETFRAGMENT fails. We can handle just about anything
      * that's reported back via GETOSPACE */
-    ioctl(data->fd, SNDCTL_DSP_SETFRAGMENT, &numFragmentsLogSize);
-    CHECKERR(ioctl(data->fd, SNDCTL_DSP_SETFMT, &ossFormat));
-    CHECKERR(ioctl(data->fd, SNDCTL_DSP_CHANNELS, &numChannels));
-    CHECKERR(ioctl(data->fd, SNDCTL_DSP_SPEED, &ossSpeed));
-    CHECKERR(ioctl(data->fd, SNDCTL_DSP_GETOSPACE, &info));
+    ioctl(self->fd, SNDCTL_DSP_SETFRAGMENT, &numFragmentsLogSize);
+    CHECKERR(ioctl(self->fd, SNDCTL_DSP_SETFMT, &ossFormat));
+    CHECKERR(ioctl(self->fd, SNDCTL_DSP_CHANNELS, &numChannels));
+    CHECKERR(ioctl(self->fd, SNDCTL_DSP_SPEED, &ossSpeed));
+    CHECKERR(ioctl(self->fd, SNDCTL_DSP_GETOSPACE, &info));
     if(0)
     {
     err:
@@ -262,82 +259,152 @@ static ALCboolean oss_reset_playback(ALCdevice *device)
         return ALC_FALSE;
     }
 
-    if(device->Frequency != (ALuint)ossSpeed)
-    {
-        if((device->Flags&DEVICE_FREQUENCY_REQUEST))
-            ERR("Failed to set %dhz, got %dhz instead\n", device->Frequency, ossSpeed);
-        device->Flags &= ~DEVICE_FREQUENCY_REQUEST;
-        device->Frequency = ossSpeed;
-    }
+    device->Frequency = ossSpeed;
     device->UpdateSize = info.fragsize / frameSize;
     device->NumUpdates = info.fragments + 1;
 
-    data->data_size = device->UpdateSize * frameSize;
-    data->mix_data = calloc(1, data->data_size);
-
     SetDefaultChannelOrder(device);
 
-    data->thread = StartThread(OSSProc, device);
-    if(data->thread == NULL)
+    return ALC_TRUE;
+}
+
+static ALCboolean ALCplaybackOSS_start(ALCplaybackOSS *self)
+{
+    ALCdevice *device = STATIC_CAST(ALCbackend, self)->mDevice;
+
+    self->data_size = device->UpdateSize * FrameSizeFromDevFmt(device->FmtChans, device->FmtType);
+    self->mix_data = calloc(1, self->data_size);
+
+    if(!StartThread(&self->thread, ALCplaybackOSS_mixerProc, self))
     {
-        free(data->mix_data);
-        data->mix_data = NULL;
+        free(self->mix_data);
+        self->mix_data = NULL;
         return ALC_FALSE;
     }
 
     return ALC_TRUE;
 }
 
-static void oss_stop_playback(ALCdevice *device)
+static void ALCplaybackOSS_stop(ALCplaybackOSS *self)
 {
-    oss_data *data = (oss_data*)device->ExtraData;
-
-    if(!data->thread)
+    if(!self->thread)
         return;
 
-    data->killNow = 1;
-    StopThread(data->thread);
-    data->thread = NULL;
+    self->killNow = 1;
+    StopThread(self->thread);
+    self->thread = NULL;
 
-    data->killNow = 0;
-    if(ioctl(data->fd, SNDCTL_DSP_RESET) != 0)
+    self->killNow = 0;
+    if(ioctl(self->fd, SNDCTL_DSP_RESET) != 0)
         ERR("Error resetting device: %s\n", strerror(errno));
 
-    free(data->mix_data);
-    data->mix_data = NULL;
+    free(self->mix_data);
+    self->mix_data = NULL;
+}
+
+static void ALCplaybackOSS_Delete(ALCplaybackOSS *self)
+{
+    free(self);
+}
+
+
+typedef struct ALCcaptureOSS {
+    DERIVE_FROM_TYPE(ALCbackend);
+
+    int fd;
+
+    ALubyte *read_data;
+    int data_size;
+
+    RingBuffer *ring;
+    int doCapture;
+
+    volatile int killNow;
+    althread_t thread;
+} ALCcaptureOSS;
+
+static ALuint ALCcaptureOSS_recordProc(ALvoid *ptr);
+
+static void ALCcaptureOSS_Construct(ALCcaptureOSS *self, ALCdevice *device);
+static DECLARE_FORWARD(ALCcaptureOSS, ALCbackend, void, Destruct)
+static ALCenum ALCcaptureOSS_open(ALCcaptureOSS *self, const ALCchar *name);
+static void ALCcaptureOSS_close(ALCcaptureOSS *self);
+static DECLARE_FORWARD(ALCcaptureOSS, ALCbackend, ALCboolean, reset)
+static ALCboolean ALCcaptureOSS_start(ALCcaptureOSS *self);
+static void ALCcaptureOSS_stop(ALCcaptureOSS *self);
+static ALCenum ALCcaptureOSS_captureSamples(ALCcaptureOSS *self, ALCvoid *buffer, ALCuint samples);
+static ALCuint ALCcaptureOSS_availableSamples(ALCcaptureOSS *self);
+static DECLARE_FORWARD(ALCcaptureOSS, ALCbackend, ALint64, getLatency)
+static DECLARE_FORWARD(ALCcaptureOSS, ALCbackend, void, lock)
+static DECLARE_FORWARD(ALCcaptureOSS, ALCbackend, void, unlock)
+static void ALCcaptureOSS_Delete(ALCcaptureOSS *self);
+DEFINE_ALCBACKEND_VTABLE(ALCcaptureOSS);
+
+
+static ALuint ALCcaptureOSS_recordProc(ALvoid *ptr)
+{
+    ALCcaptureOSS *self = (ALCcaptureOSS*)ptr;
+    ALCdevice *device = STATIC_CAST(ALCbackend, self)->mDevice;
+    int frameSize;
+    int amt;
+
+    SetRTPriority();
+    SetThreadName("alsoft-record");
+
+    frameSize = FrameSizeFromDevFmt(device->FmtChans, device->FmtType);
+
+    while(!self->killNow)
+    {
+        amt = read(self->fd, self->read_data, self->data_size);
+        if(amt < 0)
+        {
+            ERR("read failed: %s\n", strerror(errno));
+            ALCcaptureOSS_lock(self);
+            aluHandleDisconnect(device);
+            ALCcaptureOSS_unlock(self);
+            break;
+        }
+        if(amt == 0)
+        {
+            Sleep(1);
+            continue;
+        }
+        if(self->doCapture)
+            WriteRingBuffer(self->ring, self->read_data, amt/frameSize);
+    }
+
+    return 0;
 }
 
 
-static ALCenum oss_open_capture(ALCdevice *device, const ALCchar *deviceName)
+static void ALCcaptureOSS_Construct(ALCcaptureOSS *self, ALCdevice *device)
+{
+    ALCbackend_Construct(STATIC_CAST(ALCbackend, self), device);
+    SET_VTABLE2(ALCcaptureOSS, ALCbackend, self);
+}
+
+static ALCenum ALCcaptureOSS_open(ALCcaptureOSS *self, const ALCchar *name)
 {
+    ALCdevice *device = STATIC_CAST(ALCbackend, self)->mDevice;
     int numFragmentsLogSize;
     int log2FragmentSize;
     unsigned int periods;
     audio_buf_info info;
     ALuint frameSize;
     int numChannels;
-    char driver[64];
-    oss_data *data;
     int ossFormat;
     int ossSpeed;
     char *err;
 
-    strncpy(driver, GetConfigValue("oss", "capture", "/dev/dsp"), sizeof(driver)-1);
-    driver[sizeof(driver)-1] = 0;
-
-    if(!deviceName)
-        deviceName = oss_device;
-    else if(strcmp(deviceName, oss_device) != 0)
+    if(!name)
+        name = oss_device;
+    else if(strcmp(name, oss_device) != 0)
         return ALC_INVALID_VALUE;
 
-    data = (oss_data*)calloc(1, sizeof(oss_data));
-    data->killNow = 0;
-
-    data->fd = open(driver, O_RDONLY);
-    if(data->fd == -1)
+    self->fd = open(oss_capture, O_RDONLY);
+    if(self->fd == -1)
     {
-        free(data);
-        ERR("Could not open %s: %s\n", driver, strerror(errno));
+        ERR("Could not open %s: %s\n", oss_capture, strerror(errno));
         return ALC_INVALID_VALUE;
     }
 
@@ -353,9 +420,10 @@ static ALCenum oss_open_capture(ALCdevice *device, const ALCchar *deviceName)
             ossFormat = AFMT_S16_NE;
             break;
         case DevFmtUShort:
+        case DevFmtInt:
+        case DevFmtUInt:
         case DevFmtFloat:
-            free(data);
-            ERR("%s capture samples not supported on OSS\n", DevFmtTypeString(device->FmtType));
+            ERR("%s capture samples not supported\n", DevFmtTypeString(device->FmtType));
             return ALC_INVALID_VALUE;
     }
 
@@ -375,17 +443,17 @@ static ALCenum oss_open_capture(ALCdevice *device, const ALCchar *deviceName)
     err = #func;                                                              \
     goto err;                                                                 \
 }
-    CHECKERR(ioctl(data->fd, SNDCTL_DSP_SETFRAGMENT, &numFragmentsLogSize));
-    CHECKERR(ioctl(data->fd, SNDCTL_DSP_SETFMT, &ossFormat));
-    CHECKERR(ioctl(data->fd, SNDCTL_DSP_CHANNELS, &numChannels));
-    CHECKERR(ioctl(data->fd, SNDCTL_DSP_SPEED, &ossSpeed));
-    CHECKERR(ioctl(data->fd, SNDCTL_DSP_GETISPACE, &info));
+    CHECKERR(ioctl(self->fd, SNDCTL_DSP_SETFRAGMENT, &numFragmentsLogSize));
+    CHECKERR(ioctl(self->fd, SNDCTL_DSP_SETFMT, &ossFormat));
+    CHECKERR(ioctl(self->fd, SNDCTL_DSP_CHANNELS, &numChannels));
+    CHECKERR(ioctl(self->fd, SNDCTL_DSP_SPEED, &ossSpeed));
+    CHECKERR(ioctl(self->fd, SNDCTL_DSP_GETISPACE, &info));
     if(0)
     {
     err:
         ERR("%s failed: %s\n", err, strerror(errno));
-        close(data->fd);
-        free(data);
+        close(self->fd);
+        self->fd = -1;
         return ALC_INVALID_VALUE;
     }
 #undef CHECKERR
@@ -393,8 +461,8 @@ static ALCenum oss_open_capture(ALCdevice *device, const ALCchar *deviceName)
     if((int)ChannelsFromDevFmt(device->FmtChans) != numChannels)
     {
         ERR("Failed to set %s, got %d channels instead\n", DevFmtChannelsString(device->FmtChans), numChannels);
-        close(data->fd);
-        free(data);
+        close(self->fd);
+        self->fd = -1;
         return ALC_INVALID_VALUE;
     }
 
@@ -403,122 +471,129 @@ static ALCenum oss_open_capture(ALCdevice *device, const ALCchar *deviceName)
          (ossFormat == AFMT_S16_NE && device->FmtType == DevFmtShort)))
     {
         ERR("Failed to set %s samples, got OSS format %#x\n", DevFmtTypeString(device->FmtType), ossFormat);
-        close(data->fd);
-        free(data);
+        close(self->fd);
+        self->fd = -1;
         return ALC_INVALID_VALUE;
     }
 
-    data->ring = CreateRingBuffer(frameSize, device->UpdateSize * device->NumUpdates);
-    if(!data->ring)
+    self->ring = CreateRingBuffer(frameSize, device->UpdateSize * device->NumUpdates);
+    if(!self->ring)
     {
         ERR("Ring buffer create failed\n");
-        close(data->fd);
-        free(data);
+        close(self->fd);
+        self->fd = -1;
         return ALC_OUT_OF_MEMORY;
     }
 
-    data->data_size = info.fragsize;
-    data->mix_data = calloc(1, data->data_size);
+    self->data_size = info.fragsize;
+    self->read_data = calloc(1, self->data_size);
 
-    device->ExtraData = data;
-    data->thread = StartThread(OSSCaptureProc, device);
-    if(data->thread == NULL)
+    if(!StartThread(&self->thread, ALCcaptureOSS_recordProc, self))
     {
         device->ExtraData = NULL;
-        free(data->mix_data);
-        free(data);
+        close(self->fd);
+        self->fd = -1;
         return ALC_OUT_OF_MEMORY;
     }
 
-    device->szDeviceName = strdup(deviceName);
+    device->DeviceName = strdup(name);
+
     return ALC_NO_ERROR;
 }
 
-static void oss_close_capture(ALCdevice *device)
+static void ALCcaptureOSS_close(ALCcaptureOSS *self)
 {
-    oss_data *data = (oss_data*)device->ExtraData;
-    data->killNow = 1;
-    StopThread(data->thread);
+    self->killNow = 1;
+    StopThread(self->thread);
+    self->killNow = 0;
 
-    close(data->fd);
+    close(self->fd);
+    self->fd = -1;
 
-    DestroyRingBuffer(data->ring);
+    DestroyRingBuffer(self->ring);
+    self->ring = NULL;
 
-    free(data->mix_data);
-    free(data);
-    device->ExtraData = NULL;
+    free(self->read_data);
+    self->read_data = NULL;
 }
 
-static void oss_start_capture(ALCdevice *pDevice)
+static ALCboolean ALCcaptureOSS_start(ALCcaptureOSS *self)
 {
-    oss_data *data = (oss_data*)pDevice->ExtraData;
-    data->doCapture = 1;
+    self->doCapture = 1;
+    return ALC_TRUE;
 }
 
-static void oss_stop_capture(ALCdevice *pDevice)
+static void ALCcaptureOSS_stop(ALCcaptureOSS *self)
 {
-    oss_data *data = (oss_data*)pDevice->ExtraData;
-    data->doCapture = 0;
+    self->doCapture = 0;
 }
 
-static ALCenum oss_capture_samples(ALCdevice *pDevice, ALCvoid *pBuffer, ALCuint lSamples)
+static ALCenum ALCcaptureOSS_captureSamples(ALCcaptureOSS *self, ALCvoid *buffer, ALCuint samples)
 {
-    oss_data *data = (oss_data*)pDevice->ExtraData;
-    ReadRingBuffer(data->ring, pBuffer, lSamples);
+    ReadRingBuffer(self->ring, buffer, samples);
     return ALC_NO_ERROR;
 }
 
-static ALCuint oss_available_samples(ALCdevice *pDevice)
+static ALCuint ALCcaptureOSS_availableSamples(ALCcaptureOSS *self)
 {
-    oss_data *data = (oss_data*)pDevice->ExtraData;
-    return RingBufferSize(data->ring);
+    return RingBufferSize(self->ring);
 }
 
+void ALCcaptureOSS_Delete(ALCcaptureOSS *self)
+{
+    free(self);
+}
 
-static const BackendFuncs oss_funcs = {
-    oss_open_playback,
-    oss_close_playback,
-    oss_reset_playback,
-    oss_stop_playback,
-    oss_open_capture,
-    oss_close_capture,
-    oss_start_capture,
-    oss_stop_capture,
-    oss_capture_samples,
-    oss_available_samples
-};
-
-ALCboolean alc_oss_init(BackendFuncs *func_list)
+
+
+typedef struct ALCossBackendFactory {
+    DERIVE_FROM_TYPE(ALCbackendFactory);
+} ALCossBackendFactory;
+#define ALCOSSBACKENDFACTORY_INITIALIZER { { GET_VTABLE2(ALCossBackendFactory, ALCbackendFactory) } }
+
+ALCbackendFactory *ALCossBackendFactory_getFactory(void);
+
+static ALCboolean ALCossBackendFactory_init(ALCossBackendFactory *self);
+static DECLARE_FORWARD(ALCossBackendFactory, ALCbackendFactory, void, deinit)
+static ALCboolean ALCossBackendFactory_querySupport(ALCossBackendFactory *self, ALCbackend_Type type);
+static void ALCossBackendFactory_probe(ALCossBackendFactory *self, enum DevProbe type);
+static ALCbackend* ALCossBackendFactory_createBackend(ALCossBackendFactory *self, ALCdevice *device, ALCbackend_Type type);
+DEFINE_ALCBACKENDFACTORY_VTABLE(ALCossBackendFactory);
+
+
+ALCbackendFactory *ALCossBackendFactory_getFactory(void)
+{
+    static ALCossBackendFactory factory = ALCOSSBACKENDFACTORY_INITIALIZER;
+    return STATIC_CAST(ALCbackendFactory, &factory);
+}
+
+
+ALCboolean ALCossBackendFactory_init(ALCossBackendFactory* UNUSED(self))
 {
-    *func_list = oss_funcs;
+    ConfigValueStr("oss", "device", &oss_driver);
+    ConfigValueStr("oss", "capture", &oss_capture);
+
     return ALC_TRUE;
 }
 
-void alc_oss_deinit(void)
+ALCboolean ALCossBackendFactory_querySupport(ALCossBackendFactory* UNUSED(self), ALCbackend_Type type)
 {
+    if(type == ALCbackend_Playback || type == ALCbackend_Capture)
+        return ALC_TRUE;
+    return ALC_FALSE;
 }
 
-void alc_oss_probe(enum DevProbe type)
+void ALCossBackendFactory_probe(ALCossBackendFactory* UNUSED(self), enum DevProbe type)
 {
     switch(type)
     {
-        case DEVICE_PROBE:
-        {
-#ifdef HAVE_STAT
-            struct stat buf;
-            if(stat(GetConfigValue("oss", "device", "/dev/dsp"), &buf) == 0)
-#endif
-                AppendDeviceList(oss_device);
-        }
-        break;
-
         case ALL_DEVICE_PROBE:
         {
 #ifdef HAVE_STAT
             struct stat buf;
-            if(stat(GetConfigValue("oss", "device", "/dev/dsp"), &buf) == 0)
+            if(stat(oss_driver, &buf) == 0)
 #endif
-                AppendAllDeviceList(oss_device);
+                AppendAllDevicesList(oss_device);
         }
         break;
 
@@ -526,10 +601,38 @@ void alc_oss_probe(enum DevProbe type)
         {
 #ifdef HAVE_STAT
             struct stat buf;
-            if(stat(GetConfigValue("oss", "capture", "/dev/dsp"), &buf) == 0)
+            if(stat(oss_capture, &buf) == 0)
 #endif
                 AppendCaptureDeviceList(oss_device);
         }
         break;
     }
 }
+
+ALCbackend* ALCossBackendFactory_createBackend(ALCossBackendFactory* UNUSED(self), ALCdevice *device, ALCbackend_Type type)
+{
+    if(type == ALCbackend_Playback)
+    {
+        ALCplaybackOSS *backend;
+
+        backend = calloc(1, sizeof(*backend));
+        if(!backend) return NULL;
+
+        ALCplaybackOSS_Construct(backend, device);
+
+        return STATIC_CAST(ALCbackend, backend);
+    }
+    if(type == ALCbackend_Capture)
+    {
+        ALCcaptureOSS *backend;
+
+        backend = calloc(1, sizeof(*backend));
+        if(!backend) return NULL;
+
+        ALCcaptureOSS_Construct(backend, device);
+
+        return STATIC_CAST(ALCbackend, backend);
+    }
+
+    return NULL;
+}

+ 112 - 87
jni/openal-soft-android/Alc/backends/portaudio.c

@@ -23,9 +23,10 @@
 #include <stdio.h>
 #include <stdlib.h>
 #include <string.h>
+
 #include "alMain.h"
-#include "AL/al.h"
-#include "AL/alc.h"
+#include "alu.h"
+#include "compat.h"
 
 #include <portaudio.h>
 
@@ -33,9 +34,9 @@
 static const ALCchar pa_device[] = "PortAudio Default";
 
 
-static void *pa_handle;
 #ifdef HAVE_DYNLOAD
-#define MAKE_FUNC(x) static typeof(x) * p##x
+static void *pa_handle;
+#define MAKE_FUNC(x) static __typeof(x) * p##x
 MAKE_FUNC(Pa_Initialize);
 MAKE_FUNC(Pa_Terminate);
 MAKE_FUNC(Pa_GetErrorText);
@@ -60,11 +61,11 @@ MAKE_FUNC(Pa_GetStreamInfo);
 
 static ALCboolean pa_load(void)
 {
-    if(!pa_handle)
-    {
-        PaError err;
+    PaError err;
 
 #ifdef HAVE_DYNLOAD
+    if(!pa_handle)
+    {
 #ifdef _WIN32
 # define PALIB "portaudio.dll"
 #elif defined(__APPLE__) && defined(__MACH__)
@@ -98,9 +99,6 @@ static ALCboolean pa_load(void)
         LOAD_FUNC(Pa_GetDefaultOutputDevice);
         LOAD_FUNC(Pa_GetStreamInfo);
 #undef LOAD_FUNC
-#else
-        pa_handle = (void*)0xDEADBEEF;
-#endif
 
         if((err=Pa_Initialize()) != paNoError)
         {
@@ -110,43 +108,43 @@ static ALCboolean pa_load(void)
             return ALC_FALSE;
         }
     }
+#else
+    if((err=Pa_Initialize()) != paNoError)
+    {
+        ERR("Pa_Initialize() returned an error: %s\n", Pa_GetErrorText(err));
+        return ALC_FALSE;
+    }
+#endif
     return ALC_TRUE;
 }
 
 
 typedef struct {
     PaStream *stream;
+    PaStreamParameters params;
     ALuint update_size;
 
     RingBuffer *ring;
 } pa_data;
 
 
-static int pa_callback(const void *inputBuffer, void *outputBuffer,
-                       unsigned long framesPerBuffer, const PaStreamCallbackTimeInfo *timeInfo,
-                       const PaStreamCallbackFlags statusFlags, void *userData)
+static int pa_callback(const void *UNUSED(inputBuffer), void *outputBuffer,
+                       unsigned long framesPerBuffer, const PaStreamCallbackTimeInfo *UNUSED(timeInfo),
+                       const PaStreamCallbackFlags UNUSED(statusFlags), void *userData)
 {
     ALCdevice *device = (ALCdevice*)userData;
 
-    (void)inputBuffer;
-    (void)timeInfo;
-    (void)statusFlags;
-
     aluMixData(device, outputBuffer, framesPerBuffer);
     return 0;
 }
 
-static int pa_capture_cb(const void *inputBuffer, void *outputBuffer,
-                         unsigned long framesPerBuffer, const PaStreamCallbackTimeInfo *timeInfo,
-                         const PaStreamCallbackFlags statusFlags, void *userData)
+static int pa_capture_cb(const void *inputBuffer, void *UNUSED(outputBuffer),
+                         unsigned long framesPerBuffer, const PaStreamCallbackTimeInfo *UNUSED(timeInfo),
+                         const PaStreamCallbackFlags UNUSED(statusFlags), void *userData)
 {
     ALCdevice *device = (ALCdevice*)userData;
     pa_data *data = (pa_data*)device->ExtraData;
 
-    (void)outputBuffer;
-    (void)timeInfo;
-    (void)statusFlags;
-
     WriteRingBuffer(data->ring, inputBuffer, framesPerBuffer);
     return 0;
 }
@@ -154,7 +152,6 @@ static int pa_capture_cb(const void *inputBuffer, void *outputBuffer,
 
 static ALCenum pa_open_playback(ALCdevice *device, const ALCchar *deviceName)
 {
-    PaStreamParameters outParams;
     pa_data *data;
     PaError err;
 
@@ -166,64 +163,56 @@ static ALCenum pa_open_playback(ALCdevice *device, const ALCchar *deviceName)
     data = (pa_data*)calloc(1, sizeof(pa_data));
     data->update_size = device->UpdateSize;
 
-    device->ExtraData = data;
+    data->params.device = -1;
+    if(!ConfigValueInt("port", "device", &data->params.device) ||
+       data->params.device < 0)
+        data->params.device = Pa_GetDefaultOutputDevice();
+    data->params.suggestedLatency = (device->UpdateSize*device->NumUpdates) /
+                                    (float)device->Frequency;
+    data->params.hostApiSpecificStreamInfo = NULL;
 
-    outParams.device = -1;
-    if(!ConfigValueInt("port", "device", &outParams.device) || outParams.device < 0)
-        outParams.device = Pa_GetDefaultOutputDevice();
-    outParams.suggestedLatency = (device->UpdateSize*device->NumUpdates) /
-                                 (float)device->Frequency;
-    outParams.hostApiSpecificStreamInfo = NULL;
+    data->params.channelCount = ((device->FmtChans == DevFmtMono) ? 1 : 2);
 
     switch(device->FmtType)
     {
         case DevFmtByte:
-            outParams.sampleFormat = paInt8;
+            data->params.sampleFormat = paInt8;
             break;
         case DevFmtUByte:
-            outParams.sampleFormat = paUInt8;
+            data->params.sampleFormat = paUInt8;
             break;
         case DevFmtUShort:
-            device->FmtType = DevFmtShort;
             /* fall-through */
         case DevFmtShort:
-            outParams.sampleFormat = paInt16;
+            data->params.sampleFormat = paInt16;
+            break;
+        case DevFmtUInt:
+            /* fall-through */
+        case DevFmtInt:
+            data->params.sampleFormat = paInt32;
             break;
         case DevFmtFloat:
-            outParams.sampleFormat = paFloat32;
+            data->params.sampleFormat = paFloat32;
             break;
     }
-    outParams.channelCount = ((device->FmtChans == DevFmtMono) ? 1 : 2);
-
-    SetDefaultChannelOrder(device);
 
-    err = Pa_OpenStream(&data->stream, NULL, &outParams, device->Frequency,
+retry_open:
+    err = Pa_OpenStream(&data->stream, NULL, &data->params, device->Frequency,
                         device->UpdateSize, paNoFlag, pa_callback, device);
     if(err != paNoError)
     {
+        if(data->params.sampleFormat == paFloat32)
+        {
+            data->params.sampleFormat = paInt16;
+            goto retry_open;
+        }
         ERR("Pa_OpenStream() returned an error: %s\n", Pa_GetErrorText(err));
-        device->ExtraData = NULL;
         free(data);
         return ALC_INVALID_VALUE;
     }
 
-    device->szDeviceName = strdup(deviceName);
-
-    if((ALuint)outParams.channelCount != ChannelsFromDevFmt(device->FmtChans))
-    {
-        if(outParams.channelCount != 1 && outParams.channelCount != 2)
-        {
-            ERR("Unhandled channel count: %u\n", outParams.channelCount);
-            Pa_CloseStream(data->stream);
-            device->ExtraData = NULL;
-            free(data);
-            return ALC_INVALID_VALUE;
-        }
-        if((device->Flags&DEVICE_CHANNELS_REQUEST))
-            ERR("Failed to set %s, got %u channels instead\n", DevFmtChannelsString(device->FmtChans), outParams.channelCount);
-        device->Flags &= ~DEVICE_CHANNELS_REQUEST;
-        device->FmtChans = ((outParams.channelCount==1) ? DevFmtMono : DevFmtStereo);
-    }
+    device->ExtraData = data;
+    device->DeviceName = strdup(deviceName);
 
     return ALC_NO_ERROR;
 }
@@ -245,17 +234,45 @@ static ALCboolean pa_reset_playback(ALCdevice *device)
 {
     pa_data *data = (pa_data*)device->ExtraData;
     const PaStreamInfo *streamInfo;
-    PaError err;
 
     streamInfo = Pa_GetStreamInfo(data->stream);
-    if(device->Frequency != streamInfo->sampleRate)
+    device->Frequency = streamInfo->sampleRate;
+    device->UpdateSize = data->update_size;
+
+    if(data->params.sampleFormat == paInt8)
+        device->FmtType = DevFmtByte;
+    else if(data->params.sampleFormat == paUInt8)
+        device->FmtType = DevFmtUByte;
+    else if(data->params.sampleFormat == paInt16)
+        device->FmtType = DevFmtShort;
+    else if(data->params.sampleFormat == paInt32)
+        device->FmtType = DevFmtInt;
+    else if(data->params.sampleFormat == paFloat32)
+        device->FmtType = DevFmtFloat;
+    else
     {
-        if((device->Flags&DEVICE_FREQUENCY_REQUEST))
-            ERR("PortAudio does not support changing sample rates (wanted %dhz, got %.1fhz)\n", device->Frequency, streamInfo->sampleRate);
-        device->Flags &= ~DEVICE_FREQUENCY_REQUEST;
-        device->Frequency = streamInfo->sampleRate;
+        ERR("Unexpected sample format: 0x%lx\n", data->params.sampleFormat);
+        return ALC_FALSE;
     }
-    device->UpdateSize = data->update_size;
+
+    if(data->params.channelCount == 2)
+        device->FmtChans = DevFmtStereo;
+    else if(data->params.channelCount == 1)
+        device->FmtChans = DevFmtMono;
+    else
+    {
+        ERR("Unexpected channel count: %u\n", data->params.channelCount);
+        return ALC_FALSE;
+    }
+    SetDefaultChannelOrder(device);
+
+    return ALC_TRUE;
+}
+
+static ALCboolean pa_start_playback(ALCdevice *device)
+{
+    pa_data *data = (pa_data*)device->ExtraData;
+    PaError err;
 
     err = Pa_StartStream(data->stream);
     if(err != paNoError)
@@ -280,7 +297,6 @@ static void pa_stop_playback(ALCdevice *device)
 
 static ALCenum pa_open_capture(ALCdevice *device, const ALCchar *deviceName)
 {
-    PaStreamParameters inParams;
     ALuint frame_size;
     pa_data *data;
     PaError err;
@@ -299,33 +315,38 @@ static ALCenum pa_open_capture(ALCdevice *device, const ALCchar *deviceName)
     if(data->ring == NULL)
         goto error;
 
-    inParams.device = -1;
-    if(!ConfigValueInt("port", "capture", &inParams.device) || inParams.device < 0)
-        inParams.device = Pa_GetDefaultOutputDevice();
-    inParams.suggestedLatency = 0.0f;
-    inParams.hostApiSpecificStreamInfo = NULL;
+    data->params.device = -1;
+    if(!ConfigValueInt("port", "capture", &data->params.device) ||
+       data->params.device < 0)
+        data->params.device = Pa_GetDefaultOutputDevice();
+    data->params.suggestedLatency = 0.0f;
+    data->params.hostApiSpecificStreamInfo = NULL;
 
     switch(device->FmtType)
     {
         case DevFmtByte:
-            inParams.sampleFormat = paInt8;
+            data->params.sampleFormat = paInt8;
             break;
         case DevFmtUByte:
-            inParams.sampleFormat = paUInt8;
+            data->params.sampleFormat = paUInt8;
             break;
         case DevFmtShort:
-            inParams.sampleFormat = paInt16;
+            data->params.sampleFormat = paInt16;
+            break;
+        case DevFmtInt:
+            data->params.sampleFormat = paInt32;
             break;
         case DevFmtFloat:
-            inParams.sampleFormat = paFloat32;
+            data->params.sampleFormat = paFloat32;
             break;
+        case DevFmtUInt:
         case DevFmtUShort:
-            ERR("Unsigned short samples not supported\n");
+            ERR("%s samples not supported\n", DevFmtTypeString(device->FmtType));
             goto error;
     }
-    inParams.channelCount = ChannelsFromDevFmt(device->FmtChans);
+    data->params.channelCount = ChannelsFromDevFmt(device->FmtChans);
 
-    err = Pa_OpenStream(&data->stream, &inParams, NULL, device->Frequency,
+    err = Pa_OpenStream(&data->stream, &data->params, NULL, device->Frequency,
                         paFramesPerBufferUnspecified, paNoFlag, pa_capture_cb, device);
     if(err != paNoError)
     {
@@ -333,7 +354,7 @@ static ALCenum pa_open_capture(ALCdevice *device, const ALCchar *deviceName)
         goto error;
     }
 
-    device->szDeviceName = strdup(deviceName);
+    device->DeviceName = strdup(deviceName);
 
     device->ExtraData = data;
     return ALC_NO_ERROR;
@@ -353,6 +374,9 @@ static void pa_close_capture(ALCdevice *device)
     if(err != paNoError)
         ERR("Error closing stream: %s\n", Pa_GetErrorText(err));
 
+    DestroyRingBuffer(data->ring);
+    data->ring = NULL;
+
     free(data);
     device->ExtraData = NULL;
 }
@@ -395,13 +419,15 @@ static const BackendFuncs pa_funcs = {
     pa_open_playback,
     pa_close_playback,
     pa_reset_playback,
+    pa_start_playback,
     pa_stop_playback,
     pa_open_capture,
     pa_close_capture,
     pa_start_capture,
     pa_stop_capture,
     pa_capture_samples,
-    pa_available_samples
+    pa_available_samples,
+    ALCdevice_GetLatencyDefault
 };
 
 ALCboolean alc_pa_init(BackendFuncs *func_list)
@@ -414,25 +440,24 @@ ALCboolean alc_pa_init(BackendFuncs *func_list)
 
 void alc_pa_deinit(void)
 {
+#ifdef HAVE_DYNLOAD
     if(pa_handle)
     {
         Pa_Terminate();
-#ifdef HAVE_DYNLOAD
         CloseLib(pa_handle);
-#endif
         pa_handle = NULL;
     }
+#else
+    Pa_Terminate();
+#endif
 }
 
 void alc_pa_probe(enum DevProbe type)
 {
     switch(type)
     {
-        case DEVICE_PROBE:
-            AppendDeviceList(pa_device);
-            break;
         case ALL_DEVICE_PROBE:
-            AppendAllDeviceList(pa_device);
+            AppendAllDevicesList(pa_device);
             break;
         case CAPTURE_DEVICE_PROBE:
             AppendCaptureDeviceList(pa_device);

ファイルの差分が大きいため隠しています
+ 445 - 465
jni/openal-soft-android/Alc/backends/pulseaudio.c


+ 1169 - 0
jni/openal-soft-android/Alc/backends/qsa.c

@@ -0,0 +1,1169 @@
+/**
+ * OpenAL cross platform audio library
+ * Copyright (C) 2011-2013 by authors.
+ * This library is free software; you can redistribute it and/or
+ *  modify it under the terms of the GNU Library General Public
+ *  License as published by the Free Software Foundation; either
+ *  version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ *  but WITHOUT ANY WARRANTY; without even the implied warranty of
+ *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ *  Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public
+ *  License along with this library; if not, write to the
+ *  Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+ *  Boston, MA  02111-1307, USA.
+ * Or go to http://www.gnu.org/copyleft/lgpl.html
+ */
+
+#include "config.h"
+
+#include <stdlib.h>
+#include <stdio.h>
+#include <sched.h>
+#include <errno.h>
+#include <memory.h>
+#include <sys/select.h>
+#include <sys/asoundlib.h>
+#include <sys/neutrino.h>
+
+#include "alMain.h"
+#include "alu.h"
+#include "threads.h"
+
+
+typedef struct
+{
+    snd_pcm_t* pcmHandle;
+    int audio_fd;
+
+    snd_pcm_channel_setup_t  csetup;
+    snd_pcm_channel_params_t cparams;
+
+    ALvoid* buffer;
+    ALsizei size;
+
+    volatile int killNow;
+    althread_t thread;
+} qsa_data;
+
+typedef struct
+{
+    ALCchar* name;
+    int card;
+    int dev;
+} DevMap;
+
+static const ALCchar qsaDevice[]="QSA Default";
+static DevMap* allDevNameMap;
+static ALuint numDevNames;
+static DevMap* allCaptureDevNameMap;
+static ALuint numCaptureDevNames;
+
+static const struct
+{
+    int32_t format;
+} formatlist[]=
+{
+    {SND_PCM_SFMT_FLOAT_LE},
+    {SND_PCM_SFMT_S32_LE},
+    {SND_PCM_SFMT_U32_LE},
+    {SND_PCM_SFMT_S16_LE},
+    {SND_PCM_SFMT_U16_LE},
+    {SND_PCM_SFMT_S8},
+    {SND_PCM_SFMT_U8},
+    {0},
+};
+
+static const struct
+{
+    int32_t rate;
+} ratelist[]=
+{
+    {192000},
+    {176400},
+    {96000},
+    {88200},
+    {48000},
+    {44100},
+    {32000},
+    {24000},
+    {22050},
+    {16000},
+    {12000},
+    {11025},
+    {8000},
+    {0},
+};
+
+static const struct
+{
+    int32_t channels;
+} channellist[]=
+{
+    {8},
+    {7},
+    {6},
+    {4},
+    {2},
+    {1},
+    {0},
+};
+
+static DevMap* deviceList(int type, ALuint* count)
+{
+    snd_ctl_t* handle;
+    snd_pcm_info_t pcminfo;
+    int max_cards, card, err, dev, num_devices, idx;
+    DevMap* dev_list;
+    char name[1024];
+    struct snd_ctl_hw_info info;
+    void* temp;
+
+    idx=0;
+    num_devices=0;
+    max_cards=snd_cards();
+
+    if (max_cards<=0)
+    {
+        return 0;
+    }
+
+    dev_list=malloc(sizeof(DevMap)*1);
+    dev_list[0].name=strdup(qsaDevice);
+    num_devices=1;
+
+    for (card=0; card<max_cards; card++)
+    {
+        if ((err=snd_ctl_open(&handle, card))<0)
+        {
+            continue;
+        }
+        if ((err=snd_ctl_hw_info(handle, &info))<0)
+        {
+            snd_ctl_close(handle);
+            continue;
+        }
+
+        for (dev=0; dev<(int)info.pcmdevs; dev++)
+        {
+            if ((err=snd_ctl_pcm_info(handle, dev, &pcminfo)) < 0)
+            {
+                continue;
+            }
+
+            if ((type==SND_PCM_CHANNEL_PLAYBACK && (pcminfo.flags&SND_PCM_INFO_PLAYBACK)) ||
+                (type==SND_PCM_CHANNEL_CAPTURE && (pcminfo.flags&SND_PCM_INFO_CAPTURE)))
+            {
+                temp=realloc(dev_list, sizeof(DevMap)*(num_devices+1));
+                if (temp)
+                {
+                    dev_list=temp;
+                    snprintf(name, sizeof(name), "%s [%s] (hw:%d,%d)", info.name, pcminfo.name, card, dev);
+                    dev_list[num_devices].name=strdup(name);
+                    dev_list[num_devices].card=card;
+                    dev_list[num_devices].dev=dev;
+                    num_devices++;
+                }
+            }
+        }
+        snd_ctl_close (handle);
+    }
+
+    *count=num_devices;
+
+    return dev_list;
+}
+
+
+FORCE_ALIGN static ALuint qsa_proc_playback(ALvoid* ptr)
+{
+    ALCdevice* device=(ALCdevice*)ptr;
+    qsa_data* data=(qsa_data*)device->ExtraData;
+    char* write_ptr;
+    int avail;
+    snd_pcm_channel_status_t status;
+    struct sched_param param;
+    fd_set wfds;
+    int selectret;
+    struct timeval timeout;
+
+    SetRTPriority();
+    SetThreadName(MIXER_THREAD_NAME);
+
+    /* Increase default 10 priority to 11 to avoid jerky sound */
+    SchedGet(0, 0, &param);
+    param.sched_priority=param.sched_curpriority+1;
+    SchedSet(0, 0, SCHED_NOCHANGE, &param);
+
+    ALint frame_size=FrameSizeFromDevFmt(device->FmtChans, device->FmtType);
+
+    while (!data->killNow)
+    {
+        ALint len=data->size;
+        write_ptr=data->buffer;
+
+        avail=len/frame_size;
+        aluMixData(device, write_ptr, avail);
+
+        while (len>0 && !data->killNow)
+        {
+            FD_ZERO(&wfds);
+            FD_SET(data->audio_fd, &wfds);
+            timeout.tv_sec=2;
+            timeout.tv_usec=0;
+
+            /* Select also works like time slice to OS */
+            selectret=select(data->audio_fd+1, NULL, &wfds, NULL, &timeout);
+            switch (selectret)
+            {
+                case -1:
+                     aluHandleDisconnect(device);
+                     return 1;
+                case 0:
+                     break;
+                default:
+                     if (FD_ISSET(data->audio_fd, &wfds))
+                     {
+                         break;
+                     }
+                     break;
+            }
+
+            int wrote=snd_pcm_plugin_write(data->pcmHandle, write_ptr, len);
+
+            if (wrote<=0)
+            {
+                if ((errno==EAGAIN) || (errno==EWOULDBLOCK))
+                {
+                    continue;
+                }
+
+                memset(&status, 0, sizeof (status));
+                status.channel=SND_PCM_CHANNEL_PLAYBACK;
+
+                snd_pcm_plugin_status(data->pcmHandle, &status);
+
+                /* we need to reinitialize the sound channel if we've underrun the buffer */
+                if ((status.status==SND_PCM_STATUS_UNDERRUN) ||
+                    (status.status==SND_PCM_STATUS_READY))
+                {
+                    if ((snd_pcm_plugin_prepare(data->pcmHandle, SND_PCM_CHANNEL_PLAYBACK))<0)
+                    {
+                        aluHandleDisconnect(device);
+                        break;
+                    }
+                }
+            }
+            else
+            {
+                write_ptr+=wrote;
+                len-=wrote;
+            }
+        }
+    }
+
+    return 0;
+}
+
+/************/
+/* Playback */
+/************/
+
+static ALCenum qsa_open_playback(ALCdevice* device, const ALCchar* deviceName)
+{
+    qsa_data* data;
+    char driver[64];
+    int status;
+    int card, dev;
+
+    strncpy(driver, GetConfigValue("qsa", "device", qsaDevice), sizeof(driver)-1);
+    driver[sizeof(driver)-1]=0;
+
+    data=(qsa_data*)calloc(1, sizeof(qsa_data));
+    if (data==NULL)
+    {
+        return ALC_OUT_OF_MEMORY;
+    }
+
+    if (!deviceName)
+    {
+        deviceName=driver;
+    }
+
+    if (strcmp(deviceName, qsaDevice)==0)
+    {
+        if (!deviceName)
+        {
+            deviceName=qsaDevice;
+        }
+
+        status=snd_pcm_open_preferred(&data->pcmHandle, &card, &dev, SND_PCM_OPEN_PLAYBACK);
+    }
+    else
+    {
+        size_t idx;
+
+        if (!allDevNameMap)
+        {
+            allDevNameMap=deviceList(SND_PCM_CHANNEL_PLAYBACK, &numDevNames);
+        }
+
+        for (idx=0; idx<numDevNames; idx++)
+        {
+            if (allDevNameMap[idx].name && strcmp(deviceName, allDevNameMap[idx].name)==0)
+            {
+                if (idx>0)
+                {
+                    break;
+                }
+            }
+        }
+        if (idx==numDevNames)
+        {
+            free(data);
+            return ALC_INVALID_DEVICE;
+        }
+
+        status=snd_pcm_open(&data->pcmHandle, allDevNameMap[idx].card, allDevNameMap[idx].dev, SND_PCM_OPEN_PLAYBACK);
+    }
+
+    if (status<0)
+    {
+        free(data);
+        return ALC_INVALID_DEVICE;
+    }
+
+    data->audio_fd=snd_pcm_file_descriptor(data->pcmHandle, SND_PCM_CHANNEL_PLAYBACK);
+    if (data->audio_fd<0)
+    {
+        free(data);
+        return ALC_INVALID_DEVICE;
+    }
+
+    device->DeviceName=strdup(deviceName);
+    device->ExtraData=data;
+
+    return ALC_NO_ERROR;
+}
+
+static void qsa_close_playback(ALCdevice* device)
+{
+    qsa_data* data=(qsa_data*)device->ExtraData;
+
+    if (data->buffer!=NULL)
+    {
+        free(data->buffer);
+        data->buffer=NULL;
+    }
+
+    snd_pcm_close(data->pcmHandle);
+    free(data);
+
+    device->ExtraData=NULL;
+}
+
+static ALCboolean qsa_reset_playback(ALCdevice* device)
+{
+    qsa_data* data=(qsa_data*)device->ExtraData;
+    int32_t format=-1;
+
+    switch(device->FmtType)
+    {
+        case DevFmtByte:
+             format=SND_PCM_SFMT_S8;
+             break;
+        case DevFmtUByte:
+             format=SND_PCM_SFMT_U8;
+             break;
+        case DevFmtShort:
+             format=SND_PCM_SFMT_S16_LE;
+             break;
+        case DevFmtUShort:
+             format=SND_PCM_SFMT_U16_LE;
+             break;
+        case DevFmtInt:
+             format=SND_PCM_SFMT_S32_LE;
+             break;
+        case DevFmtUInt:
+             format=SND_PCM_SFMT_U32_LE;
+             break;
+        case DevFmtFloat:
+             format=SND_PCM_SFMT_FLOAT_LE;
+             break;
+    }
+
+    /* we actually don't want to block on writes */
+    snd_pcm_nonblock_mode(data->pcmHandle, 1);
+    /* Disable mmap to control data transfer to the audio device */
+    snd_pcm_plugin_set_disable(data->pcmHandle, PLUGIN_DISABLE_MMAP);
+    snd_pcm_plugin_set_disable(data->pcmHandle, PLUGIN_DISABLE_BUFFER_PARTIAL_BLOCKS);
+
+    // configure a sound channel
+    memset(&data->cparams, 0, sizeof(data->cparams));
+    data->cparams.channel=SND_PCM_CHANNEL_PLAYBACK;
+    data->cparams.mode=SND_PCM_MODE_BLOCK;
+    data->cparams.start_mode=SND_PCM_START_FULL;
+    data->cparams.stop_mode=SND_PCM_STOP_STOP;
+
+    data->cparams.buf.block.frag_size=device->UpdateSize*
+        ChannelsFromDevFmt(device->FmtChans)*BytesFromDevFmt(device->FmtType);
+    data->cparams.buf.block.frags_max=device->NumUpdates;
+    data->cparams.buf.block.frags_min=device->NumUpdates;
+
+    data->cparams.format.interleave=1;
+    data->cparams.format.rate=device->Frequency;
+    data->cparams.format.voices=ChannelsFromDevFmt(device->FmtChans);
+    data->cparams.format.format=format;
+
+    if ((snd_pcm_plugin_params(data->pcmHandle, &data->cparams))<0)
+    {
+        int original_rate=data->cparams.format.rate;
+        int original_voices=data->cparams.format.voices;
+        int original_format=data->cparams.format.format;
+        int it;
+        int jt;
+
+        for (it=0; it<1; it++)
+        {
+            /* Check for second pass */
+            if (it==1)
+            {
+                original_rate=ratelist[0].rate;
+                original_voices=channellist[0].channels;
+                original_format=formatlist[0].format;
+            }
+
+            do {
+                /* At first downgrade sample format */
+                jt=0;
+                do {
+                    if (formatlist[jt].format==data->cparams.format.format)
+                    {
+                        data->cparams.format.format=formatlist[jt+1].format;
+                        break;
+                    }
+                    if (formatlist[jt].format==0)
+                    {
+                        data->cparams.format.format=0;
+                        break;
+                    }
+                    jt++;
+                } while(1);
+
+                if (data->cparams.format.format==0)
+                {
+                    data->cparams.format.format=original_format;
+
+                    /* At secod downgrade sample rate */
+                    jt=0;
+                    do {
+                        if (ratelist[jt].rate==data->cparams.format.rate)
+                        {
+                            data->cparams.format.rate=ratelist[jt+1].rate;
+                            break;
+                        }
+                        if (ratelist[jt].rate==0)
+                        {
+                            data->cparams.format.rate=0;
+                            break;
+                        }
+                        jt++;
+                    } while(1);
+
+                    if (data->cparams.format.rate==0)
+                    {
+                        data->cparams.format.rate=original_rate;
+                        data->cparams.format.format=original_format;
+
+                        /* At third downgrade channels number */
+                        jt=0;
+                        do {
+                            if(channellist[jt].channels==data->cparams.format.voices)
+                            {
+                                data->cparams.format.voices=channellist[jt+1].channels;
+                                break;
+                            }
+                            if (channellist[jt].channels==0)
+                            {
+                                data->cparams.format.voices=0;
+                                break;
+                            }
+                           jt++;
+                        } while(1);
+                    }
+
+                    if (data->cparams.format.voices==0)
+                    {
+                        break;
+                    }
+                }
+
+                data->cparams.buf.block.frag_size=device->UpdateSize*
+                    data->cparams.format.voices*
+                    snd_pcm_format_width(data->cparams.format.format)/8;
+                data->cparams.buf.block.frags_max=device->NumUpdates;
+                data->cparams.buf.block.frags_min=device->NumUpdates;
+                if ((snd_pcm_plugin_params(data->pcmHandle, &data->cparams))<0)
+                {
+                    continue;
+                }
+                else
+                {
+                    break;
+                }
+            } while(1);
+
+            if (data->cparams.format.voices!=0)
+            {
+                break;
+            }
+        }
+
+        if (data->cparams.format.voices==0)
+        {
+            return ALC_FALSE;
+        }
+    }
+
+    if ((snd_pcm_plugin_prepare(data->pcmHandle, SND_PCM_CHANNEL_PLAYBACK))<0)
+    {
+        return ALC_FALSE;
+    }
+
+    memset(&data->csetup, 0, sizeof(data->csetup));
+    data->csetup.channel=SND_PCM_CHANNEL_PLAYBACK;
+    if (snd_pcm_plugin_setup(data->pcmHandle, &data->csetup)<0)
+    {
+        return ALC_FALSE;
+    }
+
+    /* now fill back to the our AL device */
+    device->Frequency=data->cparams.format.rate;
+
+    switch (data->cparams.format.voices)
+    {
+        case 1:
+             device->FmtChans=DevFmtMono;
+             break;
+        case 2:
+             device->FmtChans=DevFmtStereo;
+             break;
+        case 4:
+             device->FmtChans=DevFmtQuad;
+             break;
+        case 6:
+             device->FmtChans=DevFmtX51;
+             break;
+        case 7:
+             device->FmtChans=DevFmtX61;
+             break;
+        case 8:
+             device->FmtChans=DevFmtX71;
+             break;
+        default:
+             device->FmtChans=DevFmtMono;
+             break;
+    }
+
+    switch (data->cparams.format.format)
+    {
+        case SND_PCM_SFMT_S8:
+             device->FmtType=DevFmtByte;
+             break;
+        case SND_PCM_SFMT_U8:
+             device->FmtType=DevFmtUByte;
+             break;
+        case SND_PCM_SFMT_S16_LE:
+             device->FmtType=DevFmtShort;
+             break;
+        case SND_PCM_SFMT_U16_LE:
+             device->FmtType=DevFmtUShort;
+             break;
+        case SND_PCM_SFMT_S32_LE:
+             device->FmtType=DevFmtInt;
+             break;
+        case SND_PCM_SFMT_U32_LE:
+             device->FmtType=DevFmtUInt;
+             break;
+        case SND_PCM_SFMT_FLOAT_LE:
+             device->FmtType=DevFmtFloat;
+             break;
+        default:
+             device->FmtType=DevFmtShort;
+             break;
+    }
+
+    SetDefaultChannelOrder(device);
+
+    device->UpdateSize=data->csetup.buf.block.frag_size/
+        (ChannelsFromDevFmt(device->FmtChans)*BytesFromDevFmt(device->FmtType));
+    device->NumUpdates=data->csetup.buf.block.frags;
+
+    data->size=data->csetup.buf.block.frag_size;
+    data->buffer=malloc(data->size);
+    if (!data->buffer)
+    {
+        return ALC_FALSE;
+    }
+
+    return ALC_TRUE;
+}
+
+static ALCboolean qsa_start_playback(ALCdevice* device)
+{
+    qsa_data *data = (qsa_data*)device->ExtraData;
+
+    if(!StartThread(&data->thread, qsa_proc_playback, device))
+        return ALC_FALSE;
+
+    return ALC_TRUE;
+}
+
+static void qsa_stop_playback(ALCdevice* device)
+{
+    qsa_data* data=(qsa_data*)device->ExtraData;
+
+    if (data->thread)
+    {
+        data->killNow=1;
+        StopThread(data->thread);
+        data->thread=NULL;
+    }
+    data->killNow=0;
+}
+
+/***********/
+/* Capture */
+/***********/
+
+static ALCenum qsa_open_capture(ALCdevice* device, const ALCchar* deviceName)
+{
+    qsa_data* data;
+    int format=-1;
+    char driver[64];
+    int card, dev;
+    int status;
+
+    strncpy(driver, GetConfigValue("qsa", "capture", qsaDevice), sizeof(driver)-1);
+    driver[sizeof(driver)-1]=0;
+
+    data=(qsa_data*)calloc(1, sizeof(qsa_data));
+    if (data==NULL)
+    {
+        return ALC_OUT_OF_MEMORY;
+    }
+
+    if (!deviceName)
+    {
+        deviceName=driver;
+    }
+
+    if (strcmp(deviceName, qsaDevice)==0)
+    {
+        if (!deviceName)
+        {
+            deviceName=qsaDevice;
+        }
+
+        status=snd_pcm_open_preferred(&data->pcmHandle, &card, &dev, SND_PCM_OPEN_CAPTURE);
+    }
+    else
+    {
+        size_t idx;
+
+        if (!allCaptureDevNameMap)
+        {
+            allCaptureDevNameMap=deviceList(SND_PCM_CHANNEL_CAPTURE, &numDevNames);
+        }
+
+        for (idx=0; idx<numDevNames; idx++)
+        {
+            if (allCaptureDevNameMap[idx].name && strcmp(deviceName, allCaptureDevNameMap[idx].name)==0)
+            {
+                if (idx>0)
+                {
+                    break;
+                }
+            }
+        }
+        if (idx==numDevNames)
+        {
+            free(data);
+            return ALC_INVALID_DEVICE;
+        }
+
+        status=snd_pcm_open(&data->pcmHandle, allCaptureDevNameMap[idx].card, allCaptureDevNameMap[idx].dev, SND_PCM_OPEN_CAPTURE);
+    }
+
+    if (status<0)
+    {
+        free(data);
+        return ALC_INVALID_DEVICE;
+    }
+
+    data->audio_fd=snd_pcm_file_descriptor(data->pcmHandle, SND_PCM_CHANNEL_CAPTURE);
+    if (data->audio_fd<0)
+    {
+        free(data);
+        return ALC_INVALID_DEVICE;
+    }
+
+    device->DeviceName=strdup(deviceName);
+    device->ExtraData=data;
+
+    switch (device->FmtType)
+    {
+        case DevFmtByte:
+             format=SND_PCM_SFMT_S8;
+             break;
+        case DevFmtUByte:
+             format=SND_PCM_SFMT_U8;
+             break;
+        case DevFmtShort:
+             format=SND_PCM_SFMT_S16_LE;
+             break;
+        case DevFmtUShort:
+             format=SND_PCM_SFMT_U16_LE;
+             break;
+        case DevFmtInt:
+             format=SND_PCM_SFMT_S32_LE;
+             break;
+        case DevFmtUInt:
+             format=SND_PCM_SFMT_U32_LE;
+             break;
+        case DevFmtFloat:
+             format=SND_PCM_SFMT_FLOAT_LE;
+             break;
+    }
+
+    /* we actually don't want to block on reads */
+    snd_pcm_nonblock_mode(data->pcmHandle, 1);
+    /* Disable mmap to control data transfer to the audio device */
+    snd_pcm_plugin_set_disable(data->pcmHandle, PLUGIN_DISABLE_MMAP);
+
+    /* configure a sound channel */
+    memset(&data->cparams, 0, sizeof(data->cparams));
+    data->cparams.mode=SND_PCM_MODE_BLOCK;
+    data->cparams.channel=SND_PCM_CHANNEL_CAPTURE;
+    data->cparams.start_mode=SND_PCM_START_GO;
+    data->cparams.stop_mode=SND_PCM_STOP_STOP;
+
+    data->cparams.buf.block.frag_size=device->UpdateSize*
+        ChannelsFromDevFmt(device->FmtChans)*BytesFromDevFmt(device->FmtType);
+    data->cparams.buf.block.frags_max=device->NumUpdates;
+    data->cparams.buf.block.frags_min=device->NumUpdates;
+
+    data->cparams.format.interleave=1;
+    data->cparams.format.rate=device->Frequency;
+    data->cparams.format.voices=ChannelsFromDevFmt(device->FmtChans);
+    data->cparams.format.format=format;
+
+    if ((snd_pcm_plugin_params(data->pcmHandle, &data->cparams))<0)
+    {
+        int original_rate=data->cparams.format.rate;
+        int original_voices=data->cparams.format.voices;
+        int original_format=data->cparams.format.format;
+        int it;
+        int jt;
+
+        for (it=0; it<1; it++)
+        {
+            /* Check for second pass */
+            if (it==1)
+            {
+                original_rate=ratelist[0].rate;
+                original_voices=channellist[0].channels;
+                original_format=formatlist[0].format;
+            }
+
+            do {
+                /* At first downgrade sample format */
+                jt=0;
+                do {
+                    if (formatlist[jt].format==data->cparams.format.format)
+                    {
+                        data->cparams.format.format=formatlist[jt+1].format;
+                        break;
+                    }
+                    if (formatlist[jt].format==0)
+                    {
+                        data->cparams.format.format=0;
+                        break;
+                    }
+                    jt++;
+                } while(1);
+
+                if (data->cparams.format.format==0)
+                {
+                    data->cparams.format.format=original_format;
+
+                    /* At secod downgrade sample rate */
+                    jt=0;
+                    do {
+                        if (ratelist[jt].rate==data->cparams.format.rate)
+                        {
+                            data->cparams.format.rate=ratelist[jt+1].rate;
+                            break;
+                        }
+                        if (ratelist[jt].rate==0)
+                        {
+                            data->cparams.format.rate=0;
+                            break;
+                        }
+                        jt++;
+                    } while(1);
+
+                    if (data->cparams.format.rate==0)
+                    {
+                        data->cparams.format.rate=original_rate;
+                        data->cparams.format.format=original_format;
+
+                        /* At third downgrade channels number */
+                        jt=0;
+                        do {
+                            if(channellist[jt].channels==data->cparams.format.voices)
+                            {
+                                data->cparams.format.voices=channellist[jt+1].channels;
+                                break;
+                            }
+                            if (channellist[jt].channels==0)
+                            {
+                                data->cparams.format.voices=0;
+                                break;
+                            }
+                           jt++;
+                        } while(1);
+                    }
+
+                    if (data->cparams.format.voices==0)
+                    {
+                        break;
+                    }
+                }
+
+                data->cparams.buf.block.frag_size=device->UpdateSize*
+                    data->cparams.format.voices*
+                    snd_pcm_format_width(data->cparams.format.format)/8;
+                data->cparams.buf.block.frags_max=device->NumUpdates;
+                data->cparams.buf.block.frags_min=device->NumUpdates;
+                if ((snd_pcm_plugin_params(data->pcmHandle, &data->cparams))<0)
+                {
+                    continue;
+                }
+                else
+                {
+                    break;
+                }
+            } while(1);
+
+            if (data->cparams.format.voices!=0)
+            {
+                break;
+            }
+        }
+
+        if (data->cparams.format.voices==0)
+        {
+            return ALC_INVALID_VALUE;
+        }
+    }
+
+    /* now fill back to the our AL device */
+    device->Frequency=data->cparams.format.rate;
+
+    switch (data->cparams.format.voices)
+    {
+        case 1:
+             device->FmtChans=DevFmtMono;
+             break;
+        case 2:
+             device->FmtChans=DevFmtStereo;
+             break;
+        case 4:
+             device->FmtChans=DevFmtQuad;
+             break;
+        case 6:
+             device->FmtChans=DevFmtX51;
+             break;
+        case 7:
+             device->FmtChans=DevFmtX61;
+             break;
+        case 8:
+             device->FmtChans=DevFmtX71;
+             break;
+        default:
+             device->FmtChans=DevFmtMono;
+             break;
+    }
+
+    switch (data->cparams.format.format)
+    {
+        case SND_PCM_SFMT_S8:
+             device->FmtType=DevFmtByte;
+             break;
+        case SND_PCM_SFMT_U8:
+             device->FmtType=DevFmtUByte;
+             break;
+        case SND_PCM_SFMT_S16_LE:
+             device->FmtType=DevFmtShort;
+             break;
+        case SND_PCM_SFMT_U16_LE:
+             device->FmtType=DevFmtUShort;
+             break;
+        case SND_PCM_SFMT_S32_LE:
+             device->FmtType=DevFmtInt;
+             break;
+        case SND_PCM_SFMT_U32_LE:
+             device->FmtType=DevFmtUInt;
+             break;
+        case SND_PCM_SFMT_FLOAT_LE:
+             device->FmtType=DevFmtFloat;
+             break;
+        default:
+             device->FmtType=DevFmtShort;
+             break;
+    }
+
+    return ALC_NO_ERROR;
+}
+
+static void qsa_close_capture(ALCdevice* device)
+{
+    qsa_data* data=(qsa_data*)device->ExtraData;
+
+    if (data->pcmHandle!=NULL)
+    {
+        snd_pcm_close(data->pcmHandle);
+    }
+    free(data);
+    device->ExtraData=NULL;
+}
+
+static void qsa_start_capture(ALCdevice* device)
+{
+    qsa_data* data=(qsa_data*)device->ExtraData;
+    int rstatus;
+
+    if ((rstatus=snd_pcm_plugin_prepare(data->pcmHandle, SND_PCM_CHANNEL_CAPTURE))<0)
+    {
+        ERR("capture prepare failed: %s\n", snd_strerror(rstatus));
+        return;
+    }
+
+    memset(&data->csetup, 0, sizeof(data->csetup));
+    data->csetup.channel=SND_PCM_CHANNEL_CAPTURE;
+    if ((rstatus=snd_pcm_plugin_setup(data->pcmHandle, &data->csetup))<0)
+    {
+        ERR("capture setup failed: %s\n", snd_strerror(rstatus));
+        return;
+    }
+
+    snd_pcm_capture_go(data->pcmHandle);
+
+    device->UpdateSize=data->csetup.buf.block.frag_size/
+        (ChannelsFromDevFmt(device->FmtChans)*BytesFromDevFmt(device->FmtType));
+    device->NumUpdates=data->csetup.buf.block.frags;
+}
+
+static void qsa_stop_capture(ALCdevice* device)
+{
+    qsa_data* data=(qsa_data*)device->ExtraData;
+
+    snd_pcm_capture_flush(data->pcmHandle);
+}
+
+static ALCuint qsa_available_samples(ALCdevice* device)
+{
+    qsa_data* data=(qsa_data*)device->ExtraData;
+    snd_pcm_channel_status_t status;
+    ALint frame_size=FrameSizeFromDevFmt(device->FmtChans, device->FmtType);
+    ALint free_size;
+    int rstatus;
+
+    memset(&status, 0, sizeof (status));
+    status.channel=SND_PCM_CHANNEL_CAPTURE;
+    snd_pcm_plugin_status(data->pcmHandle, &status);
+    if ((status.status==SND_PCM_STATUS_OVERRUN) ||
+        (status.status==SND_PCM_STATUS_READY))
+    {
+        if ((rstatus=snd_pcm_plugin_prepare(data->pcmHandle, SND_PCM_CHANNEL_CAPTURE))<0)
+        {
+            ERR("capture prepare failed: %s\n", snd_strerror(rstatus));
+            aluHandleDisconnect(device);
+            return 0;
+        }
+
+        snd_pcm_capture_go(data->pcmHandle);
+        return 0;
+    }
+
+    free_size=data->csetup.buf.block.frag_size*data->csetup.buf.block.frags;
+    free_size-=status.free;
+
+    return free_size/frame_size;
+}
+
+static ALCenum qsa_capture_samples(ALCdevice *device, ALCvoid *buffer, ALCuint samples)
+{
+    qsa_data* data=(qsa_data*)device->ExtraData;
+    char* read_ptr;
+    snd_pcm_channel_status_t status;
+    fd_set rfds;
+    int selectret;
+    struct timeval timeout;
+    int bytes_read;
+    ALint frame_size=FrameSizeFromDevFmt(device->FmtChans, device->FmtType);
+    ALint len=samples*frame_size;
+    int rstatus;
+
+    read_ptr=buffer;
+
+    while (len>0)
+    {
+        FD_ZERO(&rfds);
+        FD_SET(data->audio_fd, &rfds);
+        timeout.tv_sec=2;
+        timeout.tv_usec=0;
+
+        /* Select also works like time slice to OS */
+        bytes_read=0;
+        selectret=select(data->audio_fd+1, &rfds, NULL, NULL, &timeout);
+        switch (selectret)
+        {
+            case -1:
+                 aluHandleDisconnect(device);
+                 return ALC_INVALID_DEVICE;
+            case 0:
+                 break;
+            default:
+                 if (FD_ISSET(data->audio_fd, &rfds))
+                 {
+                     bytes_read=snd_pcm_plugin_read(data->pcmHandle, read_ptr, len);
+                     break;
+                 }
+                 break;
+        }
+
+        if (bytes_read<=0)
+        {
+            if ((errno==EAGAIN) || (errno==EWOULDBLOCK))
+            {
+                continue;
+            }
+
+            memset(&status, 0, sizeof (status));
+            status.channel=SND_PCM_CHANNEL_CAPTURE;
+            snd_pcm_plugin_status(data->pcmHandle, &status);
+
+            /* we need to reinitialize the sound channel if we've overrun the buffer */
+            if ((status.status==SND_PCM_STATUS_OVERRUN) ||
+                (status.status==SND_PCM_STATUS_READY))
+            {
+                if ((rstatus=snd_pcm_plugin_prepare(data->pcmHandle, SND_PCM_CHANNEL_CAPTURE))<0)
+                {
+                    ERR("capture prepare failed: %s\n", snd_strerror(rstatus));
+                    aluHandleDisconnect(device);
+                    return ALC_INVALID_DEVICE;
+                }
+                snd_pcm_capture_go(data->pcmHandle);
+            }
+        }
+        else
+        {
+            read_ptr+=bytes_read;
+            len-=bytes_read;
+        }
+    }
+
+    return ALC_NO_ERROR;
+}
+
+static ALint64 qsa_get_latency(ALCdevice* device)
+{
+    ALint frame_size=FrameSizeFromDevFmt(device->FmtChans, device->FmtType);
+
+    return (ALint64)(device->UpdateSize*device->NumUpdates/frame_size)*
+        1000000000/device->Frequency;
+}
+
+BackendFuncs qsa_funcs=
+{
+    qsa_open_playback,
+    qsa_close_playback,
+    qsa_reset_playback,
+    qsa_start_playback,
+    qsa_stop_playback,
+    qsa_open_capture,
+    qsa_close_capture,
+    qsa_start_capture,
+    qsa_stop_capture,
+    qsa_capture_samples,
+    qsa_available_samples,
+    qsa_get_latency,
+};
+
+ALCboolean alc_qsa_init(BackendFuncs* func_list)
+{
+    *func_list=qsa_funcs;
+
+    return ALC_TRUE;
+}
+
+void alc_qsa_deinit(void)
+{
+    ALuint i;
+
+    for (i=0; i<numDevNames; ++i)
+    {
+        free(allDevNameMap[i].name);
+    }
+    free(allDevNameMap);
+    allDevNameMap=NULL;
+    numDevNames=0;
+
+    for (i=0; i<numCaptureDevNames; ++i)
+    {
+        free(allCaptureDevNameMap[i].name);
+    }
+    free(allCaptureDevNameMap);
+    allCaptureDevNameMap=NULL;
+    numCaptureDevNames=0;
+}
+
+void alc_qsa_probe(enum DevProbe type)
+{
+    ALuint i;
+
+    switch (type)
+    {
+        case ALL_DEVICE_PROBE:
+             for (i=0; i<numDevNames; ++i)
+             {
+                 free(allDevNameMap[i].name);
+             }
+             free(allDevNameMap);
+
+             allDevNameMap=deviceList(SND_PCM_CHANNEL_PLAYBACK, &numDevNames);
+             for (i=0; i<numDevNames; ++i)
+             {
+                 AppendAllDevicesList(allDevNameMap[i].name);
+             }
+             break;
+        case CAPTURE_DEVICE_PROBE:
+             for (i=0; i<numCaptureDevNames; ++i)
+             {
+                 free(allCaptureDevNameMap[i].name);
+             }
+             free(allCaptureDevNameMap);
+
+             allCaptureDevNameMap=deviceList(SND_PCM_CHANNEL_CAPTURE, &numCaptureDevNames);
+             for (i=0; i<numCaptureDevNames; ++i)
+             {
+                 AppendCaptureDeviceList(allCaptureDevNameMap[i].name);
+             }
+             break;
+    }
+}

+ 35 - 121
jni/openal-soft-android/Alc/backends/sndio.c

@@ -23,9 +23,10 @@
 #include <stdio.h>
 #include <stdlib.h>
 #include <string.h>
+
 #include "alMain.h"
-#include "AL/al.h"
-#include "AL/alc.h"
+#include "alu.h"
+#include "threads.h"
 
 #include <sndio.h>
 
@@ -33,86 +34,8 @@
 static const ALCchar sndio_device[] = "SndIO Default";
 
 
-static void *sndio_handle;
-#ifdef HAVE_DYNLOAD
-#define MAKE_FUNC(x) static typeof(x) * p##x
-MAKE_FUNC(sio_initpar);
-MAKE_FUNC(sio_open);
-MAKE_FUNC(sio_close);
-MAKE_FUNC(sio_setpar);
-MAKE_FUNC(sio_getpar);
-MAKE_FUNC(sio_getcap);
-MAKE_FUNC(sio_onmove);
-MAKE_FUNC(sio_write);
-MAKE_FUNC(sio_read);
-MAKE_FUNC(sio_start);
-MAKE_FUNC(sio_stop);
-MAKE_FUNC(sio_nfds);
-MAKE_FUNC(sio_pollfd);
-MAKE_FUNC(sio_revents);
-MAKE_FUNC(sio_eof);
-MAKE_FUNC(sio_setvol);
-MAKE_FUNC(sio_onvol);
-
-#define sio_initpar psio_initpar
-#define sio_open psio_open
-#define sio_close psio_close
-#define sio_setpar psio_setpar
-#define sio_getpar psio_getpar
-#define sio_getcap psio_getcap
-#define sio_onmove psio_onmove
-#define sio_write psio_write
-#define sio_read psio_read
-#define sio_start psio_start
-#define sio_stop psio_stop
-#define sio_nfds psio_nfds
-#define sio_pollfd psio_pollfd
-#define sio_revents psio_revents
-#define sio_eof psio_eof
-#define sio_setvol psio_setvol
-#define sio_onvol psio_onvol
-#endif
-
-
 static ALCboolean sndio_load(void)
 {
-    if(!sndio_handle)
-    {
-#ifdef HAVE_DYNLOAD
-        sndio_handle = LoadLib("libsndio.so");
-        if(!sndio_handle)
-            return ALC_FALSE;
-
-#define LOAD_FUNC(f) do {                                                     \
-    p##f = GetSymbol(sndio_handle, #f);                                       \
-    if(p##f == NULL) {                                                        \
-        CloseLib(sndio_handle);                                               \
-        sndio_handle = NULL;                                                  \
-        return ALC_FALSE;                                                     \
-    }                                                                         \
-} while(0)
-        LOAD_FUNC(sio_initpar);
-        LOAD_FUNC(sio_open);
-        LOAD_FUNC(sio_close);
-        LOAD_FUNC(sio_setpar);
-        LOAD_FUNC(sio_getpar);
-        LOAD_FUNC(sio_getcap);
-        LOAD_FUNC(sio_onmove);
-        LOAD_FUNC(sio_write);
-        LOAD_FUNC(sio_read);
-        LOAD_FUNC(sio_start);
-        LOAD_FUNC(sio_stop);
-        LOAD_FUNC(sio_nfds);
-        LOAD_FUNC(sio_pollfd);
-        LOAD_FUNC(sio_revents);
-        LOAD_FUNC(sio_eof);
-        LOAD_FUNC(sio_setvol);
-        LOAD_FUNC(sio_onvol);
-#undef LOAD_FUNC
-#else
-        sndio_handle = (void*)0xDEADBEEF;
-#endif
-    }
     return ALC_TRUE;
 }
 
@@ -124,7 +47,7 @@ typedef struct {
     ALsizei data_size;
 
     volatile int killNow;
-    ALvoid *thread;
+    althread_t thread;
 } sndio_data;
 
 
@@ -136,6 +59,7 @@ static ALuint sndio_proc(ALvoid *ptr)
     size_t wrote;
 
     SetRTPriority();
+    SetThreadName(MIXER_THREAD_NAME);
 
     frameSize = FrameSizeFromDevFmt(device->FmtChans, device->FmtType);
 
@@ -151,7 +75,9 @@ static ALuint sndio_proc(ALvoid *ptr)
             if(wrote == 0)
             {
                 ERR("sio_write failed\n");
+                ALCdevice_Lock(device);
                 aluHandleDisconnect(device);
+                ALCdevice_Unlock(device);
                 break;
             }
 
@@ -185,7 +111,7 @@ static ALCenum sndio_open_playback(ALCdevice *device, const ALCchar *deviceName)
         return ALC_INVALID_VALUE;
     }
 
-    device->szDeviceName = strdup(deviceName);
+    device->DeviceName = strdup(deviceName);
     device->ExtraData = data;
 
     return ALC_NO_ERROR;
@@ -208,7 +134,6 @@ static ALCboolean sndio_reset_playback(ALCdevice *device)
     sio_initpar(&par);
 
     par.rate = device->Frequency;
-
     par.pchan = ((device->FmtChans != DevFmtMono) ? 2 : 1);
 
     switch(device->FmtType)
@@ -222,8 +147,6 @@ static ALCboolean sndio_reset_playback(ALCdevice *device)
             par.sig = 0;
             break;
         case DevFmtFloat:
-            device->FmtType = DevFmtShort;
-            /* fall-through */
         case DevFmtShort:
             par.bits = 16;
             par.sig = 1;
@@ -232,6 +155,14 @@ static ALCboolean sndio_reset_playback(ALCdevice *device)
             par.bits = 16;
             par.sig = 0;
             break;
+        case DevFmtInt:
+            par.bits = 32;
+            par.sig = 1;
+            break;
+        case DevFmtUInt:
+            par.bits = 32;
+            par.sig = 0;
+            break;
     }
     par.le = SIO_LE_NATIVE;
 
@@ -239,40 +170,21 @@ static ALCboolean sndio_reset_playback(ALCdevice *device)
     par.appbufsz = device->UpdateSize * (device->NumUpdates-1);
     if(!par.appbufsz) par.appbufsz = device->UpdateSize;
 
-
     if(!sio_setpar(data->sndHandle, &par) || !sio_getpar(data->sndHandle, &par))
     {
         ERR("Failed to set device parameters\n");
         return ALC_FALSE;
     }
 
-    if(par.rate != device->Frequency)
-    {
-        if((device->Flags&DEVICE_FREQUENCY_REQUEST))
-            ERR("Failed to set frequency %uhz, got %uhz instead\n", device->Frequency, par.rate);
-        device->Flags &= ~DEVICE_FREQUENCY_REQUEST;
-        device->Frequency = par.rate;
-    }
-
-    if(par.pchan != ChannelsFromDevFmt(device->FmtChans))
-    {
-        if(par.pchan != 1 && par.pchan != 2)
-        {
-            ERR("Unhandled channel count: %u\n", par.pchan);
-            return ALC_FALSE;
-        }
-        if((device->Flags&DEVICE_CHANNELS_REQUEST))
-            ERR("Failed to set %s, got %u channels instead\n", DevFmtChannelsString(device->FmtChans), par.pchan);
-        device->Flags &= ~DEVICE_CHANNELS_REQUEST;
-        device->FmtChans = ((par.pchan==1) ? DevFmtMono : DevFmtStereo);
-    }
-
     if(par.bits != par.bps*8)
     {
         ERR("Padded samples not supported (%u of %u bits)\n", par.bits, par.bps*8);
         return ALC_FALSE;
     }
 
+    device->Frequency = par.rate;
+    device->FmtChans = ((par.pchan==1) ? DevFmtMono : DevFmtStereo);
+
     if(par.bits == 8 && par.sig == 1)
         device->FmtType = DevFmtByte;
     else if(par.bits == 8 && par.sig == 0)
@@ -281,18 +193,27 @@ static ALCboolean sndio_reset_playback(ALCdevice *device)
         device->FmtType = DevFmtShort;
     else if(par.bits == 16 && par.sig == 0)
         device->FmtType = DevFmtUShort;
+    else if(par.bits == 32 && par.sig == 1)
+        device->FmtType = DevFmtInt;
+    else if(par.bits == 32 && par.sig == 0)
+        device->FmtType = DevFmtUInt;
     else
     {
         ERR("Unhandled sample format: %s %u-bit\n", (par.sig?"signed":"unsigned"), par.bits);
         return ALC_FALSE;
     }
 
-
     device->UpdateSize = par.round;
     device->NumUpdates = (par.bufsz/par.round) + 1;
 
     SetDefaultChannelOrder(device);
 
+    return ALC_TRUE;
+}
+
+static ALCboolean sndio_start_playback(ALCdevice *device)
+{
+    sndio_data *data = device->ExtraData;
 
     if(!sio_start(data->sndHandle))
     {
@@ -300,11 +221,10 @@ static ALCboolean sndio_reset_playback(ALCdevice *device)
         return ALC_FALSE;
     }
 
-    data->data_size = device->UpdateSize * par.bps * par.pchan;
+    data->data_size = device->UpdateSize * FrameSizeFromDevFmt(device->FmtChans, device->FmtType);
     data->mix_data = calloc(1, data->data_size);
 
-    data->thread = StartThread(sndio_proc, device);
-    if(data->thread == NULL)
+    if(!StartThread(&data->thread, sndio_proc, device))
     {
         sio_stop(data->sndHandle);
         free(data->mix_data);
@@ -339,13 +259,15 @@ static const BackendFuncs sndio_funcs = {
     sndio_open_playback,
     sndio_close_playback,
     sndio_reset_playback,
+    sndio_start_playback,
     sndio_stop_playback,
     NULL,
     NULL,
     NULL,
     NULL,
     NULL,
-    NULL
+    NULL,
+    ALCdevice_GetLatencyDefault
 };
 
 ALCboolean alc_sndio_init(BackendFuncs *func_list)
@@ -358,22 +280,14 @@ ALCboolean alc_sndio_init(BackendFuncs *func_list)
 
 void alc_sndio_deinit(void)
 {
-#ifdef HAVE_DYNLOAD
-    if(sndio_handle)
-        CloseLib(sndio_handle);
-    sndio_handle = NULL;
-#endif
 }
 
 void alc_sndio_probe(enum DevProbe type)
 {
     switch(type)
     {
-        case DEVICE_PROBE:
-            AppendDeviceList(sndio_device);
-            break;
         case ALL_DEVICE_PROBE:
-            AppendAllDeviceList(sndio_device);
+            AppendAllDevicesList(sndio_device);
             break;
         case CAPTURE_DEVICE_PROBE:
             break;

+ 55 - 49
jni/openal-soft-android/Alc/backends/solaris.c

@@ -30,42 +30,48 @@
 #include <unistd.h>
 #include <errno.h>
 #include <math.h>
+
 #include "alMain.h"
-#include "AL/al.h"
-#include "AL/alc.h"
+#include "alu.h"
+#include "threads.h"
+#include "compat.h"
 
 #include <sys/audioio.h>
 
 
 static const ALCchar solaris_device[] = "Solaris Default";
 
+static const char *solaris_driver = "/dev/audio";
+
 typedef struct {
     int fd;
-    volatile int killNow;
-    ALvoid *thread;
 
     ALubyte *mix_data;
     int data_size;
+
+    volatile int killNow;
+    althread_t thread;
 } solaris_data;
 
 
 static ALuint SolarisProc(ALvoid *ptr)
 {
-    ALCdevice *pDevice = (ALCdevice*)ptr;
-    solaris_data *data = (solaris_data*)pDevice->ExtraData;
+    ALCdevice *Device = (ALCdevice*)ptr;
+    solaris_data *data = (solaris_data*)Device->ExtraData;
     ALint frameSize;
     int wrote;
 
     SetRTPriority();
+    SetThreadName(MIXER_THREAD_NAME);
 
-    frameSize = FrameSizeFromDevFmt(pDevice->FmtChans, pDevice->FmtType);
+    frameSize = FrameSizeFromDevFmt(Device->FmtChans, Device->FmtType);
 
-    while(!data->killNow && pDevice->Connected)
+    while(!data->killNow && Device->Connected)
     {
         ALint len = data->data_size;
         ALubyte *WritePtr = data->mix_data;
 
-        aluMixData(pDevice, WritePtr, len/frameSize);
+        aluMixData(Device, WritePtr, len/frameSize);
         while(len > 0 && !data->killNow)
         {
             wrote = write(data->fd, WritePtr, len);
@@ -74,7 +80,9 @@ static ALuint SolarisProc(ALvoid *ptr)
                 if(errno != EAGAIN && errno != EWOULDBLOCK && errno != EINTR)
                 {
                     ERR("write failed: %s\n", strerror(errno));
-                    aluHandleDisconnect(pDevice);
+                    ALCdevice_Lock(Device);
+                    aluHandleDisconnect(Device);
+                    ALCdevice_Unlock(Device);
                     break;
                 }
 
@@ -93,12 +101,8 @@ static ALuint SolarisProc(ALvoid *ptr)
 
 static ALCenum solaris_open_playback(ALCdevice *device, const ALCchar *deviceName)
 {
-    char driver[64];
     solaris_data *data;
 
-    strncpy(driver, GetConfigValue("solaris", "device", "/dev/audio"), sizeof(driver)-1);
-    driver[sizeof(driver)-1] = 0;
-
     if(!deviceName)
         deviceName = solaris_device;
     else if(strcmp(deviceName, solaris_device) != 0)
@@ -107,15 +111,15 @@ static ALCenum solaris_open_playback(ALCdevice *device, const ALCchar *deviceNam
     data = (solaris_data*)calloc(1, sizeof(solaris_data));
     data->killNow = 0;
 
-    data->fd = open(driver, O_WRONLY);
+    data->fd = open(solaris_driver, O_WRONLY);
     if(data->fd == -1)
     {
         free(data);
-        ERR("Could not open %s: %s\n", driver, strerror(errno));
+        ERR("Could not open %s: %s\n", solaris_driver, strerror(errno));
         return ALC_INVALID_VALUE;
     }
 
-    device->szDeviceName = strdup(deviceName);
+    device->DeviceName = strdup(deviceName);
     device->ExtraData = data;
     return ALC_NO_ERROR;
 }
@@ -156,6 +160,8 @@ static ALCboolean solaris_reset_playback(ALCdevice *device)
             info.play.encoding = AUDIO_ENCODING_LINEAR8;
             break;
         case DevFmtUShort:
+        case DevFmtInt:
+        case DevFmtUInt:
         case DevFmtFloat:
             device->FmtType = DevFmtShort;
             /* fall-through */
@@ -180,34 +186,32 @@ static ALCboolean solaris_reset_playback(ALCdevice *device)
         return ALC_FALSE;
     }
 
-    if(!((info.play.precision == 8 && info.play.encoding == AUDIO_ENCODING_LINEAR &&
-          device->FmtType == DevFmtByte) ||
-         (info.play.precision == 8 && info.play.encoding == AUDIO_ENCODING_LINEAR8 &&
-          device->FmtType == DevFmtUByte) ||
-         (info.play.precision == 16 && info.play.encoding == AUDIO_ENCODING_LINEAR &&
-          device->FmtType == DevFmtShort)))
+    if(!((info.play.precision == 8 && info.play.encoding == AUDIO_ENCODING_LINEAR8 && device->FmtType == DevFmtUByte) ||
+         (info.play.precision == 8 && info.play.encoding == AUDIO_ENCODING_LINEAR && device->FmtType == DevFmtByte) ||
+         (info.play.precision == 16 && info.play.encoding == AUDIO_ENCODING_LINEAR && device->FmtType == DevFmtShort) ||
+         (info.play.precision == 32 && info.play.encoding == AUDIO_ENCODING_LINEAR && device->FmtType == DevFmtInt)))
     {
-        ERR("Could not set %#x sample type, got %d (%#x)\n",
-            device->FmtType, info.play.precision, info.play.encoding);
+        ERR("Could not set %s samples, got %d (0x%x)\n", DevFmtTypeString(device->FmtType),
+            info.play.precision, info.play.encoding);
         return ALC_FALSE;
     }
 
-    if(device->Frequency != info.play.sample_rate)
-    {
-        if((device->Flags&DEVICE_FREQUENCY_REQUEST))
-            ERR("Failed to set requested frequency %dhz, got %dhz instead\n", device->Frequency, info.play.sample_rate);
-        device->Flags &= ~DEVICE_FREQUENCY_REQUEST;
-        device->Frequency = info.play.sample_rate;
-    }
+    device->Frequency = info.play.sample_rate;
     device->UpdateSize = (info.play.buffer_size/device->NumUpdates) + 1;
 
-    data->data_size = device->UpdateSize * frameSize;
-    data->mix_data = calloc(1, data->data_size);
-
     SetDefaultChannelOrder(device);
 
-    data->thread = StartThread(SolarisProc, device);
-    if(data->thread == NULL)
+    return ALC_TRUE;
+}
+
+static ALCboolean solaris_start_playback(ALCdevice *device)
+{
+    solaris_data *data = (solaris_data*)device->ExtraData;
+
+    data->data_size = device->UpdateSize * FrameSizeFromDevFmt(device->FmtChans, device->FmtType);
+    data->mix_data = calloc(1, data->data_size);
+
+    if(!StartThread(&data->thread, SolarisProc, device))
     {
         free(data->mix_data);
         data->mix_data = NULL;
@@ -241,17 +245,21 @@ static const BackendFuncs solaris_funcs = {
     solaris_open_playback,
     solaris_close_playback,
     solaris_reset_playback,
+    solaris_start_playback,
     solaris_stop_playback,
     NULL,
     NULL,
     NULL,
     NULL,
     NULL,
-    NULL
+    NULL,
+    ALCdevice_GetLatencyDefault
 };
 
 ALCboolean alc_solaris_init(BackendFuncs *func_list)
 {
+    ConfigValueStr("solaris", "device", &solaris_driver);
+
     *func_list = solaris_funcs;
     return ALC_TRUE;
 }
@@ -262,20 +270,18 @@ void alc_solaris_deinit(void)
 
 void alc_solaris_probe(enum DevProbe type)
 {
-#ifdef HAVE_STAT
-    struct stat buf;
-    if(stat(GetConfigValue("solaris", "device", "/dev/audio"), &buf) != 0)
-        return;
-#endif
-
     switch(type)
     {
-        case DEVICE_PROBE:
-            AppendDeviceList(solaris_device);
-            break;
         case ALL_DEVICE_PROBE:
-            AppendAllDeviceList(solaris_device);
-            break;
+        {
+#ifdef HAVE_STAT
+            struct stat buf;
+            if(stat(solaris_driver, &buf) == 0)
+#endif
+                AppendAllDevicesList(solaris_device);
+        }
+        break;
+
         case CAPTURE_DEVICE_PROBE:
             break;
     }

+ 55 - 38
jni/openal-soft-android/Alc/backends/wave.c

@@ -23,9 +23,15 @@
 #include <stdlib.h>
 #include <stdio.h>
 #include <memory.h>
+#include <errno.h>
+#ifdef HAVE_WINDOWS_H
+#include <windows.h>
+#endif
+
 #include "alMain.h"
-#include "AL/al.h"
-#include "AL/alc.h"
+#include "alu.h"
+#include "threads.h"
+#include "compat.h"
 
 
 typedef struct {
@@ -36,7 +42,7 @@ typedef struct {
     ALuint size;
 
     volatile int killNow;
-    ALvoid *thread;
+    althread_t thread;
 } wave_data;
 
 
@@ -81,50 +87,47 @@ static void fwrite32le(ALuint val, FILE *f)
 
 static ALuint WaveProc(ALvoid *ptr)
 {
-    ALCdevice *pDevice = (ALCdevice*)ptr;
-    wave_data *data = (wave_data*)pDevice->ExtraData;
+    ALCdevice *Device = (ALCdevice*)ptr;
+    wave_data *data = (wave_data*)Device->ExtraData;
     ALuint frameSize;
     ALuint now, start;
     ALuint64 avail, done;
     size_t fs;
-    union {
-        short s;
-        char b[sizeof(short)];
-    } uSB;
-    const ALuint restTime = (ALuint64)pDevice->UpdateSize * 1000 /
-                            pDevice->Frequency / 2;
+    const ALuint restTime = (ALuint64)Device->UpdateSize * 1000 /
+                            Device->Frequency / 2;
+
+    SetThreadName(MIXER_THREAD_NAME);
 
-    uSB.s = 1;
-    frameSize = FrameSizeFromDevFmt(pDevice->FmtChans, pDevice->FmtType);
+    frameSize = FrameSizeFromDevFmt(Device->FmtChans, Device->FmtType);
 
     done = 0;
     start = timeGetTime();
-    while(!data->killNow && pDevice->Connected)
+    while(!data->killNow && Device->Connected)
     {
         now = timeGetTime();
 
-        avail = (ALuint64)(now-start) * pDevice->Frequency / 1000;
+        avail = (ALuint64)(now-start) * Device->Frequency / 1000;
         if(avail < done)
         {
-            /* Timer wrapped. Add the remainder of the cycle to the available
-             * count and reset the number of samples done */
-            avail += (ALuint64)0xFFFFFFFFu*pDevice->Frequency/1000 - done;
+            /* Timer wrapped (50 days???). Add the remainder of the cycle to
+             * the available count and reset the number of samples done */
+            avail += ((ALuint64)1<<32)*Device->Frequency/1000 - done;
             done = 0;
         }
-        if(avail-done < pDevice->UpdateSize)
+        if(avail-done < Device->UpdateSize)
         {
             Sleep(restTime);
             continue;
         }
 
-        while(avail-done >= pDevice->UpdateSize)
+        while(avail-done >= Device->UpdateSize)
         {
-            aluMixData(pDevice, data->buffer, pDevice->UpdateSize);
-            done += pDevice->UpdateSize;
+            aluMixData(Device, data->buffer, Device->UpdateSize);
+            done += Device->UpdateSize;
 
-            if(uSB.b[0] != 1)
+            if(!IS_LITTLE_ENDIAN)
             {
-                ALuint bytesize = BytesFromDevFmt(pDevice->FmtType);
+                ALuint bytesize = BytesFromDevFmt(Device->FmtType);
                 ALubyte *bytes = data->buffer;
                 ALuint i;
 
@@ -145,12 +148,17 @@ static ALuint WaveProc(ALvoid *ptr)
                 }
             }
             else
-                fs = fwrite(data->buffer, frameSize, pDevice->UpdateSize,
+            {
+                fs = fwrite(data->buffer, frameSize, Device->UpdateSize,
                             data->f);
+                (void)fs;
+            }
             if(ferror(data->f))
             {
                 ERR("Error writing to file\n");
-                aluHandleDisconnect(pDevice);
+                ALCdevice_Lock(Device);
+                aluHandleDisconnect(Device);
+                ALCdevice_Unlock(Device);
                 break;
             }
         }
@@ -183,7 +191,7 @@ static ALCenum wave_open_playback(ALCdevice *device, const ALCchar *deviceName)
         return ALC_INVALID_VALUE;
     }
 
-    device->szDeviceName = strdup(deviceName);
+    device->DeviceName = strdup(deviceName);
     device->ExtraData = data;
     return ALC_NO_ERROR;
 }
@@ -214,8 +222,12 @@ static ALCboolean wave_reset_playback(ALCdevice *device)
         case DevFmtUShort:
             device->FmtType = DevFmtShort;
             break;
+        case DevFmtUInt:
+            device->FmtType = DevFmtInt;
+            break;
         case DevFmtUByte:
         case DevFmtShort:
+        case DevFmtInt:
         case DevFmtFloat:
             break;
     }
@@ -250,6 +262,7 @@ static ALCboolean wave_reset_playback(ALCdevice *device)
     fwrite32le(channel_masks[channels], data->f);
     // 16 byte GUID, sub-type format
     val = fwrite(((bits==32) ? SUBTYPE_FLOAT : SUBTYPE_PCM), 1, 16, data->f);
+    (void)val;
 
     fprintf(data->f, "data");
     fwrite32le(0xFFFFFFFF, data->f); // 'data' header len; filled in at close
@@ -259,10 +272,18 @@ static ALCboolean wave_reset_playback(ALCdevice *device)
         ERR("Error writing header: %s\n", strerror(errno));
         return ALC_FALSE;
     }
-
     data->DataStart = ftell(data->f);
 
-    data->size = device->UpdateSize * channels * bits / 8;
+    SetDefaultWFXChannelOrder(device);
+
+    return ALC_TRUE;
+}
+
+static ALCboolean wave_start_playback(ALCdevice *device)
+{
+    wave_data *data = (wave_data*)device->ExtraData;
+
+    data->size = device->UpdateSize * FrameSizeFromDevFmt(device->FmtChans, device->FmtType);
     data->buffer = malloc(data->size);
     if(!data->buffer)
     {
@@ -270,10 +291,7 @@ static ALCboolean wave_reset_playback(ALCdevice *device)
         return ALC_FALSE;
     }
 
-    SetDefaultWFXChannelOrder(device);
-
-    data->thread = StartThread(WaveProc, device);
-    if(data->thread == NULL)
+    if(!StartThread(&data->thread, WaveProc, device))
     {
         free(data->buffer);
         data->buffer = NULL;
@@ -317,13 +335,15 @@ static const BackendFuncs wave_funcs = {
     wave_open_playback,
     wave_close_playback,
     wave_reset_playback,
+    wave_start_playback,
     wave_stop_playback,
     NULL,
     NULL,
     NULL,
     NULL,
     NULL,
-    NULL
+    NULL,
+    ALCdevice_GetLatencyDefault
 };
 
 ALCboolean alc_wave_init(BackendFuncs *func_list)
@@ -343,11 +363,8 @@ void alc_wave_probe(enum DevProbe type)
 
     switch(type)
     {
-        case DEVICE_PROBE:
-            AppendDeviceList(waveDevice);
-            break;
         case ALL_DEVICE_PROBE:
-            AppendAllDeviceList(waveDevice);
+            AppendAllDevicesList(waveDevice);
             break;
         case CAPTURE_DEVICE_PROBE:
             break;

+ 327 - 322
jni/openal-soft-android/Alc/backends/winmm.c

@@ -28,32 +28,34 @@
 #include <mmsystem.h>
 
 #include "alMain.h"
-#include "AL/al.h"
-#include "AL/alc.h"
+#include "alu.h"
+#include "threads.h"
+
+#ifndef WAVE_FORMAT_IEEE_FLOAT
+#define WAVE_FORMAT_IEEE_FLOAT  0x0003
+#endif
 
 
 typedef struct {
     // MMSYSTEM Device
-    volatile ALboolean bWaveShutdown;
-    HANDLE  hWaveThreadEvent;
-    HANDLE  hWaveThread;
-    DWORD   ulWaveThreadID;
-    LONG    lWaveBuffersCommitted;
+    volatile ALboolean killNow;
+    HANDLE  WaveThreadEvent;
+    HANDLE  WaveThread;
+    DWORD   WaveThreadID;
+    volatile LONG WaveBuffersCommitted;
     WAVEHDR WaveBuffer[4];
 
     union {
         HWAVEIN  In;
         HWAVEOUT Out;
-    } hWaveHandle;
+    } WaveHandle;
 
-    ALuint Frequency;
+    WAVEFORMATEX Format;
 
-    RingBuffer *pRing;
+    RingBuffer *Ring;
 } WinMMData;
 
 
-static const ALCchar woDefault[] = "WaveOut Default";
-
 static ALCchar **PlaybackDeviceList;
 static ALuint  NumPlaybackDevices;
 static ALCchar **CaptureDeviceList;
@@ -145,33 +147,16 @@ static void ProbeCaptureDevices(void)
     Posts a message to 'PlaybackThreadProc' everytime a WaveOut Buffer is completed and
     returns to the application (for more data)
 */
-static void CALLBACK WaveOutProc(HWAVEOUT hDevice,UINT uMsg,DWORD_PTR dwInstance,DWORD_PTR dwParam1,DWORD_PTR dwParam2)
+static void CALLBACK WaveOutProc(HWAVEOUT UNUSED(device), UINT msg, DWORD_PTR instance, DWORD_PTR param1, DWORD_PTR UNUSED(param2))
 {
-    ALCdevice *pDevice = (ALCdevice*)dwInstance;
-    WinMMData *pData = pDevice->ExtraData;
+    ALCdevice *Device = (ALCdevice*)instance;
+    WinMMData *data = Device->ExtraData;
 
-    (void)hDevice;
-    (void)dwParam2;
-
-    if(uMsg != WOM_DONE)
+    if(msg != WOM_DONE)
         return;
 
-    // Decrement number of buffers in use
-    InterlockedDecrement(&pData->lWaveBuffersCommitted);
-
-    if(pData->bWaveShutdown == AL_FALSE)
-    {
-        // Notify Wave Processor Thread that a Wave Header has returned
-        PostThreadMessage(pData->ulWaveThreadID, uMsg, 0, dwParam1);
-    }
-    else
-    {
-        if(pData->lWaveBuffersCommitted == 0)
-        {
-            // Post 'Quit' Message to WaveOut Processor Thread
-            PostThreadMessage(pData->ulWaveThreadID, WM_QUIT, 0, 0);
-        }
-    }
+    InterlockedDecrement(&data->WaveBuffersCommitted);
+    PostThreadMessage(data->WaveThreadID, msg, 0, param1);
 }
 
 /*
@@ -180,38 +165,44 @@ static void CALLBACK WaveOutProc(HWAVEOUT hDevice,UINT uMsg,DWORD_PTR dwInstance
     Used by "MMSYSTEM" Device.  Called when a WaveOut buffer has used up its
     audio data.
 */
-static DWORD WINAPI PlaybackThreadProc(LPVOID lpParameter)
+FORCE_ALIGN static DWORD WINAPI PlaybackThreadProc(LPVOID param)
 {
-    ALCdevice *pDevice = (ALCdevice*)lpParameter;
-    WinMMData *pData = pDevice->ExtraData;
-    LPWAVEHDR pWaveHdr;
+    ALCdevice *Device = (ALCdevice*)param;
+    WinMMData *data = Device->ExtraData;
+    LPWAVEHDR WaveHdr;
     ALuint FrameSize;
     MSG msg;
 
-    FrameSize = FrameSizeFromDevFmt(pDevice->FmtChans, pDevice->FmtType);
+    FrameSize = FrameSizeFromDevFmt(Device->FmtChans, Device->FmtType);
 
     SetRTPriority();
+    SetThreadName(MIXER_THREAD_NAME);
 
     while(GetMessage(&msg, NULL, 0, 0))
     {
-        if(msg.message != WOM_DONE || pData->bWaveShutdown)
+        if(msg.message != WOM_DONE)
             continue;
 
-        pWaveHdr = ((LPWAVEHDR)msg.lParam);
+        if(data->killNow)
+        {
+            if(data->WaveBuffersCommitted == 0)
+                break;
+            continue;
+        }
 
-        aluMixData(pDevice, pWaveHdr->lpData, pWaveHdr->dwBufferLength/FrameSize);
+        WaveHdr = ((LPWAVEHDR)msg.lParam);
+        aluMixData(Device, WaveHdr->lpData, WaveHdr->dwBufferLength/FrameSize);
 
         // Send buffer back to play more data
-        waveOutWrite(pData->hWaveHandle.Out, pWaveHdr, sizeof(WAVEHDR));
-        InterlockedIncrement(&pData->lWaveBuffersCommitted);
+        waveOutWrite(data->WaveHandle.Out, WaveHdr, sizeof(WAVEHDR));
+        InterlockedIncrement(&data->WaveBuffersCommitted);
     }
 
     // Signal Wave Thread completed event
-    if(pData->hWaveThreadEvent)
-        SetEvent(pData->hWaveThreadEvent);
+    if(data->WaveThreadEvent)
+        SetEvent(data->WaveThreadEvent);
 
     ExitThread(0);
-
     return 0;
 }
 
@@ -221,33 +212,16 @@ static DWORD WINAPI PlaybackThreadProc(LPVOID lpParameter)
     Posts a message to 'CaptureThreadProc' everytime a WaveIn Buffer is completed and
     returns to the application (with more data)
 */
-static void CALLBACK WaveInProc(HWAVEIN hDevice,UINT uMsg,DWORD_PTR dwInstance,DWORD_PTR dwParam1,DWORD_PTR dwParam2)
+static void CALLBACK WaveInProc(HWAVEIN UNUSED(device), UINT msg, DWORD_PTR instance, DWORD_PTR param1, DWORD_PTR UNUSED(param2))
 {
-    ALCdevice *pDevice = (ALCdevice*)dwInstance;
-    WinMMData *pData = pDevice->ExtraData;
+    ALCdevice *Device = (ALCdevice*)instance;
+    WinMMData *data = Device->ExtraData;
 
-    (void)hDevice;
-    (void)dwParam2;
-
-    if(uMsg != WIM_DATA)
+    if(msg != WIM_DATA)
         return;
 
-    // Decrement number of buffers in use
-    InterlockedDecrement(&pData->lWaveBuffersCommitted);
-
-    if(pData->bWaveShutdown == AL_FALSE)
-    {
-        // Notify Wave Processor Thread that a Wave Header has returned
-        PostThreadMessage(pData->ulWaveThreadID,uMsg,0,dwParam1);
-    }
-    else
-    {
-        if(pData->lWaveBuffersCommitted == 0)
-        {
-            // Post 'Quit' Message to WaveIn Processor Thread
-            PostThreadMessage(pData->ulWaveThreadID,WM_QUIT,0,0);
-        }
-    }
+    InterlockedDecrement(&data->WaveBuffersCommitted);
+    PostThreadMessage(data->WaveThreadID, msg, 0, param1);
 }
 
 /*
@@ -256,196 +230,223 @@ static void CALLBACK WaveInProc(HWAVEIN hDevice,UINT uMsg,DWORD_PTR dwInstance,D
     Used by "MMSYSTEM" Device.  Called when a WaveIn buffer had been filled with new
     audio data.
 */
-static DWORD WINAPI CaptureThreadProc(LPVOID lpParameter)
+static DWORD WINAPI CaptureThreadProc(LPVOID param)
 {
-    ALCdevice *pDevice = (ALCdevice*)lpParameter;
-    WinMMData *pData = pDevice->ExtraData;
-    LPWAVEHDR pWaveHdr;
+    ALCdevice *Device = (ALCdevice*)param;
+    WinMMData *data = Device->ExtraData;
+    LPWAVEHDR WaveHdr;
     ALuint FrameSize;
     MSG msg;
 
-    FrameSize = FrameSizeFromDevFmt(pDevice->FmtChans, pDevice->FmtType);
+    FrameSize = FrameSizeFromDevFmt(Device->FmtChans, Device->FmtType);
+    SetThreadName("alsoft-record");
 
     while(GetMessage(&msg, NULL, 0, 0))
     {
-        if(msg.message != WIM_DATA || pData->bWaveShutdown)
+        if(msg.message != WIM_DATA)
             continue;
+        /* Don't wait for other buffers to finish before quitting. We're
+         * closing so we don't need them. */
+        if(data->killNow)
+            break;
 
-        pWaveHdr = ((LPWAVEHDR)msg.lParam);
-
-        WriteRingBuffer(pData->pRing, (ALubyte*)pWaveHdr->lpData,
-                        pWaveHdr->dwBytesRecorded/FrameSize);
+        WaveHdr = ((LPWAVEHDR)msg.lParam);
+        WriteRingBuffer(data->Ring, (ALubyte*)WaveHdr->lpData, WaveHdr->dwBytesRecorded/FrameSize);
 
         // Send buffer back to capture more data
-        waveInAddBuffer(pData->hWaveHandle.In,pWaveHdr,sizeof(WAVEHDR));
-        InterlockedIncrement(&pData->lWaveBuffersCommitted);
+        waveInAddBuffer(data->WaveHandle.In, WaveHdr, sizeof(WAVEHDR));
+        InterlockedIncrement(&data->WaveBuffersCommitted);
     }
 
     // Signal Wave Thread completed event
-    if(pData->hWaveThreadEvent)
-        SetEvent(pData->hWaveThreadEvent);
+    if(data->WaveThreadEvent)
+        SetEvent(data->WaveThreadEvent);
 
     ExitThread(0);
-
     return 0;
 }
 
 
-static ALCenum WinMMOpenPlayback(ALCdevice *pDevice, const ALCchar *deviceName)
+static ALCenum WinMMOpenPlayback(ALCdevice *Device, const ALCchar *deviceName)
 {
-    WAVEFORMATEX wfexFormat;
-    WinMMData *pData = NULL;
-    UINT lDeviceID = 0;
+    WinMMData *data = NULL;
+    UINT DeviceID = 0;
     MMRESULT res;
     ALuint i = 0;
 
+    if(!PlaybackDeviceList)
+        ProbePlaybackDevices();
+
     // Find the Device ID matching the deviceName if valid
-    if(!deviceName || strcmp(deviceName, woDefault) == 0)
-        lDeviceID = WAVE_MAPPER;
-    else
+    for(i = 0;i < NumPlaybackDevices;i++)
     {
-        if(!PlaybackDeviceList)
-            ProbePlaybackDevices();
-
-        for(i = 0;i < NumPlaybackDevices;i++)
+        if(PlaybackDeviceList[i] &&
+           (!deviceName || strcmp(deviceName, PlaybackDeviceList[i]) == 0))
         {
-            if(PlaybackDeviceList[i] &&
-               strcmp(deviceName, PlaybackDeviceList[i]) == 0)
-            {
-                lDeviceID = i;
-                break;
-            }
+            DeviceID = i;
+            break;
         }
-        if(i == NumPlaybackDevices)
-            return ALC_INVALID_VALUE;
     }
+    if(i == NumPlaybackDevices)
+        return ALC_INVALID_VALUE;
 
-    pData = calloc(1, sizeof(*pData));
-    if(!pData)
+    data = calloc(1, sizeof(*data));
+    if(!data)
         return ALC_OUT_OF_MEMORY;
-    pDevice->ExtraData = pData;
+    Device->ExtraData = data;
 
-    if(pDevice->FmtChans != DevFmtMono)
+retry_open:
+    memset(&data->Format, 0, sizeof(WAVEFORMATEX));
+    if(Device->FmtType == DevFmtFloat)
     {
-        if((pDevice->Flags&DEVICE_CHANNELS_REQUEST) &&
-           pDevice->FmtChans != DevFmtStereo)
-        {
-            ERR("Failed to set %s, got Stereo instead\n", DevFmtChannelsString(pDevice->FmtChans));
-            pDevice->Flags &= ~DEVICE_CHANNELS_REQUEST;
-        }
-        pDevice->FmtChans = DevFmtStereo;
+        data->Format.wFormatTag = WAVE_FORMAT_IEEE_FLOAT;
+        data->Format.wBitsPerSample = 32;
     }
-    switch(pDevice->FmtType)
+    else
     {
-        case DevFmtByte:
-            pDevice->FmtType = DevFmtUByte;
-            break;
-        case DevFmtUShort:
-        case DevFmtFloat:
-            pDevice->FmtType = DevFmtShort;
-            break;
-        case DevFmtUByte:
-        case DevFmtShort:
-            break;
+        data->Format.wFormatTag = WAVE_FORMAT_PCM;
+        if(Device->FmtType == DevFmtUByte || Device->FmtType == DevFmtByte)
+            data->Format.wBitsPerSample = 8;
+        else
+            data->Format.wBitsPerSample = 16;
     }
-
-    memset(&wfexFormat, 0, sizeof(WAVEFORMATEX));
-    wfexFormat.wFormatTag = WAVE_FORMAT_PCM;
-    wfexFormat.nChannels = ChannelsFromDevFmt(pDevice->FmtChans);
-    wfexFormat.wBitsPerSample = BytesFromDevFmt(pDevice->FmtType) * 8;
-    wfexFormat.nBlockAlign = wfexFormat.wBitsPerSample *
-                             wfexFormat.nChannels / 8;
-    wfexFormat.nSamplesPerSec = pDevice->Frequency;
-    wfexFormat.nAvgBytesPerSec = wfexFormat.nSamplesPerSec *
-                                 wfexFormat.nBlockAlign;
-    wfexFormat.cbSize = 0;
-
-    if((res=waveOutOpen(&pData->hWaveHandle.Out, lDeviceID, &wfexFormat, (DWORD_PTR)&WaveOutProc, (DWORD_PTR)pDevice, CALLBACK_FUNCTION)) != MMSYSERR_NOERROR)
+    data->Format.nChannels = ((Device->FmtChans == DevFmtMono) ? 1 : 2);
+    data->Format.nBlockAlign = data->Format.wBitsPerSample *
+                               data->Format.nChannels / 8;
+    data->Format.nSamplesPerSec = Device->Frequency;
+    data->Format.nAvgBytesPerSec = data->Format.nSamplesPerSec *
+                                   data->Format.nBlockAlign;
+    data->Format.cbSize = 0;
+
+    if((res=waveOutOpen(&data->WaveHandle.Out, DeviceID, &data->Format, (DWORD_PTR)&WaveOutProc, (DWORD_PTR)Device, CALLBACK_FUNCTION)) != MMSYSERR_NOERROR)
     {
+        if(Device->FmtType == DevFmtFloat)
+        {
+            Device->FmtType = DevFmtShort;
+            goto retry_open;
+        }
         ERR("waveOutOpen failed: %u\n", res);
         goto failure;
     }
 
-    pData->hWaveThreadEvent = CreateEvent(NULL, FALSE, FALSE, NULL);
-    if(pData->hWaveThreadEvent == NULL)
+    data->WaveThreadEvent = CreateEvent(NULL, FALSE, FALSE, NULL);
+    if(data->WaveThreadEvent == NULL)
     {
         ERR("CreateEvent failed: %lu\n", GetLastError());
         goto failure;
     }
 
-    pData->Frequency = pDevice->Frequency;
-
-    pDevice->szDeviceName = strdup((lDeviceID==WAVE_MAPPER) ? woDefault :
-                                   PlaybackDeviceList[lDeviceID]);
+    Device->DeviceName = strdup(PlaybackDeviceList[DeviceID]);
     return ALC_NO_ERROR;
 
 failure:
-    if(pData->hWaveThreadEvent)
-        CloseHandle(pData->hWaveThreadEvent);
+    if(data->WaveThreadEvent)
+        CloseHandle(data->WaveThreadEvent);
 
-    if(pData->hWaveHandle.Out)
-        waveOutClose(pData->hWaveHandle.Out);
+    if(data->WaveHandle.Out)
+        waveOutClose(data->WaveHandle.Out);
 
-    free(pData);
-    pDevice->ExtraData = NULL;
+    free(data);
+    Device->ExtraData = NULL;
     return ALC_INVALID_VALUE;
 }
 
 static void WinMMClosePlayback(ALCdevice *device)
 {
-    WinMMData *pData = (WinMMData*)device->ExtraData;
+    WinMMData *data = (WinMMData*)device->ExtraData;
 
     // Close the Wave device
-    CloseHandle(pData->hWaveThreadEvent);
-    pData->hWaveThreadEvent = 0;
+    CloseHandle(data->WaveThreadEvent);
+    data->WaveThreadEvent = 0;
 
-    waveOutClose(pData->hWaveHandle.Out);
-    pData->hWaveHandle.Out = 0;
+    waveOutClose(data->WaveHandle.Out);
+    data->WaveHandle.Out = 0;
 
-    free(pData);
+    free(data);
     device->ExtraData = NULL;
 }
 
 static ALCboolean WinMMResetPlayback(ALCdevice *device)
 {
-    WinMMData *pData = (WinMMData*)device->ExtraData;
-    ALbyte *BufferData;
-    ALint lBufferSize;
-    ALuint i;
-
-    pData->hWaveThread = CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)PlaybackThreadProc, (LPVOID)device, 0, &pData->ulWaveThreadID);
-    if(pData->hWaveThread == NULL)
-        return ALC_FALSE;
+    WinMMData *data = (WinMMData*)device->ExtraData;
 
     device->UpdateSize = (ALuint)((ALuint64)device->UpdateSize *
-                                  pData->Frequency / device->Frequency);
-    if(device->Frequency != pData->Frequency)
+                                  data->Format.nSamplesPerSec /
+                                  device->Frequency);
+    device->UpdateSize = (device->UpdateSize*device->NumUpdates + 3) / 4;
+    device->NumUpdates = 4;
+    device->Frequency = data->Format.nSamplesPerSec;
+
+    if(data->Format.wFormatTag == WAVE_FORMAT_IEEE_FLOAT)
     {
-        if((device->Flags&DEVICE_FREQUENCY_REQUEST))
-            ERR("WinMM does not support changing sample rates (wanted %dhz, got %dhz)\n", device->Frequency, pData->Frequency);
-        device->Flags &= ~DEVICE_FREQUENCY_REQUEST;
-        device->Frequency = pData->Frequency;
+        if(data->Format.wBitsPerSample == 32)
+            device->FmtType = DevFmtFloat;
+        else
+        {
+            ERR("Unhandled IEEE float sample depth: %d\n", data->Format.wBitsPerSample);
+            return ALC_FALSE;
+        }
+    }
+    else if(data->Format.wFormatTag == WAVE_FORMAT_PCM)
+    {
+        if(data->Format.wBitsPerSample == 16)
+            device->FmtType = DevFmtShort;
+        else if(data->Format.wBitsPerSample == 8)
+            device->FmtType = DevFmtUByte;
+        else
+        {
+            ERR("Unhandled PCM sample depth: %d\n", data->Format.wBitsPerSample);
+            return ALC_FALSE;
+        }
+    }
+    else
+    {
+        ERR("Unhandled format tag: 0x%04x\n", data->Format.wFormatTag);
+        return ALC_FALSE;
     }
 
+    if(data->Format.nChannels == 2)
+        device->FmtChans = DevFmtStereo;
+    else if(data->Format.nChannels == 1)
+        device->FmtChans = DevFmtMono;
+    else
+    {
+        ERR("Unhandled channel count: %d\n", data->Format.nChannels);
+        return ALC_FALSE;
+    }
     SetDefaultWFXChannelOrder(device);
 
-    pData->lWaveBuffersCommitted = 0;
+    return ALC_TRUE;
+}
+
+static ALCboolean WinMMStartPlayback(ALCdevice *device)
+{
+    WinMMData *data = (WinMMData*)device->ExtraData;
+    ALbyte *BufferData;
+    ALint BufferSize;
+    ALuint i;
+
+    data->WaveThread = CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)PlaybackThreadProc, (LPVOID)device, 0, &data->WaveThreadID);
+    if(data->WaveThread == NULL)
+        return ALC_FALSE;
+
+    data->WaveBuffersCommitted = 0;
 
     // Create 4 Buffers
-    lBufferSize  = device->UpdateSize*device->NumUpdates / 4;
-    lBufferSize *= FrameSizeFromDevFmt(device->FmtChans, device->FmtType);
+    BufferSize  = device->UpdateSize*device->NumUpdates / 4;
+    BufferSize *= FrameSizeFromDevFmt(device->FmtChans, device->FmtType);
 
-    BufferData = calloc(4, lBufferSize);
+    BufferData = calloc(4, BufferSize);
     for(i = 0;i < 4;i++)
     {
-        memset(&pData->WaveBuffer[i], 0, sizeof(WAVEHDR));
-        pData->WaveBuffer[i].dwBufferLength = lBufferSize;
-        pData->WaveBuffer[i].lpData = ((i==0) ? (LPSTR)BufferData :
-                                       (pData->WaveBuffer[i-1].lpData +
-                                        pData->WaveBuffer[i-1].dwBufferLength));
-        waveOutPrepareHeader(pData->hWaveHandle.Out, &pData->WaveBuffer[i], sizeof(WAVEHDR));
-        waveOutWrite(pData->hWaveHandle.Out, &pData->WaveBuffer[i], sizeof(WAVEHDR));
-        InterlockedIncrement(&pData->lWaveBuffersCommitted);
+        memset(&data->WaveBuffer[i], 0, sizeof(WAVEHDR));
+        data->WaveBuffer[i].dwBufferLength = BufferSize;
+        data->WaveBuffer[i].lpData = ((i==0) ? (LPSTR)BufferData :
+                                      (data->WaveBuffer[i-1].lpData +
+                                       data->WaveBuffer[i-1].dwBufferLength));
+        waveOutPrepareHeader(data->WaveHandle.Out, &data->WaveBuffer[i], sizeof(WAVEHDR));
+        waveOutWrite(data->WaveHandle.Out, &data->WaveBuffer[i], sizeof(WAVEHDR));
+        InterlockedIncrement(&data->WaveBuffersCommitted);
     }
 
     return ALC_TRUE;
@@ -453,43 +454,42 @@ static ALCboolean WinMMResetPlayback(ALCdevice *device)
 
 static void WinMMStopPlayback(ALCdevice *device)
 {
-    WinMMData *pData = (WinMMData*)device->ExtraData;
+    WinMMData *data = (WinMMData*)device->ExtraData;
     void *buffer = NULL;
     int i;
 
-    if(pData->hWaveThread == NULL)
+    if(data->WaveThread == NULL)
         return;
 
     // Set flag to stop processing headers
-    pData->bWaveShutdown = AL_TRUE;
+    data->killNow = AL_TRUE;
 
     // Wait for signal that Wave Thread has been destroyed
-    WaitForSingleObjectEx(pData->hWaveThreadEvent, 5000, FALSE);
+    WaitForSingleObjectEx(data->WaveThreadEvent, 5000, FALSE);
 
-    CloseHandle(pData->hWaveThread);
-    pData->hWaveThread = 0;
+    CloseHandle(data->WaveThread);
+    data->WaveThread = 0;
 
-    pData->bWaveShutdown = AL_FALSE;
+    data->killNow = AL_FALSE;
 
     // Release the wave buffers
     for(i = 0;i < 4;i++)
     {
-        waveOutUnprepareHeader(pData->hWaveHandle.Out, &pData->WaveBuffer[i], sizeof(WAVEHDR));
-        if(i == 0) buffer = pData->WaveBuffer[i].lpData;
-        pData->WaveBuffer[i].lpData = NULL;
+        waveOutUnprepareHeader(data->WaveHandle.Out, &data->WaveBuffer[i], sizeof(WAVEHDR));
+        if(i == 0) buffer = data->WaveBuffer[i].lpData;
+        data->WaveBuffer[i].lpData = NULL;
     }
     free(buffer);
 }
 
 
-static ALCenum WinMMOpenCapture(ALCdevice *pDevice, const ALCchar *deviceName)
+static ALCenum WinMMOpenCapture(ALCdevice *Device, const ALCchar *deviceName)
 {
-    WAVEFORMATEX wfexCaptureFormat;
     ALbyte *BufferData = NULL;
-    DWORD ulCapturedDataSize;
-    WinMMData *pData = NULL;
-    UINT lDeviceID = 0;
-    ALint lBufferSize;
+    DWORD CapturedDataSize;
+    WinMMData *data = NULL;
+    UINT DeviceID = 0;
+    ALint BufferSize;
     MMRESULT res;
     ALuint i;
 
@@ -497,196 +497,207 @@ static ALCenum WinMMOpenCapture(ALCdevice *pDevice, const ALCchar *deviceName)
         ProbeCaptureDevices();
 
     // Find the Device ID matching the deviceName if valid
-    if(deviceName)
-    {
-        for(i = 0;i < NumCaptureDevices;i++)
-        {
-            if(CaptureDeviceList[i] &&
-               strcmp(deviceName, CaptureDeviceList[i]) == 0)
-            {
-                lDeviceID = i;
-                break;
-            }
-        }
-    }
-    else
+    for(i = 0;i < NumCaptureDevices;i++)
     {
-        for(i = 0;i < NumCaptureDevices;i++)
+        if(CaptureDeviceList[i] &&
+           (!deviceName || strcmp(deviceName, CaptureDeviceList[i]) == 0))
         {
-            if(CaptureDeviceList[i])
-            {
-                lDeviceID = i;
-                break;
-            }
+            DeviceID = i;
+            break;
         }
     }
     if(i == NumCaptureDevices)
         return ALC_INVALID_VALUE;
 
-    pData = calloc(1, sizeof(*pData));
-    if(!pData)
-        return ALC_OUT_OF_MEMORY;
-    pDevice->ExtraData = pData;
+    switch(Device->FmtChans)
+    {
+        case DevFmtMono:
+        case DevFmtStereo:
+            break;
 
-    if((pDevice->FmtChans != DevFmtMono && pDevice->FmtChans != DevFmtStereo) ||
-       (pDevice->FmtType != DevFmtUByte && pDevice->FmtType != DevFmtShort))
-        goto failure;
+        case DevFmtQuad:
+        case DevFmtX51:
+        case DevFmtX51Side:
+        case DevFmtX61:
+        case DevFmtX71:
+            return ALC_INVALID_ENUM;
+    }
+
+    switch(Device->FmtType)
+    {
+        case DevFmtUByte:
+        case DevFmtShort:
+        case DevFmtInt:
+        case DevFmtFloat:
+            break;
+
+        case DevFmtByte:
+        case DevFmtUShort:
+        case DevFmtUInt:
+            return ALC_INVALID_ENUM;
+    }
 
-    memset(&wfexCaptureFormat, 0, sizeof(WAVEFORMATEX));
-    wfexCaptureFormat.wFormatTag = WAVE_FORMAT_PCM;
-    wfexCaptureFormat.nChannels = ChannelsFromDevFmt(pDevice->FmtChans);
-    wfexCaptureFormat.wBitsPerSample = BytesFromDevFmt(pDevice->FmtType) * 8;
-    wfexCaptureFormat.nBlockAlign = wfexCaptureFormat.wBitsPerSample *
-                                    wfexCaptureFormat.nChannels / 8;
-    wfexCaptureFormat.nSamplesPerSec = pDevice->Frequency;
-    wfexCaptureFormat.nAvgBytesPerSec = wfexCaptureFormat.nSamplesPerSec *
-                                        wfexCaptureFormat.nBlockAlign;
-    wfexCaptureFormat.cbSize = 0;
-
-    if((res=waveInOpen(&pData->hWaveHandle.In, lDeviceID, &wfexCaptureFormat, (DWORD_PTR)&WaveInProc, (DWORD_PTR)pDevice, CALLBACK_FUNCTION)) != MMSYSERR_NOERROR)
+    data = calloc(1, sizeof(*data));
+    if(!data)
+        return ALC_OUT_OF_MEMORY;
+    Device->ExtraData = data;
+
+    memset(&data->Format, 0, sizeof(WAVEFORMATEX));
+    data->Format.wFormatTag = ((Device->FmtType == DevFmtFloat) ?
+                               WAVE_FORMAT_IEEE_FLOAT : WAVE_FORMAT_PCM);
+    data->Format.nChannels = ChannelsFromDevFmt(Device->FmtChans);
+    data->Format.wBitsPerSample = BytesFromDevFmt(Device->FmtType) * 8;
+    data->Format.nBlockAlign = data->Format.wBitsPerSample *
+                               data->Format.nChannels / 8;
+    data->Format.nSamplesPerSec = Device->Frequency;
+    data->Format.nAvgBytesPerSec = data->Format.nSamplesPerSec *
+                                   data->Format.nBlockAlign;
+    data->Format.cbSize = 0;
+
+    if((res=waveInOpen(&data->WaveHandle.In, DeviceID, &data->Format, (DWORD_PTR)&WaveInProc, (DWORD_PTR)Device, CALLBACK_FUNCTION)) != MMSYSERR_NOERROR)
     {
         ERR("waveInOpen failed: %u\n", res);
         goto failure;
     }
 
-    pData->hWaveThreadEvent = CreateEvent(NULL, FALSE, FALSE, NULL);
-    if(pData->hWaveThreadEvent == NULL)
+    data->WaveThreadEvent = CreateEvent(NULL, FALSE, FALSE, NULL);
+    if(data->WaveThreadEvent == NULL)
     {
         ERR("CreateEvent failed: %lu\n", GetLastError());
         goto failure;
     }
 
-    pData->Frequency = pDevice->Frequency;
-
     // Allocate circular memory buffer for the captured audio
-    ulCapturedDataSize = pDevice->UpdateSize*pDevice->NumUpdates;
+    CapturedDataSize = Device->UpdateSize*Device->NumUpdates;
 
     // Make sure circular buffer is at least 100ms in size
-    if(ulCapturedDataSize < (wfexCaptureFormat.nSamplesPerSec / 10))
-        ulCapturedDataSize = wfexCaptureFormat.nSamplesPerSec / 10;
+    if(CapturedDataSize < (data->Format.nSamplesPerSec / 10))
+        CapturedDataSize = data->Format.nSamplesPerSec / 10;
 
-    pData->pRing = CreateRingBuffer(wfexCaptureFormat.nBlockAlign, ulCapturedDataSize);
-    if(!pData->pRing)
+    data->Ring = CreateRingBuffer(data->Format.nBlockAlign, CapturedDataSize);
+    if(!data->Ring)
         goto failure;
 
-    pData->lWaveBuffersCommitted = 0;
+    data->WaveBuffersCommitted = 0;
 
     // Create 4 Buffers of 50ms each
-    lBufferSize = wfexCaptureFormat.nAvgBytesPerSec / 20;
-    lBufferSize -= (lBufferSize % wfexCaptureFormat.nBlockAlign);
+    BufferSize = data->Format.nAvgBytesPerSec / 20;
+    BufferSize -= (BufferSize % data->Format.nBlockAlign);
 
-    BufferData = calloc(4, lBufferSize);
+    BufferData = calloc(4, BufferSize);
     if(!BufferData)
         goto failure;
 
     for(i = 0;i < 4;i++)
     {
-        memset(&pData->WaveBuffer[i], 0, sizeof(WAVEHDR));
-        pData->WaveBuffer[i].dwBufferLength = lBufferSize;
-        pData->WaveBuffer[i].lpData = ((i==0) ? (LPSTR)BufferData :
-                                       (pData->WaveBuffer[i-1].lpData +
-                                        pData->WaveBuffer[i-1].dwBufferLength));
-        pData->WaveBuffer[i].dwFlags = 0;
-        pData->WaveBuffer[i].dwLoops = 0;
-        waveInPrepareHeader(pData->hWaveHandle.In, &pData->WaveBuffer[i], sizeof(WAVEHDR));
-        waveInAddBuffer(pData->hWaveHandle.In, &pData->WaveBuffer[i], sizeof(WAVEHDR));
-        InterlockedIncrement(&pData->lWaveBuffersCommitted);
+        memset(&data->WaveBuffer[i], 0, sizeof(WAVEHDR));
+        data->WaveBuffer[i].dwBufferLength = BufferSize;
+        data->WaveBuffer[i].lpData = ((i==0) ? (LPSTR)BufferData :
+                                      (data->WaveBuffer[i-1].lpData +
+                                       data->WaveBuffer[i-1].dwBufferLength));
+        data->WaveBuffer[i].dwFlags = 0;
+        data->WaveBuffer[i].dwLoops = 0;
+        waveInPrepareHeader(data->WaveHandle.In, &data->WaveBuffer[i], sizeof(WAVEHDR));
+        waveInAddBuffer(data->WaveHandle.In, &data->WaveBuffer[i], sizeof(WAVEHDR));
+        InterlockedIncrement(&data->WaveBuffersCommitted);
     }
 
-    pData->hWaveThread = CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)CaptureThreadProc, (LPVOID)pDevice, 0, &pData->ulWaveThreadID);
-    if (pData->hWaveThread == NULL)
+    data->WaveThread = CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)CaptureThreadProc, (LPVOID)Device, 0, &data->WaveThreadID);
+    if (data->WaveThread == NULL)
         goto failure;
 
-    pDevice->szDeviceName = strdup(CaptureDeviceList[lDeviceID]);
+    Device->DeviceName = strdup(CaptureDeviceList[DeviceID]);
     return ALC_NO_ERROR;
 
 failure:
-    if(pData->hWaveThread)
-        CloseHandle(pData->hWaveThread);
+    if(data->WaveThread)
+        CloseHandle(data->WaveThread);
 
     if(BufferData)
     {
         for(i = 0;i < 4;i++)
-            waveInUnprepareHeader(pData->hWaveHandle.In, &pData->WaveBuffer[i], sizeof(WAVEHDR));
+            waveInUnprepareHeader(data->WaveHandle.In, &data->WaveBuffer[i], sizeof(WAVEHDR));
         free(BufferData);
     }
 
-    if(pData->pRing)
-        DestroyRingBuffer(pData->pRing);
+    if(data->Ring)
+        DestroyRingBuffer(data->Ring);
 
-    if(pData->hWaveThreadEvent)
-        CloseHandle(pData->hWaveThreadEvent);
+    if(data->WaveThreadEvent)
+        CloseHandle(data->WaveThreadEvent);
 
-    if(pData->hWaveHandle.In)
-        waveInClose(pData->hWaveHandle.In);
+    if(data->WaveHandle.In)
+        waveInClose(data->WaveHandle.In);
 
-    free(pData);
-    pDevice->ExtraData = NULL;
+    free(data);
+    Device->ExtraData = NULL;
     return ALC_INVALID_VALUE;
 }
 
-static void WinMMCloseCapture(ALCdevice *pDevice)
+static void WinMMCloseCapture(ALCdevice *Device)
 {
-    WinMMData *pData = (WinMMData*)pDevice->ExtraData;
+    WinMMData *data = (WinMMData*)Device->ExtraData;
     void *buffer = NULL;
     int i;
 
-    // Call waveOutReset to shutdown wave device
-    pData->bWaveShutdown = AL_TRUE;
-    waveInReset(pData->hWaveHandle.In);
+    /* Tell the processing thread to quit and wait for it to do so. */
+    data->killNow = AL_TRUE;
+    PostThreadMessage(data->WaveThreadID, WM_QUIT, 0, 0);
 
-    // Wait for signal that Wave Thread has been destroyed
-    WaitForSingleObjectEx(pData->hWaveThreadEvent, 5000, FALSE);
+    WaitForSingleObjectEx(data->WaveThreadEvent, 5000, FALSE);
 
-    CloseHandle(pData->hWaveThread);
-    pData->hWaveThread = 0;
+    /* Make sure capture is stopped and all pending buffers are flushed. */
+    waveInReset(data->WaveHandle.In);
+
+    CloseHandle(data->WaveThread);
+    data->WaveThread = 0;
 
     // Release the wave buffers
     for(i = 0;i < 4;i++)
     {
-        waveInUnprepareHeader(pData->hWaveHandle.In, &pData->WaveBuffer[i], sizeof(WAVEHDR));
-        if(i == 0) buffer = pData->WaveBuffer[i].lpData;
-        pData->WaveBuffer[i].lpData = NULL;
+        waveInUnprepareHeader(data->WaveHandle.In, &data->WaveBuffer[i], sizeof(WAVEHDR));
+        if(i == 0) buffer = data->WaveBuffer[i].lpData;
+        data->WaveBuffer[i].lpData = NULL;
     }
     free(buffer);
 
-    DestroyRingBuffer(pData->pRing);
-    pData->pRing = NULL;
+    DestroyRingBuffer(data->Ring);
+    data->Ring = NULL;
 
     // Close the Wave device
-    CloseHandle(pData->hWaveThreadEvent);
-    pData->hWaveThreadEvent = 0;
+    CloseHandle(data->WaveThreadEvent);
+    data->WaveThreadEvent = 0;
 
-    waveInClose(pData->hWaveHandle.In);
-    pData->hWaveHandle.In = 0;
+    waveInClose(data->WaveHandle.In);
+    data->WaveHandle.In = 0;
 
-    free(pData);
-    pDevice->ExtraData = NULL;
+    free(data);
+    Device->ExtraData = NULL;
 }
 
-static void WinMMStartCapture(ALCdevice *pDevice)
+static void WinMMStartCapture(ALCdevice *Device)
 {
-    WinMMData *pData = (WinMMData*)pDevice->ExtraData;
-    waveInStart(pData->hWaveHandle.In);
+    WinMMData *data = (WinMMData*)Device->ExtraData;
+    waveInStart(data->WaveHandle.In);
 }
 
-static void WinMMStopCapture(ALCdevice *pDevice)
+static void WinMMStopCapture(ALCdevice *Device)
 {
-    WinMMData *pData = (WinMMData*)pDevice->ExtraData;
-    waveInStop(pData->hWaveHandle.In);
+    WinMMData *data = (WinMMData*)Device->ExtraData;
+    waveInStop(data->WaveHandle.In);
 }
 
-static ALCenum WinMMCaptureSamples(ALCdevice *pDevice, ALCvoid *pBuffer, ALCuint lSamples)
+static ALCenum WinMMCaptureSamples(ALCdevice *Device, ALCvoid *Buffer, ALCuint Samples)
 {
-    WinMMData *pData = (WinMMData*)pDevice->ExtraData;
-    ReadRingBuffer(pData->pRing, pBuffer, lSamples);
+    WinMMData *data = (WinMMData*)Device->ExtraData;
+    ReadRingBuffer(data->Ring, Buffer, Samples);
     return ALC_NO_ERROR;
 }
 
-static ALCuint WinMMAvailableSamples(ALCdevice *pDevice)
+static ALCuint WinMMAvailableSamples(ALCdevice *Device)
 {
-    WinMMData *pData = (WinMMData*)pDevice->ExtraData;
-    return RingBufferSize(pData->pRing);
+    WinMMData *data = (WinMMData*)Device->ExtraData;
+    return RingBufferSize(data->Ring);
 }
 
 
@@ -694,13 +705,15 @@ static const BackendFuncs WinMMFuncs = {
     WinMMOpenPlayback,
     WinMMClosePlayback,
     WinMMResetPlayback,
+    WinMMStartPlayback,
     WinMMStopPlayback,
     WinMMOpenCapture,
     WinMMCloseCapture,
     WinMMStartCapture,
     WinMMStopCapture,
     WinMMCaptureSamples,
-    WinMMAvailableSamples
+    WinMMAvailableSamples,
+    ALCdevice_GetLatencyDefault
 };
 
 ALCboolean alcWinMMInit(BackendFuncs *FuncList)
@@ -711,18 +724,18 @@ ALCboolean alcWinMMInit(BackendFuncs *FuncList)
 
 void alcWinMMDeinit()
 {
-    ALuint lLoop;
+    ALuint i;
 
-    for(lLoop = 0;lLoop < NumPlaybackDevices;lLoop++)
-        free(PlaybackDeviceList[lLoop]);
+    for(i = 0;i < NumPlaybackDevices;i++)
+        free(PlaybackDeviceList[i]);
     free(PlaybackDeviceList);
     PlaybackDeviceList = NULL;
 
     NumPlaybackDevices = 0;
 
 
-    for(lLoop = 0; lLoop < NumCaptureDevices; lLoop++)
-        free(CaptureDeviceList[lLoop]);
+    for(i = 0;i < NumCaptureDevices;i++)
+        free(CaptureDeviceList[i]);
     free(CaptureDeviceList);
     CaptureDeviceList = NULL;
 
@@ -735,20 +748,12 @@ void alcWinMMProbe(enum DevProbe type)
 
     switch(type)
     {
-        case DEVICE_PROBE:
-            ProbePlaybackDevices();
-            if(NumPlaybackDevices > 0)
-                AppendDeviceList(woDefault);
-            break;
-
         case ALL_DEVICE_PROBE:
             ProbePlaybackDevices();
-            if(NumPlaybackDevices > 0)
-                AppendAllDeviceList(woDefault);
             for(i = 0;i < NumPlaybackDevices;i++)
             {
                 if(PlaybackDeviceList[i])
-                    AppendAllDeviceList(PlaybackDeviceList[i]);
+                    AppendAllDevicesList(PlaybackDeviceList[i]);
             }
             break;
 

+ 2 - 18
jni/openal-soft-android/Alc/bs2b.c

@@ -24,6 +24,7 @@
 #include "config.h"
 
 #include <math.h>
+#include <string.h>
 
 #include "bs2b.h"
 
@@ -147,26 +148,9 @@ int bs2b_get_srate(struct bs2b *bs2b)
 
 void bs2b_clear(struct bs2b *bs2b)
 {
-    int loopv = sizeof(bs2b->last_sample);
-
-    while (loopv)
-    {
-        ((char *)&bs2b->last_sample)[--loopv] = 0;
-    }
+    memset(&bs2b->last_sample, 0, sizeof(bs2b->last_sample));
 } /* bs2b_clear */
 
-int bs2b_is_clear(struct bs2b *bs2b)
-{
-    int loopv = sizeof(bs2b->last_sample);
-
-    while (loopv)
-    {
-        if (((char *)&bs2b->last_sample)[--loopv] != 0)
-            return 0;
-    }
-    return 1;
-} /* bs2b_is_clear */
-
 void bs2b_cross_feed(struct bs2b *bs2b, float *sample)
 {
     /* Lowpass filter */

+ 65 - 0
jni/openal-soft-android/Alc/compat.h

@@ -0,0 +1,65 @@
+#ifndef AL_COMPAT_H
+#define AL_COMPAT_H
+
+#include "AL/al.h"
+
+#ifdef _WIN32
+
+#define WIN32_LEAN_AND_MEAN
+#include <windows.h>
+
+typedef DWORD althread_key_t;
+int althread_key_create(althread_key_t *key, void (*callback)(void*));
+int althread_key_delete(althread_key_t key);
+void *althread_getspecific(althread_key_t key);
+int althread_setspecific(althread_key_t key, void *val);
+
+typedef LONG althread_once_t;
+#define ALTHREAD_ONCE_INIT 0
+void althread_once(althread_once_t *once, void (*callback)(void));
+
+inline int alsched_yield(void)
+{ SwitchToThread(); return 0; }
+
+WCHAR *strdupW(const WCHAR *str);
+
+#define HAVE_DYNLOAD 1
+
+#else
+
+#include <pthread.h>
+
+typedef pthread_mutex_t CRITICAL_SECTION;
+void InitializeCriticalSection(CRITICAL_SECTION *cs);
+void DeleteCriticalSection(CRITICAL_SECTION *cs);
+void EnterCriticalSection(CRITICAL_SECTION *cs);
+void LeaveCriticalSection(CRITICAL_SECTION *cs);
+
+ALuint timeGetTime(void);
+void Sleep(ALuint t);
+
+#define althread_key_t pthread_key_t
+#define althread_key_create pthread_key_create
+#define althread_key_delete pthread_key_delete
+#define althread_getspecific pthread_getspecific
+#define althread_setspecific pthread_setspecific
+
+#define althread_once_t pthread_once_t
+#define ALTHREAD_ONCE_INIT PTHREAD_ONCE_INIT
+#define althread_once pthread_once
+
+#define alsched_yield sched_yield
+
+#if defined(HAVE_DLFCN_H)
+#define HAVE_DYNLOAD 1
+#endif
+
+#endif
+
+#ifdef HAVE_DYNLOAD
+void *LoadLib(const char *name);
+void CloseLib(void *handle);
+void *GetSymbol(void *handle, const char *name);
+#endif
+
+#endif /* AL_COMPAT_H */

+ 275 - 0
jni/openal-soft-android/Alc/effects/autowah.c

@@ -0,0 +1,275 @@
+/**
+ * OpenAL cross platform audio library
+ * Copyright (C) 2013 by Anis A. Hireche, Nasca Octavian Paul
+ * This library is free software; you can redistribute it and/or
+ *  modify it under the terms of the GNU Library General Public
+ *  License as published by the Free Software Foundation; either
+ *  version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ *  but WITHOUT ANY WARRANTY; without even the implied warranty of
+ *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ *  Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public
+ *  License along with this library; if not, write to the
+ *  Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+ *  Boston, MA  02111-1307, USA.
+ * Or go to http://www.gnu.org/copyleft/lgpl.html
+ */
+
+#include <stdlib.h>
+
+#include "config.h"
+#include "alu.h"
+#include "alFilter.h"
+#include "alError.h"
+#include "alMain.h"
+#include "alAuxEffectSlot.h"
+
+
+/* Auto-wah is simply a low-pass filter with a cutoff frequency that shifts up
+ * or down depending on the input signal, and a resonant peak at the cutoff.
+ *
+ * Currently, we assume a cutoff frequency range of 500hz (no amplitude) to
+ * 3khz (peak gain). Peak gain is assumed to be in normalized scale.
+ */
+
+typedef struct ALautowahState {
+    DERIVE_FROM_TYPE(ALeffectState);
+
+    /* Effect gains for each channel */
+    ALfloat Gain[MaxChannels];
+
+    /* Effect parameters */
+    ALfloat AttackRate;
+    ALfloat ReleaseRate;
+    ALfloat Resonance;
+    ALfloat PeakGain;
+    ALfloat GainCtrl;
+    ALfloat Frequency;
+
+    /* Samples processing */
+    ALfilterState LowPass;
+} ALautowahState;
+
+static ALvoid ALautowahState_Destruct(ALautowahState *UNUSED(state))
+{
+}
+
+static ALboolean ALautowahState_deviceUpdate(ALautowahState *state, ALCdevice *device)
+{
+    state->Frequency = device->Frequency;
+    return AL_TRUE;
+}
+
+static ALvoid ALautowahState_update(ALautowahState *state, ALCdevice *device, const ALeffectslot *slot)
+{
+    ALfloat attackTime, releaseTime;
+    ALfloat gain;
+
+    attackTime = slot->EffectProps.Autowah.AttackTime * state->Frequency;
+    releaseTime = slot->EffectProps.Autowah.ReleaseTime * state->Frequency;
+
+    state->AttackRate = 1.0f / attackTime;
+    state->ReleaseRate = 1.0f / releaseTime;
+    state->PeakGain = slot->EffectProps.Autowah.PeakGain;
+    state->Resonance = slot->EffectProps.Autowah.Resonance;
+
+    gain = sqrtf(1.0f / device->NumChan) * slot->Gain;
+    SetGains(device, gain, state->Gain);
+}
+
+static ALvoid ALautowahState_process(ALautowahState *state, ALuint SamplesToDo, const ALfloat *SamplesIn, ALfloat (*SamplesOut)[BUFFERSIZE])
+{
+    ALuint it, kt;
+    ALuint base;
+
+    for(base = 0;base < SamplesToDo;)
+    {
+        ALfloat temps[64];
+        ALuint td = minu(SamplesToDo-base, 64);
+        ALfloat gain = state->GainCtrl;
+
+        for(it = 0;it < td;it++)
+        {
+            ALfloat smp = SamplesIn[it+base];
+            ALfloat alpha, w0;
+            ALfloat amplitude;
+            ALfloat cutoff;
+
+            /* Similar to compressor, we get the current amplitude of the
+             * incoming signal, and attack or release to reach it. */
+            amplitude = fabs(smp);
+            if(amplitude > gain)
+                gain = minf(gain+state->AttackRate, amplitude);
+            else if(amplitude < gain)
+                gain = maxf(gain-state->ReleaseRate, amplitude);
+            gain = maxf(gain, GAIN_SILENCE_THRESHOLD);
+
+            /* FIXME: What range does the filter cover? */
+            cutoff = lerp(1000.0f, (ALfloat)LOWPASSFREQREF, minf(gain/state->PeakGain, 1.0f));
+
+            /* The code below is like calling ALfilterState_setParams with
+             * ALfilterType_LowPass. However, instead of passing a bandwidth,
+             * we use the resonance property for Q. This also inlines the call.
+             */
+            w0 = F_2PI * cutoff / state->Frequency;
+
+            /* FIXME: Resonance controls the resonant peak, or Q. How? Not sure
+             * that Q = resonance*0.1. */
+            alpha = sinf(w0) / (2.0f * state->Resonance*0.1f);
+            state->LowPass.b[0] = (1.0f - cosf(w0)) / 2.0f;
+            state->LowPass.b[1] =  1.0f - cosf(w0);
+            state->LowPass.b[2] = (1.0f - cosf(w0)) / 2.0f;
+            state->LowPass.a[0] =  1.0f + alpha;
+            state->LowPass.a[1] = -2.0f * cosf(w0);
+            state->LowPass.a[2] =  1.0f - alpha;
+
+            state->LowPass.b[2] /= state->LowPass.a[0];
+            state->LowPass.b[1] /= state->LowPass.a[0];
+            state->LowPass.b[0] /= state->LowPass.a[0];
+            state->LowPass.a[2] /= state->LowPass.a[0];
+            state->LowPass.a[1] /= state->LowPass.a[0];
+            state->LowPass.a[0] /= state->LowPass.a[0];
+
+            temps[it] = ALfilterState_processSingle(&state->LowPass, smp);
+        }
+        state->GainCtrl = gain;
+
+        for(kt = 0;kt < MaxChannels;kt++)
+        {
+            ALfloat gain = state->Gain[kt];
+            if(!(gain > GAIN_SILENCE_THRESHOLD))
+                continue;
+
+            for(it = 0;it < td;it++)
+                SamplesOut[kt][base+it] += gain * temps[it];
+        }
+
+        base += td;
+    }
+}
+
+static void ALautowahState_Delete(ALautowahState *state)
+{
+    free(state);
+}
+
+DEFINE_ALEFFECTSTATE_VTABLE(ALautowahState);
+
+
+typedef struct ALautowahStateFactory {
+    DERIVE_FROM_TYPE(ALeffectStateFactory);
+} ALautowahStateFactory;
+
+static ALeffectState *ALautowahStateFactory_create(ALautowahStateFactory *UNUSED(factory))
+{
+    ALautowahState *state;
+
+    state = malloc(sizeof(*state));
+    if(!state) return NULL;
+    SET_VTABLE2(ALautowahState, ALeffectState, state);
+
+    state->AttackRate = 0.0f;
+    state->ReleaseRate = 0.0f;
+    state->Resonance = 0.0f;
+    state->PeakGain = 1.0f;
+    state->GainCtrl = 1.0f;
+
+    ALfilterState_clear(&state->LowPass);
+
+    return STATIC_CAST(ALeffectState, state);
+}
+
+DEFINE_ALEFFECTSTATEFACTORY_VTABLE(ALautowahStateFactory);
+
+ALeffectStateFactory *ALautowahStateFactory_getFactory(void)
+{
+    static ALautowahStateFactory AutowahFactory = { { GET_VTABLE2(ALautowahStateFactory, ALeffectStateFactory) } };
+
+    return STATIC_CAST(ALeffectStateFactory, &AutowahFactory);
+}
+
+
+void ALautowah_setParami(ALeffect *UNUSED(effect), ALCcontext *context, ALenum UNUSED(param), ALint UNUSED(val))
+{ SET_ERROR_AND_RETURN(context, AL_INVALID_ENUM); }
+void ALautowah_setParamiv(ALeffect *effect, ALCcontext *context, ALenum param, const ALint *vals)
+{
+    ALautowah_setParami(effect, context, param, vals[0]);
+}
+void ALautowah_setParamf(ALeffect *effect, ALCcontext *context, ALenum param, ALfloat val)
+{
+    ALeffectProps *props = &effect->Props;
+    switch(param)
+    {
+        case AL_AUTOWAH_ATTACK_TIME:
+            if(!(val >= AL_AUTOWAH_MIN_ATTACK_TIME && val <= AL_AUTOWAH_MAX_ATTACK_TIME))
+                SET_ERROR_AND_RETURN(context, AL_INVALID_VALUE);
+            props->Autowah.AttackTime = val;
+            break;
+
+        case AL_AUTOWAH_RELEASE_TIME:
+            if(!(val >= AL_AUTOWAH_MIN_RELEASE_TIME && val <= AL_AUTOWAH_MAX_RELEASE_TIME))
+                SET_ERROR_AND_RETURN(context, AL_INVALID_VALUE);
+            props->Autowah.ReleaseTime = val;
+            break;
+
+        case AL_AUTOWAH_RESONANCE:
+            if(!(val >= AL_AUTOWAH_MIN_RESONANCE && val <= AL_AUTOWAH_MAX_RESONANCE))
+                SET_ERROR_AND_RETURN(context, AL_INVALID_VALUE);
+            props->Autowah.Resonance = val;
+            break;
+
+        case AL_AUTOWAH_PEAK_GAIN:
+            if(!(val >= AL_AUTOWAH_MIN_PEAK_GAIN && val <= AL_AUTOWAH_MAX_PEAK_GAIN))
+                SET_ERROR_AND_RETURN(context, AL_INVALID_VALUE);
+            props->Autowah.PeakGain = val;
+            break;
+
+        default:
+            SET_ERROR_AND_RETURN(context, AL_INVALID_ENUM);
+    }
+}
+void ALautowah_setParamfv(ALeffect *effect, ALCcontext *context, ALenum param, const ALfloat *vals)
+{
+    ALautowah_setParamf(effect, context, param, vals[0]);
+}
+
+void ALautowah_getParami(const ALeffect *UNUSED(effect), ALCcontext *context, ALenum UNUSED(param), ALint *UNUSED(val))
+{ SET_ERROR_AND_RETURN(context, AL_INVALID_ENUM); }
+void ALautowah_getParamiv(const ALeffect *effect, ALCcontext *context, ALenum param, ALint *vals)
+{
+    ALautowah_getParami(effect, context, param, vals);
+}
+void ALautowah_getParamf(const ALeffect *effect, ALCcontext *context, ALenum param, ALfloat *val)
+{
+    const ALeffectProps *props = &effect->Props;
+    switch(param)
+    {
+        case AL_AUTOWAH_ATTACK_TIME:
+            *val = props->Autowah.AttackTime;
+            break;
+
+        case AL_AUTOWAH_RELEASE_TIME:
+            *val = props->Autowah.ReleaseTime;
+            break;
+
+        case AL_AUTOWAH_RESONANCE:
+            *val = props->Autowah.Resonance;
+            break;
+
+        case AL_AUTOWAH_PEAK_GAIN:
+            *val = props->Autowah.PeakGain;
+            break;
+
+        default:
+            SET_ERROR_AND_RETURN(context, AL_INVALID_ENUM);
+    }
+}
+void ALautowah_getParamfv(const ALeffect *effect, ALCcontext *context, ALenum param, ALfloat *vals)
+{
+    ALautowah_getParamf(effect, context, param, vals);
+}
+
+DEFINE_ALEFFECT_VTABLE(ALautowah);

+ 381 - 0
jni/openal-soft-android/Alc/effects/chorus.c

@@ -0,0 +1,381 @@
+/**
+ * OpenAL cross platform audio library
+ * Copyright (C) 2013 by Mike Gorchak
+ * This library is free software; you can redistribute it and/or
+ *  modify it under the terms of the GNU Library General Public
+ *  License as published by the Free Software Foundation; either
+ *  version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ *  but WITHOUT ANY WARRANTY; without even the implied warranty of
+ *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ *  Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public
+ *  License along with this library; if not, write to the
+ *  Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+ *  Boston, MA  02111-1307, USA.
+ * Or go to http://www.gnu.org/copyleft/lgpl.html
+ */
+
+#include "config.h"
+
+#include <math.h>
+#include <stdlib.h>
+
+#include "alMain.h"
+#include "alFilter.h"
+#include "alAuxEffectSlot.h"
+#include "alError.h"
+#include "alu.h"
+
+
+typedef struct ALchorusState {
+    DERIVE_FROM_TYPE(ALeffectState);
+
+    ALfloat *SampleBuffer[2];
+    ALuint BufferLength;
+    ALuint offset;
+    ALuint lfo_range;
+    ALfloat lfo_scale;
+    ALint lfo_disp;
+
+    /* Gains for left and right sides */
+    ALfloat Gain[2][MaxChannels];
+
+    /* effect parameters */
+    ALint waveform;
+    ALint delay;
+    ALfloat depth;
+    ALfloat feedback;
+} ALchorusState;
+
+static ALvoid ALchorusState_Destruct(ALchorusState *state)
+{
+    free(state->SampleBuffer[0]);
+    state->SampleBuffer[0] = NULL;
+    state->SampleBuffer[1] = NULL;
+}
+
+static ALboolean ALchorusState_deviceUpdate(ALchorusState *state, ALCdevice *Device)
+{
+    ALuint maxlen;
+    ALuint it;
+
+    maxlen = fastf2u(AL_CHORUS_MAX_DELAY * 3.0f * Device->Frequency) + 1;
+    maxlen = NextPowerOf2(maxlen);
+
+    if(maxlen != state->BufferLength)
+    {
+        void *temp;
+
+        temp = realloc(state->SampleBuffer[0], maxlen * sizeof(ALfloat) * 2);
+        if(!temp) return AL_FALSE;
+        state->SampleBuffer[0] = temp;
+        state->SampleBuffer[1] = state->SampleBuffer[0] + maxlen;
+
+        state->BufferLength = maxlen;
+    }
+
+    for(it = 0;it < state->BufferLength;it++)
+    {
+        state->SampleBuffer[0][it] = 0.0f;
+        state->SampleBuffer[1][it] = 0.0f;
+    }
+
+    return AL_TRUE;
+}
+
+static ALvoid ALchorusState_update(ALchorusState *state, ALCdevice *Device, const ALeffectslot *Slot)
+{
+    ALfloat frequency = (ALfloat)Device->Frequency;
+    ALfloat rate;
+    ALint phase;
+
+    state->waveform = Slot->EffectProps.Chorus.Waveform;
+    state->depth = Slot->EffectProps.Chorus.Depth;
+    state->feedback = Slot->EffectProps.Chorus.Feedback;
+    state->delay = fastf2i(Slot->EffectProps.Chorus.Delay * frequency);
+
+    /* Gains for left and right sides */
+    ComputeAngleGains(Device, atan2f(-1.0f, 0.0f), 0.0f, Slot->Gain, state->Gain[0]);
+    ComputeAngleGains(Device, atan2f(+1.0f, 0.0f), 0.0f, Slot->Gain, state->Gain[1]);
+
+    phase = Slot->EffectProps.Chorus.Phase;
+    rate = Slot->EffectProps.Chorus.Rate;
+    if(!(rate > 0.0f))
+    {
+        state->lfo_scale = 0.0f;
+        state->lfo_range = 1;
+        state->lfo_disp = 0;
+    }
+    else
+    {
+        /* Calculate LFO coefficient */
+        state->lfo_range = fastf2u(frequency/rate + 0.5f);
+        switch(state->waveform)
+        {
+            case AL_CHORUS_WAVEFORM_TRIANGLE:
+                state->lfo_scale = 4.0f / state->lfo_range;
+                break;
+            case AL_CHORUS_WAVEFORM_SINUSOID:
+                state->lfo_scale = F_2PI / state->lfo_range;
+                break;
+        }
+
+        /* Calculate lfo phase displacement */
+        state->lfo_disp = fastf2i(state->lfo_range * (phase/360.0f));
+    }
+}
+
+static inline void Triangle(ALint *delay_left, ALint *delay_right, ALuint offset, const ALchorusState *state)
+{
+    ALfloat lfo_value;
+
+    lfo_value = 2.0f - fabsf(2.0f - state->lfo_scale*(offset%state->lfo_range));
+    lfo_value *= state->depth * state->delay;
+    *delay_left = fastf2i(lfo_value) + state->delay;
+
+    offset += state->lfo_disp;
+    lfo_value = 2.0f - fabsf(2.0f - state->lfo_scale*(offset%state->lfo_range));
+    lfo_value *= state->depth * state->delay;
+    *delay_right = fastf2i(lfo_value) + state->delay;
+}
+
+static inline void Sinusoid(ALint *delay_left, ALint *delay_right, ALuint offset, const ALchorusState *state)
+{
+    ALfloat lfo_value;
+
+    lfo_value = 1.0f + sinf(state->lfo_scale*(offset%state->lfo_range));
+    lfo_value *= state->depth * state->delay;
+    *delay_left = fastf2i(lfo_value) + state->delay;
+
+    offset += state->lfo_disp;
+    lfo_value = 1.0f + sinf(state->lfo_scale*(offset%state->lfo_range));
+    lfo_value *= state->depth * state->delay;
+    *delay_right = fastf2i(lfo_value) + state->delay;
+}
+
+#define DECL_TEMPLATE(Func)                                                   \
+static void Process##Func(ALchorusState *state, const ALuint SamplesToDo,     \
+  const ALfloat *restrict SamplesIn, ALfloat (*restrict out)[2])              \
+{                                                                             \
+    const ALuint bufmask = state->BufferLength-1;                             \
+    ALfloat *restrict leftbuf = state->SampleBuffer[0];                       \
+    ALfloat *restrict rightbuf = state->SampleBuffer[1];                      \
+    ALuint offset = state->offset;                                            \
+    const ALfloat feedback = state->feedback;                                 \
+    ALuint it;                                                                \
+                                                                              \
+    for(it = 0;it < SamplesToDo;it++)                                         \
+    {                                                                         \
+        ALint delay_left, delay_right;                                        \
+        Func(&delay_left, &delay_right, offset, state);                       \
+                                                                              \
+        out[it][0] = leftbuf[(offset-delay_left)&bufmask];                    \
+        leftbuf[offset&bufmask] = (out[it][0]+SamplesIn[it]) * feedback;      \
+                                                                              \
+        out[it][1] = rightbuf[(offset-delay_right)&bufmask];                  \
+        rightbuf[offset&bufmask] = (out[it][1]+SamplesIn[it]) * feedback;     \
+                                                                              \
+        offset++;                                                             \
+    }                                                                         \
+    state->offset = offset;                                                   \
+}
+
+DECL_TEMPLATE(Triangle)
+DECL_TEMPLATE(Sinusoid)
+
+#undef DECL_TEMPLATE
+
+static ALvoid ALchorusState_process(ALchorusState *state, ALuint SamplesToDo, const ALfloat *restrict SamplesIn, ALfloat (*restrict SamplesOut)[BUFFERSIZE])
+{
+    ALuint it, kt;
+    ALuint base;
+
+    for(base = 0;base < SamplesToDo;)
+    {
+        ALfloat temps[64][2];
+        ALuint td = minu(SamplesToDo-base, 64);
+
+        if(state->waveform == AL_CHORUS_WAVEFORM_TRIANGLE)
+            ProcessTriangle(state, td, SamplesIn+base, temps);
+        else if(state->waveform == AL_CHORUS_WAVEFORM_SINUSOID)
+            ProcessSinusoid(state, td, SamplesIn+base, temps);
+
+        for(kt = 0;kt < MaxChannels;kt++)
+        {
+            ALfloat gain = state->Gain[0][kt];
+            if(gain > GAIN_SILENCE_THRESHOLD)
+            {
+                for(it = 0;it < td;it++)
+                    SamplesOut[kt][it+base] += temps[it][0] * gain;
+            }
+
+            gain = state->Gain[1][kt];
+            if(gain > GAIN_SILENCE_THRESHOLD)
+            {
+                for(it = 0;it < td;it++)
+                    SamplesOut[kt][it+base] += temps[it][1] * gain;
+            }
+        }
+
+        base += td;
+    }
+}
+
+static void ALchorusState_Delete(ALchorusState *state)
+{
+    free(state);
+}
+
+DEFINE_ALEFFECTSTATE_VTABLE(ALchorusState);
+
+
+typedef struct ALchorusStateFactory {
+    DERIVE_FROM_TYPE(ALeffectStateFactory);
+} ALchorusStateFactory;
+
+static ALeffectState *ALchorusStateFactory_create(ALchorusStateFactory *UNUSED(factory))
+{
+    ALchorusState *state;
+
+    state = malloc(sizeof(*state));
+    if(!state) return NULL;
+    SET_VTABLE2(ALchorusState, ALeffectState, state);
+
+    state->BufferLength = 0;
+    state->SampleBuffer[0] = NULL;
+    state->SampleBuffer[1] = NULL;
+    state->offset = 0;
+    state->lfo_range = 1;
+
+    return STATIC_CAST(ALeffectState, state);
+}
+
+DEFINE_ALEFFECTSTATEFACTORY_VTABLE(ALchorusStateFactory);
+
+
+ALeffectStateFactory *ALchorusStateFactory_getFactory(void)
+{
+    static ALchorusStateFactory ChorusFactory = { { GET_VTABLE2(ALchorusStateFactory, ALeffectStateFactory) } };
+
+    return STATIC_CAST(ALeffectStateFactory, &ChorusFactory);
+}
+
+
+void ALchorus_setParami(ALeffect *effect, ALCcontext *context, ALenum param, ALint val)
+{
+    ALeffectProps *props = &effect->Props;
+    switch(param)
+    {
+        case AL_CHORUS_WAVEFORM:
+            if(!(val >= AL_CHORUS_MIN_WAVEFORM && val <= AL_CHORUS_MAX_WAVEFORM))
+                SET_ERROR_AND_RETURN(context, AL_INVALID_VALUE);
+            props->Chorus.Waveform = val;
+            break;
+
+        case AL_CHORUS_PHASE:
+            if(!(val >= AL_CHORUS_MIN_PHASE && val <= AL_CHORUS_MAX_PHASE))
+                SET_ERROR_AND_RETURN(context, AL_INVALID_VALUE);
+            props->Chorus.Phase = val;
+            break;
+
+        default:
+            SET_ERROR_AND_RETURN(context, AL_INVALID_ENUM);
+    }
+}
+void ALchorus_setParamiv(ALeffect *effect, ALCcontext *context, ALenum param, const ALint *vals)
+{
+    ALchorus_setParami(effect, context, param, vals[0]);
+}
+void ALchorus_setParamf(ALeffect *effect, ALCcontext *context, ALenum param, ALfloat val)
+{
+    ALeffectProps *props = &effect->Props;
+    switch(param)
+    {
+        case AL_CHORUS_RATE:
+            if(!(val >= AL_CHORUS_MIN_RATE && val <= AL_CHORUS_MAX_RATE))
+                SET_ERROR_AND_RETURN(context, AL_INVALID_VALUE);
+            props->Chorus.Rate = val;
+            break;
+
+        case AL_CHORUS_DEPTH:
+            if(!(val >= AL_CHORUS_MIN_DEPTH && val <= AL_CHORUS_MAX_DEPTH))
+                SET_ERROR_AND_RETURN(context, AL_INVALID_VALUE);
+            props->Chorus.Depth = val;
+            break;
+
+        case AL_CHORUS_FEEDBACK:
+            if(!(val >= AL_CHORUS_MIN_FEEDBACK && val <= AL_CHORUS_MAX_FEEDBACK))
+                SET_ERROR_AND_RETURN(context, AL_INVALID_VALUE);
+            props->Chorus.Feedback = val;
+            break;
+
+        case AL_CHORUS_DELAY:
+            if(!(val >= AL_CHORUS_MIN_DELAY && val <= AL_CHORUS_MAX_DELAY))
+                SET_ERROR_AND_RETURN(context, AL_INVALID_VALUE);
+            props->Chorus.Delay = val;
+            break;
+
+        default:
+            SET_ERROR_AND_RETURN(context, AL_INVALID_ENUM);
+    }
+}
+void ALchorus_setParamfv(ALeffect *effect, ALCcontext *context, ALenum param, const ALfloat *vals)
+{
+    ALchorus_setParamf(effect, context, param, vals[0]);
+}
+
+void ALchorus_getParami(const ALeffect *effect, ALCcontext *context, ALenum param, ALint *val)
+{
+    const ALeffectProps *props = &effect->Props;
+    switch(param)
+    {
+        case AL_CHORUS_WAVEFORM:
+            *val = props->Chorus.Waveform;
+            break;
+
+        case AL_CHORUS_PHASE:
+            *val = props->Chorus.Phase;
+            break;
+
+        default:
+            SET_ERROR_AND_RETURN(context, AL_INVALID_ENUM);
+    }
+}
+void ALchorus_getParamiv(const ALeffect *effect, ALCcontext *context, ALenum param, ALint *vals)
+{
+    ALchorus_getParami(effect, context, param, vals);
+}
+void ALchorus_getParamf(const ALeffect *effect, ALCcontext *context, ALenum param, ALfloat *val)
+{
+    const ALeffectProps *props = &effect->Props;
+    switch(param)
+    {
+        case AL_CHORUS_RATE:
+            *val = props->Chorus.Rate;
+            break;
+
+        case AL_CHORUS_DEPTH:
+            *val = props->Chorus.Depth;
+            break;
+
+        case AL_CHORUS_FEEDBACK:
+            *val = props->Chorus.Feedback;
+            break;
+
+        case AL_CHORUS_DELAY:
+            *val = props->Chorus.Delay;
+            break;
+
+        default:
+            SET_ERROR_AND_RETURN(context, AL_INVALID_ENUM);
+    }
+}
+void ALchorus_getParamfv(const ALeffect *effect, ALCcontext *context, ALenum param, ALfloat *vals)
+{
+    ALchorus_getParamf(effect, context, param, vals);
+}
+
+DEFINE_ALEFFECT_VTABLE(ALchorus);

+ 223 - 0
jni/openal-soft-android/Alc/effects/compressor.c

@@ -0,0 +1,223 @@
+/**
+ * OpenAL cross platform audio library
+ * Copyright (C) 2013 by Anis A. Hireche
+ * This library is free software; you can redistribute it and/or
+ *  modify it under the terms of the GNU Library General Public
+ *  License as published by the Free Software Foundation; either
+ *  version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ *  but WITHOUT ANY WARRANTY; without even the implied warranty of
+ *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ *  Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public
+ *  License along with this library; if not, write to the
+ *  Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+ *  Boston, MA  02111-1307, USA.
+ * Or go to http://www.gnu.org/copyleft/lgpl.html
+ */
+
+#include <stdlib.h>
+
+#include "config.h"
+#include "alError.h"
+#include "alMain.h"
+#include "alAuxEffectSlot.h"
+#include "alu.h"
+
+
+typedef struct ALcompressorState {
+    DERIVE_FROM_TYPE(ALeffectState);
+
+    /* Effect gains for each channel */
+    ALfloat Gain[MaxChannels];
+
+    /* Effect parameters */
+    ALboolean Enabled;
+    ALfloat AttackRate;
+    ALfloat ReleaseRate;
+    ALfloat GainCtrl;
+} ALcompressorState;
+
+static ALvoid ALcompressorState_Destruct(ALcompressorState *UNUSED(state))
+{
+}
+
+static ALboolean ALcompressorState_deviceUpdate(ALcompressorState *state, ALCdevice *device)
+{
+    const ALfloat attackTime = device->Frequency * 0.2f; /* 200ms Attack */
+    const ALfloat releaseTime = device->Frequency * 0.4f; /* 400ms Release */
+
+    state->AttackRate = 1.0f / attackTime;
+    state->ReleaseRate = 1.0f / releaseTime;
+
+    return AL_TRUE;
+}
+
+static ALvoid ALcompressorState_update(ALcompressorState *state, ALCdevice *Device, const ALeffectslot *Slot)
+{
+    ALfloat gain;
+
+    state->Enabled = Slot->EffectProps.Compressor.OnOff;
+
+    gain = sqrtf(1.0f / Device->NumChan) * Slot->Gain;
+    SetGains(Device, gain, state->Gain);
+}
+
+static ALvoid ALcompressorState_process(ALcompressorState *state, ALuint SamplesToDo, const ALfloat *SamplesIn, ALfloat (*SamplesOut)[BUFFERSIZE])
+{
+    ALuint it, kt;
+    ALuint base;
+
+    for(base = 0;base < SamplesToDo;)
+    {
+        ALfloat temps[64];
+        ALuint td = minu(SamplesToDo-base, 64);
+
+        if(state->Enabled)
+        {
+            ALfloat output, smp, amplitude;
+            ALfloat gain = state->GainCtrl;
+
+            for(it = 0;it < td;it++)
+            {
+                smp = SamplesIn[it+base];
+
+                amplitude = fabs(smp);
+                if(amplitude > gain)
+                    gain = minf(gain+state->AttackRate, amplitude);
+                else if(amplitude < gain)
+                    gain = maxf(gain-state->ReleaseRate, amplitude);
+                output = 1.0 / clampf(gain, 0.5f, 2.0f);
+
+                temps[it] = smp * output;
+            }
+
+            state->GainCtrl = gain;
+        }
+        else
+        {
+            ALfloat output, smp, amplitude;
+            ALfloat gain = state->GainCtrl;
+
+            for(it = 0;it < td;it++)
+            {
+                smp = SamplesIn[it+base];
+
+                amplitude = 1.0f;
+                if(amplitude > gain)
+                    gain = minf(gain+state->AttackRate, amplitude);
+                else if(amplitude < gain)
+                    gain = maxf(gain-state->ReleaseRate, amplitude);
+                output = 1.0f / clampf(gain, 0.5f, 2.0f);
+
+                temps[it] = smp * output;
+            }
+
+            state->GainCtrl = gain;
+        }
+
+
+        for(kt = 0;kt < MaxChannels;kt++)
+        {
+            ALfloat gain = state->Gain[kt];
+            if(!(gain > GAIN_SILENCE_THRESHOLD))
+                continue;
+
+            for(it = 0;it < td;it++)
+                SamplesOut[kt][base+it] += gain * temps[it];
+        }
+
+        base += td;
+    }
+}
+
+static void ALcompressorState_Delete(ALcompressorState *state)
+{
+    free(state);
+}
+
+DEFINE_ALEFFECTSTATE_VTABLE(ALcompressorState);
+
+
+typedef struct ALcompressorStateFactory {
+    DERIVE_FROM_TYPE(ALeffectStateFactory);
+} ALcompressorStateFactory;
+
+static ALeffectState *ALcompressorStateFactory_create(ALcompressorStateFactory *UNUSED(factory))
+{
+    ALcompressorState *state;
+
+    state = malloc(sizeof(*state));
+    if(!state) return NULL;
+    SET_VTABLE2(ALcompressorState, ALeffectState, state);
+
+    state->Enabled = AL_TRUE;
+    state->AttackRate = 0.0f;
+    state->ReleaseRate = 0.0f;
+    state->GainCtrl = 1.0f;
+
+    return STATIC_CAST(ALeffectState, state);
+}
+
+DEFINE_ALEFFECTSTATEFACTORY_VTABLE(ALcompressorStateFactory);
+
+ALeffectStateFactory *ALcompressorStateFactory_getFactory(void)
+{
+    static ALcompressorStateFactory CompressorFactory = { { GET_VTABLE2(ALcompressorStateFactory, ALeffectStateFactory) } };
+
+    return STATIC_CAST(ALeffectStateFactory, &CompressorFactory);
+}
+
+
+void ALcompressor_setParami(ALeffect *effect, ALCcontext *context, ALenum param, ALint val)
+{
+    ALeffectProps *props = &effect->Props;
+    switch(param)
+    {
+        case AL_COMPRESSOR_ONOFF:
+            if(!(val >= AL_COMPRESSOR_MIN_ONOFF && val <= AL_COMPRESSOR_MAX_ONOFF))
+                SET_ERROR_AND_RETURN(context, AL_INVALID_VALUE);
+            props->Compressor.OnOff = val;
+            break;
+
+    default:
+        SET_ERROR_AND_RETURN(context, AL_INVALID_ENUM);
+    }
+}
+void ALcompressor_setParamiv(ALeffect *effect, ALCcontext *context, ALenum param, const ALint *vals)
+{
+    ALcompressor_setParami(effect, context, param, vals[0]);
+}
+void ALcompressor_setParamf(ALeffect *UNUSED(effect), ALCcontext *context, ALenum UNUSED(param), ALfloat UNUSED(val))
+{ SET_ERROR_AND_RETURN(context, AL_INVALID_ENUM); }
+void ALcompressor_setParamfv(ALeffect *effect, ALCcontext *context, ALenum param, const ALfloat *vals)
+{
+    ALcompressor_setParamf(effect, context, param, vals[0]);
+}
+
+void ALcompressor_getParami(const ALeffect *effect, ALCcontext *context, ALenum param, ALint *val)
+{ 
+    const ALeffectProps *props = &effect->Props;
+    switch(param)
+    {
+        case AL_COMPRESSOR_ONOFF:
+            *val = props->Compressor.OnOff;
+            break;
+        default:
+            SET_ERROR_AND_RETURN(context, AL_INVALID_ENUM);
+    }
+}
+void ALcompressor_getParamiv(const ALeffect *effect, ALCcontext *context, ALenum param, ALint *vals)
+{
+    ALcompressor_getParami(effect, context, param, vals);
+}
+void ALcompressor_getParamf(const ALeffect *UNUSED(effect), ALCcontext *context, ALenum UNUSED(param), ALfloat *UNUSED(val))
+{ SET_ERROR_AND_RETURN(context, AL_INVALID_ENUM); }
+void ALcompressor_getParamfv(const ALeffect *effect, ALCcontext *context, ALenum param, ALfloat *vals)
+{
+    ALcompressor_getParamf(effect, context, param, vals);
+}
+
+DEFINE_ALEFFECT_VTABLE(ALcompressor);

+ 167 - 0
jni/openal-soft-android/Alc/effects/dedicated.c

@@ -0,0 +1,167 @@
+/**
+ * OpenAL cross platform audio library
+ * Copyright (C) 2011 by Chris Robinson.
+ * This library is free software; you can redistribute it and/or
+ *  modify it under the terms of the GNU Library General Public
+ *  License as published by the Free Software Foundation; either
+ *  version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ *  but WITHOUT ANY WARRANTY; without even the implied warranty of
+ *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ *  Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public
+ *  License along with this library; if not, write to the
+ *  Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+ *  Boston, MA  02111-1307, USA.
+ * Or go to http://www.gnu.org/copyleft/lgpl.html
+ */
+
+#include "config.h"
+
+#include <stdlib.h>
+
+#include "alMain.h"
+#include "alFilter.h"
+#include "alAuxEffectSlot.h"
+#include "alError.h"
+#include "alu.h"
+
+
+typedef struct ALdedicatedState {
+    DERIVE_FROM_TYPE(ALeffectState);
+
+    ALfloat gains[MaxChannels];
+} ALdedicatedState;
+
+
+static ALvoid ALdedicatedState_Destruct(ALdedicatedState *UNUSED(state))
+{
+}
+
+static ALboolean ALdedicatedState_deviceUpdate(ALdedicatedState *UNUSED(state), ALCdevice *UNUSED(device))
+{
+    return AL_TRUE;
+}
+
+static ALvoid ALdedicatedState_update(ALdedicatedState *state, ALCdevice *device, const ALeffectslot *Slot)
+{
+    ALfloat Gain;
+    ALsizei s;
+
+    Gain = Slot->Gain * Slot->EffectProps.Dedicated.Gain;
+    if(Slot->EffectType == AL_EFFECT_DEDICATED_DIALOGUE)
+        ComputeAngleGains(device, atan2f(0.0f, 1.0f), 0.0f, Gain, state->gains);
+    else if(Slot->EffectType == AL_EFFECT_DEDICATED_LOW_FREQUENCY_EFFECT)
+    {
+        for(s = 0;s < MaxChannels;s++)
+            state->gains[s] = 0.0f;
+        state->gains[LFE] = Gain;
+    }
+}
+
+static ALvoid ALdedicatedState_process(ALdedicatedState *state, ALuint SamplesToDo, const ALfloat *restrict SamplesIn, ALfloat (*restrict SamplesOut)[BUFFERSIZE])
+{
+    const ALfloat *gains = state->gains;
+    ALuint i, c;
+
+    for(c = 0;c < MaxChannels;c++)
+    {
+        if(!(gains[c] > GAIN_SILENCE_THRESHOLD))
+            continue;
+
+        for(i = 0;i < SamplesToDo;i++)
+            SamplesOut[c][i] = SamplesIn[i] * gains[c];
+    }
+}
+
+static void ALdedicatedState_Delete(ALdedicatedState *state)
+{
+    free(state);
+}
+
+DEFINE_ALEFFECTSTATE_VTABLE(ALdedicatedState);
+
+
+typedef struct ALdedicatedStateFactory {
+    DERIVE_FROM_TYPE(ALeffectStateFactory);
+} ALdedicatedStateFactory;
+
+ALeffectState *ALdedicatedStateFactory_create(ALdedicatedStateFactory *UNUSED(factory))
+{
+    ALdedicatedState *state;
+    ALsizei s;
+
+    state = malloc(sizeof(*state));
+    if(!state) return NULL;
+    SET_VTABLE2(ALdedicatedState, ALeffectState, state);
+
+    for(s = 0;s < MaxChannels;s++)
+        state->gains[s] = 0.0f;
+
+    return STATIC_CAST(ALeffectState, state);
+}
+
+DEFINE_ALEFFECTSTATEFACTORY_VTABLE(ALdedicatedStateFactory);
+
+
+ALeffectStateFactory *ALdedicatedStateFactory_getFactory(void)
+{
+    static ALdedicatedStateFactory DedicatedFactory = { { GET_VTABLE2(ALdedicatedStateFactory, ALeffectStateFactory) } };
+
+    return STATIC_CAST(ALeffectStateFactory, &DedicatedFactory);
+}
+
+
+void ALdedicated_setParami(ALeffect *UNUSED(effect), ALCcontext *context, ALenum UNUSED(param), ALint UNUSED(val))
+{ SET_ERROR_AND_RETURN(context, AL_INVALID_ENUM); }
+void ALdedicated_setParamiv(ALeffect *effect, ALCcontext *context, ALenum param, const ALint *vals)
+{
+    ALdedicated_setParami(effect, context, param, vals[0]);
+}
+void ALdedicated_setParamf(ALeffect *effect, ALCcontext *context, ALenum param, ALfloat val)
+{
+    ALeffectProps *props = &effect->Props;
+    switch(param)
+    {
+        case AL_DEDICATED_GAIN:
+            if(!(val >= 0.0f && isfinite(val)))
+                SET_ERROR_AND_RETURN(context, AL_INVALID_VALUE);
+            props->Dedicated.Gain = val;
+            break;
+
+        default:
+            SET_ERROR_AND_RETURN(context, AL_INVALID_ENUM);
+    }
+}
+void ALdedicated_setParamfv(ALeffect *effect, ALCcontext *context, ALenum param, const ALfloat *vals)
+{
+    ALdedicated_setParamf(effect, context, param, vals[0]);
+}
+
+void ALdedicated_getParami(const ALeffect *UNUSED(effect), ALCcontext *context, ALenum UNUSED(param), ALint *UNUSED(val))
+{ SET_ERROR_AND_RETURN(context, AL_INVALID_ENUM); }
+void ALdedicated_getParamiv(const ALeffect *effect, ALCcontext *context, ALenum param, ALint *vals)
+{
+    ALdedicated_getParami(effect, context, param, vals);
+}
+void ALdedicated_getParamf(const ALeffect *effect, ALCcontext *context, ALenum param, ALfloat *val)
+{
+    const ALeffectProps *props = &effect->Props;
+    switch(param)
+    {
+        case AL_DEDICATED_GAIN:
+            *val = props->Dedicated.Gain;
+            break;
+
+        default:
+            SET_ERROR_AND_RETURN(context, AL_INVALID_ENUM);
+    }
+}
+void ALdedicated_getParamfv(const ALeffect *effect, ALCcontext *context, ALenum param, ALfloat *vals)
+{
+    ALdedicated_getParamf(effect, context, param, vals);
+}
+
+DEFINE_ALEFFECT_VTABLE(ALdedicated);

+ 300 - 0
jni/openal-soft-android/Alc/effects/distortion.c

@@ -0,0 +1,300 @@
+/**
+ * OpenAL cross platform audio library
+ * Copyright (C) 2013 by Mike Gorchak
+ * This library is free software; you can redistribute it and/or
+ *  modify it under the terms of the GNU Library General Public
+ *  License as published by the Free Software Foundation; either
+ *  version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ *  but WITHOUT ANY WARRANTY; without even the implied warranty of
+ *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ *  Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public
+ *  License along with this library; if not, write to the
+ *  Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+ *  Boston, MA  02111-1307, USA.
+ * Or go to http://www.gnu.org/copyleft/lgpl.html
+ */
+
+#include "config.h"
+
+#include <math.h>
+#include <stdlib.h>
+
+#include "alMain.h"
+#include "alFilter.h"
+#include "alAuxEffectSlot.h"
+#include "alError.h"
+#include "alu.h"
+
+
+typedef struct ALdistortionState {
+    DERIVE_FROM_TYPE(ALeffectState);
+
+    /* Effect gains for each channel */
+    ALfloat Gain[MaxChannels];
+
+    /* Effect parameters */
+    ALfilterState lowpass;
+    ALfilterState bandpass;
+    ALfloat attenuation;
+    ALfloat edge_coeff;
+} ALdistortionState;
+
+static ALvoid ALdistortionState_Destruct(ALdistortionState *UNUSED(state))
+{
+}
+
+static ALboolean ALdistortionState_deviceUpdate(ALdistortionState *UNUSED(state), ALCdevice *UNUSED(device))
+{
+    return AL_TRUE;
+}
+
+static ALvoid ALdistortionState_update(ALdistortionState *state, ALCdevice *Device, const ALeffectslot *Slot)
+{
+    ALfloat frequency = (ALfloat)Device->Frequency;
+    ALfloat bandwidth;
+    ALfloat cutoff;
+    ALfloat edge;
+    ALfloat gain;
+
+    /* Store distorted signal attenuation settings */
+    state->attenuation = Slot->EffectProps.Distortion.Gain;
+
+    /* Store waveshaper edge settings */
+    edge = sinf(Slot->EffectProps.Distortion.Edge * (F_PI_2));
+    edge = minf(edge, 0.99f);
+    state->edge_coeff = 2.0f * edge / (1.0f-edge);
+
+    /* Lowpass filter */
+    cutoff = Slot->EffectProps.Distortion.LowpassCutoff;
+    /* Bandwidth value is constant in octaves */
+    bandwidth = (cutoff / 2.0f) / (cutoff * 0.67f);
+    ALfilterState_setParams(&state->lowpass, ALfilterType_LowPass, 1.0f,
+                            cutoff / (frequency*4.0f), bandwidth);
+
+    /* Bandpass filter */
+    cutoff = Slot->EffectProps.Distortion.EQCenter;
+    /* Convert bandwidth in Hz to octaves */
+    bandwidth = Slot->EffectProps.Distortion.EQBandwidth / (cutoff * 0.67f);
+    ALfilterState_setParams(&state->bandpass, ALfilterType_BandPass, 1.0f,
+                            cutoff / (frequency*4.0f), bandwidth);
+
+    gain = sqrtf(1.0f / Device->NumChan) * Slot->Gain;
+    SetGains(Device, gain, state->Gain);
+}
+
+static ALvoid ALdistortionState_process(ALdistortionState *state, ALuint SamplesToDo, const ALfloat *restrict SamplesIn, ALfloat (*restrict SamplesOut)[BUFFERSIZE])
+{
+    const ALfloat fc = state->edge_coeff;
+    float oversample_buffer[64][4];
+    ALuint base;
+    ALuint it;
+    ALuint ot;
+    ALuint kt;
+
+    for(base = 0;base < SamplesToDo;)
+    {
+        ALfloat temps[64];
+        ALuint td = minu(SamplesToDo-base, 64);
+
+        /* Perform 4x oversampling to avoid aliasing.   */
+        /* Oversampling greatly improves distortion     */
+        /* quality and allows to implement lowpass and  */
+        /* bandpass filters using high frequencies, at  */
+        /* which classic IIR filters became unstable.   */
+
+        /* Fill oversample buffer using zero stuffing */
+        for(it = 0;it < td;it++)
+        {
+            oversample_buffer[it][0] = SamplesIn[it+base];
+            oversample_buffer[it][1] = 0.0f;
+            oversample_buffer[it][2] = 0.0f;
+            oversample_buffer[it][3] = 0.0f;
+        }
+
+        /* First step, do lowpass filtering of original signal,  */
+        /* additionally perform buffer interpolation and lowpass */
+        /* cutoff for oversampling (which is fortunately first   */
+        /* step of distortion). So combine three operations into */
+        /* the one.                                              */
+        for(it = 0;it < td;it++)
+        {
+            for(ot = 0;ot < 4;ot++)
+            {
+                ALfloat smp;
+                smp = ALfilterState_processSingle(&state->lowpass, oversample_buffer[it][ot]);
+
+                /* Restore signal power by multiplying sample by amount of oversampling */
+                oversample_buffer[it][ot] = smp * 4.0f;
+            }
+        }
+
+        for(it = 0;it < td;it++)
+        {
+            /* Second step, do distortion using waveshaper function  */
+            /* to emulate signal processing during tube overdriving. */
+            /* Three steps of waveshaping are intended to modify     */
+            /* waveform without boost/clipping/attenuation process.  */
+            for(ot = 0;ot < 4;ot++)
+            {
+                ALfloat smp = oversample_buffer[it][ot];
+
+                smp = (1.0f + fc) * smp/(1.0f + fc*fabsf(smp));
+                smp = (1.0f + fc) * smp/(1.0f + fc*fabsf(smp)) * -1.0f;
+                smp = (1.0f + fc) * smp/(1.0f + fc*fabsf(smp));
+
+                /* Third step, do bandpass filtering of distorted signal */
+                smp = ALfilterState_processSingle(&state->bandpass, smp);
+                oversample_buffer[it][ot] = smp;
+            }
+
+            /* Fourth step, final, do attenuation and perform decimation, */
+            /* store only one sample out of 4.                            */
+            temps[it] = oversample_buffer[it][0] * state->attenuation;
+        }
+
+        for(kt = 0;kt < MaxChannels;kt++)
+        {
+            ALfloat gain = state->Gain[kt];
+            if(!(gain > GAIN_SILENCE_THRESHOLD))
+                continue;
+
+            for(it = 0;it < td;it++)
+                SamplesOut[kt][base+it] += gain * temps[it];
+        }
+
+        base += td;
+    }
+}
+
+static void ALdistortionState_Delete(ALdistortionState *state)
+{
+    free(state);
+}
+
+DEFINE_ALEFFECTSTATE_VTABLE(ALdistortionState);
+
+
+typedef struct ALdistortionStateFactory {
+    DERIVE_FROM_TYPE(ALeffectStateFactory);
+} ALdistortionStateFactory;
+
+static ALeffectState *ALdistortionStateFactory_create(ALdistortionStateFactory *UNUSED(factory))
+{
+    ALdistortionState *state;
+
+    state = malloc(sizeof(*state));
+    if(!state) return NULL;
+    SET_VTABLE2(ALdistortionState, ALeffectState, state);
+
+    ALfilterState_clear(&state->lowpass);
+    ALfilterState_clear(&state->bandpass);
+
+    return STATIC_CAST(ALeffectState, state);
+}
+
+DEFINE_ALEFFECTSTATEFACTORY_VTABLE(ALdistortionStateFactory);
+
+
+ALeffectStateFactory *ALdistortionStateFactory_getFactory(void)
+{
+    static ALdistortionStateFactory DistortionFactory = { { GET_VTABLE2(ALdistortionStateFactory, ALeffectStateFactory) } };
+
+    return STATIC_CAST(ALeffectStateFactory, &DistortionFactory);
+}
+
+
+void ALdistortion_setParami(ALeffect *UNUSED(effect), ALCcontext *context, ALenum UNUSED(param), ALint UNUSED(val))
+{ SET_ERROR_AND_RETURN(context, AL_INVALID_ENUM); }
+void ALdistortion_setParamiv(ALeffect *effect, ALCcontext *context, ALenum param, const ALint *vals)
+{
+    ALdistortion_setParami(effect, context, param, vals[0]);
+}
+void ALdistortion_setParamf(ALeffect *effect, ALCcontext *context, ALenum param, ALfloat val)
+{
+    ALeffectProps *props = &effect->Props;
+    switch(param)
+    {
+        case AL_DISTORTION_EDGE:
+            if(!(val >= AL_DISTORTION_MIN_EDGE && val <= AL_DISTORTION_MAX_EDGE))
+                SET_ERROR_AND_RETURN(context, AL_INVALID_VALUE);
+            props->Distortion.Edge = val;
+            break;
+
+        case AL_DISTORTION_GAIN:
+            if(!(val >= AL_DISTORTION_MIN_GAIN && val <= AL_DISTORTION_MAX_GAIN))
+                SET_ERROR_AND_RETURN(context, AL_INVALID_VALUE);
+            props->Distortion.Gain = val;
+            break;
+
+        case AL_DISTORTION_LOWPASS_CUTOFF:
+            if(!(val >= AL_DISTORTION_MIN_LOWPASS_CUTOFF && val <= AL_DISTORTION_MAX_LOWPASS_CUTOFF))
+                SET_ERROR_AND_RETURN(context, AL_INVALID_VALUE);
+            props->Distortion.LowpassCutoff = val;
+            break;
+
+        case AL_DISTORTION_EQCENTER:
+            if(!(val >= AL_DISTORTION_MIN_EQCENTER && val <= AL_DISTORTION_MAX_EQCENTER))
+                SET_ERROR_AND_RETURN(context, AL_INVALID_VALUE);
+            props->Distortion.EQCenter = val;
+            break;
+
+        case AL_DISTORTION_EQBANDWIDTH:
+            if(!(val >= AL_DISTORTION_MIN_EQBANDWIDTH && val <= AL_DISTORTION_MAX_EQBANDWIDTH))
+                SET_ERROR_AND_RETURN(context, AL_INVALID_VALUE);
+            props->Distortion.EQBandwidth = val;
+            break;
+
+        default:
+            SET_ERROR_AND_RETURN(context, AL_INVALID_ENUM);
+    }
+}
+void ALdistortion_setParamfv(ALeffect *effect, ALCcontext *context, ALenum param, const ALfloat *vals)
+{
+    ALdistortion_setParamf(effect, context, param, vals[0]);
+}
+
+void ALdistortion_getParami(const ALeffect *UNUSED(effect), ALCcontext *context, ALenum UNUSED(param), ALint *UNUSED(val))
+{ SET_ERROR_AND_RETURN(context, AL_INVALID_ENUM); }
+void ALdistortion_getParamiv(const ALeffect *effect, ALCcontext *context, ALenum param, ALint *vals)
+{
+    ALdistortion_getParami(effect, context, param, vals);
+}
+void ALdistortion_getParamf(const ALeffect *effect, ALCcontext *context, ALenum param, ALfloat *val)
+{
+    const ALeffectProps *props = &effect->Props;
+    switch(param)
+    {
+        case AL_DISTORTION_EDGE:
+            *val = props->Distortion.Edge;
+            break;
+
+        case AL_DISTORTION_GAIN:
+            *val = props->Distortion.Gain;
+            break;
+
+        case AL_DISTORTION_LOWPASS_CUTOFF:
+            *val = props->Distortion.LowpassCutoff;
+            break;
+
+        case AL_DISTORTION_EQCENTER:
+            *val = props->Distortion.EQCenter;
+            break;
+
+        case AL_DISTORTION_EQBANDWIDTH:
+            *val = props->Distortion.EQBandwidth;
+            break;
+
+        default:
+            SET_ERROR_AND_RETURN(context, AL_INVALID_ENUM);
+    }
+}
+void ALdistortion_getParamfv(const ALeffect *effect, ALCcontext *context, ALenum param, ALfloat *vals)
+{
+    ALdistortion_getParamf(effect, context, param, vals);
+}
+
+DEFINE_ALEFFECT_VTABLE(ALdistortion);

+ 296 - 0
jni/openal-soft-android/Alc/effects/echo.c

@@ -0,0 +1,296 @@
+/**
+ * OpenAL cross platform audio library
+ * Copyright (C) 2009 by Chris Robinson.
+ * This library is free software; you can redistribute it and/or
+ *  modify it under the terms of the GNU Library General Public
+ *  License as published by the Free Software Foundation; either
+ *  version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ *  but WITHOUT ANY WARRANTY; without even the implied warranty of
+ *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ *  Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public
+ *  License along with this library; if not, write to the
+ *  Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+ *  Boston, MA  02111-1307, USA.
+ * Or go to http://www.gnu.org/copyleft/lgpl.html
+ */
+
+#include "config.h"
+
+#include <math.h>
+#include <stdlib.h>
+
+#include "alMain.h"
+#include "alFilter.h"
+#include "alAuxEffectSlot.h"
+#include "alError.h"
+#include "alu.h"
+
+
+typedef struct ALechoState {
+    DERIVE_FROM_TYPE(ALeffectState);
+
+    ALfloat *SampleBuffer;
+    ALuint BufferLength;
+
+    // The echo is two tap. The delay is the number of samples from before the
+    // current offset
+    struct {
+        ALuint delay;
+    } Tap[2];
+    ALuint Offset;
+    /* The panning gains for the two taps */
+    ALfloat Gain[2][MaxChannels];
+
+    ALfloat FeedGain;
+
+    ALfilterState Filter;
+} ALechoState;
+
+static ALvoid ALechoState_Destruct(ALechoState *state)
+{
+    free(state->SampleBuffer);
+    state->SampleBuffer = NULL;
+}
+
+static ALboolean ALechoState_deviceUpdate(ALechoState *state, ALCdevice *Device)
+{
+    ALuint maxlen, i;
+
+    // Use the next power of 2 for the buffer length, so the tap offsets can be
+    // wrapped using a mask instead of a modulo
+    maxlen  = fastf2u(AL_ECHO_MAX_DELAY * Device->Frequency) + 1;
+    maxlen += fastf2u(AL_ECHO_MAX_LRDELAY * Device->Frequency) + 1;
+    maxlen  = NextPowerOf2(maxlen);
+
+    if(maxlen != state->BufferLength)
+    {
+        void *temp;
+
+        temp = realloc(state->SampleBuffer, maxlen * sizeof(ALfloat));
+        if(!temp) return AL_FALSE;
+        state->SampleBuffer = temp;
+        state->BufferLength = maxlen;
+    }
+    for(i = 0;i < state->BufferLength;i++)
+        state->SampleBuffer[i] = 0.0f;
+
+    return AL_TRUE;
+}
+
+static ALvoid ALechoState_update(ALechoState *state, ALCdevice *Device, const ALeffectslot *Slot)
+{
+    ALuint frequency = Device->Frequency;
+    ALfloat lrpan, gain;
+    ALfloat dirGain;
+
+    state->Tap[0].delay = fastf2u(Slot->EffectProps.Echo.Delay * frequency) + 1;
+    state->Tap[1].delay = fastf2u(Slot->EffectProps.Echo.LRDelay * frequency);
+    state->Tap[1].delay += state->Tap[0].delay;
+
+    lrpan = Slot->EffectProps.Echo.Spread;
+
+    state->FeedGain = Slot->EffectProps.Echo.Feedback;
+
+    ALfilterState_setParams(&state->Filter, ALfilterType_HighShelf,
+                            1.0f - Slot->EffectProps.Echo.Damping,
+                            (ALfloat)LOWPASSFREQREF/frequency, 0.0f);
+
+    gain = Slot->Gain;
+    dirGain = fabsf(lrpan);
+
+    /* First tap panning */
+    ComputeAngleGains(Device, atan2f(-lrpan, 0.0f), (1.0f-dirGain)*F_PI, gain, state->Gain[0]);
+
+    /* Second tap panning */
+    ComputeAngleGains(Device, atan2f(+lrpan, 0.0f), (1.0f-dirGain)*F_PI, gain, state->Gain[1]);
+}
+
+static ALvoid ALechoState_process(ALechoState *state, ALuint SamplesToDo, const ALfloat *restrict SamplesIn, ALfloat (*restrict SamplesOut)[BUFFERSIZE])
+{
+    const ALuint mask = state->BufferLength-1;
+    const ALuint tap1 = state->Tap[0].delay;
+    const ALuint tap2 = state->Tap[1].delay;
+    ALuint offset = state->Offset;
+    ALfloat smp;
+    ALuint base;
+    ALuint i, k;
+
+    for(base = 0;base < SamplesToDo;)
+    {
+        ALfloat temps[64][2];
+        ALuint td = minu(SamplesToDo-base, 64);
+
+        for(i = 0;i < td;i++)
+        {
+            /* First tap */
+            temps[i][0] = state->SampleBuffer[(offset-tap1) & mask];
+            /* Second tap */
+            temps[i][1] = state->SampleBuffer[(offset-tap2) & mask];
+
+            // Apply damping and feedback gain to the second tap, and mix in the
+            // new sample
+            smp = ALfilterState_processSingle(&state->Filter, temps[i][1]+SamplesIn[i+base]);
+            state->SampleBuffer[offset&mask] = smp * state->FeedGain;
+            offset++;
+        }
+
+        for(k = 0;k < MaxChannels;k++)
+        {
+            ALfloat gain = state->Gain[0][k];
+            if(gain > GAIN_SILENCE_THRESHOLD)
+            {
+                for(i = 0;i < td;i++)
+                    SamplesOut[k][i+base] += temps[i][0] * gain;
+            }
+
+            gain = state->Gain[1][k];
+            if(gain > GAIN_SILENCE_THRESHOLD)
+            {
+                for(i = 0;i < td;i++)
+                    SamplesOut[k][i+base] += temps[i][1] * gain;
+            }
+        }
+
+        base += td;
+    }
+
+    state->Offset = offset;
+}
+
+static void ALechoState_Delete(ALechoState *state)
+{
+    free(state);
+}
+
+DEFINE_ALEFFECTSTATE_VTABLE(ALechoState);
+
+
+typedef struct ALechoStateFactory {
+    DERIVE_FROM_TYPE(ALeffectStateFactory);
+} ALechoStateFactory;
+
+ALeffectState *ALechoStateFactory_create(ALechoStateFactory *UNUSED(factory))
+{
+    ALechoState *state;
+
+    state = malloc(sizeof(*state));
+    if(!state) return NULL;
+    SET_VTABLE2(ALechoState, ALeffectState, state);
+
+    state->BufferLength = 0;
+    state->SampleBuffer = NULL;
+
+    state->Tap[0].delay = 0;
+    state->Tap[1].delay = 0;
+    state->Offset = 0;
+
+    ALfilterState_clear(&state->Filter);
+
+    return STATIC_CAST(ALeffectState, state);
+}
+
+DEFINE_ALEFFECTSTATEFACTORY_VTABLE(ALechoStateFactory);
+
+ALeffectStateFactory *ALechoStateFactory_getFactory(void)
+{
+    static ALechoStateFactory EchoFactory = { { GET_VTABLE2(ALechoStateFactory, ALeffectStateFactory) } };
+
+    return STATIC_CAST(ALeffectStateFactory, &EchoFactory);
+}
+
+
+void ALecho_setParami(ALeffect *UNUSED(effect), ALCcontext *context, ALenum UNUSED(param), ALint UNUSED(val))
+{ SET_ERROR_AND_RETURN(context, AL_INVALID_ENUM); }
+void ALecho_setParamiv(ALeffect *effect, ALCcontext *context, ALenum param, const ALint *vals)
+{
+    ALecho_setParami(effect, context, param, vals[0]);
+}
+void ALecho_setParamf(ALeffect *effect, ALCcontext *context, ALenum param, ALfloat val)
+{
+    ALeffectProps *props = &effect->Props;
+    switch(param)
+    {
+        case AL_ECHO_DELAY:
+            if(!(val >= AL_ECHO_MIN_DELAY && val <= AL_ECHO_MAX_DELAY))
+                SET_ERROR_AND_RETURN(context, AL_INVALID_VALUE);
+            props->Echo.Delay = val;
+            break;
+
+        case AL_ECHO_LRDELAY:
+            if(!(val >= AL_ECHO_MIN_LRDELAY && val <= AL_ECHO_MAX_LRDELAY))
+                SET_ERROR_AND_RETURN(context, AL_INVALID_VALUE);
+            props->Echo.LRDelay = val;
+            break;
+
+        case AL_ECHO_DAMPING:
+            if(!(val >= AL_ECHO_MIN_DAMPING && val <= AL_ECHO_MAX_DAMPING))
+                SET_ERROR_AND_RETURN(context, AL_INVALID_VALUE);
+            props->Echo.Damping = val;
+            break;
+
+        case AL_ECHO_FEEDBACK:
+            if(!(val >= AL_ECHO_MIN_FEEDBACK && val <= AL_ECHO_MAX_FEEDBACK))
+                SET_ERROR_AND_RETURN(context, AL_INVALID_VALUE);
+            props->Echo.Feedback = val;
+            break;
+
+        case AL_ECHO_SPREAD:
+            if(!(val >= AL_ECHO_MIN_SPREAD && val <= AL_ECHO_MAX_SPREAD))
+                SET_ERROR_AND_RETURN(context, AL_INVALID_VALUE);
+            props->Echo.Spread = val;
+            break;
+
+        default:
+            SET_ERROR_AND_RETURN(context, AL_INVALID_ENUM);
+    }
+}
+void ALecho_setParamfv(ALeffect *effect, ALCcontext *context, ALenum param, const ALfloat *vals)
+{
+    ALecho_setParamf(effect, context, param, vals[0]);
+}
+
+void ALecho_getParami(const ALeffect *UNUSED(effect), ALCcontext *context, ALenum UNUSED(param), ALint *UNUSED(val))
+{ SET_ERROR_AND_RETURN(context, AL_INVALID_ENUM); }
+void ALecho_getParamiv(const ALeffect *effect, ALCcontext *context, ALenum param, ALint *vals)
+{
+    ALecho_getParami(effect, context, param, vals);
+}
+void ALecho_getParamf(const ALeffect *effect, ALCcontext *context, ALenum param, ALfloat *val)
+{
+    const ALeffectProps *props = &effect->Props;
+    switch(param)
+    {
+        case AL_ECHO_DELAY:
+            *val = props->Echo.Delay;
+            break;
+
+        case AL_ECHO_LRDELAY:
+            *val = props->Echo.LRDelay;
+            break;
+
+        case AL_ECHO_DAMPING:
+            *val = props->Echo.Damping;
+            break;
+
+        case AL_ECHO_FEEDBACK:
+            *val = props->Echo.Feedback;
+            break;
+
+        case AL_ECHO_SPREAD:
+            *val = props->Echo.Spread;
+            break;
+
+        default:
+            SET_ERROR_AND_RETURN(context, AL_INVALID_ENUM);
+    }
+}
+void ALecho_getParamfv(const ALeffect *effect, ALCcontext *context, ALenum param, ALfloat *vals)
+{
+    ALecho_getParamf(effect, context, param, vals);
+}
+
+DEFINE_ALEFFECT_VTABLE(ALecho);

+ 337 - 0
jni/openal-soft-android/Alc/effects/equalizer.c

@@ -0,0 +1,337 @@
+/**
+ * OpenAL cross platform audio library
+ * Copyright (C) 2013 by Mike Gorchak
+ * This library is free software; you can redistribute it and/or
+ *  modify it under the terms of the GNU Library General Public
+ *  License as published by the Free Software Foundation; either
+ *  version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ *  but WITHOUT ANY WARRANTY; without even the implied warranty of
+ *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ *  Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public
+ *  License along with this library; if not, write to the
+ *  Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+ *  Boston, MA  02111-1307, USA.
+ * Or go to http://www.gnu.org/copyleft/lgpl.html
+ */
+
+#include "config.h"
+
+#include <math.h>
+#include <stdlib.h>
+
+#include "alMain.h"
+#include "alFilter.h"
+#include "alAuxEffectSlot.h"
+#include "alError.h"
+#include "alu.h"
+
+
+/*  The document  "Effects Extension Guide.pdf"  says that low and high  *
+ *  frequencies are cutoff frequencies. This is not fully correct, they  *
+ *  are corner frequencies for low and high shelf filters. If they were  *
+ *  just cutoff frequencies, there would be no need in cutoff frequency  *
+ *  gains, which are present.  Documentation for  "Creative Proteus X2"  *
+ *  software describes  4-band equalizer functionality in a much better  *
+ *  way.  This equalizer seems  to be a predecessor  of  OpenAL  4-band  *
+ *  equalizer.  With low and high  shelf filters  we are able to cutoff  *
+ *  frequencies below and/or above corner frequencies using attenuation  *
+ *  gains (below 1.0) and amplify all low and/or high frequencies using  *
+ *  gains above 1.0.                                                     *
+ *                                                                       *
+ *     Low-shelf       Low Mid Band      High Mid Band     High-shelf    *
+ *      corner            center             center          corner      *
+ *     frequency        frequency          frequency       frequency     *
+ *    50Hz..800Hz     200Hz..3000Hz      1000Hz..8000Hz  4000Hz..16000Hz *
+ *                                                                       *
+ *          |               |                  |               |         *
+ *          |               |                  |               |         *
+ *   B -----+            /--+--\            /--+--\            +-----    *
+ *   O      |\          |   |   |          |   |   |          /|         *
+ *   O      | \        -    |    -        -    |    -        / |         *
+ *   S +    |  \      |     |     |      |     |     |      /  |         *
+ *   T      |   |    |      |      |    |      |      |    |   |         *
+ * ---------+---------------+------------------+---------------+-------- *
+ *   C      |   |    |      |      |    |      |      |    |   |         *
+ *   U -    |  /      |     |     |      |     |     |      \  |         *
+ *   T      | /        -    |    -        -    |    -        \ |         *
+ *   O      |/          |   |   |          |   |   |          \|         *
+ *   F -----+            \--+--/            \--+--/            +-----    *
+ *   F      |               |                  |               |         *
+ *          |               |                  |               |         *
+ *                                                                       *
+ * Gains vary from 0.126 up to 7.943, which means from -18dB attenuation *
+ * up to +18dB amplification. Band width varies from 0.01 up to 1.0 in   *
+ * octaves for two mid bands.                                            *
+ *                                                                       *
+ * Implementation is based on the "Cookbook formulae for audio EQ biquad *
+ * filter coefficients" by Robert Bristow-Johnson                        *
+ * http://www.musicdsp.org/files/Audio-EQ-Cookbook.txt                   */
+
+typedef struct ALequalizerState {
+    DERIVE_FROM_TYPE(ALeffectState);
+
+    /* Effect gains for each channel */
+    ALfloat Gain[MaxChannels];
+
+    /* Effect parameters */
+    ALfilterState filter[4];
+} ALequalizerState;
+
+static ALvoid ALequalizerState_Destruct(ALequalizerState *UNUSED(state))
+{
+}
+
+static ALboolean ALequalizerState_deviceUpdate(ALequalizerState *UNUSED(state), ALCdevice *UNUSED(device))
+{
+    return AL_TRUE;
+}
+
+static ALvoid ALequalizerState_update(ALequalizerState *state, ALCdevice *device, const ALeffectslot *slot)
+{
+    ALfloat frequency = (ALfloat)device->Frequency;
+    ALfloat gain = sqrtf(1.0f / device->NumChan) * slot->Gain;
+
+    SetGains(device, gain, state->Gain);
+
+    /* Calculate coefficients for the each type of filter */
+    ALfilterState_setParams(&state->filter[0], ALfilterType_LowShelf,
+                            sqrtf(slot->EffectProps.Equalizer.LowGain),
+                            slot->EffectProps.Equalizer.LowCutoff/frequency,
+                            0.0f);
+
+    ALfilterState_setParams(&state->filter[1], ALfilterType_Peaking,
+                            sqrtf(slot->EffectProps.Equalizer.Mid1Gain),
+                            slot->EffectProps.Equalizer.Mid1Center/frequency,
+                            slot->EffectProps.Equalizer.Mid1Width);
+
+    ALfilterState_setParams(&state->filter[2], ALfilterType_Peaking,
+                            sqrtf(slot->EffectProps.Equalizer.Mid2Gain),
+                            slot->EffectProps.Equalizer.Mid2Center/frequency,
+                            slot->EffectProps.Equalizer.Mid2Width);
+
+    ALfilterState_setParams(&state->filter[3], ALfilterType_HighShelf,
+                            sqrtf(slot->EffectProps.Equalizer.HighGain),
+                            slot->EffectProps.Equalizer.HighCutoff/frequency,
+                            0.0f);
+}
+
+static ALvoid ALequalizerState_process(ALequalizerState *state, ALuint SamplesToDo, const ALfloat *restrict SamplesIn, ALfloat (*restrict SamplesOut)[BUFFERSIZE])
+{
+    ALuint base;
+    ALuint it;
+    ALuint kt;
+    ALuint ft;
+
+    for(base = 0;base < SamplesToDo;)
+    {
+        ALfloat temps[64];
+        ALuint td = minu(SamplesToDo-base, 64);
+
+        for(it = 0;it < td;it++)
+        {
+            ALfloat smp = SamplesIn[base+it];
+
+            for(ft = 0;ft < 4;ft++)
+                smp = ALfilterState_processSingle(&state->filter[ft], smp);
+
+            temps[it] = smp;
+        }
+
+        for(kt = 0;kt < MaxChannels;kt++)
+        {
+            ALfloat gain = state->Gain[kt];
+            if(!(gain > GAIN_SILENCE_THRESHOLD))
+                continue;
+
+            for(it = 0;it < td;it++)
+                SamplesOut[kt][base+it] += gain * temps[it];
+        }
+
+        base += td;
+    }
+}
+
+static void ALequalizerState_Delete(ALequalizerState *state)
+{
+    free(state);
+}
+
+DEFINE_ALEFFECTSTATE_VTABLE(ALequalizerState);
+
+
+typedef struct ALequalizerStateFactory {
+    DERIVE_FROM_TYPE(ALeffectStateFactory);
+} ALequalizerStateFactory;
+
+ALeffectState *ALequalizerStateFactory_create(ALequalizerStateFactory *UNUSED(factory))
+{
+    ALequalizerState *state;
+    int it;
+
+    state = malloc(sizeof(*state));
+    if(!state) return NULL;
+    SET_VTABLE2(ALequalizerState, ALeffectState, state);
+
+    /* Initialize sample history only on filter creation to avoid */
+    /* sound clicks if filter settings were changed in runtime.   */
+    for(it = 0; it < 4; it++)
+        ALfilterState_clear(&state->filter[it]);
+
+    return STATIC_CAST(ALeffectState, state);
+}
+
+DEFINE_ALEFFECTSTATEFACTORY_VTABLE(ALequalizerStateFactory);
+
+ALeffectStateFactory *ALequalizerStateFactory_getFactory(void)
+{
+    static ALequalizerStateFactory EqualizerFactory = { { GET_VTABLE2(ALequalizerStateFactory, ALeffectStateFactory) } };
+
+    return STATIC_CAST(ALeffectStateFactory, &EqualizerFactory);
+}
+
+
+void ALequalizer_setParami(ALeffect *UNUSED(effect), ALCcontext *context, ALenum UNUSED(param), ALint UNUSED(val))
+{ SET_ERROR_AND_RETURN(context, AL_INVALID_ENUM); }
+void ALequalizer_setParamiv(ALeffect *effect, ALCcontext *context, ALenum param, const ALint *vals)
+{
+    ALequalizer_setParami(effect, context, param, vals[0]);
+}
+void ALequalizer_setParamf(ALeffect *effect, ALCcontext *context, ALenum param, ALfloat val)
+{
+    ALeffectProps *props = &effect->Props;
+    switch(param)
+    {
+        case AL_EQUALIZER_LOW_GAIN:
+            if(!(val >= AL_EQUALIZER_MIN_LOW_GAIN && val <= AL_EQUALIZER_MAX_LOW_GAIN))
+                SET_ERROR_AND_RETURN(context, AL_INVALID_VALUE);
+            props->Equalizer.LowGain = val;
+            break;
+
+        case AL_EQUALIZER_LOW_CUTOFF:
+            if(!(val >= AL_EQUALIZER_MIN_LOW_CUTOFF && val <= AL_EQUALIZER_MAX_LOW_CUTOFF))
+                SET_ERROR_AND_RETURN(context, AL_INVALID_VALUE);
+            props->Equalizer.LowCutoff = val;
+            break;
+
+        case AL_EQUALIZER_MID1_GAIN:
+            if(!(val >= AL_EQUALIZER_MIN_MID1_GAIN && val <= AL_EQUALIZER_MAX_MID1_GAIN))
+                SET_ERROR_AND_RETURN(context, AL_INVALID_VALUE);
+            props->Equalizer.Mid1Gain = val;
+            break;
+
+        case AL_EQUALIZER_MID1_CENTER:
+            if(!(val >= AL_EQUALIZER_MIN_MID1_CENTER && val <= AL_EQUALIZER_MAX_MID1_CENTER))
+                SET_ERROR_AND_RETURN(context, AL_INVALID_VALUE);
+            props->Equalizer.Mid1Center = val;
+            break;
+
+        case AL_EQUALIZER_MID1_WIDTH:
+            if(!(val >= AL_EQUALIZER_MIN_MID1_WIDTH && val <= AL_EQUALIZER_MAX_MID1_WIDTH))
+                SET_ERROR_AND_RETURN(context, AL_INVALID_VALUE);
+            props->Equalizer.Mid1Width = val;
+            break;
+
+        case AL_EQUALIZER_MID2_GAIN:
+            if(!(val >= AL_EQUALIZER_MIN_MID2_GAIN && val <= AL_EQUALIZER_MAX_MID2_GAIN))
+                SET_ERROR_AND_RETURN(context, AL_INVALID_VALUE);
+            props->Equalizer.Mid2Gain = val;
+            break;
+
+        case AL_EQUALIZER_MID2_CENTER:
+            if(!(val >= AL_EQUALIZER_MIN_MID2_CENTER && val <= AL_EQUALIZER_MAX_MID2_CENTER))
+                SET_ERROR_AND_RETURN(context, AL_INVALID_VALUE);
+            props->Equalizer.Mid2Center = val;
+            break;
+
+        case AL_EQUALIZER_MID2_WIDTH:
+            if(!(val >= AL_EQUALIZER_MIN_MID2_WIDTH && val <= AL_EQUALIZER_MAX_MID2_WIDTH))
+                SET_ERROR_AND_RETURN(context, AL_INVALID_VALUE);
+            props->Equalizer.Mid2Width = val;
+            break;
+
+        case AL_EQUALIZER_HIGH_GAIN:
+            if(!(val >= AL_EQUALIZER_MIN_HIGH_GAIN && val <= AL_EQUALIZER_MAX_HIGH_GAIN))
+                SET_ERROR_AND_RETURN(context, AL_INVALID_VALUE);
+            props->Equalizer.HighGain = val;
+            break;
+
+        case AL_EQUALIZER_HIGH_CUTOFF:
+            if(!(val >= AL_EQUALIZER_MIN_HIGH_CUTOFF && val <= AL_EQUALIZER_MAX_HIGH_CUTOFF))
+                SET_ERROR_AND_RETURN(context, AL_INVALID_VALUE);
+            props->Equalizer.HighCutoff = val;
+            break;
+
+        default:
+            SET_ERROR_AND_RETURN(context, AL_INVALID_ENUM);
+    }
+}
+void ALequalizer_setParamfv(ALeffect *effect, ALCcontext *context, ALenum param, const ALfloat *vals)
+{
+    ALequalizer_setParamf(effect, context, param, vals[0]);
+}
+
+void ALequalizer_getParami(const ALeffect *UNUSED(effect), ALCcontext *context, ALenum UNUSED(param), ALint *UNUSED(val))
+{ SET_ERROR_AND_RETURN(context, AL_INVALID_ENUM); }
+void ALequalizer_getParamiv(const ALeffect *effect, ALCcontext *context, ALenum param, ALint *vals)
+{
+    ALequalizer_getParami(effect, context, param, vals);
+}
+void ALequalizer_getParamf(const ALeffect *effect, ALCcontext *context, ALenum param, ALfloat *val)
+{
+    const ALeffectProps *props = &effect->Props;
+    switch(param)
+    {
+        case AL_EQUALIZER_LOW_GAIN:
+            *val = props->Equalizer.LowGain;
+            break;
+
+        case AL_EQUALIZER_LOW_CUTOFF:
+            *val = props->Equalizer.LowCutoff;
+            break;
+
+        case AL_EQUALIZER_MID1_GAIN:
+            *val = props->Equalizer.Mid1Gain;
+            break;
+
+        case AL_EQUALIZER_MID1_CENTER:
+            *val = props->Equalizer.Mid1Center;
+            break;
+
+        case AL_EQUALIZER_MID1_WIDTH:
+            *val = props->Equalizer.Mid1Width;
+            break;
+
+        case AL_EQUALIZER_MID2_GAIN:
+            *val = props->Equalizer.Mid2Gain;
+            break;
+
+        case AL_EQUALIZER_MID2_CENTER:
+            *val = props->Equalizer.Mid2Center;
+            break;
+
+        case AL_EQUALIZER_MID2_WIDTH:
+            *val = props->Equalizer.Mid2Width;
+            break;
+
+        case AL_EQUALIZER_HIGH_GAIN:
+            *val = props->Equalizer.HighGain;
+            break;
+
+        case AL_EQUALIZER_HIGH_CUTOFF:
+            *val = props->Equalizer.HighCutoff;
+            break;
+
+        default:
+            SET_ERROR_AND_RETURN(context, AL_INVALID_ENUM);
+    }
+}
+void ALequalizer_getParamfv(const ALeffect *effect, ALCcontext *context, ALenum param, ALfloat *vals)
+{
+    ALequalizer_getParamf(effect, context, param, vals);
+}
+
+DEFINE_ALEFFECT_VTABLE(ALequalizer);

+ 380 - 0
jni/openal-soft-android/Alc/effects/flanger.c

@@ -0,0 +1,380 @@
+/**
+ * OpenAL cross platform audio library
+ * Copyright (C) 2013 by Mike Gorchak
+ * This library is free software; you can redistribute it and/or
+ *  modify it under the terms of the GNU Library General Public
+ *  License as published by the Free Software Foundation; either
+ *  version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ *  but WITHOUT ANY WARRANTY; without even the implied warranty of
+ *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ *  Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public
+ *  License along with this library; if not, write to the
+ *  Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+ *  Boston, MA  02111-1307, USA.
+ * Or go to http://www.gnu.org/copyleft/lgpl.html
+ */
+
+#include "config.h"
+
+#include <math.h>
+#include <stdlib.h>
+
+#include "alMain.h"
+#include "alFilter.h"
+#include "alAuxEffectSlot.h"
+#include "alError.h"
+#include "alu.h"
+
+
+typedef struct ALflangerState {
+    DERIVE_FROM_TYPE(ALeffectState);
+
+    ALfloat *SampleBuffer[2];
+    ALuint BufferLength;
+    ALuint offset;
+    ALuint lfo_range;
+    ALfloat lfo_scale;
+    ALint lfo_disp;
+
+    /* Gains for left and right sides */
+    ALfloat Gain[2][MaxChannels];
+
+    /* effect parameters */
+    ALint waveform;
+    ALint delay;
+    ALfloat depth;
+    ALfloat feedback;
+} ALflangerState;
+
+static ALvoid ALflangerState_Destruct(ALflangerState *state)
+{
+    free(state->SampleBuffer[0]);
+    state->SampleBuffer[0] = NULL;
+    state->SampleBuffer[1] = NULL;
+}
+
+static ALboolean ALflangerState_deviceUpdate(ALflangerState *state, ALCdevice *Device)
+{
+    ALuint maxlen;
+    ALuint it;
+
+    maxlen = fastf2u(AL_FLANGER_MAX_DELAY * 3.0f * Device->Frequency) + 1;
+    maxlen = NextPowerOf2(maxlen);
+
+    if(maxlen != state->BufferLength)
+    {
+        void *temp;
+
+        temp = realloc(state->SampleBuffer[0], maxlen * sizeof(ALfloat) * 2);
+        if(!temp) return AL_FALSE;
+        state->SampleBuffer[0] = temp;
+        state->SampleBuffer[1] = state->SampleBuffer[0] + maxlen;
+
+        state->BufferLength = maxlen;
+    }
+
+    for(it = 0;it < state->BufferLength;it++)
+    {
+        state->SampleBuffer[0][it] = 0.0f;
+        state->SampleBuffer[1][it] = 0.0f;
+    }
+
+    return AL_TRUE;
+}
+
+static ALvoid ALflangerState_update(ALflangerState *state, ALCdevice *Device, const ALeffectslot *Slot)
+{
+    ALfloat frequency = (ALfloat)Device->Frequency;
+    ALfloat rate;
+    ALint phase;
+
+    state->waveform = Slot->EffectProps.Flanger.Waveform;
+    state->depth = Slot->EffectProps.Flanger.Depth;
+    state->feedback = Slot->EffectProps.Flanger.Feedback;
+    state->delay = fastf2i(Slot->EffectProps.Flanger.Delay * frequency);
+
+    /* Gains for left and right sides */
+    ComputeAngleGains(Device, atan2f(-1.0f, 0.0f), 0.0f, Slot->Gain, state->Gain[0]);
+    ComputeAngleGains(Device, atan2f(+1.0f, 0.0f), 0.0f, Slot->Gain, state->Gain[1]);
+
+    phase = Slot->EffectProps.Flanger.Phase;
+    rate = Slot->EffectProps.Flanger.Rate;
+    if(!(rate > 0.0f))
+    {
+        state->lfo_scale = 0.0f;
+        state->lfo_range = 1;
+        state->lfo_disp = 0;
+    }
+    else
+    {
+        /* Calculate LFO coefficient */
+        state->lfo_range = fastf2u(frequency/rate + 0.5f);
+        switch(state->waveform)
+        {
+            case AL_FLANGER_WAVEFORM_TRIANGLE:
+                state->lfo_scale = 4.0f / state->lfo_range;
+                break;
+            case AL_FLANGER_WAVEFORM_SINUSOID:
+                state->lfo_scale = F_2PI / state->lfo_range;
+                break;
+        }
+
+        /* Calculate lfo phase displacement */
+        state->lfo_disp = fastf2i(state->lfo_range * (phase/360.0f));
+    }
+}
+
+static inline void Triangle(ALint *delay_left, ALint *delay_right, ALuint offset, const ALflangerState *state)
+{
+    ALfloat lfo_value;
+
+    lfo_value = 2.0f - fabsf(2.0f - state->lfo_scale*(offset%state->lfo_range));
+    lfo_value *= state->depth * state->delay;
+    *delay_left = fastf2i(lfo_value) + state->delay;
+
+    offset += state->lfo_disp;
+    lfo_value = 2.0f - fabsf(2.0f - state->lfo_scale*(offset%state->lfo_range));
+    lfo_value *= state->depth * state->delay;
+    *delay_right = fastf2i(lfo_value) + state->delay;
+}
+
+static inline void Sinusoid(ALint *delay_left, ALint *delay_right, ALuint offset, const ALflangerState *state)
+{
+    ALfloat lfo_value;
+
+    lfo_value = 1.0f + sinf(state->lfo_scale*(offset%state->lfo_range));
+    lfo_value *= state->depth * state->delay;
+    *delay_left = fastf2i(lfo_value) + state->delay;
+
+    offset += state->lfo_disp;
+    lfo_value = 1.0f + sinf(state->lfo_scale*(offset%state->lfo_range));
+    lfo_value *= state->depth * state->delay;
+    *delay_right = fastf2i(lfo_value) + state->delay;
+}
+
+#define DECL_TEMPLATE(Func)                                                   \
+static void Process##Func(ALflangerState *state, const ALuint SamplesToDo,    \
+  const ALfloat *restrict SamplesIn, ALfloat (*restrict out)[2])              \
+{                                                                             \
+    const ALuint bufmask = state->BufferLength-1;                             \
+    ALfloat *restrict leftbuf = state->SampleBuffer[0];                       \
+    ALfloat *restrict rightbuf = state->SampleBuffer[1];                      \
+    ALuint offset = state->offset;                                            \
+    const ALfloat feedback = state->feedback;                                 \
+    ALuint it;                                                                \
+                                                                              \
+    for(it = 0;it < SamplesToDo;it++)                                         \
+    {                                                                         \
+        ALint delay_left, delay_right;                                        \
+        Func(&delay_left, &delay_right, offset, state);                       \
+                                                                              \
+        out[it][0] = leftbuf[(offset-delay_left)&bufmask];                    \
+        leftbuf[offset&bufmask] = (out[it][0]+SamplesIn[it]) * feedback;      \
+                                                                              \
+        out[it][1] = rightbuf[(offset-delay_right)&bufmask];                  \
+        rightbuf[offset&bufmask] = (out[it][1]+SamplesIn[it]) * feedback;     \
+                                                                              \
+        offset++;                                                             \
+    }                                                                         \
+    state->offset = offset;                                                   \
+}
+
+DECL_TEMPLATE(Triangle)
+DECL_TEMPLATE(Sinusoid)
+
+#undef DECL_TEMPLATE
+
+static ALvoid ALflangerState_process(ALflangerState *state, ALuint SamplesToDo, const ALfloat *restrict SamplesIn, ALfloat (*restrict SamplesOut)[BUFFERSIZE])
+{
+    ALuint it, kt;
+    ALuint base;
+
+    for(base = 0;base < SamplesToDo;)
+    {
+        ALfloat temps[64][2];
+        ALuint td = minu(SamplesToDo-base, 64);
+
+        if(state->waveform == AL_FLANGER_WAVEFORM_TRIANGLE)
+            ProcessTriangle(state, td, SamplesIn+base, temps);
+        else if(state->waveform == AL_FLANGER_WAVEFORM_SINUSOID)
+            ProcessSinusoid(state, td, SamplesIn+base, temps);
+
+        for(kt = 0;kt < MaxChannels;kt++)
+        {
+            ALfloat gain = state->Gain[0][kt];
+            if(gain > GAIN_SILENCE_THRESHOLD)
+            {
+                for(it = 0;it < td;it++)
+                    SamplesOut[kt][it+base] += temps[it][0] * gain;
+            }
+
+            gain = state->Gain[1][kt];
+            if(gain > GAIN_SILENCE_THRESHOLD)
+            {
+                for(it = 0;it < td;it++)
+                    SamplesOut[kt][it+base] += temps[it][1] * gain;
+            }
+        }
+
+        base += td;
+    }
+}
+
+static void ALflangerState_Delete(ALflangerState *state)
+{
+    free(state);
+}
+
+DEFINE_ALEFFECTSTATE_VTABLE(ALflangerState);
+
+
+typedef struct ALflangerStateFactory {
+    DERIVE_FROM_TYPE(ALeffectStateFactory);
+} ALflangerStateFactory;
+
+ALeffectState *ALflangerStateFactory_create(ALflangerStateFactory *UNUSED(factory))
+{
+    ALflangerState *state;
+
+    state = malloc(sizeof(*state));
+    if(!state) return NULL;
+    SET_VTABLE2(ALflangerState, ALeffectState, state);
+
+    state->BufferLength = 0;
+    state->SampleBuffer[0] = NULL;
+    state->SampleBuffer[1] = NULL;
+    state->offset = 0;
+    state->lfo_range = 1;
+
+    return STATIC_CAST(ALeffectState, state);
+}
+
+DEFINE_ALEFFECTSTATEFACTORY_VTABLE(ALflangerStateFactory);
+
+ALeffectStateFactory *ALflangerStateFactory_getFactory(void)
+{
+    static ALflangerStateFactory FlangerFactory = { { GET_VTABLE2(ALflangerStateFactory, ALeffectStateFactory) } };
+
+    return STATIC_CAST(ALeffectStateFactory, &FlangerFactory);
+}
+
+
+void ALflanger_setParami(ALeffect *effect, ALCcontext *context, ALenum param, ALint val)
+{
+    ALeffectProps *props = &effect->Props;
+    switch(param)
+    {
+        case AL_FLANGER_WAVEFORM:
+            if(!(val >= AL_FLANGER_MIN_WAVEFORM && val <= AL_FLANGER_MAX_WAVEFORM))
+                SET_ERROR_AND_RETURN(context, AL_INVALID_VALUE);
+            props->Flanger.Waveform = val;
+            break;
+
+        case AL_FLANGER_PHASE:
+            if(!(val >= AL_FLANGER_MIN_PHASE && val <= AL_FLANGER_MAX_PHASE))
+                SET_ERROR_AND_RETURN(context, AL_INVALID_VALUE);
+            props->Flanger.Phase = val;
+            break;
+
+        default:
+            SET_ERROR_AND_RETURN(context, AL_INVALID_ENUM);
+    }
+}
+void ALflanger_setParamiv(ALeffect *effect, ALCcontext *context, ALenum param, const ALint *vals)
+{
+    ALflanger_setParami(effect, context, param, vals[0]);
+}
+void ALflanger_setParamf(ALeffect *effect, ALCcontext *context, ALenum param, ALfloat val)
+{
+    ALeffectProps *props = &effect->Props;
+    switch(param)
+    {
+        case AL_FLANGER_RATE:
+            if(!(val >= AL_FLANGER_MIN_RATE && val <= AL_FLANGER_MAX_RATE))
+                SET_ERROR_AND_RETURN(context, AL_INVALID_VALUE);
+            props->Flanger.Rate = val;
+            break;
+
+        case AL_FLANGER_DEPTH:
+            if(!(val >= AL_FLANGER_MIN_DEPTH && val <= AL_FLANGER_MAX_DEPTH))
+                SET_ERROR_AND_RETURN(context, AL_INVALID_VALUE);
+            props->Flanger.Depth = val;
+            break;
+
+        case AL_FLANGER_FEEDBACK:
+            if(!(val >= AL_FLANGER_MIN_FEEDBACK && val <= AL_FLANGER_MAX_FEEDBACK))
+                SET_ERROR_AND_RETURN(context, AL_INVALID_VALUE);
+            props->Flanger.Feedback = val;
+            break;
+
+        case AL_FLANGER_DELAY:
+            if(!(val >= AL_FLANGER_MIN_DELAY && val <= AL_FLANGER_MAX_DELAY))
+                SET_ERROR_AND_RETURN(context, AL_INVALID_VALUE);
+            props->Flanger.Delay = val;
+            break;
+
+        default:
+            SET_ERROR_AND_RETURN(context, AL_INVALID_ENUM);
+    }
+}
+void ALflanger_setParamfv(ALeffect *effect, ALCcontext *context, ALenum param, const ALfloat *vals)
+{
+    ALflanger_setParamf(effect, context, param, vals[0]);
+}
+
+void ALflanger_getParami(const ALeffect *effect, ALCcontext *context, ALenum param, ALint *val)
+{
+    const ALeffectProps *props = &effect->Props;
+    switch(param)
+    {
+        case AL_FLANGER_WAVEFORM:
+            *val = props->Flanger.Waveform;
+            break;
+
+        case AL_FLANGER_PHASE:
+            *val = props->Flanger.Phase;
+            break;
+
+        default:
+            SET_ERROR_AND_RETURN(context, AL_INVALID_ENUM);
+    }
+}
+void ALflanger_getParamiv(const ALeffect *effect, ALCcontext *context, ALenum param, ALint *vals)
+{
+    ALflanger_getParami(effect, context, param, vals);
+}
+void ALflanger_getParamf(const ALeffect *effect, ALCcontext *context, ALenum param, ALfloat *val)
+{
+    const ALeffectProps *props = &effect->Props;
+    switch(param)
+    {
+        case AL_FLANGER_RATE:
+            *val = props->Flanger.Rate;
+            break;
+
+        case AL_FLANGER_DEPTH:
+            *val = props->Flanger.Depth;
+            break;
+
+        case AL_FLANGER_FEEDBACK:
+            *val = props->Flanger.Feedback;
+            break;
+
+        case AL_FLANGER_DELAY:
+            *val = props->Flanger.Delay;
+            break;
+
+        default:
+            SET_ERROR_AND_RETURN(context, AL_INVALID_ENUM);
+    }
+}
+void ALflanger_getParamfv(const ALeffect *effect, ALCcontext *context, ALenum param, ALfloat *vals)
+{
+    ALflanger_getParamf(effect, context, param, vals);
+}
+
+DEFINE_ALEFFECT_VTABLE(ALflanger);

+ 306 - 0
jni/openal-soft-android/Alc/effects/modulator.c

@@ -0,0 +1,306 @@
+/**
+ * OpenAL cross platform audio library
+ * Copyright (C) 2009 by Chris Robinson.
+ * This library is free software; you can redistribute it and/or
+ *  modify it under the terms of the GNU Library General Public
+ *  License as published by the Free Software Foundation; either
+ *  version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ *  but WITHOUT ANY WARRANTY; without even the implied warranty of
+ *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ *  Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public
+ *  License along with this library; if not, write to the
+ *  Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+ *  Boston, MA  02111-1307, USA.
+ * Or go to http://www.gnu.org/copyleft/lgpl.html
+ */
+
+#include "config.h"
+
+#include <math.h>
+#include <stdlib.h>
+
+#include "alMain.h"
+#include "alFilter.h"
+#include "alAuxEffectSlot.h"
+#include "alError.h"
+#include "alu.h"
+
+
+typedef struct ALmodulatorState {
+    DERIVE_FROM_TYPE(ALeffectState);
+
+    enum {
+        SINUSOID,
+        SAWTOOTH,
+        SQUARE
+    } Waveform;
+
+    ALuint index;
+    ALuint step;
+
+    ALfloat Gain[MaxChannels];
+
+    ALfilterState Filter;
+} ALmodulatorState;
+
+#define WAVEFORM_FRACBITS  24
+#define WAVEFORM_FRACONE   (1<<WAVEFORM_FRACBITS)
+#define WAVEFORM_FRACMASK  (WAVEFORM_FRACONE-1)
+
+static inline ALfloat Sin(ALuint index)
+{
+    return sinf(index*(F_2PI/WAVEFORM_FRACONE) - F_PI)*0.5f + 0.5f;
+}
+
+static inline ALfloat Saw(ALuint index)
+{
+    return (ALfloat)index / WAVEFORM_FRACONE;
+}
+
+static inline ALfloat Square(ALuint index)
+{
+    return (ALfloat)((index >> (WAVEFORM_FRACBITS - 1)) & 1);
+}
+
+#define DECL_TEMPLATE(func)                                                   \
+static void Process##func(ALmodulatorState *state, ALuint SamplesToDo,        \
+  const ALfloat *restrict SamplesIn,                                          \
+  ALfloat (*restrict SamplesOut)[BUFFERSIZE])                                 \
+{                                                                             \
+    const ALuint step = state->step;                                          \
+    ALuint index = state->index;                                              \
+    ALuint base;                                                              \
+                                                                              \
+    for(base = 0;base < SamplesToDo;)                                         \
+    {                                                                         \
+        ALfloat temps[64];                                                    \
+        ALuint td = minu(SamplesToDo-base, 64);                               \
+        ALuint i, k;                                                          \
+                                                                              \
+        for(i = 0;i < td;i++)                                                 \
+        {                                                                     \
+            ALfloat samp;                                                     \
+            samp = SamplesIn[base+i];                                         \
+            samp = ALfilterState_processSingle(&state->Filter, samp);         \
+                                                                              \
+            index += step;                                                    \
+            index &= WAVEFORM_FRACMASK;                                       \
+            temps[i] = samp * func(index);                                    \
+        }                                                                     \
+                                                                              \
+        for(k = 0;k < MaxChannels;k++)                                        \
+        {                                                                     \
+            ALfloat gain = state->Gain[k];                                    \
+            if(!(gain > GAIN_SILENCE_THRESHOLD))                              \
+                continue;                                                     \
+                                                                              \
+            for(i = 0;i < td;i++)                                             \
+                SamplesOut[k][base+i] += gain * temps[i];                     \
+        }                                                                     \
+                                                                              \
+        base += td;                                                           \
+    }                                                                         \
+    state->index = index;                                                     \
+}
+
+DECL_TEMPLATE(Sin)
+DECL_TEMPLATE(Saw)
+DECL_TEMPLATE(Square)
+
+#undef DECL_TEMPLATE
+
+
+static ALvoid ALmodulatorState_Destruct(ALmodulatorState *UNUSED(state))
+{
+}
+
+static ALboolean ALmodulatorState_deviceUpdate(ALmodulatorState *UNUSED(state), ALCdevice *UNUSED(device))
+{
+    return AL_TRUE;
+}
+
+static ALvoid ALmodulatorState_update(ALmodulatorState *state, ALCdevice *Device, const ALeffectslot *Slot)
+{
+    ALfloat gain, cw, a;
+
+    if(Slot->EffectProps.Modulator.Waveform == AL_RING_MODULATOR_SINUSOID)
+        state->Waveform = SINUSOID;
+    else if(Slot->EffectProps.Modulator.Waveform == AL_RING_MODULATOR_SAWTOOTH)
+        state->Waveform = SAWTOOTH;
+    else if(Slot->EffectProps.Modulator.Waveform == AL_RING_MODULATOR_SQUARE)
+        state->Waveform = SQUARE;
+
+    state->step = fastf2u(Slot->EffectProps.Modulator.Frequency*WAVEFORM_FRACONE /
+                          Device->Frequency);
+    if(state->step == 0) state->step = 1;
+
+    /* Custom filter coeffs, which match the old version instead of a low-shelf. */
+    cw = cosf(F_2PI * Slot->EffectProps.Modulator.HighPassCutoff / Device->Frequency);
+    a = (2.0f-cw) - sqrtf(powf(2.0f-cw, 2.0f) - 1.0f);
+
+    state->Filter.b[0] = a;
+    state->Filter.b[1] = -a;
+    state->Filter.b[2] = 0.0f;
+    state->Filter.a[0] = 1.0f;
+    state->Filter.a[1] = -a;
+    state->Filter.a[2] = 0.0f;
+
+    gain = sqrtf(1.0f/Device->NumChan) * Slot->Gain;
+    SetGains(Device, gain, state->Gain);
+}
+
+static ALvoid ALmodulatorState_process(ALmodulatorState *state, ALuint SamplesToDo, const ALfloat *restrict SamplesIn, ALfloat (*restrict SamplesOut)[BUFFERSIZE])
+{
+    switch(state->Waveform)
+    {
+        case SINUSOID:
+            ProcessSin(state, SamplesToDo, SamplesIn, SamplesOut);
+            break;
+
+        case SAWTOOTH:
+            ProcessSaw(state, SamplesToDo, SamplesIn, SamplesOut);
+            break;
+
+        case SQUARE:
+            ProcessSquare(state, SamplesToDo, SamplesIn, SamplesOut);
+            break;
+    }
+}
+
+static void ALmodulatorState_Delete(ALmodulatorState *state)
+{
+    free(state);
+}
+
+DEFINE_ALEFFECTSTATE_VTABLE(ALmodulatorState);
+
+
+typedef struct ALmodulatorStateFactory {
+    DERIVE_FROM_TYPE(ALeffectStateFactory);
+} ALmodulatorStateFactory;
+
+static ALeffectState *ALmodulatorStateFactory_create(ALmodulatorStateFactory *UNUSED(factory))
+{
+    ALmodulatorState *state;
+
+    state = malloc(sizeof(*state));
+    if(!state) return NULL;
+    SET_VTABLE2(ALmodulatorState, ALeffectState, state);
+
+    state->index = 0;
+    state->step = 1;
+
+    ALfilterState_clear(&state->Filter);
+
+    return STATIC_CAST(ALeffectState, state);
+}
+
+DEFINE_ALEFFECTSTATEFACTORY_VTABLE(ALmodulatorStateFactory);
+
+ALeffectStateFactory *ALmodulatorStateFactory_getFactory(void)
+{
+    static ALmodulatorStateFactory ModulatorFactory = { { GET_VTABLE2(ALmodulatorStateFactory, ALeffectStateFactory) } };
+
+    return STATIC_CAST(ALeffectStateFactory, &ModulatorFactory);
+}
+
+
+void ALmodulator_setParamf(ALeffect *effect, ALCcontext *context, ALenum param, ALfloat val)
+{
+    ALeffectProps *props = &effect->Props;
+    switch(param)
+    {
+        case AL_RING_MODULATOR_FREQUENCY:
+            if(!(val >= AL_RING_MODULATOR_MIN_FREQUENCY && val <= AL_RING_MODULATOR_MAX_FREQUENCY))
+                SET_ERROR_AND_RETURN(context, AL_INVALID_VALUE);
+            props->Modulator.Frequency = val;
+            break;
+
+        case AL_RING_MODULATOR_HIGHPASS_CUTOFF:
+            if(!(val >= AL_RING_MODULATOR_MIN_HIGHPASS_CUTOFF && val <= AL_RING_MODULATOR_MAX_HIGHPASS_CUTOFF))
+                SET_ERROR_AND_RETURN(context, AL_INVALID_VALUE);
+            props->Modulator.HighPassCutoff = val;
+            break;
+
+        default:
+            SET_ERROR_AND_RETURN(context, AL_INVALID_ENUM);
+    }
+}
+void ALmodulator_setParamfv(ALeffect *effect, ALCcontext *context, ALenum param, const ALfloat *vals)
+{
+    ALmodulator_setParamf(effect, context, param, vals[0]);
+}
+void ALmodulator_setParami(ALeffect *effect, ALCcontext *context, ALenum param, ALint val)
+{
+    ALeffectProps *props = &effect->Props;
+    switch(param)
+    {
+        case AL_RING_MODULATOR_FREQUENCY:
+        case AL_RING_MODULATOR_HIGHPASS_CUTOFF:
+            ALmodulator_setParamf(effect, context, param, (ALfloat)val);
+            break;
+
+        case AL_RING_MODULATOR_WAVEFORM:
+            if(!(val >= AL_RING_MODULATOR_MIN_WAVEFORM && val <= AL_RING_MODULATOR_MAX_WAVEFORM))
+                SET_ERROR_AND_RETURN(context, AL_INVALID_VALUE);
+            props->Modulator.Waveform = val;
+            break;
+
+        default:
+            SET_ERROR_AND_RETURN(context, AL_INVALID_ENUM);
+    }
+}
+void ALmodulator_setParamiv(ALeffect *effect, ALCcontext *context, ALenum param, const ALint *vals)
+{
+    ALmodulator_setParami(effect, context, param, vals[0]);
+}
+
+void ALmodulator_getParami(const ALeffect *effect, ALCcontext *context, ALenum param, ALint *val)
+{
+    const ALeffectProps *props = &effect->Props;
+    switch(param)
+    {
+        case AL_RING_MODULATOR_FREQUENCY:
+            *val = (ALint)props->Modulator.Frequency;
+            break;
+        case AL_RING_MODULATOR_HIGHPASS_CUTOFF:
+            *val = (ALint)props->Modulator.HighPassCutoff;
+            break;
+        case AL_RING_MODULATOR_WAVEFORM:
+            *val = props->Modulator.Waveform;
+            break;
+
+        default:
+            SET_ERROR_AND_RETURN(context, AL_INVALID_ENUM);
+    }
+}
+void ALmodulator_getParamiv(const ALeffect *effect, ALCcontext *context, ALenum param, ALint *vals)
+{
+    ALmodulator_getParami(effect, context, param, vals);
+}
+void ALmodulator_getParamf(const ALeffect *effect, ALCcontext *context, ALenum param, ALfloat *val)
+{
+    const ALeffectProps *props = &effect->Props;
+    switch(param)
+    {
+        case AL_RING_MODULATOR_FREQUENCY:
+            *val = props->Modulator.Frequency;
+            break;
+        case AL_RING_MODULATOR_HIGHPASS_CUTOFF:
+            *val = props->Modulator.HighPassCutoff;
+            break;
+
+        default:
+            SET_ERROR_AND_RETURN(context, AL_INVALID_ENUM);
+    }
+}
+void ALmodulator_getParamfv(const ALeffect *effect, ALCcontext *context, ALenum param, ALfloat *vals)
+{
+    ALmodulator_getParamf(effect, context, param, vals);
+}
+
+DEFINE_ALEFFECT_VTABLE(ALmodulator);

+ 155 - 0
jni/openal-soft-android/Alc/effects/null.c

@@ -0,0 +1,155 @@
+#include "config.h"
+
+#include <stdlib.h>
+
+#include "AL/al.h"
+#include "AL/alc.h"
+#include "alMain.h"
+#include "alAuxEffectSlot.h"
+#include "alError.h"
+
+
+typedef struct ALnullState {
+    DERIVE_FROM_TYPE(ALeffectState);
+} ALnullState;
+
+
+/* This destructs (not free!) the effect state. It's called only when the
+ * effect slot is no longer used.
+ */
+static ALvoid ALnullState_Destruct(ALnullState* UNUSED(state))
+{
+}
+
+/* This updates the device-dependant effect state. This is called on
+ * initialization and any time the device parameters (eg. playback frequency,
+ * format) have been changed.
+ */
+static ALboolean ALnullState_deviceUpdate(ALnullState* UNUSED(state), ALCdevice* UNUSED(device))
+{
+    return AL_TRUE;
+}
+
+/* This updates the effect state. This is called any time the effect is
+ * (re)loaded into a slot.
+ */
+static ALvoid ALnullState_update(ALnullState* UNUSED(state), ALCdevice* UNUSED(device), const ALeffectslot* UNUSED(slot))
+{
+}
+
+/* This processes the effect state, for the given number of samples from the
+ * input to the output buffer. The result should be added to the output buffer,
+ * not replace it.
+ */
+static ALvoid ALnullState_process(ALnullState* UNUSED(state), ALuint UNUSED(samplesToDo), const ALfloat *restrict UNUSED(samplesIn), ALfloat (*restrict samplesOut)[BUFFERSIZE])
+{
+    /* NOTE: Couldn't use the UNUSED macro on samplesOut due to the way GCC's
+     * __attribute__ declaration interacts with the parenthesis. */
+    (void)samplesOut;
+}
+
+/* This frees the memory used by the object, after it has been destructed. */
+static void ALnullState_Delete(ALnullState *state)
+{
+    free(state);
+}
+
+/* Define the forwards and the ALeffectState vtable for this type. */
+DEFINE_ALEFFECTSTATE_VTABLE(ALnullState);
+
+
+typedef struct ALnullStateFactory {
+    DERIVE_FROM_TYPE(ALeffectStateFactory);
+} ALnullStateFactory;
+
+/* Creates ALeffectState objects of the appropriate type. */
+ALeffectState *ALnullStateFactory_create(ALnullStateFactory *UNUSED(factory))
+{
+    ALnullState *state;
+
+    state = calloc(1, sizeof(*state));
+    if(!state) return NULL;
+    /* Set vtables for inherited types. */
+    SET_VTABLE2(ALnullState, ALeffectState, state);
+
+    return STATIC_CAST(ALeffectState, state);
+}
+
+/* Define the ALeffectStateFactory vtable for this type. */
+DEFINE_ALEFFECTSTATEFACTORY_VTABLE(ALnullStateFactory);
+
+ALeffectStateFactory *ALnullStateFactory_getFactory(void)
+{
+    static ALnullStateFactory NullFactory = { { GET_VTABLE2(ALnullStateFactory, ALeffectStateFactory) } };
+
+    return STATIC_CAST(ALeffectStateFactory, &NullFactory);
+}
+
+
+void ALnull_setParami(ALeffect* UNUSED(effect), ALCcontext *context, ALenum param, ALint UNUSED(val))
+{
+    switch(param)
+    {
+        default:
+            SET_ERROR_AND_RETURN(context, AL_INVALID_ENUM);
+    }
+}
+void ALnull_setParamiv(ALeffect* UNUSED(effect), ALCcontext *context, ALenum param, const ALint* UNUSED(vals))
+{
+    switch(param)
+    {
+        default:
+            SET_ERROR_AND_RETURN(context, AL_INVALID_ENUM);
+    }
+}
+void ALnull_setParamf(ALeffect* UNUSED(effect), ALCcontext *context, ALenum param, ALfloat UNUSED(val))
+{
+    switch(param)
+    {
+        default:
+            SET_ERROR_AND_RETURN(context, AL_INVALID_ENUM);
+    }
+}
+void ALnull_setParamfv(ALeffect* UNUSED(effect), ALCcontext *context, ALenum param, const ALfloat* UNUSED(vals))
+{
+    switch(param)
+    {
+        default:
+            SET_ERROR_AND_RETURN(context, AL_INVALID_ENUM);
+    }
+}
+
+void ALnull_getParami(const ALeffect* UNUSED(effect), ALCcontext *context, ALenum param, ALint* UNUSED(val))
+{
+    switch(param)
+    {
+        default:
+            SET_ERROR_AND_RETURN(context, AL_INVALID_ENUM);
+    }
+}
+void ALnull_getParamiv(const ALeffect* UNUSED(effect), ALCcontext *context, ALenum param, ALint* UNUSED(vals))
+{
+    switch(param)
+    {
+        default:
+            SET_ERROR_AND_RETURN(context, AL_INVALID_ENUM);
+    }
+}
+void ALnull_getParamf(const ALeffect* UNUSED(effect), ALCcontext *context, ALenum param, ALfloat* UNUSED(val))
+{
+    switch(param)
+    {
+        default:
+            SET_ERROR_AND_RETURN(context, AL_INVALID_ENUM);
+    }
+}
+void ALnull_getParamfv(const ALeffect* UNUSED(effect), ALCcontext *context, ALenum param, ALfloat* UNUSED(vals))
+{
+    switch(param)
+    {
+        default:
+            SET_ERROR_AND_RETURN(context, AL_INVALID_ENUM);
+    }
+}
+
+DEFINE_ALEFFECT_VTABLE(ALnull);

+ 776 - 312
jni/openal-soft-android/Alc/alcReverb.c → jni/openal-soft-android/Alc/effects/reverb.c

@@ -24,13 +24,13 @@
 #include <stdlib.h>
 #include <math.h>
 
-#include "AL/al.h"
-#include "AL/alc.h"
 #include "alMain.h"
+#include "alu.h"
 #include "alAuxEffectSlot.h"
 #include "alEffect.h"
+#include "alFilter.h"
 #include "alError.h"
-#include "alu.h"
+
 
 typedef struct DelayLine
 {
@@ -40,18 +40,19 @@ typedef struct DelayLine
     ALfloat *Line;
 } DelayLine;
 
-typedef struct ALverbState {
-    // Must be first in all effects!
-    ALeffectState state;
+typedef struct ALreverbState {
+    DERIVE_FROM_TYPE(ALeffectState);
+
+    ALboolean IsEax;
 
     // All delay lines are allocated as a single buffer to reduce memory
     // fragmentation and management code.
     ALfloat  *SampleBuffer;
     ALuint    TotalSamples;
 
-    // Master effect low-pass filter (2 chained 1-pole filters).
-    FILTER    LpFilter;
-    ALfloat   LpHistory[2];
+    // Master effect filters
+    ALfilterState LpFilter;
+    ALfilterState HpFilter; // EAX only
 
     struct {
         // Modulator delay line.
@@ -85,7 +86,7 @@ typedef struct ALverbState {
 
         // The gain for each output channel based on 3D panning (only for the
         // EAX path).
-        ALfloat   PanGain[MAXCHANNELS];
+        ALfloat   PanGain[MaxChannels];
     } Early;
 
     // Decorrelator delay line.
@@ -124,7 +125,7 @@ typedef struct ALverbState {
 
         // The gain for each output channel based on 3D panning (only for the
         // EAX path).
-        ALfloat   PanGain[MAXCHANNELS];
+        ALfloat   PanGain[MaxChannels];
     } Late;
 
     struct {
@@ -157,7 +158,11 @@ typedef struct ALverbState {
     // The gain for each output channel (non-EAX path only; aliased from
     // Late.PanGain)
     ALfloat *Gain;
-} ALverbState;
+
+    /* Temporary storage used when processing, before deinterlacing. */
+    ALfloat ReverbSamples[BUFFERSIZE][4];
+    ALfloat EarlySamples[BUFFERSIZE][4];
+} ALreverbState;
 
 /* This is a user config option for modifying the overall output of the reverb
  * effect.
@@ -219,24 +224,24 @@ static const ALfloat LATE_LINE_MULTIPLIER = 4.0f;
 
 
 // Basic delay line input/output routines.
-static __inline ALfloat DelayLineOut(DelayLine *Delay, ALuint offset)
+static inline ALfloat DelayLineOut(DelayLine *Delay, ALuint offset)
 {
     return Delay->Line[offset&Delay->Mask];
 }
 
-static __inline ALvoid DelayLineIn(DelayLine *Delay, ALuint offset, ALfloat in)
+static inline ALvoid DelayLineIn(DelayLine *Delay, ALuint offset, ALfloat in)
 {
     Delay->Line[offset&Delay->Mask] = in;
 }
 
 // Attenuated delay line output routine.
-static __inline ALfloat AttenuatedDelayLineOut(DelayLine *Delay, ALuint offset, ALfloat coeff)
+static inline ALfloat AttenuatedDelayLineOut(DelayLine *Delay, ALuint offset, ALfloat coeff)
 {
     return coeff * Delay->Line[offset&Delay->Mask];
 }
 
 // Basic attenuated all-pass input/output routine.
-static __inline ALfloat AllpassInOut(DelayLine *Delay, ALuint outOffset, ALuint inOffset, ALfloat in, ALfloat feedCoeff, ALfloat coeff)
+static inline ALfloat AllpassInOut(DelayLine *Delay, ALuint outOffset, ALuint inOffset, ALfloat in, ALfloat feedCoeff, ALfloat coeff)
 {
     ALfloat out, feed;
 
@@ -252,7 +257,7 @@ static __inline ALfloat AllpassInOut(DelayLine *Delay, ALuint outOffset, ALuint
 
 // Given an input sample, this function produces modulation for the late
 // reverb.
-static __inline ALfloat EAXModulation(ALverbState *State, ALfloat in)
+static inline ALfloat EAXModulation(ALreverbState *State, ALfloat in)
 {
     ALfloat sinus, frac;
     ALuint offset;
@@ -261,7 +266,7 @@ static __inline ALfloat EAXModulation(ALverbState *State, ALfloat in)
     // Calculate the sinus rythm (dependent on modulation time and the
     // sampling rate).  The center of the sinus is moved to reduce the delay
     // of the effect when the time or depth are low.
-    sinus = 1.0f - aluCos(F_PI*2.0f * State->Mod.Index / State->Mod.Range);
+    sinus = 1.0f - cosf(F_2PI * State->Mod.Index / State->Mod.Range);
 
     // The depth determines the range over which to read the input samples
     // from, so it must be filtered to reduce the distortion caused by even
@@ -289,7 +294,7 @@ static __inline ALfloat EAXModulation(ALverbState *State, ALfloat in)
 }
 
 // Delay line output routine for early reflections.
-static __inline ALfloat EarlyDelayLineOut(ALverbState *State, ALuint index)
+static inline ALfloat EarlyDelayLineOut(ALreverbState *State, ALuint index)
 {
     return AttenuatedDelayLineOut(&State->Early.Delay[index],
                                   State->Offset - State->Early.Offset[index],
@@ -298,7 +303,7 @@ static __inline ALfloat EarlyDelayLineOut(ALverbState *State, ALuint index)
 
 // Given an input sample, this function produces four-channel output for the
 // early reflections.
-static __inline ALvoid EarlyReflection(ALverbState *State, ALfloat in, ALfloat *out)
+static inline ALvoid EarlyReflection(ALreverbState *State, ALfloat in, ALfloat *restrict out)
 {
     ALfloat d[4], v, f[4];
 
@@ -343,7 +348,7 @@ static __inline ALvoid EarlyReflection(ALverbState *State, ALfloat in, ALfloat *
 }
 
 // All-pass input/output routine for late reverb.
-static __inline ALfloat LateAllPassInOut(ALverbState *State, ALuint index, ALfloat in)
+static inline ALfloat LateAllPassInOut(ALreverbState *State, ALuint index, ALfloat in)
 {
     return AllpassInOut(&State->Late.ApDelay[index],
                         State->Offset - State->Late.ApOffset[index],
@@ -352,7 +357,7 @@ static __inline ALfloat LateAllPassInOut(ALverbState *State, ALuint index, ALflo
 }
 
 // Delay line output routine for late reverb.
-static __inline ALfloat LateDelayLineOut(ALverbState *State, ALuint index)
+static inline ALfloat LateDelayLineOut(ALreverbState *State, ALuint index)
 {
     return AttenuatedDelayLineOut(&State->Late.Delay[index],
                                   State->Offset - State->Late.Offset[index],
@@ -360,7 +365,7 @@ static __inline ALfloat LateDelayLineOut(ALverbState *State, ALuint index)
 }
 
 // Low-pass filter input/output routine for late reverb.
-static __inline ALfloat LateLowPassInOut(ALverbState *State, ALuint index, ALfloat in)
+static inline ALfloat LateLowPassInOut(ALreverbState *State, ALuint index, ALfloat in)
 {
     in = lerp(in, State->Late.LpSample[index], State->Late.LpCoeff[index]);
     State->Late.LpSample[index] = in;
@@ -369,7 +374,7 @@ static __inline ALfloat LateLowPassInOut(ALverbState *State, ALuint index, ALflo
 
 // Given four decorrelated input samples, this function produces four-channel
 // output for the late reverb.
-static __inline ALvoid LateReverb(ALverbState *State, ALfloat *in, ALfloat *out)
+static inline ALvoid LateReverb(ALreverbState *State, const ALfloat *restrict in, ALfloat *restrict out)
 {
     ALfloat d[4], f[4];
 
@@ -440,7 +445,7 @@ static __inline ALvoid LateReverb(ALverbState *State, ALfloat *in, ALfloat *out)
 
 // Given an input sample, this function mixes echo into the four-channel late
 // reverb.
-static __inline ALvoid EAXEcho(ALverbState *State, ALfloat in, ALfloat *late)
+static inline ALvoid EAXEcho(ALreverbState *State, ALfloat in, ALfloat *restrict late)
 {
     ALfloat out, feed;
 
@@ -474,19 +479,19 @@ static __inline ALvoid EAXEcho(ALverbState *State, ALfloat in, ALfloat *late)
 
 // Perform the non-EAX reverb pass on a given input sample, resulting in
 // four-channel output.
-static __inline ALvoid VerbPass(ALverbState *State, ALfloat in, ALfloat *early, ALfloat *late)
+static inline ALvoid VerbPass(ALreverbState *State, ALfloat in, ALfloat *restrict out)
 {
-    ALfloat feed, taps[4];
+    ALfloat feed, late[4], taps[4];
 
-    // Low-pass filter the incoming sample.
-    in = lpFilter2P(&State->LpFilter, 0, in);
+    // Filter the incoming sample.
+    in = ALfilterState_processSingle(&State->LpFilter, in);
 
     // Feed the initial delay line.
     DelayLineIn(&State->Delay, State->Offset, in);
 
     // Calculate the early reflection from the first delay tap.
     in = DelayLineOut(&State->Delay, State->Offset - State->DelayTap[0]);
-    EarlyReflection(State, in, early);
+    EarlyReflection(State, in, out);
 
     // Feed the decorrelator from the energy-attenuated output of the second
     // delay tap.
@@ -501,18 +506,25 @@ static __inline ALvoid VerbPass(ALverbState *State, ALfloat in, ALfloat *early,
     taps[3] = DelayLineOut(&State->Decorrelator, State->Offset - State->DecoTap[2]);
     LateReverb(State, taps, late);
 
+    // Mix early reflections and late reverb.
+    out[0] += late[0];
+    out[1] += late[1];
+    out[2] += late[2];
+    out[3] += late[3];
+
     // Step all delays forward one sample.
     State->Offset++;
 }
 
 // Perform the EAX reverb pass on a given input sample, resulting in four-
 // channel output.
-static __inline ALvoid EAXVerbPass(ALverbState *State, ALfloat in, ALfloat *early, ALfloat *late)
+static inline ALvoid EAXVerbPass(ALreverbState *State, ALfloat in, ALfloat *restrict early, ALfloat *restrict late)
 {
     ALfloat feed, taps[4];
 
     // Low-pass filter the incoming sample.
-    in = lpFilter2P(&State->LpFilter, 0, in);
+    in = ALfilterState_processSingle(&State->LpFilter, in);
+    in = ALfilterState_processSingle(&State->HpFilter, in);
 
     // Perform any modulation on the input.
     in = EAXModulation(State, in);
@@ -544,85 +556,66 @@ static __inline ALvoid EAXVerbPass(ALverbState *State, ALfloat in, ALfloat *earl
     State->Offset++;
 }
 
-// This processes the reverb state, given the input samples and an output
-// buffer.
-static ALvoid VerbProcess(ALeffectState *effect, ALuint SamplesToDo, const ALfloat *SamplesIn, ALfloat (*SamplesOut)[MAXCHANNELS])
+static ALvoid ALreverbState_processStandard(ALreverbState *State, ALuint SamplesToDo, const ALfloat *restrict SamplesIn, ALfloat (*restrict SamplesOut)[BUFFERSIZE])
 {
-    ALverbState *State = (ALverbState*)effect;
-    ALuint index;
-    ALfloat early[4], late[4], out[4];
-    const ALfloat *panGain = State->Gain;
+    ALfloat (*restrict out)[4] = State->ReverbSamples;
+    ALuint index, c;
 
+    /* Process reverb for these samples. */
     for(index = 0;index < SamplesToDo;index++)
+        VerbPass(State, SamplesIn[index], out[index]);
+
+    for(c = 0;c < MaxChannels;c++)
     {
-        // Process reverb for this sample.
-        VerbPass(State, SamplesIn[index], early, late);
-
-        // Mix early reflections and late reverb.
-        out[0] = (early[0] + late[0]);
-        out[1] = (early[1] + late[1]);
-        out[2] = (early[2] + late[2]);
-        out[3] = (early[3] + late[3]);
-
-        // Output the results.
-        SamplesOut[index][FRONT_LEFT]   += panGain[FRONT_LEFT]   * out[0];
-        SamplesOut[index][FRONT_RIGHT]  += panGain[FRONT_RIGHT]  * out[1];
-        SamplesOut[index][FRONT_CENTER] += panGain[FRONT_CENTER] * out[3];
-        SamplesOut[index][SIDE_LEFT]    += panGain[SIDE_LEFT]    * out[0];
-        SamplesOut[index][SIDE_RIGHT]   += panGain[SIDE_RIGHT]   * out[1];
-        SamplesOut[index][BACK_LEFT]    += panGain[BACK_LEFT]    * out[0];
-        SamplesOut[index][BACK_RIGHT]   += panGain[BACK_RIGHT]   * out[1];
-        SamplesOut[index][BACK_CENTER]  += panGain[BACK_CENTER]  * out[2];
+        ALfloat gain = State->Gain[c];
+        if(!(gain > GAIN_SILENCE_THRESHOLD))
+            continue;
+
+        for(index = 0;index < SamplesToDo;index++)
+            SamplesOut[c][index] += gain * out[index][c&3];
     }
 }
 
-// This processes the EAX reverb state, given the input samples and an output
-// buffer.
-static ALvoid EAXVerbProcess(ALeffectState *effect, ALuint SamplesToDo, const ALfloat *SamplesIn, ALfloat (*SamplesOut)[MAXCHANNELS])
+static ALvoid ALreverbState_processEax(ALreverbState *State, ALuint SamplesToDo, const ALfloat *restrict SamplesIn, ALfloat (*restrict SamplesOut)[BUFFERSIZE])
 {
-    ALverbState *State = (ALverbState*)effect;
-    ALuint index;
-    ALfloat early[4], late[4];
+    ALfloat (*restrict early)[4] = State->EarlySamples;
+    ALfloat (*restrict late)[4] = State->ReverbSamples;
+    ALuint index, c;
 
+    /* Process reverb for these samples. */
     for(index = 0;index < SamplesToDo;index++)
+        EAXVerbPass(State, SamplesIn[index], early[index], late[index]);
+
+    for(c = 0;c < MaxChannels;c++)
     {
-        // Process reverb for this sample.
-        EAXVerbPass(State, SamplesIn[index], early, late);
-
-        // Unfortunately, while the number and configuration of gains for
-        // panning adjust according to MAXCHANNELS, the output from the
-        // reverb engine is not so scalable.
-        SamplesOut[index][FRONT_LEFT] +=
-           (State->Early.PanGain[FRONT_LEFT]*early[0] +
-            State->Late.PanGain[FRONT_LEFT]*late[0]);
-        SamplesOut[index][FRONT_RIGHT] +=
-           (State->Early.PanGain[FRONT_RIGHT]*early[1] +
-            State->Late.PanGain[FRONT_RIGHT]*late[1]);
-        SamplesOut[index][FRONT_CENTER] +=
-           (State->Early.PanGain[FRONT_CENTER]*early[3] +
-            State->Late.PanGain[FRONT_CENTER]*late[3]);
-        SamplesOut[index][SIDE_LEFT] +=
-           (State->Early.PanGain[SIDE_LEFT]*early[0] +
-            State->Late.PanGain[SIDE_LEFT]*late[0]);
-        SamplesOut[index][SIDE_RIGHT] +=
-           (State->Early.PanGain[SIDE_RIGHT]*early[1] +
-            State->Late.PanGain[SIDE_RIGHT]*late[1]);
-        SamplesOut[index][BACK_LEFT] +=
-           (State->Early.PanGain[BACK_LEFT]*early[0] +
-            State->Late.PanGain[BACK_LEFT]*late[0]);
-        SamplesOut[index][BACK_RIGHT] +=
-           (State->Early.PanGain[BACK_RIGHT]*early[1] +
-            State->Late.PanGain[BACK_RIGHT]*late[1]);
-        SamplesOut[index][BACK_CENTER] +=
-           (State->Early.PanGain[BACK_CENTER]*early[2] +
-            State->Late.PanGain[BACK_CENTER]*late[2]);
+        ALfloat earlyGain, lateGain;
+
+        earlyGain = State->Early.PanGain[c];
+        if(earlyGain > GAIN_SILENCE_THRESHOLD)
+        {
+            for(index = 0;index < SamplesToDo;index++)
+                SamplesOut[c][index] += earlyGain*early[index][c&3];
+        }
+        lateGain = State->Late.PanGain[c];
+        if(lateGain > GAIN_SILENCE_THRESHOLD)
+        {
+            for(index = 0;index < SamplesToDo;index++)
+                SamplesOut[c][index] += lateGain*late[index][c&3];
+        }
     }
 }
 
+static ALvoid ALreverbState_process(ALreverbState *State, ALuint SamplesToDo, const ALfloat *restrict SamplesIn, ALfloat (*restrict SamplesOut)[BUFFERSIZE])
+{
+    if(State->IsEax)
+        ALreverbState_processEax(State, SamplesToDo, SamplesIn, SamplesOut);
+    else
+        ALreverbState_processStandard(State, SamplesToDo, SamplesIn, SamplesOut);
+}
 
 // Given the allocated sample buffer, this function updates each delay line
 // offset.
-static __inline ALvoid RealizeLineOffset(ALfloat * sampleBuffer, DelayLine *Delay)
+static inline ALvoid RealizeLineOffset(ALfloat *sampleBuffer, DelayLine *Delay)
 {
     Delay->Line = &sampleBuffer[(ALintptrEXT)Delay->Line];
 }
@@ -646,7 +639,7 @@ static ALuint CalcLineLength(ALfloat length, ALintptrEXT offset, ALuint frequenc
  * for all lines given the sample rate (frequency).  If an allocation failure
  * occurs, it returns AL_FALSE.
  */
-static ALboolean AllocLines(ALuint frequency, ALverbState *State)
+static ALboolean AllocLines(ALuint frequency, ALreverbState *State)
 {
     ALuint totalSamples, index;
     ALfloat length;
@@ -734,12 +727,8 @@ static ALboolean AllocLines(ALuint frequency, ALverbState *State)
     return AL_TRUE;
 }
 
-// This updates the device-dependant EAX reverb state.  This is called on
-// initialization and any time the device parameters (eg. playback frequency,
-// format) have been changed.
-static ALboolean ReverbDeviceUpdate(ALeffectState *effect, ALCdevice *Device)
+static ALboolean ALreverbState_deviceUpdate(ALreverbState *State, ALCdevice *Device)
 {
-    ALverbState *State = (ALverbState*)effect;
     ALuint frequency = Device->Frequency, index;
 
     // Allocate the delay lines.
@@ -750,8 +739,8 @@ static ALboolean ReverbDeviceUpdate(ALeffectState *effect, ALCdevice *Device)
     // is calculated given the current sample rate.  This ensures that the
     // resulting filter response over time is consistent across all sample
     // rates.
-    State->Mod.Coeff = aluPow(MODULATION_FILTER_COEFF,
-                              MODULATION_FILTER_CONST / frequency);
+    State->Mod.Coeff = powf(MODULATION_FILTER_COEFF,
+                            MODULATION_FILTER_CONST / frequency);
 
     // The early reflection and late all-pass filter line lengths are static,
     // so their offsets only need to be calculated once.
@@ -772,28 +761,21 @@ static ALboolean ReverbDeviceUpdate(ALeffectState *effect, ALCdevice *Device)
 
 // Calculate a decay coefficient given the length of each cycle and the time
 // until the decay reaches -60 dB.
-static __inline ALfloat CalcDecayCoeff(ALfloat length, ALfloat decayTime)
+static inline ALfloat CalcDecayCoeff(ALfloat length, ALfloat decayTime)
 {
-    return aluPow(0.001f/*-60 dB*/, length/decayTime);
+    return powf(0.001f/*-60 dB*/, length/decayTime);
 }
 
 // Calculate a decay length from a coefficient and the time until the decay
 // reaches -60 dB.
-static __inline ALfloat CalcDecayLength(ALfloat coeff, ALfloat decayTime)
-{
-    return aluLog10(coeff) * decayTime / aluLog10(0.001f)/*-60 dB*/;
-}
-
-// Calculate the high frequency parameter for the I3DL2 coefficient
-// calculation.
-static __inline ALfloat CalcI3DL2HFreq(ALfloat hfRef, ALuint frequency)
+static inline ALfloat CalcDecayLength(ALfloat coeff, ALfloat decayTime)
 {
-    return aluCos(F_PI*2.0f * hfRef / frequency);
+    return log10f(coeff) * decayTime / log10f(0.001f)/*-60 dB*/;
 }
 
 // Calculate an attenuation to be applied to the input of any echo models to
 // compensate for modal density and decay time.
-static __inline ALfloat CalcDensityGain(ALfloat a)
+static inline ALfloat CalcDensityGain(ALfloat a)
 {
     /* The energy of a signal can be obtained by finding the area under the
      * squared signal.  This takes the form of Sum(x_n^2), where x is the
@@ -808,22 +790,22 @@ static __inline ALfloat CalcDensityGain(ALfloat a)
      * calculated by inverting the square root of this approximation,
      * yielding:  1 / sqrt(1 / (1 - a^2)), simplified to: sqrt(1 - a^2).
      */
-    return aluSqrt(1.0f - (a * a));
+    return sqrtf(1.0f - (a * a));
 }
 
 // Calculate the mixing matrix coefficients given a diffusion factor.
-static __inline ALvoid CalcMatrixCoeffs(ALfloat diffusion, ALfloat *x, ALfloat *y)
+static inline ALvoid CalcMatrixCoeffs(ALfloat diffusion, ALfloat *x, ALfloat *y)
 {
     ALfloat n, t;
 
     // The matrix is of order 4, so n is sqrt (4 - 1).
-    n = aluSqrt(3.0f);
-    t = diffusion * aluAtan(n);
+    n = sqrtf(3.0f);
+    t = diffusion * atanf(n);
 
     // Calculate the first mixing matrix coefficient.
-    *x = aluCos(t);
+    *x = cosf(t);
     // Calculate the second mixing matrix coefficient.
-    *y = aluSin(t) / n;
+    *y = sinf(t) / n;
 }
 
 // Calculate the limited HF ratio for use with the late reverb low-pass
@@ -847,7 +829,7 @@ static ALfloat CalcLimitedHfRatio(ALfloat hfRatio, ALfloat airAbsorptionGainHF,
 
 // Calculate the coefficient for a HF (and eventually LF) decay damping
 // filter.
-static __inline ALfloat CalcDampingCoeff(ALfloat hfRatio, ALfloat length, ALfloat decayTime, ALfloat decayCoeff, ALfloat cw)
+static inline ALfloat CalcDampingCoeff(ALfloat hfRatio, ALfloat length, ALfloat decayTime, ALfloat decayCoeff, ALfloat cw)
 {
     ALfloat coeff, g;
 
@@ -862,7 +844,14 @@ static __inline ALfloat CalcDampingCoeff(ALfloat hfRatio, ALfloat length, ALfloa
 
         // Damping is done with a 1-pole filter, so g needs to be squared.
         g *= g;
-        coeff = lpCoeffCalc(g, cw);
+        if(g < 0.9999f) /* 1-epsilon */
+        {
+            /* Be careful with gains < 0.001, as that causes the coefficient
+             * head towards 1, which will flatten the signal. */
+            g = maxf(g, 0.001f);
+            coeff = (1 - g*cw - sqrtf(2*g*(1-cw) - g*g*(1 - cw*cw))) /
+                    (1 - g);
+        }
 
         // Very low decay times will produce minimal output, so apply an
         // upper bound to the coefficient.
@@ -874,7 +863,7 @@ static __inline ALfloat CalcDampingCoeff(ALfloat hfRatio, ALfloat length, ALfloa
 // Update the EAX modulation index, range, and depth.  Keep in mind that this
 // kind of vibrato is additive and not multiplicative as one may expect.  The
 // downswing will sound stronger than the upswing.
-static ALvoid UpdateModulator(ALfloat modTime, ALfloat modDepth, ALuint frequency, ALverbState *State)
+static ALvoid UpdateModulator(ALfloat modTime, ALfloat modDepth, ALuint frequency, ALreverbState *State)
 {
     ALuint range;
 
@@ -904,7 +893,7 @@ static ALvoid UpdateModulator(ALfloat modTime, ALfloat modDepth, ALuint frequenc
 }
 
 // Update the offsets for the initial effect delay line.
-static ALvoid UpdateDelayLine(ALfloat earlyDelay, ALfloat lateDelay, ALuint frequency, ALverbState *State)
+static ALvoid UpdateDelayLine(ALfloat earlyDelay, ALfloat lateDelay, ALuint frequency, ALreverbState *State)
 {
     // Calculate the initial delay taps.
     State->DelayTap[0] = fastf2u(earlyDelay * frequency);
@@ -912,7 +901,7 @@ static ALvoid UpdateDelayLine(ALfloat earlyDelay, ALfloat lateDelay, ALuint freq
 }
 
 // Update the early reflections gain and line coefficients.
-static ALvoid UpdateEarlyLines(ALfloat reverbGain, ALfloat earlyGain, ALfloat lateDelay, ALverbState *State)
+static ALvoid UpdateEarlyLines(ALfloat reverbGain, ALfloat earlyGain, ALfloat lateDelay, ALreverbState *State)
 {
     ALuint index;
 
@@ -929,7 +918,7 @@ static ALvoid UpdateEarlyLines(ALfloat reverbGain, ALfloat earlyGain, ALfloat la
 }
 
 // Update the offsets for the decorrelator line.
-static ALvoid UpdateDecorrelator(ALfloat density, ALuint frequency, ALverbState *State)
+static ALvoid UpdateDecorrelator(ALfloat density, ALuint frequency, ALreverbState *State)
 {
     ALuint index;
     ALfloat length;
@@ -943,14 +932,14 @@ static ALvoid UpdateDecorrelator(ALfloat density, ALuint frequency, ALverbState
      */
     for(index = 0;index < 3;index++)
     {
-        length = (DECO_FRACTION * aluPow(DECO_MULTIPLIER, (ALfloat)index)) *
+        length = (DECO_FRACTION * powf(DECO_MULTIPLIER, (ALfloat)index)) *
                  LATE_LINE_LENGTH[0] * (1.0f + (density * LATE_LINE_MULTIPLIER));
         State->DecoTap[index] = fastf2u(length * frequency);
     }
 }
 
 // Update the late reverb gains, line lengths, and line coefficients.
-static ALvoid UpdateLateLines(ALfloat reverbGain, ALfloat lateGain, ALfloat xMix, ALfloat density, ALfloat decayTime, ALfloat diffusion, ALfloat hfRatio, ALfloat cw, ALuint frequency, ALverbState *State)
+static ALvoid UpdateLateLines(ALfloat reverbGain, ALfloat lateGain, ALfloat xMix, ALfloat density, ALfloat decayTime, ALfloat diffusion, ALfloat hfRatio, ALfloat cw, ALuint frequency, ALreverbState *State)
 {
     ALfloat length;
     ALuint index;
@@ -977,7 +966,7 @@ static ALvoid UpdateLateLines(ALfloat reverbGain, ALfloat lateGain, ALfloat xMix
                                                              decayTime));
 
     // Calculate the all-pass feed-back and feed-forward coefficient.
-    State->Late.ApFeedCoeff = 0.5f * aluPow(diffusion, 2.0f);
+    State->Late.ApFeedCoeff = 0.5f * powf(diffusion, 2.0f);
 
     for(index = 0;index < 4;index++)
     {
@@ -1008,7 +997,7 @@ static ALvoid UpdateLateLines(ALfloat reverbGain, ALfloat lateGain, ALfloat xMix
 
 // Update the echo gain, line offset, line coefficients, and mixing
 // coefficients.
-static ALvoid UpdateEchoLine(ALfloat reverbGain, ALfloat lateGain, ALfloat echoTime, ALfloat decayTime, ALfloat diffusion, ALfloat echoDepth, ALfloat hfRatio, ALfloat cw, ALuint frequency, ALverbState *State)
+static ALvoid UpdateEchoLine(ALfloat reverbGain, ALfloat lateGain, ALfloat echoTime, ALfloat decayTime, ALfloat diffusion, ALfloat echoDepth, ALfloat hfRatio, ALfloat cw, ALuint frequency, ALreverbState *State)
 {
     // Update the offset and coefficient for the echo delay line.
     State->Echo.Offset = fastf2u(echoTime * frequency);
@@ -1021,7 +1010,7 @@ static ALvoid UpdateEchoLine(ALfloat reverbGain, ALfloat lateGain, ALfloat echoT
     State->Echo.DensityGain = CalcDensityGain(State->Echo.Coeff);
 
     // Calculate the echo all-pass feed coefficient.
-    State->Echo.ApFeedCoeff = 0.5f * aluPow(diffusion, 2.0f);
+    State->Echo.ApFeedCoeff = 0.5f * powf(diffusion, 2.0f);
 
     // Calculate the echo all-pass attenuation coefficient.
     State->Echo.ApCoeff = CalcDecayCoeff(ECHO_ALLPASS_LENGTH, decayTime);
@@ -1040,30 +1029,26 @@ static ALvoid UpdateEchoLine(ALfloat reverbGain, ALfloat lateGain, ALfloat echoT
 }
 
 // Update the early and late 3D panning gains.
-static ALvoid Update3DPanning(const ALCdevice *Device, const ALfloat *ReflectionsPan, const ALfloat *LateReverbPan, ALfloat Gain, ALverbState *State)
+static ALvoid Update3DPanning(const ALCdevice *Device, const ALfloat *ReflectionsPan, const ALfloat *LateReverbPan, ALfloat Gain, ALreverbState *State)
 {
     ALfloat earlyPan[3] = { ReflectionsPan[0], ReflectionsPan[1],
                             ReflectionsPan[2] };
     ALfloat latePan[3] = { LateReverbPan[0], LateReverbPan[1],
                            LateReverbPan[2] };
-    const ALfloat *speakerGain;
     ALfloat ambientGain;
     ALfloat dirGain;
     ALfloat length;
-    ALuint index;
-    ALint pos;
 
     Gain *= ReverbBoost;
 
-    // Attenuate non-directional reverb according to the number of channels
-    ambientGain = aluSqrt(2.0f/Device->NumChan);
+    /* Attenuate reverb according to its coverage (dirGain=0 will give
+     * Gain*ambientGain, and dirGain=1 will give Gain). */
+    ambientGain = minf(sqrtf(2.0f/Device->NumChan), 1.0f);
 
-    // Calculate the 3D-panning gains for the early reflections and late
-    // reverb.
     length = earlyPan[0]*earlyPan[0] + earlyPan[1]*earlyPan[1] + earlyPan[2]*earlyPan[2];
     if(length > 1.0f)
     {
-        length = 1.0f / aluSqrt(length);
+        length = 1.0f / sqrtf(length);
         earlyPan[0] *= length;
         earlyPan[1] *= length;
         earlyPan[2] *= length;
@@ -1071,248 +1056,727 @@ static ALvoid Update3DPanning(const ALCdevice *Device, const ALfloat *Reflection
     length = latePan[0]*latePan[0] + latePan[1]*latePan[1] + latePan[2]*latePan[2];
     if(length > 1.0f)
     {
-        length = 1.0f / aluSqrt(length);
+        length = 1.0f / sqrtf(length);
         latePan[0] *= length;
         latePan[1] *= length;
         latePan[2] *= length;
     }
 
-    /* This code applies directional reverb just like the mixer applies
-     * directional sources.  It diffuses the sound toward all speakers as the
-     * magnitude of the panning vector drops, which is only a rough
-     * approximation of the expansion of sound across the speakers from the
-     * panning direction.
-     */
-    pos = aluCart2LUTpos(earlyPan[2], earlyPan[0]);
-    speakerGain = Device->PanningLUT[pos];
-    dirGain = aluSqrt((earlyPan[0] * earlyPan[0]) + (earlyPan[2] * earlyPan[2]));
+    dirGain = sqrtf(earlyPan[0]*earlyPan[0] + earlyPan[2]*earlyPan[2]);
+    ComputeAngleGains(Device, atan2f(earlyPan[0], earlyPan[2]), (1.0f-dirGain)*F_PI,
+                      lerp(ambientGain, 1.0f, dirGain) * Gain, State->Early.PanGain);
 
-    for(index = 0;index < MAXCHANNELS;index++)
-        State->Early.PanGain[index] = 0.0f;
-    for(index = 0;index < Device->NumChan;index++)
-    {
-        enum Channel chan = Device->Speaker2Chan[index];
-        State->Early.PanGain[chan] = lerp(ambientGain, speakerGain[chan], dirGain) * Gain;
-    }
-
-
-    pos = aluCart2LUTpos(latePan[2], latePan[0]);
-    speakerGain = Device->PanningLUT[pos];
-    dirGain = aluSqrt((latePan[0] * latePan[0]) + (latePan[2] * latePan[2]));
-
-    for(index = 0;index < MAXCHANNELS;index++)
-         State->Late.PanGain[index] = 0.0f;
-    for(index = 0;index < Device->NumChan;index++)
-    {
-        enum Channel chan = Device->Speaker2Chan[index];
-        State->Late.PanGain[chan] = lerp(ambientGain, speakerGain[chan], dirGain) * Gain;
-    }
+    dirGain = sqrtf(latePan[0]*latePan[0] + latePan[2]*latePan[2]);
+    ComputeAngleGains(Device, atan2f(latePan[0], latePan[2]), (1.0f-dirGain)*F_PI,
+                      lerp(ambientGain, 1.0f, dirGain) * Gain, State->Late.PanGain);
 }
 
-// This updates the EAX reverb state.  This is called any time the EAX reverb
-// effect is loaded into a slot.
-static ALvoid ReverbUpdate(ALeffectState *effect, ALCcontext *Context, const ALeffectslot *Slot)
+static ALvoid ALreverbState_update(ALreverbState *State, ALCdevice *Device, const ALeffectslot *Slot)
 {
-    ALverbState *State = (ALverbState*)effect;
-    ALuint frequency = Context->Device->Frequency;
-    ALboolean isEAX = AL_FALSE;
-    ALfloat cw, x, y, hfRatio;
+    ALuint frequency = Device->Frequency;
+    ALfloat lfscale, hfscale, hfRatio;
+    ALfloat cw, x, y;
+
+    if(Slot->EffectType == AL_EFFECT_EAXREVERB && !EmulateEAXReverb)
+        State->IsEax = AL_TRUE;
+    else if(Slot->EffectType == AL_EFFECT_REVERB || EmulateEAXReverb)
+        State->IsEax = AL_FALSE;
 
-    if(Slot->effect.type == AL_EFFECT_EAXREVERB && !EmulateEAXReverb)
+    // Calculate the master low-pass filter (from the master effect HF gain).
+    if(State->IsEax)
     {
-        State->state.Process = EAXVerbProcess;
-        isEAX = AL_TRUE;
+        hfscale = Slot->EffectProps.Reverb.HFReference / frequency;
+        ALfilterState_setParams(&State->LpFilter, ALfilterType_HighShelf,
+                                Slot->EffectProps.Reverb.GainHF,
+                                hfscale, 0.0f);
+        lfscale = Slot->EffectProps.Reverb.LFReference / frequency;
+        ALfilterState_setParams(&State->HpFilter, ALfilterType_LowShelf,
+                                Slot->EffectProps.Reverb.GainLF,
+                                lfscale, 0.0f);
     }
-    else if(Slot->effect.type == AL_EFFECT_REVERB || EmulateEAXReverb)
+    else
     {
-        State->state.Process = VerbProcess;
-        isEAX = AL_FALSE;
+        hfscale = (ALfloat)LOWPASSFREQREF / frequency;
+        ALfilterState_setParams(&State->LpFilter, ALfilterType_HighShelf,
+                                Slot->EffectProps.Reverb.GainHF,
+                                hfscale, 0.0f);
     }
 
-    // Calculate the master low-pass filter (from the master effect HF gain).
-    if(isEAX) cw = CalcI3DL2HFreq(Slot->effect.Reverb.HFReference, frequency);
-    else cw = CalcI3DL2HFreq(LOWPASSFREQREF, frequency);
-    // This is done with 2 chained 1-pole filters, so no need to square g.
-    State->LpFilter.coeff = lpCoeffCalc(Slot->effect.Reverb.GainHF, cw);
-
-    if(isEAX)
+    if(State->IsEax)
     {
         // Update the modulator line.
-        UpdateModulator(Slot->effect.Reverb.ModulationTime,
-                        Slot->effect.Reverb.ModulationDepth,
+        UpdateModulator(Slot->EffectProps.Reverb.ModulationTime,
+                        Slot->EffectProps.Reverb.ModulationDepth,
                         frequency, State);
     }
 
     // Update the initial effect delay.
-    UpdateDelayLine(Slot->effect.Reverb.ReflectionsDelay,
-                    Slot->effect.Reverb.LateReverbDelay,
+    UpdateDelayLine(Slot->EffectProps.Reverb.ReflectionsDelay,
+                    Slot->EffectProps.Reverb.LateReverbDelay,
                     frequency, State);
 
     // Update the early lines.
-    UpdateEarlyLines(Slot->effect.Reverb.Gain,
-                     Slot->effect.Reverb.ReflectionsGain,
-                     Slot->effect.Reverb.LateReverbDelay, State);
+    UpdateEarlyLines(Slot->EffectProps.Reverb.Gain,
+                     Slot->EffectProps.Reverb.ReflectionsGain,
+                     Slot->EffectProps.Reverb.LateReverbDelay, State);
 
     // Update the decorrelator.
-    UpdateDecorrelator(Slot->effect.Reverb.Density, frequency, State);
+    UpdateDecorrelator(Slot->EffectProps.Reverb.Density, frequency, State);
 
     // Get the mixing matrix coefficients (x and y).
-    CalcMatrixCoeffs(Slot->effect.Reverb.Diffusion, &x, &y);
+    CalcMatrixCoeffs(Slot->EffectProps.Reverb.Diffusion, &x, &y);
     // Then divide x into y to simplify the matrix calculation.
     State->Late.MixCoeff = y / x;
 
     // If the HF limit parameter is flagged, calculate an appropriate limit
     // based on the air absorption parameter.
-    hfRatio = Slot->effect.Reverb.DecayHFRatio;
-    if(Slot->effect.Reverb.DecayHFLimit &&
-       Slot->effect.Reverb.AirAbsorptionGainHF < 1.0f)
+    hfRatio = Slot->EffectProps.Reverb.DecayHFRatio;
+    if(Slot->EffectProps.Reverb.DecayHFLimit &&
+       Slot->EffectProps.Reverb.AirAbsorptionGainHF < 1.0f)
         hfRatio = CalcLimitedHfRatio(hfRatio,
-                                     Slot->effect.Reverb.AirAbsorptionGainHF,
-                                     Slot->effect.Reverb.DecayTime);
+                                     Slot->EffectProps.Reverb.AirAbsorptionGainHF,
+                                     Slot->EffectProps.Reverb.DecayTime);
 
+    cw = cosf(F_2PI * hfscale);
     // Update the late lines.
-    UpdateLateLines(Slot->effect.Reverb.Gain, Slot->effect.Reverb.LateReverbGain,
-                    x, Slot->effect.Reverb.Density, Slot->effect.Reverb.DecayTime,
-                    Slot->effect.Reverb.Diffusion, hfRatio, cw, frequency, State);
+    UpdateLateLines(Slot->EffectProps.Reverb.Gain, Slot->EffectProps.Reverb.LateReverbGain,
+                    x, Slot->EffectProps.Reverb.Density, Slot->EffectProps.Reverb.DecayTime,
+                    Slot->EffectProps.Reverb.Diffusion, hfRatio, cw, frequency, State);
 
-    if(isEAX)
+    if(State->IsEax)
     {
         // Update the echo line.
-        UpdateEchoLine(Slot->effect.Reverb.Gain, Slot->effect.Reverb.LateReverbGain,
-                       Slot->effect.Reverb.EchoTime, Slot->effect.Reverb.DecayTime,
-                       Slot->effect.Reverb.Diffusion, Slot->effect.Reverb.EchoDepth,
+        UpdateEchoLine(Slot->EffectProps.Reverb.Gain, Slot->EffectProps.Reverb.LateReverbGain,
+                       Slot->EffectProps.Reverb.EchoTime, Slot->EffectProps.Reverb.DecayTime,
+                       Slot->EffectProps.Reverb.Diffusion, Slot->EffectProps.Reverb.EchoDepth,
                        hfRatio, cw, frequency, State);
 
         // Update early and late 3D panning.
-        Update3DPanning(Context->Device, Slot->effect.Reverb.ReflectionsPan,
-                        Slot->effect.Reverb.LateReverbPan, Slot->Gain, State);
+        Update3DPanning(Device, Slot->EffectProps.Reverb.ReflectionsPan,
+                        Slot->EffectProps.Reverb.LateReverbPan, Slot->Gain, State);
     }
     else
     {
-        ALCdevice *Device = Context->Device;
-        ALfloat gain = Slot->Gain;
-        ALuint index;
-
         /* Update channel gains */
-        gain *= aluSqrt(2.0f/Device->NumChan) * ReverbBoost;
-        for(index = 0;index < MAXCHANNELS;index++)
-             State->Gain[index] = 0.0f;
-        for(index = 0;index < Device->NumChan;index++)
-        {
-            enum Channel chan = Device->Speaker2Chan[index];
-            State->Gain[chan] = gain;
-        }
+        ALfloat gain = sqrtf(2.0f/Device->NumChan) * ReverbBoost * Slot->Gain;
+        SetGains(Device, gain, State->Gain);
     }
 }
 
-// This destroys the reverb state.  It should be called only when the effect
-// slot has a different (or no) effect loaded over the reverb effect.
-static ALvoid ReverbDestroy(ALeffectState *effect)
+
+static ALvoid ALreverbState_Destruct(ALreverbState *State)
 {
-    ALverbState *State = (ALverbState*)effect;
-    if(State)
-    {
-        free(State->SampleBuffer);
-        State->SampleBuffer = NULL;
-        free(State);
-    }
+    free(State->SampleBuffer);
+    State->SampleBuffer = NULL;
 }
 
-// This creates the reverb state.  It should be called only when the reverb
-// effect is loaded into a slot that doesn't already have a reverb effect.
-ALeffectState *ReverbCreate(void)
+static void ALreverbState_Delete(ALreverbState *state)
 {
-    ALverbState *State = NULL;
-    ALuint index;
+    free(state);
+}
 
-    State = malloc(sizeof(ALverbState));
-    if(!State)
-        return NULL;
+DEFINE_ALEFFECTSTATE_VTABLE(ALreverbState);
 
-    State->state.Destroy = ReverbDestroy;
-    State->state.DeviceUpdate = ReverbDeviceUpdate;
-    State->state.Update = ReverbUpdate;
-    State->state.Process = VerbProcess;
 
-    State->TotalSamples = 0;
-    State->SampleBuffer = NULL;
+typedef struct ALreverbStateFactory {
+    DERIVE_FROM_TYPE(ALeffectStateFactory);
+} ALreverbStateFactory;
+
+static ALeffectState *ALreverbStateFactory_create(ALreverbStateFactory* UNUSED(factory))
+{
+    ALreverbState *state;
+    ALuint index;
 
-    State->LpFilter.coeff = 0.0f;
-    State->LpFilter.history[0] = 0.0f;
-    State->LpFilter.history[1] = 0.0f;
+    state = malloc(sizeof(ALreverbState));
+    if(!state) return NULL;
+    SET_VTABLE2(ALreverbState, ALeffectState, state);
 
-    State->Mod.Delay.Mask = 0;
-    State->Mod.Delay.Line = NULL;
-    State->Mod.Index = 0;
-    State->Mod.Range = 1;
-    State->Mod.Depth = 0.0f;
-    State->Mod.Coeff = 0.0f;
-    State->Mod.Filter = 0.0f;
+    state->TotalSamples = 0;
+    state->SampleBuffer = NULL;
 
-    State->Delay.Mask = 0;
-    State->Delay.Line = NULL;
-    State->DelayTap[0] = 0;
-    State->DelayTap[1] = 0;
+    ALfilterState_clear(&state->LpFilter);
+    ALfilterState_clear(&state->HpFilter);
 
-    State->Early.Gain = 0.0f;
+    state->Mod.Delay.Mask = 0;
+    state->Mod.Delay.Line = NULL;
+    state->Mod.Index = 0;
+    state->Mod.Range = 1;
+    state->Mod.Depth = 0.0f;
+    state->Mod.Coeff = 0.0f;
+    state->Mod.Filter = 0.0f;
+
+    state->Delay.Mask = 0;
+    state->Delay.Line = NULL;
+    state->DelayTap[0] = 0;
+    state->DelayTap[1] = 0;
+
+    state->Early.Gain = 0.0f;
     for(index = 0;index < 4;index++)
     {
-        State->Early.Coeff[index] = 0.0f;
-        State->Early.Delay[index].Mask = 0;
-        State->Early.Delay[index].Line = NULL;
-        State->Early.Offset[index] = 0;
+        state->Early.Coeff[index] = 0.0f;
+        state->Early.Delay[index].Mask = 0;
+        state->Early.Delay[index].Line = NULL;
+        state->Early.Offset[index] = 0;
     }
 
-    State->Decorrelator.Mask = 0;
-    State->Decorrelator.Line = NULL;
-    State->DecoTap[0] = 0;
-    State->DecoTap[1] = 0;
-    State->DecoTap[2] = 0;
+    state->Decorrelator.Mask = 0;
+    state->Decorrelator.Line = NULL;
+    state->DecoTap[0] = 0;
+    state->DecoTap[1] = 0;
+    state->DecoTap[2] = 0;
 
-    State->Late.Gain = 0.0f;
-    State->Late.DensityGain = 0.0f;
-    State->Late.ApFeedCoeff = 0.0f;
-    State->Late.MixCoeff = 0.0f;
+    state->Late.Gain = 0.0f;
+    state->Late.DensityGain = 0.0f;
+    state->Late.ApFeedCoeff = 0.0f;
+    state->Late.MixCoeff = 0.0f;
     for(index = 0;index < 4;index++)
     {
-        State->Late.ApCoeff[index] = 0.0f;
-        State->Late.ApDelay[index].Mask = 0;
-        State->Late.ApDelay[index].Line = NULL;
-        State->Late.ApOffset[index] = 0;
-
-        State->Late.Coeff[index] = 0.0f;
-        State->Late.Delay[index].Mask = 0;
-        State->Late.Delay[index].Line = NULL;
-        State->Late.Offset[index] = 0;
-
-        State->Late.LpCoeff[index] = 0.0f;
-        State->Late.LpSample[index] = 0.0f;
+        state->Late.ApCoeff[index] = 0.0f;
+        state->Late.ApDelay[index].Mask = 0;
+        state->Late.ApDelay[index].Line = NULL;
+        state->Late.ApOffset[index] = 0;
+
+        state->Late.Coeff[index] = 0.0f;
+        state->Late.Delay[index].Mask = 0;
+        state->Late.Delay[index].Line = NULL;
+        state->Late.Offset[index] = 0;
+
+        state->Late.LpCoeff[index] = 0.0f;
+        state->Late.LpSample[index] = 0.0f;
+    }
+
+    for(index = 0;index < MaxChannels;index++)
+    {
+        state->Early.PanGain[index] = 0.0f;
+        state->Late.PanGain[index] = 0.0f;
+    }
+
+    state->Echo.DensityGain = 0.0f;
+    state->Echo.Delay.Mask = 0;
+    state->Echo.Delay.Line = NULL;
+    state->Echo.ApDelay.Mask = 0;
+    state->Echo.ApDelay.Line = NULL;
+    state->Echo.Coeff = 0.0f;
+    state->Echo.ApFeedCoeff = 0.0f;
+    state->Echo.ApCoeff = 0.0f;
+    state->Echo.Offset = 0;
+    state->Echo.ApOffset = 0;
+    state->Echo.LpCoeff = 0.0f;
+    state->Echo.LpSample = 0.0f;
+    state->Echo.MixCoeff[0] = 0.0f;
+    state->Echo.MixCoeff[1] = 0.0f;
+
+    state->Offset = 0;
+
+    state->Gain = state->Late.PanGain;
+
+    return STATIC_CAST(ALeffectState, state);
+}
+
+DEFINE_ALEFFECTSTATEFACTORY_VTABLE(ALreverbStateFactory);
+
+ALeffectStateFactory *ALreverbStateFactory_getFactory(void)
+{
+    static ALreverbStateFactory ReverbFactory = { { GET_VTABLE2(ALreverbStateFactory, ALeffectStateFactory) } };
+
+    return STATIC_CAST(ALeffectStateFactory, &ReverbFactory);
+}
+
+
+void ALeaxreverb_setParami(ALeffect *effect, ALCcontext *context, ALenum param, ALint val)
+{
+    ALeffectProps *props = &effect->Props;
+    switch(param)
+    {
+        case AL_EAXREVERB_DECAY_HFLIMIT:
+            if(!(val >= AL_EAXREVERB_MIN_DECAY_HFLIMIT && val <= AL_EAXREVERB_MAX_DECAY_HFLIMIT))
+                SET_ERROR_AND_RETURN(context, AL_INVALID_VALUE);
+            props->Reverb.DecayHFLimit = val;
+            break;
+
+        default:
+            SET_ERROR_AND_RETURN(context, AL_INVALID_ENUM);
+    }
+}
+void ALeaxreverb_setParamiv(ALeffect *effect, ALCcontext *context, ALenum param, const ALint *vals)
+{
+    ALeaxreverb_setParami(effect, context, param, vals[0]);
+}
+void ALeaxreverb_setParamf(ALeffect *effect, ALCcontext *context, ALenum param, ALfloat val)
+{
+    ALeffectProps *props = &effect->Props;
+    switch(param)
+    {
+        case AL_EAXREVERB_DENSITY:
+            if(!(val >= AL_EAXREVERB_MIN_DENSITY && val <= AL_EAXREVERB_MAX_DENSITY))
+                SET_ERROR_AND_RETURN(context, AL_INVALID_VALUE);
+            props->Reverb.Density = val;
+            break;
+
+        case AL_EAXREVERB_DIFFUSION:
+            if(!(val >= AL_EAXREVERB_MIN_DIFFUSION && val <= AL_EAXREVERB_MAX_DIFFUSION))
+                SET_ERROR_AND_RETURN(context, AL_INVALID_VALUE);
+            props->Reverb.Diffusion = val;
+            break;
+
+        case AL_EAXREVERB_GAIN:
+            if(!(val >= AL_EAXREVERB_MIN_GAIN && val <= AL_EAXREVERB_MAX_GAIN))
+                SET_ERROR_AND_RETURN(context, AL_INVALID_VALUE);
+            props->Reverb.Gain = val;
+            break;
+
+        case AL_EAXREVERB_GAINHF:
+            if(!(val >= AL_EAXREVERB_MIN_GAINHF && val <= AL_EAXREVERB_MAX_GAINHF))
+                SET_ERROR_AND_RETURN(context, AL_INVALID_VALUE);
+            props->Reverb.GainHF = val;
+            break;
+
+        case AL_EAXREVERB_GAINLF:
+            if(!(val >= AL_EAXREVERB_MIN_GAINLF && val <= AL_EAXREVERB_MAX_GAINLF))
+                SET_ERROR_AND_RETURN(context, AL_INVALID_VALUE);
+            props->Reverb.GainLF = val;
+            break;
+
+        case AL_EAXREVERB_DECAY_TIME:
+            if(!(val >= AL_EAXREVERB_MIN_DECAY_TIME && val <= AL_EAXREVERB_MAX_DECAY_TIME))
+                SET_ERROR_AND_RETURN(context, AL_INVALID_VALUE);
+            props->Reverb.DecayTime = val;
+            break;
+
+        case AL_EAXREVERB_DECAY_HFRATIO:
+            if(!(val >= AL_EAXREVERB_MIN_DECAY_HFRATIO && val <= AL_EAXREVERB_MAX_DECAY_HFRATIO))
+                SET_ERROR_AND_RETURN(context, AL_INVALID_VALUE);
+            props->Reverb.DecayHFRatio = val;
+            break;
+
+        case AL_EAXREVERB_DECAY_LFRATIO:
+            if(!(val >= AL_EAXREVERB_MIN_DECAY_LFRATIO && val <= AL_EAXREVERB_MAX_DECAY_LFRATIO))
+                SET_ERROR_AND_RETURN(context, AL_INVALID_VALUE);
+            props->Reverb.DecayLFRatio = val;
+            break;
+
+        case AL_EAXREVERB_REFLECTIONS_GAIN:
+            if(!(val >= AL_EAXREVERB_MIN_REFLECTIONS_GAIN && val <= AL_EAXREVERB_MAX_REFLECTIONS_GAIN))
+                SET_ERROR_AND_RETURN(context, AL_INVALID_VALUE);
+            props->Reverb.ReflectionsGain = val;
+            break;
+
+        case AL_EAXREVERB_REFLECTIONS_DELAY:
+            if(!(val >= AL_EAXREVERB_MIN_REFLECTIONS_DELAY && val <= AL_EAXREVERB_MAX_REFLECTIONS_DELAY))
+                SET_ERROR_AND_RETURN(context, AL_INVALID_VALUE);
+            props->Reverb.ReflectionsDelay = val;
+            break;
+
+        case AL_EAXREVERB_LATE_REVERB_GAIN:
+            if(!(val >= AL_EAXREVERB_MIN_LATE_REVERB_GAIN && val <= AL_EAXREVERB_MAX_LATE_REVERB_GAIN))
+                SET_ERROR_AND_RETURN(context, AL_INVALID_VALUE);
+            props->Reverb.LateReverbGain = val;
+            break;
+
+        case AL_EAXREVERB_LATE_REVERB_DELAY:
+            if(!(val >= AL_EAXREVERB_MIN_LATE_REVERB_DELAY && val <= AL_EAXREVERB_MAX_LATE_REVERB_DELAY))
+                SET_ERROR_AND_RETURN(context, AL_INVALID_VALUE);
+            props->Reverb.LateReverbDelay = val;
+            break;
+
+        case AL_EAXREVERB_AIR_ABSORPTION_GAINHF:
+            if(!(val >= AL_EAXREVERB_MIN_AIR_ABSORPTION_GAINHF && val <= AL_EAXREVERB_MAX_AIR_ABSORPTION_GAINHF))
+                SET_ERROR_AND_RETURN(context, AL_INVALID_VALUE);
+            props->Reverb.AirAbsorptionGainHF = val;
+            break;
+
+        case AL_EAXREVERB_ECHO_TIME:
+            if(!(val >= AL_EAXREVERB_MIN_ECHO_TIME && val <= AL_EAXREVERB_MAX_ECHO_TIME))
+                SET_ERROR_AND_RETURN(context, AL_INVALID_VALUE);
+            props->Reverb.EchoTime = val;
+            break;
+
+        case AL_EAXREVERB_ECHO_DEPTH:
+            if(!(val >= AL_EAXREVERB_MIN_ECHO_DEPTH && val <= AL_EAXREVERB_MAX_ECHO_DEPTH))
+                SET_ERROR_AND_RETURN(context, AL_INVALID_VALUE);
+            props->Reverb.EchoDepth = val;
+            break;
+
+        case AL_EAXREVERB_MODULATION_TIME:
+            if(!(val >= AL_EAXREVERB_MIN_MODULATION_TIME && val <= AL_EAXREVERB_MAX_MODULATION_TIME))
+                SET_ERROR_AND_RETURN(context, AL_INVALID_VALUE);
+            props->Reverb.ModulationTime = val;
+            break;
+
+        case AL_EAXREVERB_MODULATION_DEPTH:
+            if(!(val >= AL_EAXREVERB_MIN_MODULATION_DEPTH && val <= AL_EAXREVERB_MAX_MODULATION_DEPTH))
+                SET_ERROR_AND_RETURN(context, AL_INVALID_VALUE);
+            props->Reverb.ModulationDepth = val;
+            break;
+
+        case AL_EAXREVERB_HFREFERENCE:
+            if(!(val >= AL_EAXREVERB_MIN_HFREFERENCE && val <= AL_EAXREVERB_MAX_HFREFERENCE))
+                SET_ERROR_AND_RETURN(context, AL_INVALID_VALUE);
+            props->Reverb.HFReference = val;
+            break;
+
+        case AL_EAXREVERB_LFREFERENCE:
+            if(!(val >= AL_EAXREVERB_MIN_LFREFERENCE && val <= AL_EAXREVERB_MAX_LFREFERENCE))
+                SET_ERROR_AND_RETURN(context, AL_INVALID_VALUE);
+            props->Reverb.LFReference = val;
+            break;
+
+        case AL_EAXREVERB_ROOM_ROLLOFF_FACTOR:
+            if(!(val >= AL_EAXREVERB_MIN_ROOM_ROLLOFF_FACTOR && val <= AL_EAXREVERB_MAX_ROOM_ROLLOFF_FACTOR))
+                SET_ERROR_AND_RETURN(context, AL_INVALID_VALUE);
+            props->Reverb.RoomRolloffFactor = val;
+            break;
+
+        default:
+            SET_ERROR_AND_RETURN(context, AL_INVALID_ENUM);
     }
+}
+void ALeaxreverb_setParamfv(ALeffect *effect, ALCcontext *context, ALenum param, const ALfloat *vals)
+{
+    ALeffectProps *props = &effect->Props;
+    switch(param)
+    {
+        case AL_EAXREVERB_REFLECTIONS_PAN:
+            if(!(isfinite(vals[0]) && isfinite(vals[1]) && isfinite(vals[2])))
+                SET_ERROR_AND_RETURN(context, AL_INVALID_VALUE);
+            LockContext(context);
+            props->Reverb.ReflectionsPan[0] = vals[0];
+            props->Reverb.ReflectionsPan[1] = vals[1];
+            props->Reverb.ReflectionsPan[2] = vals[2];
+            UnlockContext(context);
+            break;
+        case AL_EAXREVERB_LATE_REVERB_PAN:
+            if(!(isfinite(vals[0]) && isfinite(vals[1]) && isfinite(vals[2])))
+                SET_ERROR_AND_RETURN(context, AL_INVALID_VALUE);
+            LockContext(context);
+            props->Reverb.LateReverbPan[0] = vals[0];
+            props->Reverb.LateReverbPan[1] = vals[1];
+            props->Reverb.LateReverbPan[2] = vals[2];
+            UnlockContext(context);
+            break;
+
+        default:
+            ALeaxreverb_setParamf(effect, context, param, vals[0]);
+            break;
+    }
+}
 
-    for(index = 0;index < MAXCHANNELS;index++)
+void ALeaxreverb_getParami(const ALeffect *effect, ALCcontext *context, ALenum param, ALint *val)
+{
+    const ALeffectProps *props = &effect->Props;
+    switch(param)
     {
-        State->Early.PanGain[index] = 0.0f;
-        State->Late.PanGain[index] = 0.0f;
+        case AL_EAXREVERB_DECAY_HFLIMIT:
+            *val = props->Reverb.DecayHFLimit;
+            break;
+
+        default:
+            SET_ERROR_AND_RETURN(context, AL_INVALID_ENUM);
     }
+}
+void ALeaxreverb_getParamiv(const ALeffect *effect, ALCcontext *context, ALenum param, ALint *vals)
+{
+    ALeaxreverb_getParami(effect, context, param, vals);
+}
+void ALeaxreverb_getParamf(const ALeffect *effect, ALCcontext *context, ALenum param, ALfloat *val)
+{
+    const ALeffectProps *props = &effect->Props;
+    switch(param)
+    {
+        case AL_EAXREVERB_DENSITY:
+            *val = props->Reverb.Density;
+            break;
+
+        case AL_EAXREVERB_DIFFUSION:
+            *val = props->Reverb.Diffusion;
+            break;
+
+        case AL_EAXREVERB_GAIN:
+            *val = props->Reverb.Gain;
+            break;
+
+        case AL_EAXREVERB_GAINHF:
+            *val = props->Reverb.GainHF;
+            break;
+
+        case AL_EAXREVERB_GAINLF:
+            *val = props->Reverb.GainLF;
+            break;
+
+        case AL_EAXREVERB_DECAY_TIME:
+            *val = props->Reverb.DecayTime;
+            break;
+
+        case AL_EAXREVERB_DECAY_HFRATIO:
+            *val = props->Reverb.DecayHFRatio;
+            break;
+
+        case AL_EAXREVERB_DECAY_LFRATIO:
+            *val = props->Reverb.DecayLFRatio;
+            break;
+
+        case AL_EAXREVERB_REFLECTIONS_GAIN:
+            *val = props->Reverb.ReflectionsGain;
+            break;
 
-    State->Echo.DensityGain = 0.0f;
-    State->Echo.Delay.Mask = 0;
-    State->Echo.Delay.Line = NULL;
-    State->Echo.ApDelay.Mask = 0;
-    State->Echo.ApDelay.Line = NULL;
-    State->Echo.Coeff = 0.0f;
-    State->Echo.ApFeedCoeff = 0.0f;
-    State->Echo.ApCoeff = 0.0f;
-    State->Echo.Offset = 0;
-    State->Echo.ApOffset = 0;
-    State->Echo.LpCoeff = 0.0f;
-    State->Echo.LpSample = 0.0f;
-    State->Echo.MixCoeff[0] = 0.0f;
-    State->Echo.MixCoeff[1] = 0.0f;
-
-    State->Offset = 0;
-
-    State->Gain = State->Late.PanGain;
-
-    return &State->state;
+        case AL_EAXREVERB_REFLECTIONS_DELAY:
+            *val = props->Reverb.ReflectionsDelay;
+            break;
+
+        case AL_EAXREVERB_LATE_REVERB_GAIN:
+            *val = props->Reverb.LateReverbGain;
+            break;
+
+        case AL_EAXREVERB_LATE_REVERB_DELAY:
+            *val = props->Reverb.LateReverbDelay;
+            break;
+
+        case AL_EAXREVERB_AIR_ABSORPTION_GAINHF:
+            *val = props->Reverb.AirAbsorptionGainHF;
+            break;
+
+        case AL_EAXREVERB_ECHO_TIME:
+            *val = props->Reverb.EchoTime;
+            break;
+
+        case AL_EAXREVERB_ECHO_DEPTH:
+            *val = props->Reverb.EchoDepth;
+            break;
+
+        case AL_EAXREVERB_MODULATION_TIME:
+            *val = props->Reverb.ModulationTime;
+            break;
+
+        case AL_EAXREVERB_MODULATION_DEPTH:
+            *val = props->Reverb.ModulationDepth;
+            break;
+
+        case AL_EAXREVERB_HFREFERENCE:
+            *val = props->Reverb.HFReference;
+            break;
+
+        case AL_EAXREVERB_LFREFERENCE:
+            *val = props->Reverb.LFReference;
+            break;
+
+        case AL_EAXREVERB_ROOM_ROLLOFF_FACTOR:
+            *val = props->Reverb.RoomRolloffFactor;
+            break;
+
+        default:
+            SET_ERROR_AND_RETURN(context, AL_INVALID_ENUM);
+    }
 }
+void ALeaxreverb_getParamfv(const ALeffect *effect, ALCcontext *context, ALenum param, ALfloat *vals)
+{
+    const ALeffectProps *props = &effect->Props;
+    switch(param)
+    {
+        case AL_EAXREVERB_REFLECTIONS_PAN:
+            LockContext(context);
+            vals[0] = props->Reverb.ReflectionsPan[0];
+            vals[1] = props->Reverb.ReflectionsPan[1];
+            vals[2] = props->Reverb.ReflectionsPan[2];
+            UnlockContext(context);
+            break;
+        case AL_EAXREVERB_LATE_REVERB_PAN:
+            LockContext(context);
+            vals[0] = props->Reverb.LateReverbPan[0];
+            vals[1] = props->Reverb.LateReverbPan[1];
+            vals[2] = props->Reverb.LateReverbPan[2];
+            UnlockContext(context);
+            break;
+
+        default:
+            ALeaxreverb_getParamf(effect, context, param, vals);
+            break;
+    }
+}
+
+DEFINE_ALEFFECT_VTABLE(ALeaxreverb);
+
+void ALreverb_setParami(ALeffect *effect, ALCcontext *context, ALenum param, ALint val)
+{
+    ALeffectProps *props = &effect->Props;
+    switch(param)
+    {
+        case AL_REVERB_DECAY_HFLIMIT:
+            if(!(val >= AL_REVERB_MIN_DECAY_HFLIMIT && val <= AL_REVERB_MAX_DECAY_HFLIMIT))
+                SET_ERROR_AND_RETURN(context, AL_INVALID_VALUE);
+            props->Reverb.DecayHFLimit = val;
+            break;
+
+        default:
+            SET_ERROR_AND_RETURN(context, AL_INVALID_ENUM);
+    }
+}
+void ALreverb_setParamiv(ALeffect *effect, ALCcontext *context, ALenum param, const ALint *vals)
+{
+    ALreverb_setParami(effect, context, param, vals[0]);
+}
+void ALreverb_setParamf(ALeffect *effect, ALCcontext *context, ALenum param, ALfloat val)
+{
+    ALeffectProps *props = &effect->Props;
+    switch(param)
+    {
+        case AL_REVERB_DENSITY:
+            if(!(val >= AL_REVERB_MIN_DENSITY && val <= AL_REVERB_MAX_DENSITY))
+                SET_ERROR_AND_RETURN(context, AL_INVALID_VALUE);
+            props->Reverb.Density = val;
+            break;
+
+        case AL_REVERB_DIFFUSION:
+            if(!(val >= AL_REVERB_MIN_DIFFUSION && val <= AL_REVERB_MAX_DIFFUSION))
+                SET_ERROR_AND_RETURN(context, AL_INVALID_VALUE);
+            props->Reverb.Diffusion = val;
+            break;
+
+        case AL_REVERB_GAIN:
+            if(!(val >= AL_REVERB_MIN_GAIN && val <= AL_REVERB_MAX_GAIN))
+                SET_ERROR_AND_RETURN(context, AL_INVALID_VALUE);
+            props->Reverb.Gain = val;
+            break;
+
+        case AL_REVERB_GAINHF:
+            if(!(val >= AL_REVERB_MIN_GAINHF && val <= AL_REVERB_MAX_GAINHF))
+                SET_ERROR_AND_RETURN(context, AL_INVALID_VALUE);
+            props->Reverb.GainHF = val;
+            break;
+
+        case AL_REVERB_DECAY_TIME:
+            if(!(val >= AL_REVERB_MIN_DECAY_TIME && val <= AL_REVERB_MAX_DECAY_TIME))
+                SET_ERROR_AND_RETURN(context, AL_INVALID_VALUE);
+            props->Reverb.DecayTime = val;
+            break;
+
+        case AL_REVERB_DECAY_HFRATIO:
+            if(!(val >= AL_REVERB_MIN_DECAY_HFRATIO && val <= AL_REVERB_MAX_DECAY_HFRATIO))
+                SET_ERROR_AND_RETURN(context, AL_INVALID_VALUE);
+            props->Reverb.DecayHFRatio = val;
+            break;
+
+        case AL_REVERB_REFLECTIONS_GAIN:
+            if(!(val >= AL_REVERB_MIN_REFLECTIONS_GAIN && val <= AL_REVERB_MAX_REFLECTIONS_GAIN))
+                SET_ERROR_AND_RETURN(context, AL_INVALID_VALUE);
+            props->Reverb.ReflectionsGain = val;
+            break;
+
+        case AL_REVERB_REFLECTIONS_DELAY:
+            if(!(val >= AL_REVERB_MIN_REFLECTIONS_DELAY && val <= AL_REVERB_MAX_REFLECTIONS_DELAY))
+                SET_ERROR_AND_RETURN(context, AL_INVALID_VALUE);
+            props->Reverb.ReflectionsDelay = val;
+            break;
+
+        case AL_REVERB_LATE_REVERB_GAIN:
+            if(!(val >= AL_REVERB_MIN_LATE_REVERB_GAIN && val <= AL_REVERB_MAX_LATE_REVERB_GAIN))
+                SET_ERROR_AND_RETURN(context, AL_INVALID_VALUE);
+            props->Reverb.LateReverbGain = val;
+            break;
+
+        case AL_REVERB_LATE_REVERB_DELAY:
+            if(!(val >= AL_REVERB_MIN_LATE_REVERB_DELAY && val <= AL_REVERB_MAX_LATE_REVERB_DELAY))
+                SET_ERROR_AND_RETURN(context, AL_INVALID_VALUE);
+            props->Reverb.LateReverbDelay = val;
+            break;
+
+        case AL_REVERB_AIR_ABSORPTION_GAINHF:
+            if(!(val >= AL_REVERB_MIN_AIR_ABSORPTION_GAINHF && val <= AL_REVERB_MAX_AIR_ABSORPTION_GAINHF))
+                SET_ERROR_AND_RETURN(context, AL_INVALID_VALUE);
+            props->Reverb.AirAbsorptionGainHF = val;
+            break;
+
+        case AL_REVERB_ROOM_ROLLOFF_FACTOR:
+            if(!(val >= AL_REVERB_MIN_ROOM_ROLLOFF_FACTOR && val <= AL_REVERB_MAX_ROOM_ROLLOFF_FACTOR))
+                SET_ERROR_AND_RETURN(context, AL_INVALID_VALUE);
+            props->Reverb.RoomRolloffFactor = val;
+            break;
+
+        default:
+            SET_ERROR_AND_RETURN(context, AL_INVALID_ENUM);
+    }
+}
+void ALreverb_setParamfv(ALeffect *effect, ALCcontext *context, ALenum param, const ALfloat *vals)
+{
+    ALreverb_setParamf(effect, context, param, vals[0]);
+}
+
+void ALreverb_getParami(const ALeffect *effect, ALCcontext *context, ALenum param, ALint *val)
+{
+    const ALeffectProps *props = &effect->Props;
+    switch(param)
+    {
+        case AL_REVERB_DECAY_HFLIMIT:
+            *val = props->Reverb.DecayHFLimit;
+            break;
+
+        default:
+            SET_ERROR_AND_RETURN(context, AL_INVALID_ENUM);
+    }
+}
+void ALreverb_getParamiv(const ALeffect *effect, ALCcontext *context, ALenum param, ALint *vals)
+{
+    ALreverb_getParami(effect, context, param, vals);
+}
+void ALreverb_getParamf(const ALeffect *effect, ALCcontext *context, ALenum param, ALfloat *val)
+{
+    const ALeffectProps *props = &effect->Props;
+    switch(param)
+    {
+        case AL_REVERB_DENSITY:
+            *val = props->Reverb.Density;
+            break;
+
+        case AL_REVERB_DIFFUSION:
+            *val = props->Reverb.Diffusion;
+            break;
+
+        case AL_REVERB_GAIN:
+            *val = props->Reverb.Gain;
+            break;
+
+        case AL_REVERB_GAINHF:
+            *val = props->Reverb.GainHF;
+            break;
+
+        case AL_REVERB_DECAY_TIME:
+            *val = props->Reverb.DecayTime;
+            break;
+
+        case AL_REVERB_DECAY_HFRATIO:
+            *val = props->Reverb.DecayHFRatio;
+            break;
+
+        case AL_REVERB_REFLECTIONS_GAIN:
+            *val = props->Reverb.ReflectionsGain;
+            break;
+
+        case AL_REVERB_REFLECTIONS_DELAY:
+            *val = props->Reverb.ReflectionsDelay;
+            break;
+
+        case AL_REVERB_LATE_REVERB_GAIN:
+            *val = props->Reverb.LateReverbGain;
+            break;
+
+        case AL_REVERB_LATE_REVERB_DELAY:
+            *val = props->Reverb.LateReverbDelay;
+            break;
+
+        case AL_REVERB_AIR_ABSORPTION_GAINHF:
+            *val = props->Reverb.AirAbsorptionGainHF;
+            break;
+
+        case AL_REVERB_ROOM_ROLLOFF_FACTOR:
+            *val = props->Reverb.RoomRolloffFactor;
+            break;
+
+        default:
+            SET_ERROR_AND_RETURN(context, AL_INVALID_ENUM);
+    }
+}
+void ALreverb_getParamfv(const ALeffect *effect, ALCcontext *context, ALenum param, ALfloat *vals)
+{
+    ALreverb_getParamf(effect, context, param, vals);
+}
+
+DEFINE_ALEFFECT_VTABLE(ALreverb);

+ 31 - 0
jni/openal-soft-android/Alc/evtqueue.h

@@ -0,0 +1,31 @@
+#ifndef AL_EVTQUEUE_H
+#define AL_EVTQUEUE_H
+
+#include "AL/al.h"
+
+#include "alMain.h"
+
+typedef struct MidiEvent {
+    ALuint64 time;
+    ALuint event;
+    union {
+        ALuint val[2];
+        struct {
+            ALvoid *data;
+            ALsizei size;
+        } sysex;
+    } param;
+} MidiEvent;
+
+typedef struct EvtQueue {
+    MidiEvent *events;
+    ALsizei pos;
+    ALsizei size;
+    ALsizei maxsize;
+} EvtQueue;
+
+void InitEvtQueue(EvtQueue *queue);
+void ResetEvtQueue(EvtQueue *queue);
+ALenum InsertEvtQueue(EvtQueue *queue, const MidiEvent *evt);
+
+#endif /* AL_EVTQUEUE_H */

+ 295 - 31
jni/openal-soft-android/Alc/helpers.c

@@ -21,10 +21,14 @@
 #include "config.h"
 
 #include <stdlib.h>
-#ifdef HAVE_DLFCN_H
-#include <dlfcn.h>
+#include <time.h>
+#include <errno.h>
+#include <stdarg.h>
+#ifdef HAVE_MALLOC_H
+#include <malloc.h>
 #endif
 
+#ifndef AL_NO_UID_DEFS
 #if defined(HAVE_GUIDDEF_H) || defined(HAVE_INITGUID_H)
 #define INITGUID
 #include <windows.h>
@@ -44,23 +48,266 @@ DEFINE_GUID(IID_IMMDeviceEnumerator,  0xa95664d2, 0x9614, 0x4f35, 0xa7,0x46, 0xd
 DEFINE_GUID(IID_IAudioClient,         0x1cb9ad4c, 0xdbfa, 0x4c32, 0xb1,0x78, 0xc2,0xf5,0x68,0xa7,0x03,0xb2);
 DEFINE_GUID(IID_IAudioRenderClient,   0xf294acfc, 0x3146, 0x4483, 0xa7,0xbf, 0xad,0xdc,0xa7,0xc2,0x60,0xe2);
 
+#ifdef HAVE_MMDEVAPI
+#include <devpropdef.h>
+DEFINE_DEVPROPKEY(DEVPKEY_Device_FriendlyName, 0xa45c254e, 0xdf1c, 0x4efd, 0x80,0x20, 0x67,0xd1,0x46,0xa8,0x50,0xe0, 14);
+#endif
+#endif
+#endif /* AL_NO_UID_DEFS */
+
+#ifdef HAVE_DLFCN_H
+#include <dlfcn.h>
+#endif
+#ifdef HAVE_CPUID_H
+#include <cpuid.h>
+#endif
+#ifdef HAVE_SYS_SYSCONF_H
+#include <sys/sysconf.h>
+#endif
+#ifdef HAVE_FLOAT_H
+#include <float.h>
+#endif
+#ifdef HAVE_IEEEFP_H
+#include <ieeefp.h>
 #endif
 
 #include "alMain.h"
+#include "atomic.h"
+#include "uintmap.h"
+#include "compat.h"
+
+
+extern inline RefCount IncrementRef(volatile RefCount *ptr);
+extern inline RefCount DecrementRef(volatile RefCount *ptr);
+extern inline int ExchangeInt(volatile int *ptr, int newval);
+extern inline void *ExchangePtr(XchgPtr *ptr, void *newval);
+extern inline ALboolean CompExchangeInt(volatile int *ptr, int oldval, int newval);
+extern inline ALboolean CompExchangePtr(XchgPtr *ptr, void *oldval, void *newval);
+
+extern inline void LockUIntMapRead(UIntMap *map);
+extern inline void UnlockUIntMapRead(UIntMap *map);
+extern inline void LockUIntMapWrite(UIntMap *map);
+extern inline void UnlockUIntMapWrite(UIntMap *map);
+
+extern inline ALuint NextPowerOf2(ALuint value);
+extern inline ALint fastf2i(ALfloat f);
+extern inline ALuint fastf2u(ALfloat f);
+
+
+ALuint CPUCapFlags = 0;
+
+
+void FillCPUCaps(ALuint capfilter)
+{
+    ALuint caps = 0;
+
+/* FIXME: We really should get this for all available CPUs in case different
+ * CPUs have different caps (is that possible on one machine?). */
+#if defined(HAVE_CPUID_H) && (defined(__i386__) || defined(__x86_64__) || \
+                              defined(_M_IX86) || defined(_M_X64))
+    union {
+        unsigned int regs[4];
+        char str[sizeof(unsigned int[4])];
+    } cpuinf[3];
+
+    if(!__get_cpuid(0, &cpuinf[0].regs[0], &cpuinf[0].regs[1], &cpuinf[0].regs[2], &cpuinf[0].regs[3]))
+        ERR("Failed to get CPUID\n");
+    else
+    {
+        unsigned int maxfunc = cpuinf[0].regs[0];
+        unsigned int maxextfunc = 0;
+
+        if(__get_cpuid(0x80000000, &cpuinf[0].regs[0], &cpuinf[0].regs[1], &cpuinf[0].regs[2], &cpuinf[0].regs[3]))
+            maxextfunc = cpuinf[0].regs[0];
+        TRACE("Detected max CPUID function: 0x%x (ext. 0x%x)\n", maxfunc, maxextfunc);
+
+        TRACE("Vendor ID: \"%.4s%.4s%.4s\"\n", cpuinf[0].str+4, cpuinf[0].str+12, cpuinf[0].str+8);
+        if(maxextfunc >= 0x80000004 &&
+           __get_cpuid(0x80000002, &cpuinf[0].regs[0], &cpuinf[0].regs[1], &cpuinf[0].regs[2], &cpuinf[0].regs[3]) &&
+           __get_cpuid(0x80000003, &cpuinf[1].regs[0], &cpuinf[1].regs[1], &cpuinf[1].regs[2], &cpuinf[1].regs[3]) &&
+           __get_cpuid(0x80000004, &cpuinf[2].regs[0], &cpuinf[2].regs[1], &cpuinf[2].regs[2], &cpuinf[2].regs[3]))
+            TRACE("Name: \"%.16s%.16s%.16s\"\n", cpuinf[0].str, cpuinf[1].str, cpuinf[2].str);
+
+        if(maxfunc >= 1 &&
+           __get_cpuid(1, &cpuinf[0].regs[0], &cpuinf[0].regs[1], &cpuinf[0].regs[2], &cpuinf[0].regs[3]))
+        {
+            if((cpuinf[0].regs[3]&(1<<25)))
+            {
+                caps |= CPU_CAP_SSE;
+                if((cpuinf[0].regs[3]&(1<<26)))
+                    caps |= CPU_CAP_SSE2;
+            }
+        }
+    }
+#elif defined(HAVE_WINDOWS_H)
+    HMODULE k32 = GetModuleHandleA("kernel32.dll");
+    BOOL (WINAPI*IsProcessorFeaturePresent)(DWORD ProcessorFeature);
+    IsProcessorFeaturePresent = (BOOL(WINAPI*)(DWORD))GetProcAddress(k32, "IsProcessorFeaturePresent");
+    if(!IsProcessorFeaturePresent)
+        ERR("IsProcessorFeaturePresent not available; CPU caps not detected\n");
+    else
+    {
+        if(IsProcessorFeaturePresent(PF_XMMI_INSTRUCTIONS_AVAILABLE))
+        {
+            caps |= CPU_CAP_SSE;
+            if(IsProcessorFeaturePresent(PF_XMMI64_INSTRUCTIONS_AVAILABLE))
+                caps |= CPU_CAP_SSE2;
+        }
+    }
+#endif
+#ifdef HAVE_NEON
+    /* Assume Neon support if compiled with it */
+    caps |= CPU_CAP_NEON;
+#endif
+
+    TRACE("Got caps:%s%s%s%s\n", ((caps&CPU_CAP_SSE)?((capfilter&CPU_CAP_SSE)?" SSE":" (SSE)"):""),
+                                 ((caps&CPU_CAP_SSE2)?((capfilter&CPU_CAP_SSE2)?" SSE2":" (SSE2)"):""),
+                                 ((caps&CPU_CAP_NEON)?((capfilter&CPU_CAP_NEON)?" Neon":" (Neon)"):""),
+                                 ((!caps)?" -none-":""));
+    CPUCapFlags = caps & capfilter;
+}
+
+
+void *al_malloc(size_t alignment, size_t size)
+{
+#if defined(HAVE_ALIGNED_ALLOC)
+    size = (size+(alignment-1))&~(alignment-1);
+    return aligned_alloc(alignment, size);
+#elif defined(HAVE_POSIX_MEMALIGN)
+    void *ret;
+    if(posix_memalign(&ret, alignment, size) == 0)
+        return ret;
+    return NULL;
+#elif defined(HAVE__ALIGNED_MALLOC)
+    return _aligned_malloc(size, alignment);
+#else
+    char *ret = malloc(size+alignment);
+    if(ret != NULL)
+    {
+        *(ret++) = 0x00;
+        while(((ALintptrEXT)ret&(alignment-1)) != 0)
+            *(ret++) = 0x55;
+    }
+    return ret;
+#endif
+}
+
+void *al_calloc(size_t alignment, size_t size)
+{
+    void *ret = al_malloc(alignment, size);
+    if(ret) memset(ret, 0, size);
+    return ret;
+}
+
+void al_free(void *ptr)
+{
+#if defined(HAVE_ALIGNED_ALLOC) || defined(HAVE_POSIX_MEMALIGN)
+    free(ptr);
+#elif defined(HAVE__ALIGNED_MALLOC)
+    _aligned_free(ptr);
+#else
+    if(ptr != NULL)
+    {
+        char *finder = ptr;
+        do {
+            --finder;
+        } while(*finder == 0x55);
+        free(finder);
+    }
+#endif
+}
+
+
+#if (defined(HAVE___CONTROL87_2) || defined(HAVE__CONTROLFP)) && (defined(__x86_64__) || defined(_M_X64))
+/* Win64 doesn't allow us to set the precision control. */
+#undef _MCW_PC
+#define _MCW_PC 0
+#endif
+
+void SetMixerFPUMode(FPUCtl *ctl)
+{
+#ifdef HAVE_FENV_H
+    fegetenv(STATIC_CAST(fenv_t, ctl));
+#if defined(__GNUC__) && defined(HAVE_SSE)
+    if((CPUCapFlags&CPU_CAP_SSE))
+        __asm__ __volatile__("stmxcsr %0" : "=m" (*&ctl->sse_state));
+#endif
+
+#ifdef FE_TOWARDZERO
+    fesetround(FE_TOWARDZERO);
+#endif
+#if defined(__GNUC__) && defined(HAVE_SSE)
+    if((CPUCapFlags&CPU_CAP_SSE))
+    {
+        int sseState = ctl->sse_state;
+        sseState |= 0x6000; /* set round-to-zero */
+        sseState |= 0x8000; /* set flush-to-zero */
+        if((CPUCapFlags&CPU_CAP_SSE2))
+            sseState |= 0x0040; /* set denormals-are-zero */
+        __asm__ __volatile__("ldmxcsr %0" : : "m" (*&sseState));
+    }
+#endif
+
+#elif defined(HAVE___CONTROL87_2)
+
+    int mode;
+    __control87_2(0, 0, &ctl->state, NULL);
+    __control87_2(_RC_CHOP|_PC_24, _MCW_RC|_MCW_PC, &mode, NULL);
+#ifdef HAVE_SSE
+    if((CPUCapFlags&CPU_CAP_SSE))
+    {
+        __control87_2(0, 0, NULL, &ctl->sse_state);
+        __control87_2(_RC_CHOP|_DN_FLUSH, _MCW_RC|_MCW_DN, NULL, &mode);
+    }
+#endif
+
+#elif defined(HAVE__CONTROLFP)
+
+    ctl->state = _controlfp(0, 0);
+    (void)_controlfp(_RC_CHOP|_PC_24, _MCW_RC|_MCW_PC);
+#endif
+}
+
+void RestoreFPUMode(const FPUCtl *ctl)
+{
+#ifdef HAVE_FENV_H
+    fesetenv(STATIC_CAST(fenv_t, ctl));
+#if defined(__GNUC__) && defined(HAVE_SSE)
+    if((CPUCapFlags&CPU_CAP_SSE))
+        __asm__ __volatile__("ldmxcsr %0" : : "m" (*&ctl->sse_state));
+#endif
+
+#elif defined(HAVE___CONTROL87_2)
+
+    int mode;
+    __control87_2(ctl->state, _MCW_RC|_MCW_PC, &mode, NULL);
+#ifdef HAVE_SSE
+    if((CPUCapFlags&CPU_CAP_SSE))
+        __control87_2(ctl->sse_state, _MCW_RC|_MCW_DN, NULL, &mode);
+#endif
+
+#elif defined(HAVE__CONTROLFP)
+
+    _controlfp(ctl->state, _MCW_RC|_MCW_PC);
+#endif
+}
+
 
 #ifdef _WIN32
-void pthread_once(pthread_once_t *once, void (*callback)(void))
+extern inline int alsched_yield(void);
+
+void althread_once(althread_once_t *once, void (*callback)(void))
 {
     LONG ret;
     while((ret=InterlockedExchange(once, 1)) == 1)
-        sched_yield();
+        alsched_yield();
     if(ret == 0)
         callback();
     InterlockedExchange(once, 2);
 }
 
 
-int pthread_key_create(pthread_key_t *key, void (*callback)(void*))
+int althread_key_create(althread_key_t *key, void (*callback)(void*))
 {
     *key = TlsAlloc();
     if(callback)
@@ -68,17 +315,17 @@ int pthread_key_create(pthread_key_t *key, void (*callback)(void*))
     return 0;
 }
 
-int pthread_key_delete(pthread_key_t key)
+int althread_key_delete(althread_key_t key)
 {
     InsertUIntMapEntry(&TlsDestructor, key, NULL);
     TlsFree(key);
     return 0;
 }
 
-void *pthread_getspecific(pthread_key_t key)
+void *althread_getspecific(althread_key_t key)
 { return TlsGetValue(key); }
 
-int pthread_setspecific(pthread_key_t key, void *val)
+int althread_setspecific(althread_key_t key, void *val)
 {
     TlsSetValue(key, val);
     return 0;
@@ -99,8 +346,32 @@ void *GetSymbol(void *handle, const char *name)
     return ret;
 }
 
+WCHAR *strdupW(const WCHAR *str)
+{
+    const WCHAR *n;
+    WCHAR *ret;
+    size_t len;
+
+    n = str;
+    while(*n) n++;
+    len = n - str;
+
+    ret = calloc(sizeof(WCHAR), len+1);
+    if(ret != NULL)
+        memcpy(ret, str, sizeof(WCHAR)*len);
+    return ret;
+}
+
 #else
 
+#include <pthread.h>
+#ifdef HAVE_PTHREAD_NP_H
+#include <pthread_np.h>
+#endif
+#include <sched.h>
+#include <time.h>
+#include <sys/time.h>
+
 void InitializeCriticalSection(CRITICAL_SECTION *cs)
 {
     pthread_mutexattr_t attrib;
@@ -217,22 +488,15 @@ void *GetSymbol(void *handle, const char *name)
 #endif
 
 
-void al_print(const char *func, const char *fmt, ...)
+void al_print(const char *type, const char *func, const char *fmt, ...)
 {
-    char str[256];
-    int i;
+    va_list ap;
 
-    i = snprintf(str, sizeof(str), "AL lib: %s: ", func);
-    if(i < (int)sizeof(str) && i > 0)
-    {
-        va_list ap;
-        va_start(ap, fmt);
-        vsnprintf(str+i, sizeof(str)-i, fmt, ap);
-        va_end(ap);
-    }
-    str[sizeof(str)-1] = 0;
+    va_start(ap, fmt);
+    fprintf(LogFile, "AL lib: %s %s: ", type, func);
+    vfprintf(LogFile, fmt, ap);
+    va_end(ap);
 
-    fprintf(LogFile, "%s", str);
     fflush(LogFile);
 }
 
@@ -265,7 +529,7 @@ void SetRTPriority(void)
 static void Lock(volatile ALenum *l)
 {
     while(ExchangeInt(l, AL_TRUE) == AL_TRUE)
-        sched_yield();
+        alsched_yield();
 }
 
 static void Unlock(volatile ALenum *l)
@@ -337,12 +601,6 @@ ALenum InsertUIntMapEntry(UIntMap *map, ALuint key, ALvoid *value)
     ALsizei pos = 0;
 
     WriteLock(&map->lock);
-    if(map->size == map->limit)
-    {
-        WriteUnlock(&map->lock);
-        return AL_OUT_OF_MEMORY;
-    }
-
     if(map->size > 0)
     {
         ALsizei low = 0;
@@ -362,6 +620,12 @@ ALenum InsertUIntMapEntry(UIntMap *map, ALuint key, ALvoid *value)
 
     if(pos == map->size || map->array[pos].key != key)
     {
+        if(map->size == map->limit)
+        {
+            WriteUnlock(&map->lock);
+            return AL_OUT_OF_MEMORY;
+        }
+
         if(map->size == map->maxsize)
         {
             ALvoid *temp = NULL;
@@ -379,10 +643,10 @@ ALenum InsertUIntMapEntry(UIntMap *map, ALuint key, ALvoid *value)
             map->maxsize = newsize;
         }
 
-        map->size++;
-        if(pos < map->size-1)
+        if(pos < map->size)
             memmove(&map->array[pos+1], &map->array[pos],
-                    (map->size-1-pos)*sizeof(map->array[0]));
+                    (map->size-pos)*sizeof(map->array[0]));
+        map->size++;
     }
     map->array[pos].key = key;
     map->array[pos].value = value;

+ 610 - 253
jni/openal-soft-android/Alc/hrtf.c

@@ -27,79 +27,90 @@
 #include "AL/alc.h"
 #include "alMain.h"
 #include "alSource.h"
+#include "alu.h"
 
-/* External HRTF file format (LE byte order):
- *
- * ALchar   magic[8] = "MinPHR00";
- * ALuint   sampleRate;
- *
- * ALushort hrirCount; // Required value: 828
- * ALushort hrirSize;  // Required value: 32
- * ALubyte  evCount;   // Required value: 19
- *
- * ALushort evOffset[evCount]; // Required values:
- *   { 0, 1, 13, 37, 73, 118, 174, 234, 306, 378, 450, 522, 594, 654, 710, 755, 791, 815, 827 }
- *
- * ALshort coefficients[hrirCount][hrirSize];
- * ALubyte delays[hrirCount]; // Element values must not exceed 127
- */
 
-static const ALchar magicMarker[8] = "MinPHR00";
+#ifndef PATH_MAX
+#define PATH_MAX 4096
+#endif
+
 
-#define HRIR_COUNT 828
-#define ELEV_COUNT 19
+/* Current data set limits defined by the makehrtf utility. */
+#define MIN_IR_SIZE                  (8)
+#define MAX_IR_SIZE                  (128)
+#define MOD_IR_SIZE                  (8)
 
-static const ALushort evOffset[ELEV_COUNT] = { 0, 1, 13, 37, 73, 118, 174, 234, 306, 378, 450, 522, 594, 654, 710, 755, 791, 815, 827 };
-static const ALubyte azCount[ELEV_COUNT] = { 1, 12, 24, 36, 45, 56, 60, 72, 72, 72, 72, 72, 60, 56, 45, 36, 24, 12, 1 };
+#define MIN_EV_COUNT                 (5)
+#define MAX_EV_COUNT                 (128)
 
+#define MIN_AZ_COUNT                 (1)
+#define MAX_AZ_COUNT                 (128)
 
-static const struct Hrtf {
+struct Hrtf {
     ALuint sampleRate;
-    ALshort coeffs[HRIR_COUNT][HRIR_LENGTH];
-    ALubyte delays[HRIR_COUNT];
-} DefaultHrtf = {
-    44100,
-#include "hrtf_tables.inc"
+    ALuint irSize;
+    ALubyte evCount;
+
+    const ALubyte *azCount;
+    const ALushort *evOffset;
+    const ALshort *coeffs;
+    const ALubyte *delays;
+
+    struct Hrtf *next;
 };
 
-static struct Hrtf *LoadedHrtfs = NULL;
-static ALuint NumLoadedHrtfs = 0;
+static const ALchar magicMarker00[8] = "MinPHR00";
+static const ALchar magicMarker01[8] = "MinPHR01";
+
+/* Define the default HRTF:
+ *  ALubyte  defaultAzCount  [DefaultHrtf.evCount]
+ *  ALushort defaultEvOffset [DefaultHrtf.evCount]
+ *  ALshort  defaultCoeffs   [DefaultHrtf.irCount * defaultHrtf.irSize]
+ *  ALubyte  defaultDelays   [DefaultHrtf.irCount]
+ *
+ *  struct Hrtf DefaultHrtf
+ */
+#include "hrtf_tables.inc"
 
+static struct Hrtf *LoadedHrtfs = NULL;
 
-// Calculate the elevation indices given the polar elevation in radians.
-// This will return two indices between 0 and (ELEV_COUNT-1) and an
-// interpolation factor between 0.0 and 1.0.
-static void CalcEvIndices(ALfloat ev, ALuint *evidx, ALfloat *evmu)
+/* Calculate the elevation indices given the polar elevation in radians.
+ * This will return two indices between 0 and (Hrtf->evCount - 1) and an
+ * interpolation factor between 0.0 and 1.0.
+ */
+static void CalcEvIndices(const struct Hrtf *Hrtf, ALfloat ev, ALuint *evidx, ALfloat *evmu)
 {
-    ev = (F_PI_2 + ev) * (ELEV_COUNT-1) / F_PI;
+    ev = (F_PI_2 + ev) * (Hrtf->evCount-1) / F_PI;
     evidx[0] = fastf2u(ev);
-    evidx[1] = minu(evidx[0] + 1, ELEV_COUNT-1);
+    evidx[1] = minu(evidx[0] + 1, Hrtf->evCount-1);
     *evmu = ev - evidx[0];
 }
 
-// Calculate the azimuth indices given the polar azimuth in radians.  This
-// will return two indices between 0 and (azCount [ei] - 1) and an
-// interpolation factor between 0.0 and 1.0.
-static void CalcAzIndices(ALuint evidx, ALfloat az, ALuint *azidx, ALfloat *azmu)
+/* Calculate the azimuth indices given the polar azimuth in radians.  This
+ * will return two indices between 0 and (Hrtf->azCount[ei] - 1) and an
+ * interpolation factor between 0.0 and 1.0.
+ */
+static void CalcAzIndices(const struct Hrtf *Hrtf, ALuint evidx, ALfloat az, ALuint *azidx, ALfloat *azmu)
 {
-    az = (F_PI*2.0f + az) * azCount[evidx] / (F_PI*2.0f);
-    azidx[0] = fastf2u(az) % azCount[evidx];
-    azidx[1] = (azidx[0] + 1) % azCount[evidx];
-    *azmu = az - aluFloor(az);
+    az = (F_2PI + az) * Hrtf->azCount[evidx] / (F_2PI);
+    azidx[0] = fastf2u(az) % Hrtf->azCount[evidx];
+    azidx[1] = (azidx[0] + 1) % Hrtf->azCount[evidx];
+    *azmu = az - floorf(az);
 }
 
-// Calculates the normalized HRTF transition factor (delta) from the changes
-// in gain and listener to source angle between updates.  The result is a
-// normalized delta factor than can be used to calculate moving HRIR stepping
-// values.
+/* Calculates the normalized HRTF transition factor (delta) from the changes
+ * in gain and listener to source angle between updates.  The result is a
+ * normalized delta factor that can be used to calculate moving HRIR stepping
+ * values.
+ */
 ALfloat CalcHrtfDelta(ALfloat oldGain, ALfloat newGain, const ALfloat olddir[3], const ALfloat newdir[3])
 {
-    ALfloat gainChange, angleChange;
+    ALfloat gainChange, angleChange, change;
 
     // Calculate the normalized dB gain change.
     newGain = maxf(newGain, 0.0001f);
     oldGain = maxf(oldGain, 0.0001f);
-    gainChange = aluFabs(aluLog10(newGain / oldGain) / aluLog10(0.0001f));
+    gainChange = fabsf(log10f(newGain / oldGain) / log10f(0.0001f));
 
     // Calculate the normalized listener to source angle change when there is
     // enough gain to notice it.
@@ -109,136 +120,192 @@ ALfloat CalcHrtfDelta(ALfloat oldGain, ALfloat newGain, const ALfloat olddir[3],
         // No angle change when the directions are equal or degenerate (when
         // both have zero length).
         if(newdir[0]-olddir[0] || newdir[1]-olddir[1] || newdir[2]-olddir[2])
-            angleChange = aluAcos(olddir[0]*newdir[0] +
-                                  olddir[1]*newdir[1] +
-                                  olddir[2]*newdir[2]) / F_PI;
+            angleChange = acosf(olddir[0]*newdir[0] +
+                                olddir[1]*newdir[1] +
+                                olddir[2]*newdir[2]) / F_PI;
 
     }
 
     // Use the largest of the two changes for the delta factor, and apply a
     // significance shaping function to it.
-    return clampf(angleChange*2.0f, gainChange*2.0f, 1.0f);
+    change = maxf(angleChange * 25.0f, gainChange) * 2.0f;
+    return minf(change, 1.0f);
 }
 
-// Calculates static HRIR coefficients and delays for the given polar
-// elevation and azimuth in radians.  Linear interpolation is used to
-// increase the apparent resolution of the HRIR dataset.  The coefficients
-// are also normalized and attenuated by the specified gain.
+/* Calculates static HRIR coefficients and delays for the given polar
+ * elevation and azimuth in radians.  Linear interpolation is used to
+ * increase the apparent resolution of the HRIR data set.  The coefficients
+ * are also normalized and attenuated by the specified gain.
+ */
 void GetLerpedHrtfCoeffs(const struct Hrtf *Hrtf, ALfloat elevation, ALfloat azimuth, ALfloat gain, ALfloat (*coeffs)[2], ALuint *delays)
 {
     ALuint evidx[2], azidx[2];
-    ALfloat mu[3];
     ALuint lidx[4], ridx[4];
+    ALfloat mu[3], blend[4];
     ALuint i;
 
     // Claculate elevation indices and interpolation factor.
-    CalcEvIndices(elevation, evidx, &mu[2]);
+    CalcEvIndices(Hrtf, elevation, evidx, &mu[2]);
 
     // Calculate azimuth indices and interpolation factor for the first
     // elevation.
-    CalcAzIndices(evidx[0], azimuth, azidx, &mu[0]);
+    CalcAzIndices(Hrtf, evidx[0], azimuth, azidx, &mu[0]);
 
     // Calculate the first set of linear HRIR indices for left and right
     // channels.
-    lidx[0] = evOffset[evidx[0]] + azidx[0];
-    lidx[1] = evOffset[evidx[0]] + azidx[1];
-    ridx[0] = evOffset[evidx[0]] + ((azCount[evidx[0]]-azidx[0]) % azCount[evidx[0]]);
-    ridx[1] = evOffset[evidx[0]] + ((azCount[evidx[0]]-azidx[1]) % azCount[evidx[0]]);
+    lidx[0] = Hrtf->evOffset[evidx[0]] + azidx[0];
+    lidx[1] = Hrtf->evOffset[evidx[0]] + azidx[1];
+    ridx[0] = Hrtf->evOffset[evidx[0]] + ((Hrtf->azCount[evidx[0]]-azidx[0]) % Hrtf->azCount[evidx[0]]);
+    ridx[1] = Hrtf->evOffset[evidx[0]] + ((Hrtf->azCount[evidx[0]]-azidx[1]) % Hrtf->azCount[evidx[0]]);
 
     // Calculate azimuth indices and interpolation factor for the second
     // elevation.
-    CalcAzIndices(evidx[1], azimuth, azidx, &mu[1]);
+    CalcAzIndices(Hrtf, evidx[1], azimuth, azidx, &mu[1]);
 
     // Calculate the second set of linear HRIR indices for left and right
     // channels.
-    lidx[2] = evOffset[evidx[1]] + azidx[0];
-    lidx[3] = evOffset[evidx[1]] + azidx[1];
-    ridx[2] = evOffset[evidx[1]] + ((azCount[evidx[1]]-azidx[0]) % azCount[evidx[1]]);
-    ridx[3] = evOffset[evidx[1]] + ((azCount[evidx[1]]-azidx[1]) % azCount[evidx[1]]);
-
-    // Calculate the normalized and attenuated HRIR coefficients using linear
-    // interpolation when there is enough gain to warrant it.  Zero the
-    // coefficients if gain is too low.
+    lidx[2] = Hrtf->evOffset[evidx[1]] + azidx[0];
+    lidx[3] = Hrtf->evOffset[evidx[1]] + azidx[1];
+    ridx[2] = Hrtf->evOffset[evidx[1]] + ((Hrtf->azCount[evidx[1]]-azidx[0]) % Hrtf->azCount[evidx[1]]);
+    ridx[3] = Hrtf->evOffset[evidx[1]] + ((Hrtf->azCount[evidx[1]]-azidx[1]) % Hrtf->azCount[evidx[1]]);
+
+    /* Calculate 4 blending weights for 2D bilinear interpolation. */
+    blend[0] = (1.0f-mu[0]) * (1.0f-mu[2]);
+    blend[1] = (     mu[0]) * (1.0f-mu[2]);
+    blend[2] = (1.0f-mu[1]) * (     mu[2]);
+    blend[3] = (     mu[1]) * (     mu[2]);
+
+    /* Calculate the HRIR delays using linear interpolation. */
+    delays[0] = fastf2u(Hrtf->delays[lidx[0]]*blend[0] + Hrtf->delays[lidx[1]]*blend[1] +
+                        Hrtf->delays[lidx[2]]*blend[2] + Hrtf->delays[lidx[3]]*blend[3] +
+                        0.5f) << HRTFDELAY_BITS;
+    delays[1] = fastf2u(Hrtf->delays[ridx[0]]*blend[0] + Hrtf->delays[ridx[1]]*blend[1] +
+                        Hrtf->delays[ridx[2]]*blend[2] + Hrtf->delays[ridx[3]]*blend[3] +
+                        0.5f) << HRTFDELAY_BITS;
+
+    /* Calculate the sample offsets for the HRIR indices. */
+    lidx[0] *= Hrtf->irSize;
+    lidx[1] *= Hrtf->irSize;
+    lidx[2] *= Hrtf->irSize;
+    lidx[3] *= Hrtf->irSize;
+    ridx[0] *= Hrtf->irSize;
+    ridx[1] *= Hrtf->irSize;
+    ridx[2] *= Hrtf->irSize;
+    ridx[3] *= Hrtf->irSize;
+
+    /* Calculate the normalized and attenuated HRIR coefficients using linear
+     * interpolation when there is enough gain to warrant it.  Zero the
+     * coefficients if gain is too low.
+     */
     if(gain > 0.0001f)
     {
         gain *= 1.0f/32767.0f;
-        for(i = 0;i < HRIR_LENGTH;i++)
+        for(i = 0;i < Hrtf->irSize;i++)
         {
-            coeffs[i][0] = lerp(lerp(Hrtf->coeffs[lidx[0]][i], Hrtf->coeffs[lidx[1]][i], mu[0]),
-                                lerp(Hrtf->coeffs[lidx[2]][i], Hrtf->coeffs[lidx[3]][i], mu[1]),
-                                mu[2]) * gain;
-            coeffs[i][1] = lerp(lerp(Hrtf->coeffs[ridx[0]][i], Hrtf->coeffs[ridx[1]][i], mu[0]),
-                                lerp(Hrtf->coeffs[ridx[2]][i], Hrtf->coeffs[ridx[3]][i], mu[1]),
-                                mu[2]) * gain;
+            coeffs[i][0] = (Hrtf->coeffs[lidx[0]+i]*blend[0] +
+                            Hrtf->coeffs[lidx[1]+i]*blend[1] +
+                            Hrtf->coeffs[lidx[2]+i]*blend[2] +
+                            Hrtf->coeffs[lidx[3]+i]*blend[3]) * gain;
+            coeffs[i][1] = (Hrtf->coeffs[ridx[0]+i]*blend[0] +
+                            Hrtf->coeffs[ridx[1]+i]*blend[1] +
+                            Hrtf->coeffs[ridx[2]+i]*blend[2] +
+                            Hrtf->coeffs[ridx[3]+i]*blend[3]) * gain;
         }
     }
     else
     {
-        for(i = 0;i < HRIR_LENGTH;i++)
+        for(i = 0;i < Hrtf->irSize;i++)
         {
             coeffs[i][0] = 0.0f;
             coeffs[i][1] = 0.0f;
         }
     }
-
-    // Calculate the HRIR delays using linear interpolation.
-    delays[0] = fastf2u(lerp(lerp(Hrtf->delays[lidx[0]], Hrtf->delays[lidx[1]], mu[0]),
-                             lerp(Hrtf->delays[lidx[2]], Hrtf->delays[lidx[3]], mu[1]),
-                             mu[2]) * 65536.0f);
-    delays[1] = fastf2u(lerp(lerp(Hrtf->delays[ridx[0]], Hrtf->delays[ridx[1]], mu[0]),
-                             lerp(Hrtf->delays[ridx[2]], Hrtf->delays[ridx[3]], mu[1]),
-                             mu[2]) * 65536.0f);
 }
 
-// Calculates the moving HRIR target coefficients, target delays, and
-// stepping values for the given polar elevation and azimuth in radians.
-// Linear interpolation is used to increase the apparent resolution of the
-// HRIR dataset.  The coefficients are also normalized and attenuated by the
-// specified gain.  Stepping resolution and count is determined using the
-// given delta factor between 0.0 and 1.0.
+/* Calculates the moving HRIR target coefficients, target delays, and
+ * stepping values for the given polar elevation and azimuth in radians.
+ * Linear interpolation is used to increase the apparent resolution of the
+ * HRIR data set.  The coefficients are also normalized and attenuated by the
+ * specified gain.  Stepping resolution and count is determined using the
+ * given delta factor between 0.0 and 1.0.
+ */
 ALuint GetMovingHrtfCoeffs(const struct Hrtf *Hrtf, ALfloat elevation, ALfloat azimuth, ALfloat gain, ALfloat delta, ALint counter, ALfloat (*coeffs)[2], ALuint *delays, ALfloat (*coeffStep)[2], ALint *delayStep)
 {
     ALuint evidx[2], azidx[2];
     ALuint lidx[4], ridx[4];
+    ALfloat mu[3], blend[4];
     ALfloat left, right;
-    ALfloat mu[3];
     ALfloat step;
     ALuint i;
 
     // Claculate elevation indices and interpolation factor.
-    CalcEvIndices(elevation, evidx, &mu[2]);
+    CalcEvIndices(Hrtf, elevation, evidx, &mu[2]);
 
     // Calculate azimuth indices and interpolation factor for the first
     // elevation.
-    CalcAzIndices(evidx[0], azimuth, azidx, &mu[0]);
+    CalcAzIndices(Hrtf, evidx[0], azimuth, azidx, &mu[0]);
 
     // Calculate the first set of linear HRIR indices for left and right
     // channels.
-    lidx[0] = evOffset[evidx[0]] + azidx[0];
-    lidx[1] = evOffset[evidx[0]] + azidx[1];
-    ridx[0] = evOffset[evidx[0]] + ((azCount[evidx[0]]-azidx[0]) % azCount[evidx[0]]);
-    ridx[1] = evOffset[evidx[0]] + ((azCount[evidx[0]]-azidx[1]) % azCount[evidx[0]]);
+    lidx[0] = Hrtf->evOffset[evidx[0]] + azidx[0];
+    lidx[1] = Hrtf->evOffset[evidx[0]] + azidx[1];
+    ridx[0] = Hrtf->evOffset[evidx[0]] + ((Hrtf->azCount[evidx[0]]-azidx[0]) % Hrtf->azCount[evidx[0]]);
+    ridx[1] = Hrtf->evOffset[evidx[0]] + ((Hrtf->azCount[evidx[0]]-azidx[1]) % Hrtf->azCount[evidx[0]]);
 
     // Calculate azimuth indices and interpolation factor for the second
     // elevation.
-    CalcAzIndices(evidx[1], azimuth, azidx, &mu[1]);
+    CalcAzIndices(Hrtf, evidx[1], azimuth, azidx, &mu[1]);
 
     // Calculate the second set of linear HRIR indices for left and right
     // channels.
-    lidx[2] = evOffset[evidx[1]] + azidx[0];
-    lidx[3] = evOffset[evidx[1]] + azidx[1];
-    ridx[2] = evOffset[evidx[1]] + ((azCount[evidx[1]]-azidx[0]) % azCount[evidx[1]]);
-    ridx[3] = evOffset[evidx[1]] + ((azCount[evidx[1]]-azidx[1]) % azCount[evidx[1]]);
+    lidx[2] = Hrtf->evOffset[evidx[1]] + azidx[0];
+    lidx[3] = Hrtf->evOffset[evidx[1]] + azidx[1];
+    ridx[2] = Hrtf->evOffset[evidx[1]] + ((Hrtf->azCount[evidx[1]]-azidx[0]) % Hrtf->azCount[evidx[1]]);
+    ridx[3] = Hrtf->evOffset[evidx[1]] + ((Hrtf->azCount[evidx[1]]-azidx[1]) % Hrtf->azCount[evidx[1]]);
 
     // Calculate the stepping parameters.
-    delta = maxf(aluFloor(delta*(Hrtf->sampleRate*0.015f) + 0.5f), 1.0f);
+    delta = maxf(floorf(delta*(Hrtf->sampleRate*0.015f) + 0.5f), 1.0f);
     step = 1.0f / delta;
 
-    // Calculate the normalized and attenuated target HRIR coefficients using
-    // linear interpolation when there is enough gain to warrant it.  Zero
-    // the target coefficients if gain is too low.  Then calculate the
-    // coefficient stepping values using the target and previous running
-    // coefficients.
+    /* Calculate 4 blending weights for 2D bilinear interpolation. */
+    blend[0] = (1.0f-mu[0]) * (1.0f-mu[2]);
+    blend[1] = (     mu[0]) * (1.0f-mu[2]);
+    blend[2] = (1.0f-mu[1]) * (     mu[2]);
+    blend[3] = (     mu[1]) * (     mu[2]);
+
+    /* Calculate the HRIR delays using linear interpolation.  Then calculate
+     * the delay stepping values using the target and previous running
+     * delays.
+     */
+    left = (ALfloat)(delays[0] - (delayStep[0] * counter));
+    right = (ALfloat)(delays[1] - (delayStep[1] * counter));
+
+    delays[0] = fastf2u(Hrtf->delays[lidx[0]]*blend[0] + Hrtf->delays[lidx[1]]*blend[1] +
+                        Hrtf->delays[lidx[2]]*blend[2] + Hrtf->delays[lidx[3]]*blend[3] +
+                        0.5f) << HRTFDELAY_BITS;
+    delays[1] = fastf2u(Hrtf->delays[ridx[0]]*blend[0] + Hrtf->delays[ridx[1]]*blend[1] +
+                        Hrtf->delays[ridx[2]]*blend[2] + Hrtf->delays[ridx[3]]*blend[3] +
+                        0.5f) << HRTFDELAY_BITS;
+
+    delayStep[0] = fastf2i(step * (delays[0] - left));
+    delayStep[1] = fastf2i(step * (delays[1] - right));
+
+    /* Calculate the sample offsets for the HRIR indices. */
+    lidx[0] *= Hrtf->irSize;
+    lidx[1] *= Hrtf->irSize;
+    lidx[2] *= Hrtf->irSize;
+    lidx[3] *= Hrtf->irSize;
+    ridx[0] *= Hrtf->irSize;
+    ridx[1] *= Hrtf->irSize;
+    ridx[2] *= Hrtf->irSize;
+    ridx[3] *= Hrtf->irSize;
+
+    /* Calculate the normalized and attenuated target HRIR coefficients using
+     * linear interpolation when there is enough gain to warrant it.  Zero
+     * the target coefficients if gain is too low.  Then calculate the
+     * coefficient stepping values using the target and previous running
+     * coefficients.
+     */
     if(gain > 0.0001f)
     {
         gain *= 1.0f/32767.0f;
@@ -247,12 +314,14 @@ ALuint GetMovingHrtfCoeffs(const struct Hrtf *Hrtf, ALfloat elevation, ALfloat a
             left = coeffs[i][0] - (coeffStep[i][0] * counter);
             right = coeffs[i][1] - (coeffStep[i][1] * counter);
 
-            coeffs[i][0] = lerp(lerp(Hrtf->coeffs[lidx[0]][i], Hrtf->coeffs[lidx[1]][i], mu[0]),
-                                lerp(Hrtf->coeffs[lidx[2]][i], Hrtf->coeffs[lidx[3]][i], mu[1]),
-                                mu[2]) * gain;
-            coeffs[i][1] = lerp(lerp(Hrtf->coeffs[ridx[0]][i], Hrtf->coeffs[ridx[1]][i], mu[0]),
-                                lerp(Hrtf->coeffs[ridx[2]][i], Hrtf->coeffs[ridx[3]][i], mu[1]),
-                                mu[2]) * gain;
+            coeffs[i][0] = (Hrtf->coeffs[lidx[0]+i]*blend[0] +
+                            Hrtf->coeffs[lidx[1]+i]*blend[1] +
+                            Hrtf->coeffs[lidx[2]+i]*blend[2] +
+                            Hrtf->coeffs[lidx[3]+i]*blend[3]) * gain;
+            coeffs[i][1] = (Hrtf->coeffs[ridx[0]+i]*blend[0] +
+                            Hrtf->coeffs[ridx[1]+i]*blend[1] +
+                            Hrtf->coeffs[ridx[2]+i]*blend[2] +
+                            Hrtf->coeffs[ridx[3]+i]*blend[3]) * gain;
 
             coeffStep[i][0] = step * (coeffs[i][0] - left);
             coeffStep[i][1] = step * (coeffs[i][1] - right);
@@ -273,199 +342,487 @@ ALuint GetMovingHrtfCoeffs(const struct Hrtf *Hrtf, ALfloat elevation, ALfloat a
         }
     }
 
-    // Calculate the HRIR delays using linear interpolation.  Then calculate
-    // the delay stepping values using the target and previous running
-    // delays.
-    left = (ALfloat)(delays[0] - (delayStep[0] * counter));
-    right = (ALfloat)(delays[1] - (delayStep[1] * counter));
-
-    delays[0] = fastf2u(lerp(lerp(Hrtf->delays[lidx[0]], Hrtf->delays[lidx[1]], mu[0]),
-                             lerp(Hrtf->delays[lidx[2]], Hrtf->delays[lidx[3]], mu[1]),
-                             mu[2]) * 65536.0f);
-    delays[1] = fastf2u(lerp(lerp(Hrtf->delays[ridx[0]], Hrtf->delays[ridx[1]], mu[0]),
-                             lerp(Hrtf->delays[ridx[2]], Hrtf->delays[ridx[3]], mu[1]),
-                             mu[2]) * 65536.0f);
-
-    delayStep[0] = fastf2i(step * (delays[0] - left));
-    delayStep[1] = fastf2i(step * (delays[1] - right));
-
-    // The stepping count is the number of samples necessary for the HRIR to
-    // complete its transition.  The mixer will only apply stepping for this
-    // many samples.
+    /* The stepping count is the number of samples necessary for the HRIR to
+     * complete its transition.  The mixer will only apply stepping for this
+     * many samples.
+     */
     return fastf2u(delta);
 }
 
-const struct Hrtf *GetHrtf(ALCdevice *device)
+
+static struct Hrtf *LoadHrtf00(FILE *f, ALuint deviceRate)
 {
-    if(device->FmtChans == DevFmtStereo)
+    const ALubyte maxDelay = SRC_HISTORY_LENGTH-1;
+    struct Hrtf *Hrtf = NULL;
+    ALboolean failed = AL_FALSE;
+    ALuint rate = 0, irCount = 0;
+    ALushort irSize = 0;
+    ALubyte evCount = 0;
+    ALubyte *azCount = NULL;
+    ALushort *evOffset = NULL;
+    ALshort *coeffs = NULL;
+    ALubyte *delays = NULL;
+    ALuint i, j;
+
+    rate  = fgetc(f);
+    rate |= fgetc(f)<<8;
+    rate |= fgetc(f)<<16;
+    rate |= fgetc(f)<<24;
+
+    irCount  = fgetc(f);
+    irCount |= fgetc(f)<<8;
+
+    irSize  = fgetc(f);
+    irSize |= fgetc(f)<<8;
+
+    evCount = fgetc(f);
+
+    if(rate != deviceRate)
     {
-        ALuint i;
-        for(i = 0;i < NumLoadedHrtfs;i++)
-        {
-            if(device->Frequency == LoadedHrtfs[i].sampleRate)
-                return &LoadedHrtfs[i];
-        }
-        if(device->Frequency == DefaultHrtf.sampleRate)
-            return &DefaultHrtf;
+        ERR("HRIR rate does not match device rate: rate=%d (%d)\n",
+            rate, deviceRate);
+        failed = AL_TRUE;
+    }
+    if(irSize < MIN_IR_SIZE || irSize > MAX_IR_SIZE || (irSize%MOD_IR_SIZE))
+    {
+        ERR("Unsupported HRIR size: irSize=%d (%d to %d by %d)\n",
+            irSize, MIN_IR_SIZE, MAX_IR_SIZE, MOD_IR_SIZE);
+        failed = AL_TRUE;
+    }
+    if(evCount < MIN_EV_COUNT || evCount > MAX_EV_COUNT)
+    {
+        ERR("Unsupported elevation count: evCount=%d (%d to %d)\n",
+            evCount, MIN_EV_COUNT, MAX_EV_COUNT);
+        failed = AL_TRUE;
     }
-    ERR("Incompatible format: %s %uhz\n",
-        DevFmtChannelsString(device->FmtChans), device->Frequency);
-    return NULL;
-}
 
-void InitHrtf(void)
-{
-    char *fnamelist=NULL, *next=NULL;
-    const char *val;
+    if(failed)
+        return NULL;
 
-    if(ConfigValueStr(NULL, "hrtf_tables", &val))
-        next = fnamelist = strdup(val);
-    while(next && *next)
+    azCount = malloc(sizeof(azCount[0])*evCount);
+    evOffset = malloc(sizeof(evOffset[0])*evCount);
+    if(azCount == NULL || evOffset == NULL)
     {
-        const ALubyte maxDelay = SRC_HISTORY_LENGTH-1;
-        struct Hrtf newdata;
-        ALboolean failed;
-        ALchar magic[9];
-        ALsizei i, j;
-        char *fname;
-        FILE *f;
+        ERR("Out of memory.\n");
+        failed = AL_TRUE;
+    }
 
-        fname = next;
-        next = strchr(fname, ',');
-        if(next)
+    if(!failed)
+    {
+        evOffset[0]  = fgetc(f);
+        evOffset[0] |= fgetc(f)<<8;
+        for(i = 1;i < evCount;i++)
         {
-            while(next != fname)
+            evOffset[i]  = fgetc(f);
+            evOffset[i] |= fgetc(f)<<8;
+            if(evOffset[i] <= evOffset[i-1])
             {
-                next--;
-                if(!isspace(*next))
-                {
-                    *(next++) = '\0';
-                    break;
-                }
+                ERR("Invalid evOffset: evOffset[%d]=%d (last=%d)\n",
+                    i, evOffset[i], evOffset[i-1]);
+                failed = AL_TRUE;
             }
-            while(isspace(*next) || *next == ',')
-                next++;
+
+            azCount[i-1] = evOffset[i] - evOffset[i-1];
+            if(azCount[i-1] < MIN_AZ_COUNT || azCount[i-1] > MAX_AZ_COUNT)
+            {
+                ERR("Unsupported azimuth count: azCount[%d]=%d (%d to %d)\n",
+                    i-1, azCount[i-1], MIN_AZ_COUNT, MAX_AZ_COUNT);
+                failed = AL_TRUE;
+            }
+        }
+        if(irCount <= evOffset[i-1])
+        {
+            ERR("Invalid evOffset: evOffset[%d]=%d (irCount=%d)\n",
+                i-1, evOffset[i-1], irCount);
+            failed = AL_TRUE;
         }
 
-        if(!fname[0])
-            continue;
-        TRACE("Loading %s\n", fname);
-        f = fopen(fname, "rb");
-        if(f == NULL)
+        azCount[i-1] = irCount - evOffset[i-1];
+        if(azCount[i-1] < MIN_AZ_COUNT || azCount[i-1] > MAX_AZ_COUNT)
         {
-            ERR("Could not open %s\n", fname);
-            continue;
+            ERR("Unsupported azimuth count: azCount[%d]=%d (%d to %d)\n",
+                i-1, azCount[i-1], MIN_AZ_COUNT, MAX_AZ_COUNT);
+            failed = AL_TRUE;
         }
+    }
 
-        failed = AL_FALSE;
-        if(fread(magic, 1, sizeof(magicMarker), f) != sizeof(magicMarker))
+    if(!failed)
+    {
+        coeffs = malloc(sizeof(coeffs[0])*irSize*irCount);
+        delays = malloc(sizeof(delays[0])*irCount);
+        if(coeffs == NULL || delays == NULL)
         {
-            ERR("Failed to read magic marker\n");
+            ERR("Out of memory.\n");
             failed = AL_TRUE;
         }
-        else if(memcmp(magic, magicMarker, sizeof(magicMarker)) != 0)
+    }
+
+    if(!failed)
+    {
+        for(i = 0;i < irCount*irSize;i+=irSize)
+        {
+            for(j = 0;j < irSize;j++)
+            {
+                ALshort coeff;
+                coeff  = fgetc(f);
+                coeff |= fgetc(f)<<8;
+                coeffs[i+j] = coeff;
+            }
+        }
+        for(i = 0;i < irCount;i++)
         {
-            magic[8] = 0;
-            ERR("Invalid magic marker: \"%s\"\n", magic);
+            delays[i] = fgetc(f);
+            if(delays[i] > maxDelay)
+            {
+                ERR("Invalid delays[%d]: %d (%d)\n", i, delays[i], maxDelay);
+                failed = AL_TRUE;
+            }
+        }
+
+        if(feof(f))
+        {
+            ERR("Premature end of data\n");
             failed = AL_TRUE;
         }
+    }
 
-        if(!failed)
+    if(!failed)
+    {
+        Hrtf = malloc(sizeof(struct Hrtf));
+        if(Hrtf == NULL)
         {
-            ALushort hrirCount, hrirSize;
-            ALubyte  evCount;
+            ERR("Out of memory.\n");
+            failed = AL_TRUE;
+        }
+    }
 
-            newdata.sampleRate  = fgetc(f);
-            newdata.sampleRate |= fgetc(f)<<8;
-            newdata.sampleRate |= fgetc(f)<<16;
-            newdata.sampleRate |= fgetc(f)<<24;
+    if(!failed)
+    {
+        Hrtf->sampleRate = rate;
+        Hrtf->irSize = irSize;
+        Hrtf->evCount = evCount;
+        Hrtf->azCount = azCount;
+        Hrtf->evOffset = evOffset;
+        Hrtf->coeffs = coeffs;
+        Hrtf->delays = delays;
+        Hrtf->next = NULL;
+        return Hrtf;
+    }
 
-            hrirCount  = fgetc(f);
-            hrirCount |= fgetc(f)<<8;
+    free(azCount);
+    free(evOffset);
+    free(coeffs);
+    free(delays);
+    return NULL;
+}
 
-            hrirSize  = fgetc(f);
-            hrirSize |= fgetc(f)<<8;
 
-            evCount = fgetc(f);
+static struct Hrtf *LoadHrtf01(FILE *f, ALuint deviceRate)
+{
+    const ALubyte maxDelay = SRC_HISTORY_LENGTH-1;
+    struct Hrtf *Hrtf = NULL;
+    ALboolean failed = AL_FALSE;
+    ALuint rate = 0, irCount = 0;
+    ALubyte irSize = 0, evCount = 0;
+    ALubyte *azCount = NULL;
+    ALushort *evOffset = NULL;
+    ALshort *coeffs = NULL;
+    ALubyte *delays = NULL;
+    ALuint i, j;
+
+    rate  = fgetc(f);
+    rate |= fgetc(f)<<8;
+    rate |= fgetc(f)<<16;
+    rate |= fgetc(f)<<24;
+
+    irSize = fgetc(f);
+
+    evCount = fgetc(f);
+
+    if(rate != deviceRate)
+    {
+        ERR("HRIR rate does not match device rate: rate=%d (%d)\n",
+                rate, deviceRate);
+        failed = AL_TRUE;
+    }
+    if(irSize < MIN_IR_SIZE || irSize > MAX_IR_SIZE || (irSize%MOD_IR_SIZE))
+    {
+        ERR("Unsupported HRIR size: irSize=%d (%d to %d by %d)\n",
+            irSize, MIN_IR_SIZE, MAX_IR_SIZE, MOD_IR_SIZE);
+        failed = AL_TRUE;
+    }
+    if(evCount < MIN_EV_COUNT || evCount > MAX_EV_COUNT)
+    {
+        ERR("Unsupported elevation count: evCount=%d (%d to %d)\n",
+            evCount, MIN_EV_COUNT, MAX_EV_COUNT);
+        failed = AL_TRUE;
+    }
 
-            if(hrirCount != HRIR_COUNT || hrirSize != HRIR_LENGTH || evCount != ELEV_COUNT)
+    if(failed)
+        return NULL;
+
+    azCount = malloc(sizeof(azCount[0])*evCount);
+    evOffset = malloc(sizeof(evOffset[0])*evCount);
+    if(azCount == NULL || evOffset == NULL)
+    {
+        ERR("Out of memory.\n");
+        failed = AL_TRUE;
+    }
+
+    if(!failed)
+    {
+        for(i = 0;i < evCount;i++)
+        {
+            azCount[i] = fgetc(f);
+            if(azCount[i] < MIN_AZ_COUNT || azCount[i] > MAX_AZ_COUNT)
             {
-                ERR("Unsupported value: hrirCount=%d (%d), hrirSize=%d (%d), evCount=%d (%d)\n",
-                    hrirCount, HRIR_COUNT, hrirSize, HRIR_LENGTH, evCount, ELEV_COUNT);
+                ERR("Unsupported azimuth count: azCount[%d]=%d (%d to %d)\n",
+                    i, azCount[i], MIN_AZ_COUNT, MAX_AZ_COUNT);
                 failed = AL_TRUE;
             }
         }
+    }
+
+    if(!failed)
+    {
+        evOffset[0] = 0;
+        irCount = azCount[0];
+        for(i = 1;i < evCount;i++)
+        {
+            evOffset[i] = evOffset[i-1] + azCount[i-1];
+            irCount += azCount[i];
+        }
+
+        coeffs = malloc(sizeof(coeffs[0])*irSize*irCount);
+        delays = malloc(sizeof(delays[0])*irCount);
+        if(coeffs == NULL || delays == NULL)
+        {
+            ERR("Out of memory.\n");
+            failed = AL_TRUE;
+        }
+    }
 
-        if(!failed)
+    if(!failed)
+    {
+        for(i = 0;i < irCount*irSize;i+=irSize)
         {
-            for(i = 0;i < HRIR_COUNT;i++)
+            for(j = 0;j < irSize;j++)
             {
-                ALushort offset;
-                offset  = fgetc(f);
-                offset |= fgetc(f)<<8;
-                if(offset != evOffset[i])
-                {
-                    ERR("Unsupported evOffset[%d] value: %d (%d)\n", i, offset, evOffset[i]);
-                    failed = AL_TRUE;
-                }
+                ALshort coeff;
+                coeff  = fgetc(f);
+                coeff |= fgetc(f)<<8;
+                coeffs[i+j] = coeff;
             }
         }
+        for(i = 0;i < irCount;i++)
+        {
+            delays[i] = fgetc(f);
+            if(delays[i] > maxDelay)
+            {
+                ERR("Invalid delays[%d]: %d (%d)\n", i, delays[i], maxDelay);
+                failed = AL_TRUE;
+            }
+        }
+
+        if(feof(f))
+        {
+            ERR("Premature end of data\n");
+            failed = AL_TRUE;
+        }
+    }
+
+    if(!failed)
+    {
+        Hrtf = malloc(sizeof(struct Hrtf));
+        if(Hrtf == NULL)
+        {
+            ERR("Out of memory.\n");
+            failed = AL_TRUE;
+        }
+    }
+
+    if(!failed)
+    {
+        Hrtf->sampleRate = rate;
+        Hrtf->irSize = irSize;
+        Hrtf->evCount = evCount;
+        Hrtf->azCount = azCount;
+        Hrtf->evOffset = evOffset;
+        Hrtf->coeffs = coeffs;
+        Hrtf->delays = delays;
+        Hrtf->next = NULL;
+        return Hrtf;
+    }
+
+    free(azCount);
+    free(evOffset);
+    free(coeffs);
+    free(delays);
+    return NULL;
+}
 
-        if(!failed)
+
+static struct Hrtf *LoadHrtf(ALuint deviceRate)
+{
+    const char *fnamelist = NULL;
+
+    if(!ConfigValueStr(NULL, "hrtf_tables", &fnamelist))
+        return NULL;
+    while(*fnamelist != '\0')
+    {
+        struct Hrtf *Hrtf = NULL;
+        char fname[PATH_MAX];
+        ALchar magic[8];
+        ALuint i;
+        FILE *f;
+
+        while(isspace(*fnamelist) || *fnamelist == ',')
+            fnamelist++;
+        i = 0;
+        while(*fnamelist != '\0' && *fnamelist != ',')
         {
-            for(i = 0;i < HRIR_COUNT;i++)
+            const char *next = strpbrk(fnamelist, "%,");
+            while(fnamelist != next && *fnamelist && i < sizeof(fname))
+                fname[i++] = *(fnamelist++);
+
+            if(!next || *next == ',')
+                break;
+
+            /* *next == '%' */
+            next++;
+            if(*next == 'r')
             {
-                for(j = 0;j < HRIR_LENGTH;j++)
-                {
-                    ALshort coeff;
-                    coeff  = fgetc(f);
-                    coeff |= fgetc(f)<<8;
-                    newdata.coeffs[i][j] = coeff;
-                }
+                int wrote = snprintf(&fname[i], sizeof(fname)-i, "%u", deviceRate);
+                i += minu(wrote, sizeof(fname)-i);
+                next++;
             }
-            for(i = 0;i < HRIR_COUNT;i++)
+            else if(*next == '%')
             {
-                ALubyte delay;
-                delay = fgetc(f);
-                newdata.delays[i] = delay;
-                if(delay > maxDelay)
-                {
-                    ERR("Invalid delay[%d]: %d (%d)\n", i, delay, maxDelay);
-                    failed = AL_TRUE;
-                }
+                if(i < sizeof(fname))
+                    fname[i++] = '%';
+                next++;
             }
+            else
+                ERR("Invalid marker '%%%c'\n", *next);
+            fnamelist = next;
+        }
+        i = minu(i, sizeof(fname)-1);
+        fname[i] = '\0';
+        while(i > 0 && isspace(fname[i-1]))
+            i--;
+        fname[i] = '\0';
 
-            if(feof(f))
+        if(fname[0] == '\0')
+            continue;
+
+        TRACE("Loading %s...\n", fname);
+        f = fopen(fname, "rb");
+        if(f == NULL)
+        {
+            ERR("Could not open %s\n", fname);
+            continue;
+        }
+
+        if(fread(magic, 1, sizeof(magic), f) != sizeof(magic))
+            ERR("Failed to read header from %s\n", fname);
+        else
+        {
+            if(memcmp(magic, magicMarker00, sizeof(magicMarker00)) == 0)
             {
-                ERR("Premature end of data\n");
-                failed = AL_TRUE;
+                TRACE("Detected data set format v0\n");
+                Hrtf = LoadHrtf00(f, deviceRate);
+            }
+            else if(memcmp(magic, magicMarker01, sizeof(magicMarker01)) == 0)
+            {
+                TRACE("Detected data set format v1\n");
+                Hrtf = LoadHrtf01(f, deviceRate);
             }
+            else
+                ERR("Invalid header in %s: \"%.8s\"\n", fname, magic);
         }
 
         fclose(f);
         f = NULL;
 
-        if(!failed)
+        if(Hrtf)
         {
-            void *temp = realloc(LoadedHrtfs, (NumLoadedHrtfs+1)*sizeof(LoadedHrtfs[0]));
-            if(temp != NULL)
-            {
-                LoadedHrtfs = temp;
-                TRACE("Loaded HRTF support for format: %s %uhz\n",
-                      DevFmtChannelsString(DevFmtStereo), newdata.sampleRate);
-                LoadedHrtfs[NumLoadedHrtfs++] = newdata;
-            }
+            Hrtf->next = LoadedHrtfs;
+            LoadedHrtfs = Hrtf;
+            TRACE("Loaded HRTF support for format: %s %uhz\n",
+                  DevFmtChannelsString(DevFmtStereo), Hrtf->sampleRate);
+            return Hrtf;
         }
-        else
-            ERR("Failed to load %s\n", fname);
+
+        ERR("Failed to load %s\n", fname);
+    }
+
+    return NULL;
+}
+
+const struct Hrtf *GetHrtf(ALCdevice *device)
+{
+    if(device->FmtChans == DevFmtStereo)
+    {
+        struct Hrtf *Hrtf = LoadedHrtfs;
+        while(Hrtf != NULL)
+        {
+            if(device->Frequency == Hrtf->sampleRate)
+                return Hrtf;
+            Hrtf = Hrtf->next;
+        }
+
+        Hrtf = LoadHrtf(device->Frequency);
+        if(Hrtf != NULL)
+            return Hrtf;
+
+        if(device->Frequency == DefaultHrtf.sampleRate)
+            return &DefaultHrtf;
+    }
+    ERR("Incompatible format: %s %uhz\n",
+        DevFmtChannelsString(device->FmtChans), device->Frequency);
+    return NULL;
+}
+
+void FindHrtfFormat(const ALCdevice *device, enum DevFmtChannels *chans, ALCuint *srate)
+{
+    const struct Hrtf *hrtf = &DefaultHrtf;
+
+    if(device->Frequency != DefaultHrtf.sampleRate)
+    {
+        hrtf = LoadedHrtfs;
+        while(hrtf != NULL)
+        {
+            if(device->Frequency == hrtf->sampleRate)
+                break;
+            hrtf = hrtf->next;
+        }
+
+        if(hrtf == NULL)
+            hrtf = LoadHrtf(device->Frequency);
+        if(hrtf == NULL)
+            hrtf = &DefaultHrtf;
+    }
+
+    *chans = DevFmtStereo;
+    *srate = hrtf->sampleRate;
+}
+
+void FreeHrtfs(void)
+{
+    struct Hrtf *Hrtf = NULL;
+
+    while((Hrtf=LoadedHrtfs) != NULL)
+    {
+        LoadedHrtfs = Hrtf->next;
+        free((void*)Hrtf->azCount);
+        free((void*)Hrtf->evOffset);
+        free((void*)Hrtf->coeffs);
+        free((void*)Hrtf->delays);
+        free(Hrtf);
     }
-    free(fnamelist);
-    fnamelist = NULL;
 }
 
-void FreeHrtf(void)
+ALuint GetHrtfIrSize (const struct Hrtf *Hrtf)
 {
-    NumLoadedHrtfs = 0;
-    free(LoadedHrtfs);
-    LoadedHrtfs = NULL;
+    return Hrtf->irSize;
 }

ファイルの差分が大きいため隠しています
+ 835 - 836
jni/openal-soft-android/Alc/hrtf_tables.inc


+ 278 - 0
jni/openal-soft-android/Alc/midi/base.c

@@ -0,0 +1,278 @@
+
+#include "config.h"
+
+#include <stdlib.h>
+#include <string.h>
+#include <limits.h>
+
+#include "midi/base.h"
+
+#include "alMidi.h"
+#include "alMain.h"
+#include "alError.h"
+#include "alThunk.h"
+#include "evtqueue.h"
+#include "rwlock.h"
+#include "alu.h"
+
+
+/* Microsecond resolution */
+#define TICKS_PER_SECOND (1000000)
+
+/* MIDI events */
+#define SYSEX_EVENT  (0xF0)
+
+
+void InitEvtQueue(EvtQueue *queue)
+{
+    queue->events = NULL;
+    queue->maxsize = 0;
+    queue->size = 0;
+    queue->pos = 0;
+}
+
+void ResetEvtQueue(EvtQueue *queue)
+{
+    ALsizei i;
+    for(i = 0;i < queue->size;i++)
+    {
+        if(queue->events[i].event == SYSEX_EVENT)
+        {
+            free(queue->events[i].param.sysex.data);
+            queue->events[i].param.sysex.data = NULL;
+        }
+    }
+
+    free(queue->events);
+    queue->events = NULL;
+    queue->maxsize = 0;
+    queue->size = 0;
+    queue->pos = 0;
+}
+
+ALenum InsertEvtQueue(EvtQueue *queue, const MidiEvent *evt)
+{
+    ALsizei pos;
+
+    if(queue->maxsize == queue->size)
+    {
+        if(queue->pos > 0)
+        {
+            /* Queue has some stale entries, remove them to make space for more
+             * events. */
+            for(pos = 0;pos < queue->pos;pos++)
+            {
+                if(queue->events[pos].event == SYSEX_EVENT)
+                {
+                    free(queue->events[pos].param.sysex.data);
+                    queue->events[pos].param.sysex.data = NULL;
+                }
+            }
+            memmove(&queue->events[0], &queue->events[queue->pos],
+                    (queue->size-queue->pos)*sizeof(queue->events[0]));
+            queue->size -= queue->pos;
+            queue->pos = 0;
+        }
+        else
+        {
+            /* Queue is full, double the allocated space. */
+            void *temp = NULL;
+            ALsizei newsize;
+
+            newsize = (queue->maxsize ? (queue->maxsize<<1) : 16);
+            if(newsize > queue->maxsize)
+                temp = realloc(queue->events, newsize * sizeof(queue->events[0]));
+            if(!temp)
+                return AL_OUT_OF_MEMORY;
+
+            queue->events = temp;
+            queue->maxsize = newsize;
+        }
+    }
+
+    pos = queue->pos;
+    if(queue->size > 0)
+    {
+        ALsizei high = queue->size - 1;
+        while(pos < high)
+        {
+            ALsizei mid = pos + (high-pos)/2;
+            if(queue->events[mid].time < evt->time)
+                pos = mid + 1;
+            else
+                high = mid;
+        }
+        while(pos < queue->size && queue->events[pos].time <= evt->time)
+            pos++;
+
+        if(pos < queue->size)
+            memmove(&queue->events[pos+1], &queue->events[pos],
+                    (queue->size-pos)*sizeof(queue->events[0]));
+    }
+
+    queue->events[pos] = *evt;
+    queue->size++;
+
+    return AL_NO_ERROR;
+}
+
+
+void MidiSynth_Construct(MidiSynth *self, ALCdevice *device)
+{
+    InitEvtQueue(&self->EventQueue);
+
+    RWLockInit(&self->Lock);
+
+    self->Soundfonts = NULL;
+    self->NumSoundfonts = 0;
+
+    self->Gain = 1.0f;
+    self->State = AL_INITIAL;
+
+    self->LastEvtTime = 0;
+    self->NextEvtTime = UINT64_MAX;
+    self->SamplesSinceLast = 0.0;
+    self->SamplesToNext = 0.0;
+
+    self->SamplesPerTick = (ALdouble)device->Frequency / TICKS_PER_SECOND;
+}
+
+void MidiSynth_Destruct(MidiSynth *self)
+{
+    ALsizei i;
+
+    for(i = 0;i < self->NumSoundfonts;i++)
+        DecrementRef(&self->Soundfonts[i]->ref);
+    free(self->Soundfonts);
+    self->Soundfonts = NULL;
+    self->NumSoundfonts = 0;
+
+    ResetEvtQueue(&self->EventQueue);
+}
+
+
+ALenum MidiSynth_selectSoundfonts(MidiSynth *self, ALCcontext *context, ALsizei count, const ALuint *ids)
+{
+    ALCdevice *device = context->Device;
+    ALsoundfont **sfonts;
+    ALsizei i;
+
+    if(self->State != AL_INITIAL && self->State != AL_STOPPED)
+        return AL_INVALID_OPERATION;
+
+    sfonts = calloc(1, count * sizeof(sfonts[0]));
+    if(!sfonts) return AL_OUT_OF_MEMORY;
+
+    for(i = 0;i < count;i++)
+    {
+        if(ids[i] == 0)
+            sfonts[i] = ALsoundfont_getDefSoundfont(context);
+        else if(!(sfonts[i]=LookupSfont(device, ids[i])))
+        {
+            free(sfonts);
+            return AL_INVALID_VALUE;
+        }
+    }
+
+    for(i = 0;i < count;i++)
+        IncrementRef(&sfonts[i]->ref);
+    sfonts = ExchangePtr((XchgPtr*)&self->Soundfonts, sfonts);
+    count = ExchangeInt(&self->NumSoundfonts, count);
+
+    for(i = 0;i < count;i++)
+        DecrementRef(&sfonts[i]->ref);
+    free(sfonts);
+
+    return AL_NO_ERROR;
+}
+
+extern inline void MidiSynth_setGain(MidiSynth *self, ALfloat gain);
+extern inline ALfloat MidiSynth_getGain(const MidiSynth *self);
+extern inline void MidiSynth_setState(MidiSynth *self, ALenum state);
+extern inline ALenum MidiSynth_getState(const MidiSynth *self);
+
+void MidiSynth_stop(MidiSynth *self)
+{
+    ResetEvtQueue(&self->EventQueue);
+
+    self->LastEvtTime = 0;
+    self->NextEvtTime = UINT64_MAX;
+    self->SamplesSinceLast = 0.0;
+    self->SamplesToNext = 0.0;
+}
+
+extern inline void MidiSynth_reset(MidiSynth *self);
+
+ALuint64 MidiSynth_getTime(const MidiSynth *self)
+{
+    ALuint64 time = self->LastEvtTime + (self->SamplesSinceLast/self->SamplesPerTick);
+    return clampu64(time, self->LastEvtTime, self->NextEvtTime);
+}
+
+extern inline ALuint64 MidiSynth_getNextEvtTime(const MidiSynth *self);
+
+void MidiSynth_setSampleRate(MidiSynth *self, ALdouble srate)
+{
+    ALdouble sampletickrate = srate / TICKS_PER_SECOND;
+
+    self->SamplesSinceLast = self->SamplesSinceLast * sampletickrate / self->SamplesPerTick;
+    self->SamplesToNext = self->SamplesToNext * sampletickrate / self->SamplesPerTick;
+    self->SamplesPerTick = sampletickrate;
+}
+
+extern inline void MidiSynth_update(MidiSynth *self, ALCdevice *device);
+
+ALenum MidiSynth_insertEvent(MidiSynth *self, ALuint64 time, ALuint event, ALsizei param1, ALsizei param2)
+{
+    MidiEvent entry;
+    ALenum err;
+
+    entry.time = time;
+    entry.event = event;
+    entry.param.val[0] = param1;
+    entry.param.val[1] = param2;
+
+    err = InsertEvtQueue(&self->EventQueue, &entry);
+    if(err != AL_NO_ERROR) return err;
+
+    if(entry.time < self->NextEvtTime)
+    {
+        self->NextEvtTime = entry.time;
+
+        self->SamplesToNext  = (self->NextEvtTime - self->LastEvtTime) * self->SamplesPerTick;
+        self->SamplesToNext -= self->SamplesSinceLast;
+    }
+
+    return AL_NO_ERROR;
+}
+
+ALenum MidiSynth_insertSysExEvent(MidiSynth *self, ALuint64 time, const ALbyte *data, ALsizei size)
+{
+    MidiEvent entry;
+    ALenum err;
+
+    entry.time = time;
+    entry.event = SYSEX_EVENT;
+    entry.param.sysex.size = size;
+    entry.param.sysex.data = malloc(size);
+    if(!entry.param.sysex.data)
+        return AL_OUT_OF_MEMORY;
+    memcpy(entry.param.sysex.data, data, size);
+
+    err = InsertEvtQueue(&self->EventQueue, &entry);
+    if(err != AL_NO_ERROR)
+    {
+        free(entry.param.sysex.data);
+        return err;
+    }
+
+    if(entry.time < self->NextEvtTime)
+    {
+        self->NextEvtTime = entry.time;
+
+        self->SamplesToNext  = (self->NextEvtTime - self->LastEvtTime) * self->SamplesPerTick;
+        self->SamplesToNext -= self->SamplesSinceLast;
+    }
+
+    return AL_NO_ERROR;
+}

+ 128 - 0
jni/openal-soft-android/Alc/midi/base.h

@@ -0,0 +1,128 @@
+#ifndef AL_MIDI_BASE_H
+#define AL_MIDI_BASE_H
+
+#include "alMain.h"
+#include "atomic.h"
+#include "evtqueue.h"
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+struct ALsoundfont;
+
+typedef size_t (*ReaderCb)(void *ptr, size_t size, void *stream);
+typedef struct Reader {
+    ReaderCb cb;
+    void *ptr;
+    int error;
+} Reader;
+#define READ(x_, buf_, len_) ((x_)->cb((buf_), (len_), (x_)->ptr))
+#define READERR(x_)          ((x_)->error)
+
+ALboolean loadSf2(Reader *stream, struct ALsoundfont *sfont, ALCcontext *context);
+
+
+struct MidiSynthVtable;
+
+typedef struct MidiSynth {
+    EvtQueue EventQueue;
+
+    ALuint64 LastEvtTime;
+    ALuint64 NextEvtTime;
+    ALdouble SamplesSinceLast;
+    ALdouble SamplesToNext;
+
+    ALdouble SamplesPerTick;
+
+    /* NOTE: This rwlock is for the state and soundfont. The EventQueue and
+     * related must instead use the device lock as they're used in the mixer
+     * thread.
+     */
+    RWLock Lock;
+
+    struct ALsoundfont **Soundfonts;
+    ALsizei NumSoundfonts;
+
+    volatile ALfloat Gain;
+    volatile ALenum State;
+
+    const struct MidiSynthVtable *vtbl;
+} MidiSynth;
+
+void MidiSynth_Construct(MidiSynth *self, ALCdevice *device);
+void MidiSynth_Destruct(MidiSynth *self);
+ALenum MidiSynth_selectSoundfonts(MidiSynth *self, ALCcontext *context, ALsizei count, const ALuint *ids);
+inline void MidiSynth_setGain(MidiSynth *self, ALfloat gain) { self->Gain = gain; }
+inline ALfloat MidiSynth_getGain(const MidiSynth *self) { return self->Gain; }
+inline void MidiSynth_setState(MidiSynth *self, ALenum state) { ExchangeInt(&self->State, state); }
+inline ALenum MidiSynth_getState(const MidiSynth *self) { return self->State; }
+void MidiSynth_stop(MidiSynth *self);
+inline void MidiSynth_reset(MidiSynth *self) { MidiSynth_stop(self); }
+ALuint64 MidiSynth_getTime(const MidiSynth *self);
+inline ALuint64 MidiSynth_getNextEvtTime(const MidiSynth *self)
+{
+    if(self->EventQueue.pos == self->EventQueue.size)
+        return UINT64_MAX;
+    return self->EventQueue.events[self->EventQueue.pos].time;
+}
+void MidiSynth_setSampleRate(MidiSynth *self, ALdouble srate);
+inline void MidiSynth_update(MidiSynth *self, ALCdevice *device)
+{ MidiSynth_setSampleRate(self, device->Frequency); }
+ALenum MidiSynth_insertEvent(MidiSynth *self, ALuint64 time, ALuint event, ALsizei param1, ALsizei param2);
+ALenum MidiSynth_insertSysExEvent(MidiSynth *self, ALuint64 time, const ALbyte *data, ALsizei size);
+
+
+struct MidiSynthVtable {
+    void (*const Destruct)(MidiSynth *self);
+
+    ALenum (*const selectSoundfonts)(MidiSynth *self, ALCcontext *context, ALsizei count, const ALuint *ids);
+
+    void (*const setGain)(MidiSynth *self, ALfloat gain);
+    void (*const setState)(MidiSynth *self, ALenum state);
+
+    void (*const stop)(MidiSynth *self);
+    void (*const reset)(MidiSynth *self);
+
+    void (*const update)(MidiSynth *self, ALCdevice *device);
+    void (*const process)(MidiSynth *self, ALuint samples, ALfloat (*restrict DryBuffer)[BUFFERSIZE]);
+
+    void (*const Delete)(MidiSynth *self);
+};
+
+#define DEFINE_MIDISYNTH_VTABLE(T)                                            \
+DECLARE_THUNK(T, MidiSynth, void, Destruct)                                   \
+DECLARE_THUNK3(T, MidiSynth, ALenum, selectSoundfonts, ALCcontext*, ALsizei, const ALuint*) \
+DECLARE_THUNK1(T, MidiSynth, void, setGain, ALfloat)                          \
+DECLARE_THUNK1(T, MidiSynth, void, setState, ALenum)                          \
+DECLARE_THUNK(T, MidiSynth, void, stop)                                       \
+DECLARE_THUNK(T, MidiSynth, void, reset)                                      \
+DECLARE_THUNK1(T, MidiSynth, void, update, ALCdevice*)                        \
+DECLARE_THUNK2(T, MidiSynth, void, process, ALuint, ALfloatBUFFERSIZE*restrict) \
+DECLARE_THUNK(T, MidiSynth, void, Delete)                                     \
+                                                                              \
+static const struct MidiSynthVtable T##_MidiSynth_vtable = {                  \
+    T##_MidiSynth_Destruct,                                                   \
+                                                                              \
+    T##_MidiSynth_selectSoundfonts,                                           \
+    T##_MidiSynth_setGain,                                                    \
+    T##_MidiSynth_setState,                                                   \
+    T##_MidiSynth_stop,                                                       \
+    T##_MidiSynth_reset,                                                      \
+    T##_MidiSynth_update,                                                     \
+    T##_MidiSynth_process,                                                    \
+                                                                              \
+    T##_MidiSynth_Delete,                                                     \
+}
+
+
+MidiSynth *FSynth_create(ALCdevice *device);
+MidiSynth *DSynth_create(ALCdevice *device);
+
+MidiSynth *SynthCreate(ALCdevice *device);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* AL_MIDI_BASE_H */

+ 95 - 0
jni/openal-soft-android/Alc/midi/dummy.c

@@ -0,0 +1,95 @@
+
+#include "config.h"
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <limits.h>
+
+#include "alMain.h"
+#include "alError.h"
+#include "evtqueue.h"
+#include "rwlock.h"
+#include "alu.h"
+
+#include "midi/base.h"
+
+typedef struct DSynth {
+    DERIVE_FROM_TYPE(MidiSynth);
+} DSynth;
+
+static void DSynth_Construct(DSynth *self, ALCdevice *device);
+static DECLARE_FORWARD(DSynth, MidiSynth, void, Destruct)
+static DECLARE_FORWARD3(DSynth, MidiSynth, ALenum, selectSoundfonts, ALCcontext*, ALsizei, const ALuint*)
+static DECLARE_FORWARD1(DSynth, MidiSynth, void, setGain, ALfloat)
+static DECLARE_FORWARD1(DSynth, MidiSynth, void, setState, ALenum)
+static DECLARE_FORWARD(DSynth, MidiSynth, void, stop)
+static DECLARE_FORWARD(DSynth, MidiSynth, void, reset)
+static DECLARE_FORWARD1(DSynth, MidiSynth, void, update, ALCdevice*)
+static void DSynth_process(DSynth *self, ALuint SamplesToDo, ALfloat (*restrict DryBuffer)[BUFFERSIZE]);
+static void DSynth_Delete(DSynth *self);
+DEFINE_MIDISYNTH_VTABLE(DSynth);
+
+
+static void DSynth_Construct(DSynth *self, ALCdevice *device)
+{
+    MidiSynth_Construct(STATIC_CAST(MidiSynth, self), device);
+    SET_VTABLE2(DSynth, MidiSynth, self);
+}
+
+
+static void DSynth_processQueue(DSynth *self, ALuint64 time)
+{
+    EvtQueue *queue = &STATIC_CAST(MidiSynth, self)->EventQueue;
+
+    while(queue->pos < queue->size && queue->events[queue->pos].time <= time)
+        queue->pos++;
+}
+
+static void DSynth_process(DSynth *self, ALuint SamplesToDo, ALfloatBUFFERSIZE*restrict UNUSED(DryBuffer))
+{
+    MidiSynth *synth = STATIC_CAST(MidiSynth, self);
+
+    if(synth->State != AL_PLAYING)
+        return;
+
+    synth->SamplesSinceLast += SamplesToDo;
+    synth->SamplesToNext -= SamplesToDo;
+    while(synth->SamplesToNext < 1.0f)
+    {
+        ALuint64 time = synth->NextEvtTime;
+        if(time == UINT64_MAX)
+        {
+            synth->SamplesToNext = 0.0;
+            break;
+        }
+
+        synth->SamplesSinceLast -= (time - synth->LastEvtTime) * synth->SamplesPerTick;
+        synth->SamplesSinceLast  = maxd(synth->SamplesSinceLast, 0.0);
+        synth->LastEvtTime = time;
+        DSynth_processQueue(self, time);
+
+        synth->NextEvtTime = MidiSynth_getNextEvtTime(synth);
+        if(synth->NextEvtTime != UINT64_MAX)
+            synth->SamplesToNext += (synth->NextEvtTime - synth->LastEvtTime) * synth->SamplesPerTick;
+    }
+}
+
+
+static void DSynth_Delete(DSynth *self)
+{
+    free(self);
+}
+
+
+MidiSynth *DSynth_create(ALCdevice *device)
+{
+    DSynth *synth = calloc(1, sizeof(*synth));
+    if(!synth)
+    {
+        ERR("Failed to allocate DSynth\n");
+        return NULL;
+    }
+    DSynth_Construct(synth, device);
+    return STATIC_CAST(MidiSynth, synth);
+}

+ 843 - 0
jni/openal-soft-android/Alc/midi/fluidsynth.c

@@ -0,0 +1,843 @@
+
+#include "config.h"
+
+#include <stdlib.h>
+#include <string.h>
+#include <limits.h>
+
+#include "midi/base.h"
+
+#include "alMain.h"
+#include "alError.h"
+#include "alMidi.h"
+#include "evtqueue.h"
+#include "rwlock.h"
+#include "alu.h"
+
+#ifdef HAVE_FLUIDSYNTH
+
+#include <fluidsynth.h>
+
+
+/* MIDI events */
+#define SYSEX_EVENT  (0xF0)
+
+/* MIDI controllers */
+#define CTRL_BANKSELECT_MSB  (0)
+#define CTRL_BANKSELECT_LSB  (32)
+#define CTRL_ALLNOTESOFF     (123)
+
+
+static int getGenInput(ALenum input)
+{
+    switch(input)
+    {
+        case AL_ONE_SOFT: return FLUID_MOD_NONE;
+        case AL_NOTEON_VELOCITY_SOFT: return FLUID_MOD_VELOCITY;
+        case AL_NOTEON_KEY_SOFT: return FLUID_MOD_KEY;
+        case AL_KEYPRESSURE_SOFT: return FLUID_MOD_KEYPRESSURE;
+        case AL_CHANNELPRESSURE_SOFT: return FLUID_MOD_CHANNELPRESSURE;
+        case AL_PITCHBEND_SOFT: return FLUID_MOD_PITCHWHEEL;
+        case AL_PITCHBEND_SENSITIVITY_SOFT: return FLUID_MOD_PITCHWHEELSENS;
+    }
+    return input&0x7F;
+}
+
+static int getGenFlags(ALenum input, ALenum type, ALenum form)
+{
+    int ret = 0;
+
+    switch(type)
+    {
+        case AL_UNORM_SOFT: ret |= FLUID_MOD_UNIPOLAR | FLUID_MOD_POSITIVE; break;
+        case AL_UNORM_REV_SOFT: ret |= FLUID_MOD_UNIPOLAR | FLUID_MOD_NEGATIVE; break;
+        case AL_SNORM_SOFT: ret |= FLUID_MOD_BIPOLAR | FLUID_MOD_POSITIVE; break;
+        case AL_SNORM_REV_SOFT: ret |= FLUID_MOD_BIPOLAR | FLUID_MOD_NEGATIVE; break;
+    }
+    switch(form)
+    {
+        case AL_LINEAR_SOFT: ret |= FLUID_MOD_LINEAR; break;
+        case AL_CONCAVE_SOFT: ret |= FLUID_MOD_CONCAVE; break;
+        case AL_CONVEX_SOFT: ret |= FLUID_MOD_CONVEX; break;
+        case AL_SWITCH_SOFT: ret |= FLUID_MOD_SWITCH; break;
+    }
+    /* Source input values less than 128 correspond to a MIDI continuous
+     * controller. Otherwise, it's a general controller. */
+    if(input < 128) ret |= FLUID_MOD_CC;
+    else ret |= FLUID_MOD_GC;
+
+    return ret;
+}
+
+static enum fluid_gen_type getSf2Gen(ALenum gen)
+{
+    switch(gen)
+    {
+        case AL_MOD_LFO_TO_PITCH_SOFT: return GEN_MODLFOTOPITCH;
+        case AL_VIBRATO_LFO_TO_PITCH_SOFT: return GEN_VIBLFOTOPITCH;
+        case AL_MOD_ENV_TO_PITCH_SOFT: return GEN_MODENVTOPITCH;
+        case AL_FILTER_CUTOFF_SOFT: return GEN_FILTERFC;
+        case AL_FILTER_RESONANCE_SOFT: return GEN_FILTERQ;
+        case AL_MOD_LFO_TO_FILTER_CUTOFF_SOFT: return GEN_MODLFOTOFILTERFC;
+        case AL_MOD_ENV_TO_FILTER_CUTOFF_SOFT: return GEN_MODENVTOFILTERFC;
+        case AL_MOD_LFO_TO_VOLUME_SOFT: return GEN_MODLFOTOVOL;
+        case AL_CHORUS_SEND_SOFT: return GEN_CHORUSSEND;
+        case AL_REVERB_SEND_SOFT: return GEN_REVERBSEND;
+        case AL_PAN_SOFT: return GEN_PAN;
+        case AL_MOD_LFO_DELAY_SOFT: return GEN_MODLFODELAY;
+        case AL_MOD_LFO_FREQUENCY_SOFT: return GEN_MODLFOFREQ;
+        case AL_VIBRATO_LFO_DELAY_SOFT: return GEN_VIBLFODELAY;
+        case AL_VIBRATO_LFO_FREQUENCY_SOFT: return GEN_VIBLFOFREQ;
+        case AL_MOD_ENV_DELAYTIME_SOFT: return GEN_MODENVDELAY;
+        case AL_MOD_ENV_ATTACKTIME_SOFT: return GEN_MODENVATTACK;
+        case AL_MOD_ENV_HOLDTIME_SOFT: return GEN_MODENVHOLD;
+        case AL_MOD_ENV_DECAYTIME_SOFT: return GEN_MODENVDECAY;
+        case AL_MOD_ENV_SUSTAINVOLUME_SOFT: return GEN_MODENVSUSTAIN;
+        case AL_MOD_ENV_RELEASETIME_SOFT: return GEN_MODENVRELEASE;
+        case AL_MOD_ENV_KEY_TO_HOLDTIME_SOFT: return GEN_KEYTOMODENVHOLD;
+        case AL_MOD_ENV_KEY_TO_DECAYTIME_SOFT: return GEN_KEYTOMODENVDECAY;
+        case AL_VOLUME_ENV_DELAYTIME_SOFT: return GEN_VOLENVDELAY;
+        case AL_VOLUME_ENV_ATTACKTIME_SOFT: return GEN_VOLENVATTACK;
+        case AL_VOLUME_ENV_HOLDTIME_SOFT: return GEN_VOLENVHOLD;
+        case AL_VOLUME_ENV_DECAYTIME_SOFT: return GEN_VOLENVDECAY;
+        case AL_VOLUME_ENV_SUSTAINVOLUME_SOFT: return GEN_VOLENVSUSTAIN;
+        case AL_VOLUME_ENV_RELEASETIME_SOFT: return GEN_VOLENVRELEASE;
+        case AL_VOLUME_ENV_KEY_TO_HOLDTIME_SOFT: return GEN_KEYTOVOLENVHOLD;
+        case AL_VOLUME_ENV_KEY_TO_DECAYTIME_SOFT: return GEN_KEYTOVOLENVDECAY;
+        case AL_ATTENUATION_SOFT: return GEN_ATTENUATION;
+        case AL_TUNING_COARSE_SOFT: return GEN_COARSETUNE;
+        case AL_TUNING_FINE_SOFT: return GEN_FINETUNE;
+        case AL_TUNING_SCALE_SOFT: return GEN_SCALETUNE;
+    }
+    ERR("Unhandled generator: 0x%04x\n", gen);
+    return 0;
+}
+
+static int getSf2LoopMode(ALenum mode)
+{
+    switch(mode)
+    {
+        case AL_NONE: return 0;
+        case AL_LOOP_CONTINUOUS_SOFT: return 1;
+        case AL_LOOP_UNTIL_RELEASE_SOFT: return 3;
+    }
+    return 0;
+}
+
+static int getSampleType(ALenum type)
+{
+    switch(type)
+    {
+        case AL_MONO_SOFT: return FLUID_SAMPLETYPE_MONO;
+        case AL_RIGHT_SOFT: return FLUID_SAMPLETYPE_RIGHT;
+        case AL_LEFT_SOFT: return FLUID_SAMPLETYPE_LEFT;
+    }
+    return FLUID_SAMPLETYPE_MONO;
+}
+
+typedef struct FSample {
+    DERIVE_FROM_TYPE(fluid_sample_t);
+
+    ALfontsound *Sound;
+
+    fluid_mod_t *Mods;
+    ALsizei NumMods;
+} FSample;
+
+static void FSample_Construct(FSample *self, ALfontsound *sound, ALsoundfont *sfont)
+{
+    fluid_sample_t *sample = STATIC_CAST(fluid_sample_t, self);
+    memset(sample->name, 0, sizeof(sample->name));
+    sample->start = sound->Start;
+    sample->end = sound->End;
+    sample->loopstart = sound->LoopStart;
+    sample->loopend = sound->LoopEnd;
+    sample->samplerate = sound->SampleRate;
+    sample->origpitch = sound->PitchKey;
+    sample->pitchadj = sound->PitchCorrection;
+    sample->sampletype = getSampleType(sound->SampleType);
+    sample->valid = 1;
+    sample->data = sfont->Samples;
+
+    sample->amplitude_that_reaches_noise_floor_is_valid = 0;
+    sample->amplitude_that_reaches_noise_floor = 0.0;
+
+    sample->refcount = 0;
+
+    sample->notify = NULL;
+
+    sample->userdata = self;
+
+    self->Sound = sound;
+
+    self->NumMods = 0;
+    self->Mods = calloc(sound->ModulatorMap.size, sizeof(self->Mods[0]));
+    if(self->Mods)
+    {
+        ALsizei i;
+
+        self->NumMods = sound->ModulatorMap.size;
+        for(i = 0;i < self->NumMods;i++)
+        {
+            ALsfmodulator *mod = sound->ModulatorMap.array[i].value;
+            fluid_mod_set_source1(&self->Mods[i], getGenInput(mod->Source[0].Input),
+                                  getGenFlags(mod->Source[0].Input, mod->Source[0].Type,
+                                              mod->Source[0].Form));
+            fluid_mod_set_source2(&self->Mods[i], getGenInput(mod->Source[1].Input),
+                                  getGenFlags(mod->Source[1].Input, mod->Source[1].Type,
+                                              mod->Source[1].Form));
+            fluid_mod_set_amount(&self->Mods[i], mod->Amount);
+            fluid_mod_set_dest(&self->Mods[i], getSf2Gen(mod->Dest));
+            self->Mods[i].next = NULL;
+        }
+    }
+}
+
+static void FSample_Destruct(FSample *self)
+{
+    free(self->Mods);
+    self->Mods = NULL;
+    self->NumMods = 0;
+}
+
+
+typedef struct FPreset {
+    DERIVE_FROM_TYPE(fluid_preset_t);
+
+    char Name[16];
+
+    int Preset;
+    int Bank;
+
+    FSample *Samples;
+    ALsizei NumSamples;
+} FPreset;
+
+static char* FPreset_getName(fluid_preset_t *preset);
+static int FPreset_getPreset(fluid_preset_t *preset);
+static int FPreset_getBank(fluid_preset_t *preset);
+static int FPreset_noteOn(fluid_preset_t *preset, fluid_synth_t *synth, int channel, int key, int velocity);
+
+static void FPreset_Construct(FPreset *self, ALsfpreset *preset, fluid_sfont_t *parent, ALsoundfont *sfont)
+{
+    STATIC_CAST(fluid_preset_t, self)->data = self;
+    STATIC_CAST(fluid_preset_t, self)->sfont = parent;
+    STATIC_CAST(fluid_preset_t, self)->free = NULL;
+    STATIC_CAST(fluid_preset_t, self)->get_name = FPreset_getName;
+    STATIC_CAST(fluid_preset_t, self)->get_banknum = FPreset_getBank;
+    STATIC_CAST(fluid_preset_t, self)->get_num = FPreset_getPreset;
+    STATIC_CAST(fluid_preset_t, self)->noteon = FPreset_noteOn;
+    STATIC_CAST(fluid_preset_t, self)->notify = NULL;
+
+    memset(self->Name, 0, sizeof(self->Name));
+    self->Preset = preset->Preset;
+    self->Bank = preset->Bank;
+
+    self->NumSamples = 0;
+    self->Samples = calloc(1, preset->NumSounds * sizeof(self->Samples[0]));
+    if(self->Samples)
+    {
+        ALsizei i;
+        self->NumSamples = preset->NumSounds;
+        for(i = 0;i < self->NumSamples;i++)
+            FSample_Construct(&self->Samples[i], preset->Sounds[i], sfont);
+    }
+}
+
+static void FPreset_Destruct(FPreset *self)
+{
+    ALsizei i;
+
+    for(i = 0;i < self->NumSamples;i++)
+        FSample_Destruct(&self->Samples[i]);
+    free(self->Samples);
+    self->Samples = NULL;
+    self->NumSamples = 0;
+}
+
+static ALboolean FPreset_canDelete(FPreset *self)
+{
+    ALsizei i;
+
+    for(i = 0;i < self->NumSamples;i++)
+    {
+        if(fluid_sample_refcount(STATIC_CAST(fluid_sample_t, &self->Samples[i])) != 0)
+            return AL_FALSE;
+    }
+    return AL_TRUE;
+}
+
+static char* FPreset_getName(fluid_preset_t *preset)
+{
+    return ((FPreset*)preset->data)->Name;
+}
+
+static int FPreset_getPreset(fluid_preset_t *preset)
+{
+    return ((FPreset*)preset->data)->Preset;
+}
+
+static int FPreset_getBank(fluid_preset_t *preset)
+{
+    return ((FPreset*)preset->data)->Bank;
+}
+
+static int FPreset_noteOn(fluid_preset_t *preset, fluid_synth_t *synth, int channel, int key, int vel)
+{
+    FPreset *self = ((FPreset*)preset->data);
+    ALsizei i;
+
+    for(i = 0;i < self->NumSamples;i++)
+    {
+        FSample *sample = &self->Samples[i];
+        ALfontsound *sound = sample->Sound;
+        fluid_voice_t *voice;
+        ALsizei m;
+
+        if(!(key >= sound->MinKey && key <= sound->MaxKey && vel >= sound->MinVelocity && vel <= sound->MaxVelocity))
+            continue;
+
+        voice = fluid_synth_alloc_voice(synth, STATIC_CAST(fluid_sample_t, sample), channel, key, vel);
+        if(voice == NULL)
+            return FLUID_FAILED;
+
+        fluid_voice_gen_set(voice, GEN_MODLFOTOPITCH, sound->ModLfoToPitch);
+        fluid_voice_gen_set(voice, GEN_VIBLFOTOPITCH, sound->VibratoLfoToPitch);
+        fluid_voice_gen_set(voice, GEN_MODENVTOPITCH, sound->ModEnvToPitch);
+        fluid_voice_gen_set(voice, GEN_FILTERFC, sound->FilterCutoff);
+        fluid_voice_gen_set(voice, GEN_FILTERQ, sound->FilterQ);
+        fluid_voice_gen_set(voice, GEN_MODLFOTOFILTERFC, sound->ModLfoToFilterCutoff);
+        fluid_voice_gen_set(voice, GEN_MODENVTOFILTERFC, sound->ModEnvToFilterCutoff);
+        fluid_voice_gen_set(voice, GEN_MODLFOTOVOL, sound->ModLfoToVolume);
+        fluid_voice_gen_set(voice, GEN_CHORUSSEND, sound->ChorusSend);
+        fluid_voice_gen_set(voice, GEN_REVERBSEND, sound->ReverbSend);
+        fluid_voice_gen_set(voice, GEN_PAN, sound->Pan);
+        fluid_voice_gen_set(voice, GEN_MODLFODELAY, sound->ModLfo.Delay);
+        fluid_voice_gen_set(voice, GEN_MODLFOFREQ, sound->ModLfo.Frequency);
+        fluid_voice_gen_set(voice, GEN_VIBLFODELAY, sound->VibratoLfo.Delay);
+        fluid_voice_gen_set(voice, GEN_VIBLFOFREQ, sound->VibratoLfo.Frequency);
+        fluid_voice_gen_set(voice, GEN_MODENVDELAY, sound->ModEnv.DelayTime);
+        fluid_voice_gen_set(voice, GEN_MODENVATTACK, sound->ModEnv.AttackTime);
+        fluid_voice_gen_set(voice, GEN_MODENVHOLD, sound->ModEnv.HoldTime);
+        fluid_voice_gen_set(voice, GEN_MODENVDECAY, sound->ModEnv.DecayTime);
+        fluid_voice_gen_set(voice, GEN_MODENVSUSTAIN, sound->ModEnv.SustainAttn);
+        fluid_voice_gen_set(voice, GEN_MODENVRELEASE, sound->ModEnv.ReleaseTime);
+        fluid_voice_gen_set(voice, GEN_KEYTOMODENVHOLD, sound->ModEnv.KeyToHoldTime);
+        fluid_voice_gen_set(voice, GEN_KEYTOMODENVDECAY, sound->ModEnv.KeyToDecayTime);
+        fluid_voice_gen_set(voice, GEN_VOLENVDELAY, sound->VolEnv.DelayTime);
+        fluid_voice_gen_set(voice, GEN_VOLENVATTACK, sound->VolEnv.AttackTime);
+        fluid_voice_gen_set(voice, GEN_VOLENVHOLD, sound->VolEnv.HoldTime);
+        fluid_voice_gen_set(voice, GEN_VOLENVDECAY, sound->VolEnv.DecayTime);
+        fluid_voice_gen_set(voice, GEN_VOLENVSUSTAIN, sound->VolEnv.SustainAttn);
+        fluid_voice_gen_set(voice, GEN_VOLENVRELEASE, sound->VolEnv.ReleaseTime);
+        fluid_voice_gen_set(voice, GEN_KEYTOVOLENVHOLD, sound->VolEnv.KeyToHoldTime);
+        fluid_voice_gen_set(voice, GEN_KEYTOVOLENVDECAY, sound->VolEnv.KeyToDecayTime);
+        fluid_voice_gen_set(voice, GEN_ATTENUATION, sound->Attenuation);
+        fluid_voice_gen_set(voice, GEN_COARSETUNE, sound->CoarseTuning);
+        fluid_voice_gen_set(voice, GEN_FINETUNE, sound->FineTuning);
+        fluid_voice_gen_set(voice, GEN_SAMPLEMODE, getSf2LoopMode(sound->LoopMode));
+        fluid_voice_gen_set(voice, GEN_SCALETUNE, sound->TuningScale);
+        fluid_voice_gen_set(voice, GEN_EXCLUSIVECLASS, sound->ExclusiveClass);
+        for(m = 0;m < sample->NumMods;m++)
+            fluid_voice_add_mod(voice, &sample->Mods[m], FLUID_VOICE_OVERWRITE);
+
+        fluid_synth_start_voice(synth, voice);
+    }
+
+    return FLUID_OK;
+}
+
+
+typedef struct FSfont {
+    DERIVE_FROM_TYPE(fluid_sfont_t);
+
+    char Name[16];
+
+    FPreset *Presets;
+    ALsizei NumPresets;
+
+    ALsizei CurrentPos;
+} FSfont;
+
+static int FSfont_free(fluid_sfont_t *sfont);
+static char* FSfont_getName(fluid_sfont_t *sfont);
+static fluid_preset_t* FSfont_getPreset(fluid_sfont_t *sfont, unsigned int bank, unsigned int prenum);
+static void FSfont_iterStart(fluid_sfont_t *sfont);
+static int FSfont_iterNext(fluid_sfont_t *sfont, fluid_preset_t *preset);
+
+static void FSfont_Construct(FSfont *self, ALsoundfont *sfont)
+{
+    STATIC_CAST(fluid_sfont_t, self)->data = self;
+    STATIC_CAST(fluid_sfont_t, self)->id = FLUID_FAILED;
+    STATIC_CAST(fluid_sfont_t, self)->free = FSfont_free;
+    STATIC_CAST(fluid_sfont_t, self)->get_name = FSfont_getName;
+    STATIC_CAST(fluid_sfont_t, self)->get_preset = FSfont_getPreset;
+    STATIC_CAST(fluid_sfont_t, self)->iteration_start = FSfont_iterStart;
+    STATIC_CAST(fluid_sfont_t, self)->iteration_next = FSfont_iterNext;
+
+    memset(self->Name, 0, sizeof(self->Name));
+    self->CurrentPos = 0;
+    self->NumPresets = 0;
+    self->Presets = calloc(1, sfont->NumPresets * sizeof(self->Presets[0]));
+    if(self->Presets)
+    {
+        ALsizei i;
+        self->NumPresets = sfont->NumPresets;
+        for(i = 0;i < self->NumPresets;i++)
+            FPreset_Construct(&self->Presets[i], sfont->Presets[i], STATIC_CAST(fluid_sfont_t, self), sfont);
+    }
+}
+
+static void FSfont_Destruct(FSfont *self)
+{
+    ALsizei i;
+
+    for(i = 0;i < self->NumPresets;i++)
+        FPreset_Destruct(&self->Presets[i]);
+    free(self->Presets);
+    self->Presets = NULL;
+    self->NumPresets = 0;
+    self->CurrentPos = 0;
+}
+
+static int FSfont_free(fluid_sfont_t *sfont)
+{
+    FSfont *self = STATIC_UPCAST(FSfont, fluid_sfont_t, sfont);
+    ALsizei i;
+
+    for(i = 0;i < self->NumPresets;i++)
+    {
+        if(!FPreset_canDelete(&self->Presets[i]))
+            return 1;
+    }
+
+    FSfont_Destruct(self);
+    free(self);
+    return 0;
+}
+
+static char* FSfont_getName(fluid_sfont_t *sfont)
+{
+    return STATIC_UPCAST(FSfont, fluid_sfont_t, sfont)->Name;
+}
+
+static fluid_preset_t *FSfont_getPreset(fluid_sfont_t *sfont, unsigned int bank, unsigned int prenum)
+{
+    FSfont *self = STATIC_UPCAST(FSfont, fluid_sfont_t, sfont);
+    ALsizei i;
+
+    for(i = 0;i < self->NumPresets;i++)
+    {
+        FPreset *preset = &self->Presets[i];
+        if(preset->Bank == (int)bank && preset->Preset == (int)prenum)
+            return STATIC_CAST(fluid_preset_t, preset);
+    }
+
+    return NULL;
+}
+
+static void FSfont_iterStart(fluid_sfont_t *sfont)
+{
+    STATIC_UPCAST(FSfont, fluid_sfont_t, sfont)->CurrentPos = 0;
+}
+
+static int FSfont_iterNext(fluid_sfont_t *sfont, fluid_preset_t *preset)
+{
+    FSfont *self = STATIC_UPCAST(FSfont, fluid_sfont_t, sfont);
+    if(self->CurrentPos >= self->NumPresets)
+        return 0;
+    *preset = *STATIC_CAST(fluid_preset_t, &self->Presets[self->CurrentPos++]);
+    preset->free = NULL;
+    return 1;
+}
+
+
+typedef struct FSynth {
+    DERIVE_FROM_TYPE(MidiSynth);
+    DERIVE_FROM_TYPE(fluid_sfloader_t);
+
+    fluid_settings_t *Settings;
+    fluid_synth_t *Synth;
+    int *FontIDs;
+    ALsizei NumFontIDs;
+
+    ALboolean ForceGM2BankSelect;
+    ALfloat GainScale;
+} FSynth;
+
+static void FSynth_Construct(FSynth *self, ALCdevice *device);
+static void FSynth_Destruct(FSynth *self);
+static ALboolean FSynth_init(FSynth *self, ALCdevice *device);
+static ALenum FSynth_selectSoundfonts(FSynth *self, ALCcontext *context, ALsizei count, const ALuint *ids);
+static void FSynth_setGain(FSynth *self, ALfloat gain);
+static void FSynth_setState(FSynth *self, ALenum state);
+static void FSynth_stop(FSynth *self);
+static void FSynth_reset(FSynth *self);
+static void FSynth_update(FSynth *self, ALCdevice *device);
+static void FSynth_processQueue(FSynth *self, ALuint64 time);
+static void FSynth_process(FSynth *self, ALuint SamplesToDo, ALfloat (*restrict DryBuffer)[BUFFERSIZE]);
+static void FSynth_Delete(FSynth *self);
+DEFINE_MIDISYNTH_VTABLE(FSynth);
+
+static fluid_sfont_t *FSynth_loadSfont(fluid_sfloader_t *loader, const char *filename);
+
+
+static void FSynth_Construct(FSynth *self, ALCdevice *device)
+{
+    MidiSynth_Construct(STATIC_CAST(MidiSynth, self), device);
+    SET_VTABLE2(FSynth, MidiSynth, self);
+
+    STATIC_CAST(fluid_sfloader_t, self)->data = self;
+    STATIC_CAST(fluid_sfloader_t, self)->free = NULL;
+    STATIC_CAST(fluid_sfloader_t, self)->load = FSynth_loadSfont;
+
+    self->Settings = NULL;
+    self->Synth = NULL;
+    self->FontIDs = NULL;
+    self->NumFontIDs = 0;
+    self->ForceGM2BankSelect = AL_FALSE;
+    self->GainScale = 0.2f;
+}
+
+static void FSynth_Destruct(FSynth *self)
+{
+    ALsizei i;
+
+    for(i = 0;i < self->NumFontIDs;i++)
+        fluid_synth_sfunload(self->Synth, self->FontIDs[i], 0);
+    free(self->FontIDs);
+    self->FontIDs = NULL;
+    self->NumFontIDs = 0;
+
+    if(self->Synth != NULL)
+        delete_fluid_synth(self->Synth);
+    self->Synth = NULL;
+
+    if(self->Settings != NULL)
+        delete_fluid_settings(self->Settings);
+    self->Settings = NULL;
+
+    MidiSynth_Destruct(STATIC_CAST(MidiSynth, self));
+}
+
+static ALboolean FSynth_init(FSynth *self, ALCdevice *device)
+{
+    ALfloat vol;
+
+    if(ConfigValueFloat("midi", "volume", &vol))
+    {
+        if(!(vol <= 0.0f))
+        {
+            ERR("MIDI volume %f clamped to 0\n", vol);
+            vol = 0.0f;
+        }
+        self->GainScale = powf(10.0f, vol / 20.0f);
+    }
+
+    self->Settings = new_fluid_settings();
+    if(!self->Settings)
+    {
+        ERR("Failed to create FluidSettings\n");
+        return AL_FALSE;
+    }
+
+    fluid_settings_setint(self->Settings, "synth.polyphony", 256);
+    fluid_settings_setnum(self->Settings, "synth.gain", self->GainScale);
+    fluid_settings_setnum(self->Settings, "synth.sample-rate", device->Frequency);
+
+    self->Synth = new_fluid_synth(self->Settings);
+    if(!self->Synth)
+    {
+        ERR("Failed to create FluidSynth\n");
+        return AL_FALSE;
+    }
+
+    fluid_synth_add_sfloader(self->Synth, STATIC_CAST(fluid_sfloader_t, self));
+
+    return AL_TRUE;
+}
+
+
+static fluid_sfont_t *FSynth_loadSfont(fluid_sfloader_t *loader, const char *filename)
+{
+    FSynth *self = STATIC_UPCAST(FSynth, fluid_sfloader_t, loader);
+    FSfont *sfont;
+    int idx;
+
+    if(!filename || sscanf(filename, "_al_internal %d", &idx) != 1)
+        return NULL;
+    if(idx < 0 || idx >= STATIC_CAST(MidiSynth, self)->NumSoundfonts)
+    {
+        ERR("Received invalid soundfont index %d (max: %d)\n", idx, STATIC_CAST(MidiSynth, self)->NumSoundfonts);
+        return NULL;
+    }
+
+    sfont = calloc(1, sizeof(sfont[0]));
+    if(!sfont) return NULL;
+
+    FSfont_Construct(sfont, STATIC_CAST(MidiSynth, self)->Soundfonts[idx]);
+    return STATIC_CAST(fluid_sfont_t, sfont);
+}
+
+static ALenum FSynth_selectSoundfonts(FSynth *self, ALCcontext *context, ALsizei count, const ALuint *ids)
+{
+    int *fontid;
+    ALenum ret;
+    ALsizei i;
+
+    ret = MidiSynth_selectSoundfonts(STATIC_CAST(MidiSynth, self), context, count, ids);
+    if(ret != AL_NO_ERROR) return ret;
+
+    ALCdevice_Lock(context->Device);
+    for(i = 0;i < 16;i++)
+        fluid_synth_all_sounds_off(self->Synth, i);
+    ALCdevice_Unlock(context->Device);
+
+    fontid = malloc(count * sizeof(fontid[0]));
+    if(fontid)
+    {
+        for(i = 0;i < STATIC_CAST(MidiSynth, self)->NumSoundfonts;i++)
+        {
+            char name[16];
+            snprintf(name, sizeof(name), "_al_internal %d", i);
+
+            fontid[i] = fluid_synth_sfload(self->Synth, name, 0);
+            if(fontid[i] == FLUID_FAILED)
+                ERR("Failed to load selected soundfont %d\n", i);
+        }
+
+        fontid = ExchangePtr((XchgPtr*)&self->FontIDs, fontid);
+        count = ExchangeInt(&self->NumFontIDs, count);
+    }
+    else
+    {
+        ERR("Failed to allocate space for %d font IDs!\n", count);
+        fontid = ExchangePtr((XchgPtr*)&self->FontIDs, NULL);
+        count = ExchangeInt(&self->NumFontIDs, 0);
+    }
+
+    for(i = 0;i < count;i++)
+        fluid_synth_sfunload(self->Synth, fontid[i], 0);
+    free(fontid);
+
+    return ret;
+}
+
+
+static void FSynth_setGain(FSynth *self, ALfloat gain)
+{
+    fluid_settings_setnum(self->Settings, "synth.gain", self->GainScale * gain);
+    fluid_synth_set_gain(self->Synth, self->GainScale * gain);
+    MidiSynth_setGain(STATIC_CAST(MidiSynth, self), gain);
+}
+
+
+static void FSynth_setState(FSynth *self, ALenum state)
+{
+    MidiSynth_setState(STATIC_CAST(MidiSynth, self), state);
+}
+
+static void FSynth_stop(FSynth *self)
+{
+    MidiSynth *synth = STATIC_CAST(MidiSynth, self);
+    ALsizei chan;
+
+    /* Make sure all pending events are processed. */
+    while(!(synth->SamplesToNext >= 1.0))
+    {
+        ALuint64 time = synth->NextEvtTime;
+        if(time == UINT64_MAX)
+            break;
+
+        synth->SamplesSinceLast -= (time - synth->LastEvtTime) * synth->SamplesPerTick;
+        synth->SamplesSinceLast = maxd(synth->SamplesSinceLast, 0.0);
+        synth->LastEvtTime = time;
+        FSynth_processQueue(self, time);
+
+        synth->NextEvtTime = MidiSynth_getNextEvtTime(synth);
+        if(synth->NextEvtTime != UINT64_MAX)
+            synth->SamplesToNext += (synth->NextEvtTime - synth->LastEvtTime) * synth->SamplesPerTick;
+    }
+
+    /* All notes off */
+    for(chan = 0;chan < 16;chan++)
+        fluid_synth_cc(self->Synth, chan, CTRL_ALLNOTESOFF, 0);
+
+    MidiSynth_stop(STATIC_CAST(MidiSynth, self));
+}
+
+static void FSynth_reset(FSynth *self)
+{
+    /* Reset to power-up status. */
+    fluid_synth_system_reset(self->Synth);
+
+    MidiSynth_reset(STATIC_CAST(MidiSynth, self));
+}
+
+
+static void FSynth_update(FSynth *self, ALCdevice *device)
+{
+    fluid_settings_setnum(self->Settings, "synth.sample-rate", device->Frequency);
+    fluid_synth_set_sample_rate(self->Synth, device->Frequency);
+    MidiSynth_update(STATIC_CAST(MidiSynth, self), device);
+}
+
+
+static void FSynth_processQueue(FSynth *self, ALuint64 time)
+{
+    EvtQueue *queue = &STATIC_CAST(MidiSynth, self)->EventQueue;
+
+    while(queue->pos < queue->size && queue->events[queue->pos].time <= time)
+    {
+        const MidiEvent *evt = &queue->events[queue->pos];
+
+        if(evt->event == SYSEX_EVENT)
+        {
+            static const ALbyte gm2_on[] = { 0x7E, 0x7F, 0x09, 0x03 };
+            static const ALbyte gm2_off[] = { 0x7E, 0x7F, 0x09, 0x02 };
+            int handled = 0;
+
+            fluid_synth_sysex(self->Synth, evt->param.sysex.data, evt->param.sysex.size, NULL, NULL, &handled, 0);
+            if(!handled && evt->param.sysex.size >= (ALsizei)sizeof(gm2_on))
+            {
+                if(memcmp(evt->param.sysex.data, gm2_on, sizeof(gm2_on)) == 0)
+                    self->ForceGM2BankSelect = AL_TRUE;
+                else if(memcmp(evt->param.sysex.data, gm2_off, sizeof(gm2_off)) == 0)
+                    self->ForceGM2BankSelect = AL_FALSE;
+            }
+        }
+        else switch((evt->event&0xF0))
+        {
+            case AL_NOTEOFF_SOFT:
+                fluid_synth_noteoff(self->Synth, (evt->event&0x0F), evt->param.val[0]);
+                break;
+            case AL_NOTEON_SOFT:
+                fluid_synth_noteon(self->Synth, (evt->event&0x0F), evt->param.val[0], evt->param.val[1]);
+                break;
+            case AL_KEYPRESSURE_SOFT:
+                break;
+
+            case AL_CONTROLLERCHANGE_SOFT:
+                if(self->ForceGM2BankSelect)
+                {
+                    int chan = (evt->event&0x0F);
+                    if(evt->param.val[0] == CTRL_BANKSELECT_MSB)
+                    {
+                        if(evt->param.val[1] == 120 && (chan == 9 || chan == 10))
+                            fluid_synth_set_channel_type(self->Synth, chan, CHANNEL_TYPE_DRUM);
+                        else if(evt->param.val[1] == 121)
+                            fluid_synth_set_channel_type(self->Synth, chan, CHANNEL_TYPE_MELODIC);
+                        break;
+                    }
+                    if(evt->param.val[0] == CTRL_BANKSELECT_LSB)
+                    {
+                        fluid_synth_bank_select(self->Synth, chan, evt->param.val[1]);
+                        break;
+                    }
+                }
+                fluid_synth_cc(self->Synth, (evt->event&0x0F), evt->param.val[0], evt->param.val[1]);
+                break;
+            case AL_PROGRAMCHANGE_SOFT:
+                fluid_synth_program_change(self->Synth, (evt->event&0x0F), evt->param.val[0]);
+                break;
+
+            case AL_CHANNELPRESSURE_SOFT:
+                fluid_synth_channel_pressure(self->Synth, (evt->event&0x0F), evt->param.val[0]);
+                break;
+
+            case AL_PITCHBEND_SOFT:
+                fluid_synth_pitch_bend(self->Synth, (evt->event&0x0F), (evt->param.val[0]&0x7F) |
+                                                                       ((evt->param.val[1]&0x7F)<<7));
+                break;
+        }
+
+        queue->pos++;
+    }
+}
+
+static void FSynth_process(FSynth *self, ALuint SamplesToDo, ALfloat (*restrict DryBuffer)[BUFFERSIZE])
+{
+    MidiSynth *synth = STATIC_CAST(MidiSynth, self);
+    ALenum state = synth->State;
+    ALuint total = 0;
+
+    if(state == AL_INITIAL)
+        return;
+    if(state != AL_PLAYING)
+    {
+        fluid_synth_write_float(self->Synth, SamplesToDo, DryBuffer[FrontLeft], 0, 1,
+                                                          DryBuffer[FrontRight], 0, 1);
+        return;
+    }
+
+    while(total < SamplesToDo)
+    {
+        if(synth->SamplesToNext >= 1.0)
+        {
+            ALuint todo = minu(SamplesToDo - total, fastf2u(synth->SamplesToNext));
+
+            fluid_synth_write_float(self->Synth, todo,
+                                    &DryBuffer[FrontLeft][total], 0, 1,
+                                    &DryBuffer[FrontRight][total], 0, 1);
+            total += todo;
+            synth->SamplesSinceLast += todo;
+            synth->SamplesToNext -= todo;
+        }
+        else
+        {
+            ALuint64 time = synth->NextEvtTime;
+            if(time == UINT64_MAX)
+            {
+                synth->SamplesSinceLast += SamplesToDo-total;
+                fluid_synth_write_float(self->Synth, SamplesToDo-total,
+                                        &DryBuffer[FrontLeft][total], 0, 1,
+                                        &DryBuffer[FrontRight][total], 0, 1);
+                break;
+            }
+
+            synth->SamplesSinceLast -= (time - synth->LastEvtTime) * synth->SamplesPerTick;
+            synth->SamplesSinceLast = maxd(synth->SamplesSinceLast, 0.0);
+            synth->LastEvtTime = time;
+            FSynth_processQueue(self, time);
+
+            synth->NextEvtTime = MidiSynth_getNextEvtTime(synth);
+            if(synth->NextEvtTime != UINT64_MAX)
+                synth->SamplesToNext += (synth->NextEvtTime - synth->LastEvtTime) * synth->SamplesPerTick;
+        }
+    }
+}
+
+
+static void FSynth_Delete(FSynth *self)
+{
+    free(self);
+}
+
+
+MidiSynth *FSynth_create(ALCdevice *device)
+{
+    FSynth *synth = calloc(1, sizeof(*synth));
+    if(!synth)
+    {
+        ERR("Failed to allocate FSynth\n");
+        return NULL;
+    }
+    FSynth_Construct(synth, device);
+
+    if(FSynth_init(synth, device) == AL_FALSE)
+    {
+        DELETE_OBJ(STATIC_CAST(MidiSynth, synth));
+        return NULL;
+    }
+
+    return STATIC_CAST(MidiSynth, synth);
+}
+
+#else
+
+MidiSynth *FSynth_create(ALCdevice* UNUSED(device))
+{
+    return NULL;
+}
+
+#endif

+ 1436 - 0
jni/openal-soft-android/Alc/midi/sf2load.c

@@ -0,0 +1,1436 @@
+
+#include "config.h"
+
+#include <stdio.h>
+#include <stdlib.h>
+
+#include "alMain.h"
+#include "alMidi.h"
+#include "alError.h"
+#include "alu.h"
+
+#include "midi/base.h"
+
+
+static ALuint read_le32(Reader *stream)
+{
+    ALubyte buf[4];
+    if(READ(stream, buf, 4) != 4)
+    {
+        READERR(stream) = 1;
+        return 0;
+    }
+    return (buf[3]<<24) | (buf[2]<<16) | (buf[1]<<8) | buf[0];
+}
+static ALushort read_le16(Reader *stream)
+{
+    ALubyte buf[2];
+    if(READ(stream, buf, 2) != 2)
+    {
+        READERR(stream) = 1;
+        return 0;
+    }
+    return (buf[1]<<8) | buf[0];
+}
+static ALubyte read_8(Reader *stream)
+{
+    ALubyte buf[1];
+    if(READ(stream, buf, 1) != 1)
+    {
+        READERR(stream) = 1;
+        return 0;
+    }
+    return buf[0];
+}
+static void skip(Reader *stream, ALuint amt)
+{
+    while(amt > 0 && !READERR(stream))
+    {
+        char buf[4096];
+        size_t got;
+
+        got = READ(stream, buf, minu(sizeof(buf), amt));
+        if(got == 0) READERR(stream) = 1;
+
+        amt -= got;
+    }
+}
+
+typedef struct Generator {
+    ALushort mGenerator;
+    ALushort mAmount;
+} Generator;
+static void Generator_read(Generator *self, Reader *stream)
+{
+    self->mGenerator = read_le16(stream);
+    self->mAmount = read_le16(stream);
+}
+
+static const ALint DefaultGenValue[60] = {
+    0, /* 0 - startAddrOffset */
+    0, /* 1 - endAddrOffset */
+    0, /* 2 - startloopAddrOffset */
+    0, /* 3 - endloopAddrOffset */
+    0, /* 4 - startAddrCoarseOffset */
+    0, /* 5 - modLfoToPitch */
+    0, /* 6 - vibLfoToPitch */
+    0, /* 7 - modEnvToPitch */
+    13500, /* 8 - initialFilterFc */
+    0, /* 9 - initialFilterQ */
+    0, /* 10 - modLfoToFilterFc */
+    0, /* 11 - modEnvToFilterFc */
+    0, /* 12 - endAddrCoarseOffset */
+    0, /* 13 - modLfoToVolume */
+    0, /* 14 -  */
+    0, /* 15 - chorusEffectsSend */
+    0, /* 16 - reverbEffectsSend */
+    0, /* 17 - pan */
+    0, /* 18 -  */
+    0, /* 19 -  */
+    0, /* 20 -  */
+    -12000, /* 21 - delayModLFO */
+    0, /* 22 - freqModLFO */
+    -12000, /* 23 - delayVibLFO */
+    0, /* 24 - freqVibLFO */
+    -12000, /* 25 - delayModEnv */
+    -12000, /* 26 - attackModEnv */
+    -12000, /* 27 - holdModEnv */
+    -12000, /* 28 - decayModEnv */
+    0, /* 29 - sustainModEnv */
+    -12000, /* 30 - releaseModEnv */
+    0, /* 31 - keynumToModEnvHold */
+    0, /* 32 - keynumToModEnvDecay */
+    -12000, /* 33 - delayVolEnv */
+    -12000, /* 34 - attackVolEnv */
+    -12000, /* 35 - holdVolEnv */
+    -12000, /* 36 - decayVolEnv */
+    0, /* 37 - sustainVolEnv */
+    -12000, /* 38 - releaseVolEnv */
+    0, /* 39 - keynumToVolEnvHold */
+    0, /* 40 - keynumToVolEnvDecay */
+    0, /* 41 -  */
+    0, /* 42 -  */
+    0, /* 43 - keyRange */
+    0, /* 44 - velRange */
+    0, /* 45 - startloopAddrCoarseOffset */
+    0, /* 46 - keynum */
+    0, /* 47 - velocity */
+    0, /* 48 - initialAttenuation */
+    0, /* 49 -  */
+    0, /* 50 - endloopAddrCoarseOffset */
+    0, /* 51 - corseTune */
+    0, /* 52 - fineTune */
+    0, /* 53 -  */
+    0, /* 54 - sampleModes */
+    0, /* 55 -  */
+    100, /* 56 - scaleTuning */
+    0, /* 57 - exclusiveClass */
+    0, /* 58 - overridingRootKey */
+    0, /* 59 -  */
+};
+
+typedef struct Modulator {
+    ALushort mSrcOp;
+    ALushort mDstOp;
+    ALshort mAmount;
+    ALushort mAmtSrcOp;
+    ALushort mTransOp;
+} Modulator;
+static void Modulator_read(Modulator *self, Reader *stream)
+{
+    self->mSrcOp = read_le16(stream);
+    self->mDstOp = read_le16(stream);
+    self->mAmount = read_le16(stream);
+    self->mAmtSrcOp = read_le16(stream);
+    self->mTransOp = read_le16(stream);
+}
+
+typedef struct Zone {
+    ALushort mGenIdx;
+    ALushort mModIdx;
+} Zone;
+static void Zone_read(Zone *self, Reader *stream)
+{
+    self->mGenIdx = read_le16(stream);
+    self->mModIdx = read_le16(stream);
+}
+
+typedef struct PresetHeader {
+    ALchar mName[20];
+    ALushort mPreset; /* MIDI program number */
+    ALushort mBank;
+    ALushort mZoneIdx;
+    ALuint mLibrary;
+    ALuint mGenre;
+    ALuint mMorphology;
+} PresetHeader;
+static void PresetHeader_read(PresetHeader *self, Reader *stream)
+{
+    if(READ(stream, self->mName, sizeof(self->mName)) != sizeof(self->mName))
+        READERR(stream) = 1;
+    self->mPreset = read_le16(stream);
+    self->mBank = read_le16(stream);
+    self->mZoneIdx = read_le16(stream);
+    self->mLibrary = read_le32(stream);
+    self->mGenre = read_le32(stream);
+    self->mMorphology = read_le32(stream);
+}
+
+typedef struct InstrumentHeader {
+    ALchar mName[20];
+    ALushort mZoneIdx;
+} InstrumentHeader;
+static void InstrumentHeader_read(InstrumentHeader *self, Reader *stream)
+{
+    if(READ(stream, self->mName, sizeof(self->mName)) != sizeof(self->mName))
+        READERR(stream) = 1;
+    self->mZoneIdx = read_le16(stream);
+}
+
+typedef struct SampleHeader {
+    ALchar mName[20]; // 20 bytes
+    ALuint mStart;
+    ALuint mEnd;
+    ALuint mStartloop;
+    ALuint mEndloop;
+    ALuint mSampleRate;
+    ALubyte mOriginalKey;
+    ALbyte mCorrection;
+    ALushort mSampleLink;
+    ALushort mSampleType;
+} SampleHeader;
+static void SampleHeader_read(SampleHeader *self, Reader *stream)
+{
+    if(READ(stream, self->mName, sizeof(self->mName)) != sizeof(self->mName))
+        READERR(stream) = 1;
+    self->mStart = read_le32(stream);
+    self->mEnd = read_le32(stream);
+    self->mStartloop = read_le32(stream);
+    self->mEndloop = read_le32(stream);
+    self->mSampleRate = read_le32(stream);
+    self->mOriginalKey = read_8(stream);
+    self->mCorrection = read_8(stream);
+    self->mSampleLink = read_le16(stream);
+    self->mSampleType = read_le16(stream);
+}
+
+
+typedef struct Soundfont {
+    ALuint ifil;
+    ALchar *irom;
+
+    PresetHeader *phdr;
+    ALsizei phdr_size;
+
+    Zone *pbag;
+    ALsizei pbag_size;
+    Modulator *pmod;
+    ALsizei pmod_size;
+    Generator *pgen;
+    ALsizei pgen_size;
+
+    InstrumentHeader *inst;
+    ALsizei inst_size;
+
+    Zone *ibag;
+    ALsizei ibag_size;
+    Modulator *imod;
+    ALsizei imod_size;
+    Generator *igen;
+    ALsizei igen_size;
+
+    SampleHeader *shdr;
+    ALsizei shdr_size;
+} Soundfont;
+
+static void Soundfont_Construct(Soundfont *self)
+{
+    self->ifil = 0;
+    self->irom = NULL;
+
+    self->phdr = NULL;
+    self->phdr_size = 0;
+
+    self->pbag = NULL;
+    self->pbag_size = 0;
+    self->pmod = NULL;
+    self->pmod_size = 0;
+    self->pgen = NULL;
+    self->pgen_size = 0;
+
+    self->inst = NULL;
+    self->inst_size = 0;
+
+    self->ibag = NULL;
+    self->ibag_size = 0;
+    self->imod = NULL;
+    self->imod_size = 0;
+    self->igen = NULL;
+    self->igen_size = 0;
+
+    self->shdr = NULL;
+    self->shdr_size = 0;
+}
+
+static void Soundfont_Destruct(Soundfont *self)
+{
+    free(self->irom);
+    self->irom = NULL;
+
+    free(self->phdr);
+    self->phdr = NULL;
+    self->phdr_size = 0;
+
+    free(self->pbag);
+    self->pbag = NULL;
+    self->pbag_size = 0;
+    free(self->pmod);
+    self->pmod = NULL;
+    self->pmod_size = 0;
+    free(self->pgen);
+    self->pgen = NULL;
+    self->pgen_size = 0;
+
+    free(self->inst);
+    self->inst = NULL;
+    self->inst_size = 0;
+
+    free(self->ibag);
+    self->ibag = NULL;
+    self->ibag_size = 0;
+    free(self->imod);
+    self->imod = NULL;
+    self->imod_size = 0;
+    free(self->igen);
+    self->igen = NULL;
+    self->igen_size = 0;
+
+    free(self->shdr);
+    self->shdr = NULL;
+    self->shdr_size = 0;
+}
+
+
+#define FOURCC(a,b,c,d) (((d)<<24) | ((c)<<16) | ((b)<<8) | (a))
+#define FOURCCARGS(x)  (char)((x)&0xff), (char)(((x)>>8)&0xff), (char)(((x)>>16)&0xff), (char)(((x)>>24)&0xff)
+typedef struct RiffHdr {
+    ALuint mCode;
+    ALuint mSize;
+} RiffHdr;
+static void RiffHdr_read(RiffHdr *self, Reader *stream)
+{
+    self->mCode = read_le32(stream);
+    self->mSize = read_le32(stream);
+}
+
+
+typedef struct GenModList {
+    Generator *gens;
+    ALsizei gens_size;
+    ALsizei gens_max;
+
+    Modulator *mods;
+    ALsizei mods_size;
+    ALsizei mods_max;
+} GenModList;
+
+static void GenModList_Construct(GenModList *self)
+{
+    self->gens = NULL;
+    self->gens_size = 0;
+    self->gens_max = 0;
+
+    self->mods = NULL;
+    self->mods_size = 0;
+    self->mods_max = 0;
+}
+
+static void GenModList_Destruct(GenModList *self)
+{
+    free(self->gens);
+    self->gens = NULL;
+    self->gens_size = 0;
+    self->gens_max = 0;
+
+    free(self->mods);
+    self->mods = NULL;
+    self->mods_size = 0;
+    self->mods_max = 0;
+}
+
+static GenModList GenModList_clone(const GenModList *self)
+{
+    GenModList ret;
+
+    ret.gens = malloc(self->gens_max * sizeof(ret.gens[0]));
+    memcpy(ret.gens, self->gens, self->gens_size * sizeof(ret.gens[0]));
+    ret.gens_size = self->gens_size;
+    ret.gens_max = self->gens_max;
+
+    ret.mods = malloc(self->mods_max * sizeof(ret.mods[0]));
+    memcpy(ret.mods, self->mods, self->mods_size * sizeof(ret.mods[0]));
+    ret.mods_size = self->mods_size;
+    ret.mods_max = self->mods_max;
+
+    return ret;
+}
+
+static void GenModList_insertGen(GenModList *self, const Generator *gen, ALboolean ispreset)
+{
+    Generator *i = self->gens;
+    Generator *end = i + self->gens_size;
+    for(;i != end;i++)
+    {
+        if(i->mGenerator == gen->mGenerator)
+        {
+            i->mAmount = gen->mAmount;
+            return;
+        }
+    }
+
+    if(ispreset &&
+       (gen->mGenerator == 0 || gen->mGenerator == 1 || gen->mGenerator == 2 ||
+        gen->mGenerator == 3 || gen->mGenerator == 4 || gen->mGenerator == 12 ||
+        gen->mGenerator == 45 || gen->mGenerator == 46 || gen->mGenerator == 47 ||
+        gen->mGenerator == 50 || gen->mGenerator == 54 || gen->mGenerator == 57 ||
+        gen->mGenerator == 58))
+        return;
+
+    if(self->gens_size == self->gens_max)
+    {
+        void *temp = NULL;
+        ALsizei newsize;
+
+        newsize = (self->gens_max ? self->gens_max<<1 : 1);
+        if(newsize > self->gens_max)
+            temp = realloc(self->gens, newsize * sizeof(self->gens[0]));
+        if(!temp)
+        {
+            ERR("Failed to increase generator storage to %d elements (from %d)\n",
+                newsize, self->gens_max);
+            return;
+        }
+
+        self->gens = temp;
+        self->gens_max = newsize;
+    }
+
+    self->gens[self->gens_size] = *gen;
+    self->gens_size++;
+}
+static void GenModList_accumGen(GenModList *self, const Generator *gen)
+{
+    Generator *i = self->gens;
+    Generator *end = i + self->gens_size;
+    for(;i != end;i++)
+    {
+        if(i->mGenerator == gen->mGenerator)
+        {
+            if(gen->mGenerator == 43 || gen->mGenerator == 44)
+            {
+                /* Range generators accumulate by taking the intersection of
+                 * the two ranges.
+                 */
+                ALushort low = maxu(i->mAmount&0x00ff, gen->mAmount&0x00ff);
+                ALushort high = minu(i->mAmount&0xff00, gen->mAmount&0xff00);
+                i->mAmount = low | high;
+            }
+            else
+                i->mAmount += gen->mAmount;
+            return;
+        }
+    }
+
+    if(self->gens_size == self->gens_max)
+    {
+        void *temp = NULL;
+        ALsizei newsize;
+
+        newsize = (self->gens_max ? self->gens_max<<1 : 1);
+        if(newsize > self->gens_max)
+            temp = realloc(self->gens, newsize * sizeof(self->gens[0]));
+        if(!temp)
+        {
+            ERR("Failed to increase generator storage to %d elements (from %d)\n",
+                newsize, self->gens_max);
+            return;
+        }
+
+        self->gens = temp;
+        self->gens_max = newsize;
+    }
+
+    self->gens[self->gens_size] = *gen;
+    if(gen->mGenerator < 60)
+        self->gens[self->gens_size].mAmount += DefaultGenValue[gen->mGenerator];
+    self->gens_size++;
+}
+
+static void GenModList_insertMod(GenModList *self, const Modulator *mod)
+{
+    Modulator *i = self->mods;
+    Modulator *end = i + self->mods_size;
+    for(;i != end;i++)
+    {
+        if(i->mDstOp == mod->mDstOp && i->mSrcOp == mod->mSrcOp &&
+           i->mAmtSrcOp == mod->mAmtSrcOp && i->mTransOp == mod->mTransOp)
+        {
+            i->mAmount = mod->mAmount;
+            return;
+        }
+    }
+
+    if(self->mods_size == self->mods_max)
+    {
+        void *temp = NULL;
+        ALsizei newsize;
+
+        newsize = (self->mods_max ? self->mods_max<<1 : 1);
+        if(newsize > self->mods_max)
+            temp = realloc(self->mods, newsize * sizeof(self->mods[0]));
+        if(!temp)
+        {
+            ERR("Failed to increase modulator storage to %d elements (from %d)\n",
+                newsize, self->mods_max);
+            return;
+        }
+
+        self->mods = temp;
+        self->mods_max = newsize;
+    }
+
+    self->mods[self->mods_size] = *mod;
+    self->mods_size++;
+}
+static void GenModList_accumMod(GenModList *self, const Modulator *mod)
+{
+    Modulator *i = self->mods;
+    Modulator *end = i + self->mods_size;
+    for(;i != end;i++)
+    {
+        if(i->mDstOp == mod->mDstOp && i->mSrcOp == mod->mSrcOp &&
+           i->mAmtSrcOp == mod->mAmtSrcOp && i->mTransOp == mod->mTransOp)
+        {
+            i->mAmount += mod->mAmount;
+            return;
+        }
+    }
+
+    if(self->mods_size == self->mods_max)
+    {
+        void *temp = NULL;
+        ALsizei newsize;
+
+        newsize = (self->mods_max ? self->mods_max<<1 : 1);
+        if(newsize > self->mods_max)
+            temp = realloc(self->mods, newsize * sizeof(self->mods[0]));
+        if(!temp)
+        {
+            ERR("Failed to increase modulator storage to %d elements (from %d)\n",
+                newsize, self->mods_max);
+            return;
+        }
+
+        self->mods = temp;
+        self->mods_max = newsize;
+    }
+
+    self->mods[self->mods_size] = *mod;
+    if(mod->mSrcOp == 0x0502 && mod->mDstOp == 48 && mod->mAmtSrcOp == 0 && mod->mTransOp == 0)
+        self->mods[self->mods_size].mAmount += 960;
+    else if(mod->mSrcOp == 0x0102 && mod->mDstOp == 8 && mod->mAmtSrcOp == 0 && mod->mTransOp == 0)
+        self->mods[self->mods_size].mAmount += -2400;
+    else if(mod->mSrcOp == 0x000D && mod->mDstOp == 6 && mod->mAmtSrcOp == 0 && mod->mTransOp == 0)
+        self->mods[self->mods_size].mAmount += 50;
+    else if(mod->mSrcOp == 0x0081 && mod->mDstOp == 6 && mod->mAmtSrcOp == 0 && mod->mTransOp == 0)
+        self->mods[self->mods_size].mAmount += 50;
+    else if(mod->mSrcOp == 0x0582 && mod->mDstOp == 48 && mod->mAmtSrcOp == 0 && mod->mTransOp == 0)
+        self->mods[self->mods_size].mAmount += 960;
+    else if(mod->mSrcOp == 0x028A && mod->mDstOp == 17 && mod->mAmtSrcOp == 0 && mod->mTransOp == 0)
+        self->mods[self->mods_size].mAmount += 1000;
+    else if(mod->mSrcOp == 0x058B && mod->mDstOp == 48 && mod->mAmtSrcOp == 0 && mod->mTransOp == 0)
+        self->mods[self->mods_size].mAmount += 960;
+    else if(mod->mSrcOp == 0x00DB && mod->mDstOp == 16 && mod->mAmtSrcOp == 0 && mod->mTransOp == 0)
+        self->mods[self->mods_size].mAmount += 200;
+    else if(mod->mSrcOp == 0x00DD && mod->mDstOp == 15 && mod->mAmtSrcOp == 0 && mod->mTransOp == 0)
+        self->mods[self->mods_size].mAmount += 200;
+    /*else if(mod->mSrcOp == 0x020E && mod->mDstOp == ?initialpitch? && mod->mAmtSrcOp == 0x0010 && mod->mTransOp == 0)
+        self->mods[self->mods_size].mAmount += 12700;*/
+    self->mods_size++;
+}
+
+
+#define ERROR_GOTO(lbl_, ...)  do {                                           \
+    ERR(__VA_ARGS__);                                                         \
+    goto lbl_;                                                                \
+} while(0)
+
+static ALboolean ensureFontSanity(const Soundfont *sfont)
+{
+    ALsizei i;
+
+    for(i = 0;i < sfont->phdr_size-1;i++)
+    {
+        if(sfont->phdr[i].mZoneIdx >= sfont->pbag_size)
+        {
+            WARN("Preset %d has invalid zone index %d (max: %d)\n", i,
+                 sfont->phdr[i].mZoneIdx, sfont->pbag_size);
+            return AL_FALSE;
+        }
+        if(sfont->phdr[i+1].mZoneIdx < sfont->phdr[i].mZoneIdx)
+        {
+            WARN("Preset %d has invalid zone index (%d does not follow %d)\n", i+1,
+                 sfont->phdr[i+1].mZoneIdx, sfont->phdr[i].mZoneIdx);
+            return AL_FALSE;
+        }
+    }
+    if(sfont->phdr[i].mZoneIdx >= sfont->pbag_size)
+    {
+        WARN("Preset %d has invalid zone index %d (max: %d)\n", i,
+             sfont->phdr[i].mZoneIdx, sfont->pbag_size);
+        return AL_FALSE;
+    }
+
+    for(i = 0;i < sfont->pbag_size-1;i++)
+    {
+        if(sfont->pbag[i].mGenIdx >= sfont->pgen_size)
+        {
+            WARN("Preset zone %d has invalid generator index %d (max: %d)\n", i,
+                 sfont->pbag[i].mGenIdx, sfont->pgen_size);
+            return AL_FALSE;
+        }
+        if(sfont->pbag[i+1].mGenIdx < sfont->pbag[i].mGenIdx)
+        {
+            WARN("Preset zone %d has invalid generator index (%d does not follow %d)\n", i+1,
+                 sfont->pbag[i+1].mGenIdx, sfont->pbag[i].mGenIdx);
+            return AL_FALSE;
+        }
+        if(sfont->pbag[i].mModIdx >= sfont->pmod_size)
+        {
+            WARN("Preset zone %d has invalid modulator index %d (max: %d)\n", i,
+                 sfont->pbag[i].mModIdx, sfont->pmod_size);
+            return AL_FALSE;
+        }
+        if(sfont->pbag[i+1].mModIdx < sfont->pbag[i].mModIdx)
+        {
+            WARN("Preset zone %d has invalid modulator index (%d does not follow %d)\n", i+1,
+                 sfont->pbag[i+1].mModIdx, sfont->pbag[i].mModIdx);
+            return AL_FALSE;
+        }
+    }
+    if(sfont->pbag[i].mGenIdx >= sfont->pgen_size)
+    {
+        WARN("Preset zone %d has invalid generator index %d (max: %d)\n", i,
+             sfont->pbag[i].mGenIdx, sfont->pgen_size);
+        return AL_FALSE;
+    }
+    if(sfont->pbag[i].mModIdx >= sfont->pmod_size)
+    {
+        WARN("Preset zone %d has invalid modulator index %d (max: %d)\n", i,
+             sfont->pbag[i].mModIdx, sfont->pmod_size);
+        return AL_FALSE;
+    }
+
+
+    for(i = 0;i < sfont->inst_size-1;i++)
+    {
+        if(sfont->inst[i].mZoneIdx >= sfont->ibag_size)
+        {
+            WARN("Instrument %d has invalid zone index %d (max: %d)\n", i,
+                 sfont->inst[i].mZoneIdx, sfont->ibag_size);
+            return AL_FALSE;
+        }
+        if(sfont->inst[i+1].mZoneIdx < sfont->inst[i].mZoneIdx)
+        {
+            WARN("Instrument %d has invalid zone index (%d does not follow %d)\n", i+1,
+                 sfont->inst[i+1].mZoneIdx, sfont->inst[i].mZoneIdx);
+            return AL_FALSE;
+        }
+    }
+    if(sfont->inst[i].mZoneIdx >= sfont->ibag_size)
+    {
+        WARN("Instrument %d has invalid zone index %d (max: %d)\n", i,
+             sfont->inst[i].mZoneIdx, sfont->ibag_size);
+        return AL_FALSE;
+    }
+
+    for(i = 0;i < sfont->ibag_size-1;i++)
+    {
+        if(sfont->ibag[i].mGenIdx >= sfont->igen_size)
+        {
+            WARN("Instrument zone %d has invalid generator index %d (max: %d)\n", i,
+                 sfont->ibag[i].mGenIdx, sfont->igen_size);
+            return AL_FALSE;
+        }
+        if(sfont->ibag[i+1].mGenIdx < sfont->ibag[i].mGenIdx)
+        {
+            WARN("Instrument zone %d has invalid generator index (%d does not follow %d)\n", i+1,
+                 sfont->ibag[i+1].mGenIdx, sfont->ibag[i].mGenIdx);
+            return AL_FALSE;
+        }
+        if(sfont->ibag[i].mModIdx >= sfont->imod_size)
+        {
+            WARN("Instrument zone %d has invalid modulator index %d (max: %d)\n", i,
+                 sfont->ibag[i].mModIdx, sfont->imod_size);
+            return AL_FALSE;
+        }
+        if(sfont->ibag[i+1].mModIdx < sfont->ibag[i].mModIdx)
+        {
+            WARN("Instrument zone %d has invalid modulator index (%d does not follow %d)\n", i+1,
+                 sfont->ibag[i+1].mModIdx, sfont->ibag[i].mModIdx);
+            return AL_FALSE;
+        }
+    }
+    if(sfont->ibag[i].mGenIdx >= sfont->igen_size)
+    {
+        WARN("Instrument zone %d has invalid generator index %d (max: %d)\n", i,
+             sfont->ibag[i].mGenIdx, sfont->igen_size);
+        return AL_FALSE;
+    }
+    if(sfont->ibag[i].mModIdx >= sfont->imod_size)
+    {
+        WARN("Instrument zone %d has invalid modulator index %d (max: %d)\n", i,
+             sfont->ibag[i].mModIdx, sfont->imod_size);
+        return AL_FALSE;
+    }
+
+
+    for(i = 0;i < sfont->shdr_size-1;i++)
+    {
+        if((sfont->shdr[i].mSampleType&0x8000) && sfont->irom == NULL)
+        {
+            WARN("Sample header %d has ROM sample type without an irom sub-chunk\n", i);
+            return AL_FALSE;
+        }
+    }
+
+
+    return AL_TRUE;
+}
+
+static ALboolean checkZone(const GenModList *zone, const PresetHeader *preset, const InstrumentHeader *inst, const SampleHeader *samp)
+{
+    ALsizei i;
+
+    for(i = 0;i < zone->gens_size;i++)
+    {
+        if(zone->gens[i].mGenerator == 43 || zone->gens[i].mGenerator == 44)
+        {
+            int high = zone->gens[i].mAmount>>8;
+            int low = zone->gens[i].mAmount&0xff;
+
+            if(!(low >= 0 && high <= 127 && high >= low))
+            {
+                TRACE("Preset \"%s\", inst \"%s\", sample \"%s\": invalid %s range %d...%d\n",
+                      preset->mName, inst->mName, samp->mName,
+                      (zone->gens[i].mGenerator == 43) ? "key" :
+                      (zone->gens[i].mGenerator == 44) ? "velocity" : "(unknown)",
+                      low, high);
+                return AL_FALSE;
+            }
+        }
+    }
+
+    return AL_TRUE;
+}
+
+static ALenum getModSrcInput(int input)
+{
+    if(input == 0) return AL_ONE_SOFT;
+    if(input == 2) return AL_NOTEON_VELOCITY_SOFT;
+    if(input == 3) return AL_NOTEON_KEY_SOFT;
+    if(input == 10) return AL_KEYPRESSURE_SOFT;
+    if(input == 13) return AL_CHANNELPRESSURE_SOFT;
+    if(input == 14) return AL_PITCHBEND_SOFT;
+    if(input == 16) return AL_PITCHBEND_SENSITIVITY_SOFT;
+    if((input&0x80))
+    {
+        input ^= 0x80;
+        if(input > 0 && input < 120 && !(input == 6 || (input >= 32 && input <= 63) ||
+                                         (input >= 98 && input <= 101)))
+            return input;
+        input ^= 0x80;
+    }
+    ERR("Unhandled modulator source input: 0x%02x\n", input);
+    return AL_INVALID;
+}
+
+static ALenum getModSrcType(int type)
+{
+    if(type == 0x0000) return AL_UNORM_SOFT;
+    if(type == 0x0100) return AL_UNORM_REV_SOFT;
+    if(type == 0x0200) return AL_SNORM_SOFT;
+    if(type == 0x0300) return AL_SNORM_REV_SOFT;
+    ERR("Unhandled modulator source type: 0x%04x\n", type);
+    return AL_INVALID;
+}
+
+static ALenum getModSrcForm(int form)
+{
+    if(form == 0x0000) return AL_LINEAR_SOFT;
+    if(form == 0x0400) return AL_CONCAVE_SOFT;
+    if(form == 0x0800) return AL_CONVEX_SOFT;
+    if(form == 0x0C00) return AL_SWITCH_SOFT;
+    ERR("Unhandled modulator source form: 0x%04x\n", form);
+    return AL_INVALID;
+}
+
+static ALenum getModTransOp(int op)
+{
+    if(op == 0) return AL_LINEAR_SOFT;
+    if(op == 2) return AL_ABSOLUTE_SOFT;
+    ERR("Unhandled modulator transform op: 0x%04x\n", op);
+    return AL_INVALID;
+}
+
+static ALenum getLoopMode(int mode)
+{
+    if(mode == 0) return AL_NONE;
+    if(mode == 1) return AL_LOOP_CONTINUOUS_SOFT;
+    if(mode == 3) return AL_LOOP_UNTIL_RELEASE_SOFT;
+    ERR("Unhandled loop mode: %d\n", mode);
+    return AL_NONE;
+}
+
+static ALenum getSampleType(int type)
+{
+    if(type == 1) return AL_MONO_SOFT;
+    if(type == 2) return AL_RIGHT_SOFT;
+    if(type == 4) return AL_LEFT_SOFT;
+    if(type == 8)
+    {
+        WARN("Sample type \"linked\" ignored; pretending mono\n");
+        return AL_MONO_SOFT;
+    }
+    ERR("Unhandled sample type: 0x%04x\n", type);
+    return AL_MONO_SOFT;
+}
+
+static void fillZone(ALfontsound *sound, ALCcontext *context, const GenModList *zone)
+{
+    static const ALenum Gen2Param[60] = {
+        0, /* 0 - startAddrOffset */
+        0, /* 1 - endAddrOffset */
+        0, /* 2 - startloopAddrOffset */
+        0, /* 3 - endloopAddrOffset */
+        0, /* 4 - startAddrCoarseOffset */
+        AL_MOD_LFO_TO_PITCH_SOFT, /* 5 - modLfoToPitch */
+        AL_VIBRATO_LFO_TO_PITCH_SOFT, /* 6 - vibLfoToPitch */
+        AL_MOD_ENV_TO_PITCH_SOFT, /* 7 - modEnvToPitch */
+        AL_FILTER_CUTOFF_SOFT, /* 8 - initialFilterFc */
+        AL_FILTER_RESONANCE_SOFT, /* 9 - initialFilterQ */
+        AL_MOD_LFO_TO_FILTER_CUTOFF_SOFT, /* 10 - modLfoToFilterFc */
+        AL_MOD_ENV_TO_FILTER_CUTOFF_SOFT, /* 11 - modEnvToFilterFc */
+        0, /* 12 - endAddrCoarseOffset */
+        AL_MOD_LFO_TO_VOLUME_SOFT, /* 13 - modLfoToVolume */
+        0, /* 14 -  */
+        AL_CHORUS_SEND_SOFT, /* 15 - chorusEffectsSend */
+        AL_REVERB_SEND_SOFT, /* 16 - reverbEffectsSend */
+        AL_PAN_SOFT, /* 17 - pan */
+        0, /* 18 -  */
+        0, /* 19 -  */
+        0, /* 20 -  */
+        AL_MOD_LFO_DELAY_SOFT, /* 21 - delayModLFO */
+        AL_MOD_LFO_FREQUENCY_SOFT, /* 22 - freqModLFO */
+        AL_VIBRATO_LFO_DELAY_SOFT, /* 23 - delayVibLFO */
+        AL_VIBRATO_LFO_FREQUENCY_SOFT, /* 24 - freqVibLFO */
+        AL_MOD_ENV_DELAYTIME_SOFT, /* 25 - delayModEnv */
+        AL_MOD_ENV_ATTACKTIME_SOFT, /* 26 - attackModEnv */
+        AL_MOD_ENV_HOLDTIME_SOFT, /* 27 - holdModEnv */
+        AL_MOD_ENV_DECAYTIME_SOFT, /* 28 - decayModEnv */
+        AL_MOD_ENV_SUSTAINVOLUME_SOFT, /* 29 - sustainModEnv */
+        AL_MOD_ENV_RELEASETIME_SOFT, /* 30 - releaseModEnv */
+        AL_MOD_ENV_KEY_TO_HOLDTIME_SOFT, /* 31 - keynumToModEnvHold */
+        AL_MOD_ENV_KEY_TO_DECAYTIME_SOFT, /* 32 - keynumToModEnvDecay */
+        AL_VOLUME_ENV_DELAYTIME_SOFT, /* 33 - delayVolEnv */
+        AL_VOLUME_ENV_ATTACKTIME_SOFT, /* 34 - attackVolEnv */
+        AL_VOLUME_ENV_HOLDTIME_SOFT, /* 35 - holdVolEnv */
+        AL_VOLUME_ENV_DECAYTIME_SOFT, /* 36 - decayVolEnv */
+        AL_VOLUME_ENV_SUSTAINVOLUME_SOFT, /* 37 - sustainVolEnv */
+        AL_VOLUME_ENV_RELEASETIME_SOFT, /* 38 - releaseVolEnv */
+        AL_VOLUME_ENV_KEY_TO_HOLDTIME_SOFT, /* 39 - keynumToVolEnvHold */
+        AL_VOLUME_ENV_KEY_TO_DECAYTIME_SOFT, /* 40 - keynumToVolEnvDecay */
+        0, /* 41 -  */
+        0, /* 42 -  */
+        AL_KEY_RANGE_SOFT, /* 43 - keyRange */
+        AL_VELOCITY_RANGE_SOFT, /* 44 - velRange */
+        0, /* 45 - startloopAddrCoarseOffset */
+        0, /* 46 - keynum */
+        0, /* 47 - velocity */
+        AL_ATTENUATION_SOFT, /* 48 - initialAttenuation */
+        0, /* 49 -  */
+        0, /* 50 - endloopAddrCoarseOffset */
+        AL_TUNING_COARSE_SOFT, /* 51 - corseTune */
+        AL_TUNING_FINE_SOFT, /* 52 - fineTune */
+        0, /* 53 -  */
+        AL_LOOP_MODE_SOFT, /* 54 - sampleModes */
+        0, /* 55 -  */
+        AL_TUNING_SCALE_SOFT, /* 56 - scaleTuning */
+        AL_EXCLUSIVE_CLASS_SOFT, /* 57 - exclusiveClass */
+        AL_BASE_KEY_SOFT, /* 58 - overridingRootKey */
+        0, /* 59 -  */
+    };
+    const Generator *gen, *gen_end;
+
+    if(zone->mods)
+    {
+        ALsizei i;
+        for(i = 0;i < zone->mods_size;i++)
+        {
+            ALenum src0in = getModSrcInput(zone->mods[i].mSrcOp&0xFF);
+            ALenum src0type = getModSrcType(zone->mods[i].mSrcOp&0x0300);
+            ALenum src0form = getModSrcForm(zone->mods[i].mSrcOp&0xFC00);
+            ALenum src1in = getModSrcInput(zone->mods[i].mAmtSrcOp&0xFF);
+            ALenum src1type = getModSrcType(zone->mods[i].mAmtSrcOp&0x0300);
+            ALenum src1form = getModSrcForm(zone->mods[i].mAmtSrcOp&0xFC00);
+            ALenum trans = getModTransOp(zone->mods[i].mTransOp);
+            ALenum dst = (zone->mods[i].mDstOp < 60) ? Gen2Param[zone->mods[i].mDstOp] : 0;
+            if(!dst || dst == AL_KEY_RANGE_SOFT || dst == AL_VELOCITY_RANGE_SOFT ||
+               dst == AL_LOOP_MODE_SOFT || dst == AL_EXCLUSIVE_CLASS_SOFT ||
+               dst == AL_BASE_KEY_SOFT)
+                ERR("Unhandled modulator destination: %d\n", zone->mods[i].mDstOp);
+            else if(src0in != AL_INVALID && src0form != AL_INVALID && src0type != AL_INVALID &&
+                    src1in != AL_INVALID && src1form != AL_INVALID && src0type != AL_INVALID &&
+                    trans != AL_INVALID)
+            {
+                ALfontsound_setModStagei(sound, context, i, AL_SOURCE0_INPUT_SOFT, src0in);
+                ALfontsound_setModStagei(sound, context, i, AL_SOURCE0_TYPE_SOFT, src0type);
+                ALfontsound_setModStagei(sound, context, i, AL_SOURCE0_FORM_SOFT, src0form);
+                ALfontsound_setModStagei(sound, context, i, AL_SOURCE1_INPUT_SOFT, src1in);
+                ALfontsound_setModStagei(sound, context, i, AL_SOURCE1_TYPE_SOFT, src1type);
+                ALfontsound_setModStagei(sound, context, i, AL_SOURCE1_FORM_SOFT, src1form);
+                ALfontsound_setModStagei(sound, context, i, AL_AMOUNT_SOFT, zone->mods[i].mAmount);
+                ALfontsound_setModStagei(sound, context, i, AL_TRANSFORM_OP_SOFT, trans);
+                ALfontsound_setModStagei(sound, context, i, AL_DESTINATION_SOFT, dst);
+            }
+        }
+    }
+
+    gen = zone->gens;
+    gen_end = gen + zone->gens_size;
+    for(;gen != gen_end;gen++)
+    {
+        ALint value = (ALshort)gen->mAmount;
+        if(gen->mGenerator == 0)
+            sound->Start += value;
+        else if(gen->mGenerator == 1)
+            sound->End += value;
+        else if(gen->mGenerator == 2)
+            sound->LoopStart += value;
+        else if(gen->mGenerator == 3)
+            sound->LoopEnd += value;
+        else if(gen->mGenerator == 4)
+            sound->Start += value<<15;
+        else if(gen->mGenerator == 12)
+            sound->End += value<<15;
+        else if(gen->mGenerator == 45)
+            sound->LoopStart += value<<15;
+        else if(gen->mGenerator == 50)
+            sound->LoopEnd += value<<15;
+        else if(gen->mGenerator == 43)
+        {
+            sound->MinKey = mini((value&0xff), 127);
+            sound->MaxKey = mini(((value>>8)&0xff), 127);
+        }
+        else if(gen->mGenerator == 44)
+        {
+            sound->MinVelocity = mini((value&0xff), 127);
+            sound->MaxVelocity = mini(((value>>8)&0xff), 127);
+        }
+        else
+        {
+            ALenum param = 0;
+            if(gen->mGenerator < 60)
+                param = Gen2Param[gen->mGenerator];
+            if(param)
+            {
+                if(param == AL_BASE_KEY_SOFT)
+                {
+                    if(!(value >= 0 && value <= 127))
+                    {
+                        if(value != -1)
+                            WARN("Invalid overridingRootKey generator value %d\n", value);
+                        continue;
+                    }
+                }
+                if(param == AL_FILTER_RESONANCE_SOFT || param == AL_ATTENUATION_SOFT)
+                    value = maxi(0, value);
+                else if(param == AL_CHORUS_SEND_SOFT || param == AL_REVERB_SEND_SOFT)
+                    value = clampi(value, 0, 1000);
+                else if(param == AL_LOOP_MODE_SOFT)
+                    value = getLoopMode(value);
+                ALfontsound_setPropi(sound, context, param, value);
+            }
+            else if(gen->mGenerator < 256)
+            {
+                static ALboolean warned[256];
+                if(!warned[gen->mGenerator])
+                {
+                    warned[gen->mGenerator] = AL_TRUE;
+                    ERR("Unhandled generator %d\n", gen->mGenerator);
+                }
+            }
+        }
+    }
+}
+
+static void processInstrument(ALfontsound ***sounds, ALsizei *sounds_size, ALCcontext *context, InstrumentHeader *inst, const PresetHeader *preset, const Soundfont *sfont, const GenModList *pzone)
+{
+    const Generator *gen, *gen_end;
+    const Modulator *mod, *mod_end;
+    const Zone *zone, *zone_end;
+    GenModList gzone;
+    ALvoid *temp;
+
+    if((inst+1)->mZoneIdx == inst->mZoneIdx)
+        ERR("Instrument with no zones!");
+
+    GenModList_Construct(&gzone);
+    zone = sfont->ibag + inst->mZoneIdx;
+    zone_end = sfont->ibag + (inst+1)->mZoneIdx;
+    if(zone_end-zone > 1)
+    {
+        gen = sfont->igen + zone->mGenIdx;
+        gen_end = sfont->igen + (zone+1)->mGenIdx;
+
+        // If no generators, or last generator is not a sample, this is a global zone
+        for(;gen != gen_end;gen++)
+        {
+            if(gen->mGenerator == 53)
+                break;
+        }
+
+        if(gen == gen_end)
+        {
+            gen = sfont->igen + zone->mGenIdx;
+            gen_end = sfont->igen + (zone+1)->mGenIdx;
+            for(;gen != gen_end;gen++)
+                GenModList_insertGen(&gzone, gen, AL_FALSE);
+
+            mod = sfont->imod + zone->mModIdx;
+            mod_end = sfont->imod + (zone+1)->mModIdx;
+            for(;mod != mod_end;mod++)
+                GenModList_insertMod(&gzone, mod);
+
+            zone++;
+        }
+    }
+
+    temp = realloc(*sounds, (zone_end-zone + *sounds_size)*sizeof((*sounds)[0]));
+    if(!temp)
+    {
+        ERR("Failed reallocating fontsound storage to %ld elements (from %d)\n",
+            (zone_end-zone + *sounds_size), *sounds_size);
+        return;
+    }
+    *sounds = temp;
+    for(;zone != zone_end;zone++)
+    {
+        GenModList lzone = GenModList_clone(&gzone);
+        mod = sfont->imod + zone->mModIdx;
+        mod_end = sfont->imod + (zone+1)->mModIdx;
+        for(;mod != mod_end;mod++)
+            GenModList_insertMod(&lzone, mod);
+
+        gen = sfont->igen + zone->mGenIdx;
+        gen_end = sfont->igen + (zone+1)->mGenIdx;
+        for(;gen != gen_end;gen++)
+        {
+            if(gen->mGenerator == 53)
+            {
+                const SampleHeader *samp;
+                ALfontsound *sound;
+
+                if(gen->mAmount >= sfont->shdr_size-1)
+                {
+                    ERR("Generator %ld has invalid sample ID (%d of %d)\n",
+                        (long)(gen-sfont->igen), gen->mAmount, sfont->shdr_size-1);
+                    break;
+                }
+                samp = &sfont->shdr[gen->mAmount];
+
+                gen = pzone->gens;
+                gen_end = gen + pzone->gens_size;
+                for(;gen != gen_end;gen++)
+                    GenModList_accumGen(&lzone, gen);
+
+                mod = pzone->mods;
+                mod_end = mod + pzone->mods_size;
+                for(;mod != mod_end;mod++)
+                    GenModList_accumMod(&lzone, mod);
+
+                if(!checkZone(&lzone, preset, inst, samp))
+                    break;
+                /* Ignore ROM samples for now. */
+                if((samp->mSampleType&0x8000))
+                    break;
+
+                sound = NewFontsound(context);
+                (*sounds)[(*sounds_size)++] = sound;
+                ALfontsound_setPropi(sound, context, AL_SAMPLE_START_SOFT, samp->mStart);
+                ALfontsound_setPropi(sound, context, AL_SAMPLE_END_SOFT, samp->mEnd);
+                ALfontsound_setPropi(sound, context, AL_SAMPLE_LOOP_START_SOFT, samp->mStartloop);
+                ALfontsound_setPropi(sound, context, AL_SAMPLE_LOOP_END_SOFT, samp->mEndloop);
+                ALfontsound_setPropi(sound, context, AL_SAMPLE_RATE_SOFT, samp->mSampleRate);
+                ALfontsound_setPropi(sound, context, AL_BASE_KEY_SOFT, (samp->mOriginalKey <= 127) ? samp->mOriginalKey : 60);
+                ALfontsound_setPropi(sound, context, AL_KEY_CORRECTION_SOFT, samp->mCorrection);
+                ALfontsound_setPropi(sound, context, AL_SAMPLE_TYPE_SOFT, getSampleType(samp->mSampleType&0x7fff));
+                fillZone(sound, context, &lzone);
+
+                break;
+            }
+            GenModList_insertGen(&lzone, gen, AL_FALSE);
+        }
+
+        GenModList_Destruct(&lzone);
+    }
+
+    GenModList_Destruct(&gzone);
+}
+
+ALboolean loadSf2(Reader *stream, ALsoundfont *soundfont, ALCcontext *context)
+{
+    ALsfpreset **presets = NULL;
+    ALsizei presets_size = 0;
+    ALuint ltype;
+    Soundfont sfont;
+    RiffHdr riff;
+    RiffHdr list;
+    ALsizei i;
+
+    Soundfont_Construct(&sfont);
+
+    RiffHdr_read(&riff, stream);
+    if(riff.mCode != FOURCC('R','I','F','F'))
+        ERROR_GOTO(error, "Invalid Format, expected RIFF got '%c%c%c%c'\n", FOURCCARGS(riff.mCode));
+    if((ltype=read_le32(stream)) != FOURCC('s','f','b','k'))
+        ERROR_GOTO(error, "Invalid Format, expected sfbk got '%c%c%c%c'\n", FOURCCARGS(ltype));
+
+    if(READERR(stream) != 0)
+        ERROR_GOTO(error, "Error reading file header\n");
+
+    RiffHdr_read(&list, stream);
+    if(list.mCode != FOURCC('L','I','S','T'))
+        ERROR_GOTO(error, "Invalid Format, expected LIST (INFO) got '%c%c%c%c'\n", FOURCCARGS(list.mCode));
+    if((ltype=read_le32(stream)) != FOURCC('I','N','F','O'))
+        ERROR_GOTO(error, "Invalid Format, expected INFO got '%c%c%c%c'\n", FOURCCARGS(ltype));
+    list.mSize -= 4;
+    while(list.mSize > 0 && !READERR(stream))
+    {
+        RiffHdr info;
+
+        RiffHdr_read(&info, stream);
+        list.mSize -= 8;
+        if(info.mCode == FOURCC('i','f','i','l'))
+        {
+            if(info.mSize != 4)
+                ERR("Invalid ifil chunk size: %d\n", info.mSize);
+            else
+            {
+                ALushort major = read_le16(stream);
+                ALushort minor = read_le16(stream);
+
+                list.mSize -= 4;
+                info.mSize -= 4;
+
+                if(major != 2)
+                    ERROR_GOTO(error, "Unsupported SF2 format version: %d.%02d\n", major, minor);
+                TRACE("SF2 format version: %d.%02d\n", major, minor);
+
+                sfont.ifil = (major<<16) | minor;
+            }
+        }
+        else if(info.mCode == FOURCC('i','r','o','m'))
+        {
+            if(info.mSize == 0 || (info.mSize&1))
+                ERR("Invalid irom size: %d\n", info.mSize);
+            else
+            {
+                free(sfont.irom);
+                sfont.irom = calloc(1, info.mSize+1);
+                READ(stream, sfont.irom, info.mSize);
+
+                list.mSize -= info.mSize;
+                info.mSize -= info.mSize;
+
+                TRACE("SF2 ROM ID: %s\n", sfont.irom);
+            }
+        }
+        list.mSize -= info.mSize;
+        skip(stream, info.mSize);
+    }
+
+    if(READERR(stream) != 0)
+        ERROR_GOTO(error, "Error reading INFO chunk\n");
+    if(sfont.ifil == 0)
+        ERROR_GOTO(error, "Missing ifil sub-chunk\n");
+
+    RiffHdr_read(&list, stream);
+    if(list.mCode != FOURCC('L','I','S','T'))
+        ERROR_GOTO(error, "Invalid Format, expected LIST (sdta) got '%c%c%c%c'\n", FOURCCARGS(list.mCode));
+    if((ltype=read_le32(stream)) != FOURCC('s','d','t','a'))
+        ERROR_GOTO(error, "Invalid Format, expected sdta got '%c%c%c%c'\n", FOURCCARGS(ltype));
+    list.mSize -= 4;
+    {
+        ALbyte *ptr;
+        RiffHdr smpl;
+
+        RiffHdr_read(&smpl, stream);
+        if(smpl.mCode != FOURCC('s','m','p','l'))
+            ERROR_GOTO(error, "Invalid Format, expected smpl got '%c%c%c%c'\n", FOURCCARGS(smpl.mCode));
+        list.mSize -= 8;
+
+        if(smpl.mSize > list.mSize)
+            ERROR_GOTO(error, "Invalid Format, sample chunk size mismatch\n");
+
+        if(!(ptr=realloc(soundfont->Samples, smpl.mSize)))
+            SET_ERROR_AND_GOTO(context, AL_OUT_OF_MEMORY, error);
+        soundfont->Samples = (ALshort*)ptr;
+        soundfont->NumSamples = smpl.mSize/2;
+
+        if(IS_LITTLE_ENDIAN)
+            READ(stream, ptr, smpl.mSize);
+        else
+        {
+            while(smpl.mSize > 0)
+            {
+                ALbyte buf[4096];
+                ALuint todo = minu(smpl.mSize, sizeof(buf));
+                ALuint i;
+
+                READ(stream, buf, todo);
+                for(i = 0;i < todo;i++)
+                    ptr[i] = buf[i^1];
+            }
+        }
+        list.mSize -= smpl.mSize;
+
+        skip(stream, list.mSize);
+    }
+
+    if(READERR(stream) != 0)
+        ERROR_GOTO(error, "Error reading sdta chunk\n");
+
+    RiffHdr_read(&list, stream);
+    if(list.mCode != FOURCC('L','I','S','T'))
+        ERROR_GOTO(error, "Invalid Format, expected LIST (pdta) got '%c%c%c%c'\n", FOURCCARGS(list.mCode));
+    if((ltype=read_le32(stream)) != FOURCC('p','d','t','a'))
+        ERROR_GOTO(error, "Invalid Format, expected pdta got '%c%c%c%c'\n", FOURCCARGS(ltype));
+
+    //
+    RiffHdr_read(&list, stream);
+    if(list.mCode != FOURCC('p','h','d','r'))
+        ERROR_GOTO(error, "Invalid Format, expected phdr got '%c%c%c%c'\n", FOURCCARGS(list.mCode));
+    if((list.mSize%38) != 0 || list.mSize == 0)
+        ERROR_GOTO(error, "Invalid Format, bad phdr size: %u\n", list.mSize);
+    sfont.phdr_size = list.mSize/38;
+    sfont.phdr = calloc(sfont.phdr_size, sizeof(sfont.phdr[0]));
+    for(i = 0;i < sfont.phdr_size;i++)
+        PresetHeader_read(&sfont.phdr[i], stream);
+
+    RiffHdr_read(&list, stream);
+    if(list.mCode != FOURCC('p','b','a','g'))
+        ERROR_GOTO(error, "Invalid Format, expected pbag got '%c%c%c%c'\n", FOURCCARGS(list.mCode));
+    if((list.mSize%4) != 0 || list.mSize == 0)
+        ERROR_GOTO(error, "Invalid Format, bad pbag size: %u\n", list.mSize);
+    sfont.pbag_size = list.mSize/4;
+    sfont.pbag = calloc(sfont.pbag_size, sizeof(sfont.pbag[0]));
+    for(i = 0;i < sfont.pbag_size;i++)
+        Zone_read(&sfont.pbag[i], stream);
+
+    RiffHdr_read(&list, stream);
+    if(list.mCode != FOURCC('p','m','o','d'))
+        ERROR_GOTO(error, "Invalid Format, expected pmod got '%c%c%c%c'\n", FOURCCARGS(list.mCode));
+    if((list.mSize%10) != 0 || list.mSize == 0)
+        ERROR_GOTO(error, "Invalid Format, bad pmod size: %u\n", list.mSize);
+    sfont.pmod_size = list.mSize/10;
+    sfont.pmod = calloc(sfont.pmod_size, sizeof(sfont.pmod[0]));
+    for(i = 0;i < sfont.pmod_size;i++)
+        Modulator_read(&sfont.pmod[i], stream);
+
+    RiffHdr_read(&list, stream);
+    if(list.mCode != FOURCC('p','g','e','n'))
+        ERROR_GOTO(error, "Invalid Format, expected pgen got '%c%c%c%c'\n", FOURCCARGS(list.mCode));
+    if((list.mSize%4) != 0 || list.mSize == 0)
+        ERROR_GOTO(error, "Invalid Format, bad pgen size: %u\n", list.mSize);
+    sfont.pgen_size = list.mSize/4;
+    sfont.pgen = calloc(sfont.pgen_size, sizeof(sfont.pgen[0]));
+    for(i = 0;i < sfont.pgen_size;i++)
+        Generator_read(&sfont.pgen[i], stream);
+
+    //
+    RiffHdr_read(&list, stream);
+    if(list.mCode != FOURCC('i','n','s','t'))
+        ERROR_GOTO(error, "Invalid Format, expected inst got '%c%c%c%c'\n", FOURCCARGS(list.mCode));
+    if((list.mSize%22) != 0 || list.mSize == 0)
+        ERROR_GOTO(error, "Invalid Format, bad inst size: %u\n", list.mSize);
+    sfont.inst_size = list.mSize/22;
+    sfont.inst = calloc(sfont.inst_size, sizeof(sfont.inst[0]));
+    for(i = 0;i < sfont.inst_size;i++)
+        InstrumentHeader_read(&sfont.inst[i], stream);
+
+    RiffHdr_read(&list, stream);
+    if(list.mCode != FOURCC('i','b','a','g'))
+        ERROR_GOTO(error, "Invalid Format, expected ibag got '%c%c%c%c'\n", FOURCCARGS(list.mCode));
+    if((list.mSize%4) != 0 || list.mSize == 0)
+        ERROR_GOTO(error, "Invalid Format, bad ibag size: %u\n", list.mSize);
+    sfont.ibag_size = list.mSize/4;
+    sfont.ibag = calloc(sfont.ibag_size, sizeof(sfont.ibag[0]));
+    for(i = 0;i < sfont.ibag_size;i++)
+        Zone_read(&sfont.ibag[i], stream);
+
+    RiffHdr_read(&list, stream);
+    if(list.mCode != FOURCC('i','m','o','d'))
+        ERROR_GOTO(error, "Invalid Format, expected imod got '%c%c%c%c'\n", FOURCCARGS(list.mCode));
+    if((list.mSize%10) != 0 || list.mSize == 0)
+        ERROR_GOTO(error, "Invalid Format, bad imod size: %u\n", list.mSize);
+    sfont.imod_size = list.mSize/10;
+    sfont.imod = calloc(sfont.imod_size, sizeof(sfont.imod[0]));
+    for(i = 0;i < sfont.imod_size;i++)
+        Modulator_read(&sfont.imod[i], stream);
+
+    RiffHdr_read(&list, stream);
+    if(list.mCode != FOURCC('i','g','e','n'))
+        ERROR_GOTO(error, "Invalid Format, expected igen got '%c%c%c%c'\n", FOURCCARGS(list.mCode));
+    if((list.mSize%4) != 0 || list.mSize == 0)
+        ERROR_GOTO(error, "Invalid Format, bad igen size: %u\n", list.mSize);
+    sfont.igen_size = list.mSize/4;
+    sfont.igen = calloc(sfont.igen_size, sizeof(sfont.igen[0]));
+    for(i = 0;i < sfont.igen_size;i++)
+        Generator_read(&sfont.igen[i], stream);
+
+    //
+    RiffHdr_read(&list, stream);
+    if(list.mCode != FOURCC('s','h','d','r'))
+        ERROR_GOTO(error, "Invalid Format, expected shdr got '%c%c%c%c'\n", FOURCCARGS(list.mCode));
+    if((list.mSize%46) != 0 || list.mSize == 0)
+        ERROR_GOTO(error, "Invalid Format, bad shdr size: %u\n", list.mSize);
+    sfont.shdr_size = list.mSize/46;
+    sfont.shdr = calloc(sfont.shdr_size, sizeof(sfont.shdr[0]));
+    for(i = 0;i < sfont.shdr_size;i++)
+        SampleHeader_read(&sfont.shdr[i], stream);
+
+    if(READERR(stream) != 0)
+        ERROR_GOTO(error, "Error reading pdta chunk\n");
+
+    if(!ensureFontSanity(&sfont))
+        goto error;
+
+    presets = calloc(1, (sfont.phdr_size-1)*sizeof(presets[0]));
+    if(!presets)
+        ERROR_GOTO(error, "Error allocating presets\n");
+
+    for(i = 0;i < sfont.phdr_size-1;i++)
+    {
+        const Generator *gen, *gen_end;
+        const Modulator *mod, *mod_end;
+        const Zone *zone, *zone_end;
+        ALfontsound **sounds = NULL;
+        ALsizei sounds_size = 0;
+        GenModList gzone;
+
+        if(sfont.phdr[i+1].mZoneIdx == sfont.phdr[i].mZoneIdx)
+            continue;
+
+        GenModList_Construct(&gzone);
+        zone = sfont.pbag + sfont.phdr[i].mZoneIdx;
+        zone_end = sfont.pbag + sfont.phdr[i+1].mZoneIdx;
+        if(zone_end-zone > 1)
+        {
+            gen = sfont.pgen + zone->mGenIdx;
+            gen_end = sfont.pgen + (zone+1)->mGenIdx;
+
+            // If no generators, or last generator is not an instrument, this is a global zone
+            for(;gen != gen_end;gen++)
+            {
+                if(gen->mGenerator == 41)
+                    break;
+            }
+
+            if(gen == gen_end)
+            {
+                gen = sfont.pgen + zone->mGenIdx;
+                gen_end = sfont.pgen + (zone+1)->mGenIdx;
+                for(;gen != gen_end;gen++)
+                    GenModList_insertGen(&gzone, gen, AL_TRUE);
+
+                mod = sfont.pmod + zone->mModIdx;
+                mod_end = sfont.pmod + (zone+1)->mModIdx;
+                for(;mod != mod_end;mod++)
+                    GenModList_insertMod(&gzone, mod);
+
+                zone++;
+            }
+        }
+
+        for(;zone != zone_end;zone++)
+        {
+            GenModList lzone = GenModList_clone(&gzone);
+
+            mod = sfont.pmod + zone->mModIdx;
+            mod_end = sfont.pmod + (zone+1)->mModIdx;
+            for(;mod != mod_end;mod++)
+                GenModList_insertMod(&lzone, mod);
+
+            gen = sfont.pgen + zone->mGenIdx;
+            gen_end = sfont.pgen + (zone+1)->mGenIdx;
+            for(;gen != gen_end;gen++)
+            {
+                if(gen->mGenerator == 41)
+                {
+                    if(gen->mAmount >= sfont.inst_size-1)
+                        ERR("Generator %ld has invalid instrument ID (%d of %d)\n",
+                            (long)(gen-sfont.pgen), gen->mAmount, sfont.inst_size-1);
+                    else
+                        processInstrument(&sounds, &sounds_size, context,
+                                          &sfont.inst[gen->mAmount], &sfont.phdr[i], &sfont, &lzone);
+                    break;
+                }
+                GenModList_insertGen(&lzone, gen, AL_TRUE);
+            }
+            GenModList_Destruct(&lzone);
+        }
+
+        if(sounds_size > 0)
+        {
+            ALsizei j;
+
+            presets[presets_size] = NewPreset(context);
+            presets[presets_size]->Preset = sfont.phdr[i].mPreset;
+            presets[presets_size]->Bank = sfont.phdr[i].mBank;
+
+            for(j = 0;j < sounds_size;j++)
+                IncrementRef(&sounds[j]->ref);
+            sounds = ExchangePtr((XchgPtr*)&presets[presets_size]->Sounds, sounds);
+            ExchangeInt(&presets[presets_size]->NumSounds, sounds_size);
+            presets_size++;
+        }
+        free(sounds);
+
+        GenModList_Destruct(&gzone);
+    }
+
+    for(i = 0;i < presets_size;i++)
+        IncrementRef(&presets[i]->ref);
+    presets = ExchangePtr((XchgPtr*)&soundfont->Presets, presets);
+    ExchangeInt(&soundfont->NumPresets, presets_size);
+
+    free(presets);
+
+    Soundfont_Destruct(&sfont);
+
+    return AL_TRUE;
+
+error:
+    if(presets)
+    {
+        ALCdevice *device = context->Device;
+        for(i = 0;i < presets_size;i++)
+            DeletePreset(presets[i], device);
+        free(presets);
+    }
+
+    Soundfont_Destruct(&sfont);
+
+    return AL_FALSE;
+}

+ 204 - 607
jni/openal-soft-android/Alc/mixer.c

@@ -37,454 +37,21 @@
 #include "bs2b.h"
 
 
-static __inline ALfloat point32(const ALfloat *vals, ALint step, ALint frac)
-{ return vals[0]; (void)step; (void)frac; }
-static __inline ALfloat lerp32(const ALfloat *vals, ALint step, ALint frac)
-{ return lerp(vals[0], vals[step], frac * (1.0f/FRACTIONONE)); }
-static __inline ALfloat cubic32(const ALfloat *vals, ALint step, ALint frac)
-{ return cubic(vals[-step], vals[0], vals[step], vals[step+step],
-               frac * (1.0f/FRACTIONONE)); }
-
-#ifdef __GNUC__
-#define LIKELY(x) __builtin_expect(!!(x), 1)
-#define UNLIKELY(x) __builtin_expect(!!(x), 0)
-#else
-#define LIKELY(x) (x)
-#define UNLIKELY(x) (x)
-#endif
-
-#if defined(__ARM_NEON__) && defined(HAVE_ARM_NEON_H)
-#include <arm_neon.h>
-
-static __inline void ApplyCoeffs(ALuint Offset, ALfloat (*RESTRICT Values)[2],
-                                 ALfloat (*RESTRICT Coeffs)[2],
-                                 ALfloat left, ALfloat right)
-{
-    ALuint c;
-    float32x4_t leftright4;
-    {
-        float32x2_t leftright2 = vdup_n_f32(0.0);
-        leftright2 = vset_lane_f32(left, leftright2, 0);
-        leftright2 = vset_lane_f32(right, leftright2, 1);
-        leftright4 = vcombine_f32(leftright2, leftright2);
-    }
-    for(c = 0;c < HRIR_LENGTH;c += 2)
-    {
-        const ALuint o0 = (Offset+c)&HRIR_MASK;
-        const ALuint o1 = (o0+1)&HRIR_MASK;
-        float32x4_t vals = vcombine_f32(vld1_f32((float32_t*)&Values[o0][0]),
-                                        vld1_f32((float32_t*)&Values[o1][0]));
-        float32x4_t coefs = vld1q_f32((float32_t*)&Coeffs[c][0]);
-
-        vals = vmlaq_f32(vals, coefs, leftright4);
-
-        vst1_f32((float32_t*)&Values[o0][0], vget_low_f32(vals));
-        vst1_f32((float32_t*)&Values[o1][0], vget_high_f32(vals));
-    }
-}
-
-#else
-
-static __inline void ApplyCoeffs(ALuint Offset, ALfloat (*RESTRICT Values)[2],
-                                 ALfloat (*RESTRICT Coeffs)[2],
-                                 ALfloat left, ALfloat right)
-{
-    ALuint c;
-    for(c = 0;c < HRIR_LENGTH;c++)
-    {
-        const ALuint off = (Offset+c)&HRIR_MASK;
-        Values[off][0] += Coeffs[c][0] * left;
-        Values[off][1] += Coeffs[c][1] * right;
-    }
-}
-
-#endif
-
-#define DECL_TEMPLATE(T, sampler)                                             \
-static void Mix_Hrtf_##T##_##sampler(ALsource *Source, ALCdevice *Device,     \
-  const ALvoid *srcdata, ALuint *DataPosInt, ALuint *DataPosFrac,             \
-  ALuint OutPos, ALuint SamplesToDo, ALuint BufferSize)                       \
-{                                                                             \
-    const ALuint NumChannels = Source->NumChannels;                           \
-    const T *RESTRICT data = srcdata;                                         \
-    const ALint *RESTRICT DelayStep = Source->Params.HrtfDelayStep;           \
-    ALfloat (*RESTRICT DryBuffer)[MAXCHANNELS];                               \
-    ALfloat *RESTRICT ClickRemoval, *RESTRICT PendingClicks;                  \
-    ALfloat (*RESTRICT CoeffStep)[2] = Source->Params.HrtfCoeffStep;          \
-    ALuint pos, frac;                                                         \
-    FILTER *DryFilter;                                                        \
-    ALuint BufferIdx;                                                         \
-    ALuint increment;                                                         \
-    ALuint i, out, c;                                                         \
-    ALfloat value;                                                            \
-                                                                              \
-    increment = Source->Params.Step;                                          \
-                                                                              \
-    DryBuffer = Device->DryBuffer;                                            \
-    ClickRemoval = Device->ClickRemoval;                                      \
-    PendingClicks = Device->PendingClicks;                                    \
-    DryFilter = &Source->Params.iirFilter;                                    \
-                                                                              \
-    pos = 0;                                                                  \
-    frac = *DataPosFrac;                                                      \
-                                                                              \
-    for(i = 0;i < NumChannels;i++)                                            \
-    {                                                                         \
-        ALfloat (*RESTRICT TargetCoeffs)[2] = Source->Params.HrtfCoeffs[i];   \
-        ALuint *RESTRICT TargetDelay = Source->Params.HrtfDelay[i];           \
-        ALfloat *RESTRICT History = Source->HrtfHistory[i];                   \
-        ALfloat (*RESTRICT Values)[2] = Source->HrtfValues[i];                \
-        ALint Counter = maxu(Source->HrtfCounter, OutPos) - OutPos;           \
-        ALuint Offset = Source->HrtfOffset + OutPos;                          \
-        ALfloat Coeffs[HRIR_LENGTH][2];                                       \
-        ALuint Delay[2];                                                      \
-        ALfloat left, right;                                                  \
-                                                                              \
-        pos = 0;                                                              \
-        frac = *DataPosFrac;                                                  \
-                                                                              \
-        for(c = 0;c < HRIR_LENGTH;c++)                                        \
-        {                                                                     \
-            Coeffs[c][0] = TargetCoeffs[c][0] - (CoeffStep[c][0]*Counter);    \
-            Coeffs[c][1] = TargetCoeffs[c][1] - (CoeffStep[c][1]*Counter);    \
-        }                                                                     \
-                                                                              \
-        Delay[0] = TargetDelay[0] - (DelayStep[0]*Counter) + 32768;           \
-        Delay[1] = TargetDelay[1] - (DelayStep[1]*Counter) + 32768;           \
-                                                                              \
-        if(LIKELY(OutPos == 0))                                               \
-        {                                                                     \
-            value = sampler(data + pos*NumChannels + i, NumChannels, frac);   \
-            value = lpFilter2PC(DryFilter, i, value);                         \
-                                                                              \
-            History[Offset&SRC_HISTORY_MASK] = value;                         \
-            left = History[(Offset-(Delay[0]>>16))&SRC_HISTORY_MASK];         \
-            right = History[(Offset-(Delay[1]>>16))&SRC_HISTORY_MASK];        \
-                                                                              \
-            ClickRemoval[FRONT_LEFT]  -= Values[(Offset+1)&HRIR_MASK][0] +    \
-                                         Coeffs[0][0] * left;                 \
-            ClickRemoval[FRONT_RIGHT] -= Values[(Offset+1)&HRIR_MASK][1] +    \
-                                         Coeffs[0][1] * right;                \
-        }                                                                     \
-        for(BufferIdx = 0;BufferIdx < BufferSize && Counter > 0;BufferIdx++)  \
-        {                                                                     \
-            value = sampler(data + pos*NumChannels + i, NumChannels, frac);   \
-            value = lpFilter2P(DryFilter, i, value);                          \
-                                                                              \
-            History[Offset&SRC_HISTORY_MASK] = value;                         \
-            left = History[(Offset-(Delay[0]>>16))&SRC_HISTORY_MASK];         \
-            right = History[(Offset-(Delay[1]>>16))&SRC_HISTORY_MASK];        \
-                                                                              \
-            Delay[0] += DelayStep[0];                                         \
-            Delay[1] += DelayStep[1];                                         \
-                                                                              \
-            Values[Offset&HRIR_MASK][0] = 0.0f;                               \
-            Values[Offset&HRIR_MASK][1] = 0.0f;                               \
-            Offset++;                                                         \
-                                                                              \
-            for(c = 0;c < HRIR_LENGTH;c++)                                    \
-            {                                                                 \
-                const ALuint off = (Offset+c)&HRIR_MASK;                      \
-                Values[off][0] += Coeffs[c][0] * left;                        \
-                Values[off][1] += Coeffs[c][1] * right;                       \
-                Coeffs[c][0] += CoeffStep[c][0];                              \
-                Coeffs[c][1] += CoeffStep[c][1];                              \
-            }                                                                 \
-                                                                              \
-            DryBuffer[OutPos][FRONT_LEFT]  += Values[Offset&HRIR_MASK][0];    \
-            DryBuffer[OutPos][FRONT_RIGHT] += Values[Offset&HRIR_MASK][1];    \
-                                                                              \
-            frac += increment;                                                \
-            pos  += frac>>FRACTIONBITS;                                       \
-            frac &= FRACTIONMASK;                                             \
-            OutPos++;                                                         \
-            Counter--;                                                        \
-        }                                                                     \
-                                                                              \
-        Delay[0] >>= 16;                                                      \
-        Delay[1] >>= 16;                                                      \
-        for(;BufferIdx < BufferSize;BufferIdx++)                              \
-        {                                                                     \
-            value = sampler(data + pos*NumChannels + i, NumChannels, frac);   \
-            value = lpFilter2P(DryFilter, i, value);                          \
-                                                                              \
-            History[Offset&SRC_HISTORY_MASK] = value;                         \
-            left = History[(Offset-Delay[0])&SRC_HISTORY_MASK];               \
-            right = History[(Offset-Delay[1])&SRC_HISTORY_MASK];              \
-                                                                              \
-            Values[Offset&HRIR_MASK][0] = 0.0f;                               \
-            Values[Offset&HRIR_MASK][1] = 0.0f;                               \
-            Offset++;                                                         \
-                                                                              \
-            ApplyCoeffs(Offset, Values, Coeffs, left, right);                 \
-            DryBuffer[OutPos][FRONT_LEFT]  += Values[Offset&HRIR_MASK][0];    \
-            DryBuffer[OutPos][FRONT_RIGHT] += Values[Offset&HRIR_MASK][1];    \
-                                                                              \
-            frac += increment;                                                \
-            pos  += frac>>FRACTIONBITS;                                       \
-            frac &= FRACTIONMASK;                                             \
-            OutPos++;                                                         \
-        }                                                                     \
-        if(LIKELY(OutPos == SamplesToDo))                                     \
-        {                                                                     \
-            value = sampler(data + pos*NumChannels + i, NumChannels, frac);   \
-            value = lpFilter2PC(DryFilter, i, value);                         \
-                                                                              \
-            History[Offset&SRC_HISTORY_MASK] = value;                         \
-            left = History[(Offset-Delay[0])&SRC_HISTORY_MASK];               \
-            right = History[(Offset-Delay[1])&SRC_HISTORY_MASK];              \
-                                                                              \
-            PendingClicks[FRONT_LEFT]  += Values[(Offset+1)&HRIR_MASK][0] +   \
-                                          Coeffs[0][0] * left;                \
-            PendingClicks[FRONT_RIGHT] += Values[(Offset+1)&HRIR_MASK][1] +   \
-                                          Coeffs[0][1] * right;               \
-        }                                                                     \
-        OutPos -= BufferSize;                                                 \
-    }                                                                         \
-                                                                              \
-    for(out = 0;out < Device->NumAuxSends;out++)                              \
-    {                                                                         \
-        ALeffectslot *Slot = Source->Params.Send[out].Slot;                   \
-        ALfloat  WetSend;                                                     \
-        ALfloat *RESTRICT WetBuffer;                                          \
-        ALfloat *RESTRICT WetClickRemoval;                                    \
-        ALfloat *RESTRICT WetPendingClicks;                                   \
-        FILTER  *WetFilter;                                                   \
-                                                                              \
-        if(!Slot || Slot->effect.type == AL_EFFECT_NULL)                      \
-            continue;                                                         \
-                                                                              \
-        WetBuffer = Slot->WetBuffer;                                          \
-        WetClickRemoval = Slot->ClickRemoval;                                 \
-        WetPendingClicks = Slot->PendingClicks;                               \
-        WetFilter = &Source->Params.Send[out].iirFilter;                      \
-        WetSend = Source->Params.Send[out].WetGain;                           \
-                                                                              \
-        for(i = 0;i < NumChannels;i++)                                        \
-        {                                                                     \
-            pos = 0;                                                          \
-            frac = *DataPosFrac;                                              \
-                                                                              \
-            if(LIKELY(OutPos == 0))                                           \
-            {                                                                 \
-                value = sampler(data + pos*NumChannels + i, NumChannels,frac);\
-                value = lpFilter1PC(WetFilter, i, value);                     \
-                                                                              \
-                WetClickRemoval[0] -= value * WetSend;                        \
-            }                                                                 \
-            for(BufferIdx = 0;BufferIdx < BufferSize;BufferIdx++)             \
-            {                                                                 \
-                value = sampler(data + pos*NumChannels + i, NumChannels,frac);\
-                value = lpFilter1P(WetFilter, i, value);                      \
-                                                                              \
-                WetBuffer[OutPos] += value * WetSend;                         \
-                                                                              \
-                frac += increment;                                            \
-                pos  += frac>>FRACTIONBITS;                                   \
-                frac &= FRACTIONMASK;                                         \
-                OutPos++;                                                     \
-            }                                                                 \
-            if(LIKELY(OutPos == SamplesToDo))                                 \
-            {                                                                 \
-                value = sampler(data + pos*NumChannels + i, NumChannels,frac);\
-                value = lpFilter1PC(WetFilter, i, value);                     \
-                                                                              \
-                WetPendingClicks[0] += value * WetSend;                       \
-            }                                                                 \
-            OutPos -= BufferSize;                                             \
-        }                                                                     \
-    }                                                                         \
-    *DataPosInt += pos;                                                       \
-    *DataPosFrac = frac;                                                      \
-}
-
-DECL_TEMPLATE(ALfloat, point32)
-DECL_TEMPLATE(ALfloat, lerp32)
-DECL_TEMPLATE(ALfloat, cubic32)
-
-#undef DECL_TEMPLATE
-
-
-#define DECL_TEMPLATE(T, sampler)                                             \
-static void Mix_##T##_##sampler(ALsource *Source, ALCdevice *Device,          \
-  const ALvoid *srcdata, ALuint *DataPosInt, ALuint *DataPosFrac,             \
-  ALuint OutPos, ALuint SamplesToDo, ALuint BufferSize)                       \
-{                                                                             \
-    const ALuint NumChannels = Source->NumChannels;                           \
-    const T *RESTRICT data = srcdata;                                         \
-    ALfloat (*RESTRICT DryBuffer)[MAXCHANNELS];                               \
-    ALfloat *RESTRICT ClickRemoval, *RESTRICT PendingClicks;                  \
-    ALfloat DrySend[MAXCHANNELS];                                             \
-    FILTER *DryFilter;                                                        \
-    ALuint pos, frac;                                                         \
-    ALuint BufferIdx;                                                         \
-    ALuint increment;                                                         \
-    ALuint i, out, c;                                                         \
-    ALfloat value;                                                            \
-                                                                              \
-    increment = Source->Params.Step;                                          \
-                                                                              \
-    DryBuffer = Device->DryBuffer;                                            \
-    ClickRemoval = Device->ClickRemoval;                                      \
-    PendingClicks = Device->PendingClicks;                                    \
-    DryFilter = &Source->Params.iirFilter;                                    \
-                                                                              \
-    pos = 0;                                                                  \
-    frac = *DataPosFrac;                                                      \
-                                                                              \
-    for(i = 0;i < NumChannels;i++)                                            \
-    {                                                                         \
-        for(c = 0;c < MAXCHANNELS;c++)                                        \
-            DrySend[c] = Source->Params.DryGains[i][c];                       \
-                                                                              \
-        pos = 0;                                                              \
-        frac = *DataPosFrac;                                                  \
-                                                                              \
-        if(OutPos == 0)                                                       \
-        {                                                                     \
-            value = sampler(data + pos*NumChannels + i, NumChannels, frac);   \
-                                                                              \
-            value = lpFilter2PC(DryFilter, i, value);                         \
-            for(c = 0;c < MAXCHANNELS;c++)                                    \
-                ClickRemoval[c] -= value*DrySend[c];                          \
-        }                                                                     \
-        for(BufferIdx = 0;BufferIdx < BufferSize;BufferIdx++)                 \
-        {                                                                     \
-            value = sampler(data + pos*NumChannels + i, NumChannels, frac);   \
-                                                                              \
-            value = lpFilter2P(DryFilter, i, value);                          \
-            for(c = 0;c < MAXCHANNELS;c++)                                    \
-                DryBuffer[OutPos][c] += value*DrySend[c];                     \
-                                                                              \
-            frac += increment;                                                \
-            pos  += frac>>FRACTIONBITS;                                       \
-            frac &= FRACTIONMASK;                                             \
-            OutPos++;                                                         \
-        }                                                                     \
-        if(OutPos == SamplesToDo)                                             \
-        {                                                                     \
-            value = sampler(data + pos*NumChannels + i, NumChannels, frac);   \
-                                                                              \
-            value = lpFilter2PC(DryFilter, i, value);                         \
-            for(c = 0;c < MAXCHANNELS;c++)                                    \
-                PendingClicks[c] += value*DrySend[c];                         \
-        }                                                                     \
-        OutPos -= BufferSize;                                                 \
-    }                                                                         \
-                                                                              \
-    for(out = 0;out < Device->NumAuxSends;out++)                              \
-    {                                                                         \
-        ALeffectslot *Slot = Source->Params.Send[out].Slot;                   \
-        ALfloat  WetSend;                                                     \
-        ALfloat *WetBuffer;                                                   \
-        ALfloat *WetClickRemoval;                                             \
-        ALfloat *WetPendingClicks;                                            \
-        FILTER  *WetFilter;                                                   \
-                                                                              \
-        if(!Slot || Slot->effect.type == AL_EFFECT_NULL)                      \
-            continue;                                                         \
-                                                                              \
-        WetBuffer = Slot->WetBuffer;                                          \
-        WetClickRemoval = Slot->ClickRemoval;                                 \
-        WetPendingClicks = Slot->PendingClicks;                               \
-        WetFilter = &Source->Params.Send[out].iirFilter;                      \
-        WetSend = Source->Params.Send[out].WetGain;                           \
-                                                                              \
-        for(i = 0;i < NumChannels;i++)                                        \
-        {                                                                     \
-            pos = 0;                                                          \
-            frac = *DataPosFrac;                                              \
-                                                                              \
-            if(OutPos == 0)                                                   \
-            {                                                                 \
-                value = sampler(data + pos*NumChannels + i, NumChannels,frac);\
-                                                                              \
-                value = lpFilter1PC(WetFilter, i, value);                     \
-                WetClickRemoval[0] -= value * WetSend;                        \
-            }                                                                 \
-            for(BufferIdx = 0;BufferIdx < BufferSize;BufferIdx++)             \
-            {                                                                 \
-                value = sampler(data + pos*NumChannels + i, NumChannels,frac);\
-                                                                              \
-                value = lpFilter1P(WetFilter, i, value);                      \
-                WetBuffer[OutPos] += value * WetSend;                         \
-                                                                              \
-                frac += increment;                                            \
-                pos  += frac>>FRACTIONBITS;                                   \
-                frac &= FRACTIONMASK;                                         \
-                OutPos++;                                                     \
-            }                                                                 \
-            if(OutPos == SamplesToDo)                                         \
-            {                                                                 \
-                value = sampler(data + pos*NumChannels + i, NumChannels,frac);\
-                                                                              \
-                value = lpFilter1PC(WetFilter, i, value);                     \
-                WetPendingClicks[0] += value * WetSend;                       \
-            }                                                                 \
-            OutPos -= BufferSize;                                             \
-        }                                                                     \
-    }                                                                         \
-    *DataPosInt += pos;                                                       \
-    *DataPosFrac = frac;                                                      \
-}
-
-DECL_TEMPLATE(ALfloat, point32)
-DECL_TEMPLATE(ALfloat, lerp32)
-DECL_TEMPLATE(ALfloat, cubic32)
-
-#undef DECL_TEMPLATE
-
-
-MixerFunc SelectMixer(enum Resampler Resampler)
-{
-    switch(Resampler)
-    {
-        case POINT_RESAMPLER:
-            return Mix_ALfloat_point32;
-        case LINEAR_RESAMPLER:
-            return Mix_ALfloat_lerp32;
-        case CUBIC_RESAMPLER:
-            return Mix_ALfloat_cubic32;
-        case RESAMPLER_MIN:
-        case RESAMPLER_MAX:
-            break;
-    }
-    return NULL;
-}
-
-MixerFunc SelectHrtfMixer(enum Resampler Resampler)
-{
-    switch(Resampler)
-    {
-        case POINT_RESAMPLER:
-            return Mix_Hrtf_ALfloat_point32;
-        case LINEAR_RESAMPLER:
-            return Mix_Hrtf_ALfloat_lerp32;
-        case CUBIC_RESAMPLER:
-            return Mix_Hrtf_ALfloat_cubic32;
-        case RESAMPLER_MIN:
-        case RESAMPLER_MAX:
-            break;
-    }
-    return NULL;
-}
-
-
-static __inline ALfloat Sample_ALbyte(ALbyte val)
+static inline ALfloat Sample_ALbyte(ALbyte val)
 { return val * (1.0f/127.0f); }
 
-static __inline ALfloat Sample_ALshort(ALshort val)
+static inline ALfloat Sample_ALshort(ALshort val)
 { return val * (1.0f/32767.0f); }
 
-static __inline ALfloat Sample_ALfloat(ALfloat val)
+static inline ALfloat Sample_ALfloat(ALfloat val)
 { return val; }
 
 #define DECL_TEMPLATE(T)                                                      \
-static void Load_##T(ALfloat *dst, const T *src, ALuint samples)              \
+static void Load_##T(ALfloat *dst, const T *src, ALuint srcstep, ALuint samples)\
 {                                                                             \
     ALuint i;                                                                 \
     for(i = 0;i < samples;i++)                                                \
-        dst[i] = Sample_##T(src[i]);                                          \
+        dst[i] = Sample_##T(src[i*srcstep]);                                  \
 }
 
 DECL_TEMPLATE(ALbyte)
@@ -493,23 +60,23 @@ DECL_TEMPLATE(ALfloat)
 
 #undef DECL_TEMPLATE
 
-static void LoadStack(ALfloat *dst, const ALvoid *src, enum FmtType srctype, ALuint samples)
+static void LoadData(ALfloat *dst, const ALvoid *src, ALuint srcstep, enum FmtType srctype, ALuint samples)
 {
     switch(srctype)
     {
         case FmtByte:
-            Load_ALbyte(dst, src, samples);
+            Load_ALbyte(dst, src, srcstep, samples);
             break;
         case FmtShort:
-            Load_ALshort(dst, src, samples);
+            Load_ALshort(dst, src, srcstep, samples);
             break;
         case FmtFloat:
-            Load_ALfloat(dst, src, samples);
+            Load_ALfloat(dst, src, srcstep, samples);
             break;
     }
 }
 
-static void SilenceStack(ALfloat *dst, ALuint samples)
+static void SilenceData(ALfloat *dst, ALuint samples)
 {
     ALuint i;
     for(i = 0;i < samples;i++)
@@ -517,6 +84,16 @@ static void SilenceStack(ALfloat *dst, ALuint samples)
 }
 
 
+static void DoFilter(ALfilterState *filter, ALfloat *restrict dst, const ALfloat *restrict src,
+                     ALuint numsamples)
+{
+    ALuint i;
+    for(i = 0;i < numsamples;i++)
+        dst[i] = ALfilterState_processSingle(filter, src[i]);
+    dst[i] = ALfilterState_processSingleC(filter, src[i]);
+}
+
+
 ALvoid MixSource(ALsource *Source, ALCdevice *Device, ALuint SamplesToDo)
 {
     ALbufferlistitem *BufferListItem;
@@ -528,232 +105,255 @@ ALvoid MixSource(ALsource *Source, ALCdevice *Device, ALuint SamplesToDo)
     ALenum State;
     ALuint OutPos;
     ALuint NumChannels;
-    ALuint FrameSize;
+    ALuint SampleSize;
     ALint64 DataSize64;
-    ALuint i;
+    ALuint chan, j;
 
     /* Get source info */
     State         = Source->state;
     BuffersPlayed = Source->BuffersPlayed;
     DataPosInt    = Source->position;
     DataPosFrac   = Source->position_fraction;
-    Looping       = Source->bLooping;
+    Looping       = Source->Looping;
     increment     = Source->Params.Step;
-    Resampler     = Source->Resampler;
+    Resampler     = (increment==FRACTIONONE) ? PointResampler : Source->Resampler;
     NumChannels   = Source->NumChannels;
-    FrameSize     = NumChannels * Source->SampleSize;
+    SampleSize    = Source->SampleSize;
 
     /* Get current buffer queue item */
     BufferListItem = Source->queue;
-    for(i = 0;i < BuffersPlayed;i++)
+    for(j = 0;j < BuffersPlayed;j++)
         BufferListItem = BufferListItem->next;
 
     OutPos = 0;
     do {
         const ALuint BufferPrePadding = ResamplerPrePadding[Resampler];
         const ALuint BufferPadding = ResamplerPadding[Resampler];
-        ALfloat StackData[STACK_DATA_SIZE/sizeof(ALfloat)];
-        ALfloat *SrcData = StackData;
-        ALuint SrcDataSize = 0;
-        ALuint BufferSize;
+        ALuint SrcBufferSize, DstBufferSize;
 
-        /* Figure out how many buffer bytes will be needed */
+        /* Figure out how many buffer samples will be needed */
         DataSize64  = SamplesToDo-OutPos+1;
         DataSize64 *= increment;
         DataSize64 += DataPosFrac+FRACTIONMASK;
         DataSize64 >>= FRACTIONBITS;
         DataSize64 += BufferPadding+BufferPrePadding;
-        DataSize64 *= NumChannels;
 
-        BufferSize  = (ALuint)mini64(DataSize64, STACK_DATA_SIZE/sizeof(ALfloat));
-        BufferSize /= NumChannels;
+        SrcBufferSize = (ALuint)mini64(DataSize64, BUFFERSIZE);
 
-        if(Source->lSourceType == AL_STATIC)
+        /* Figure out how many samples we can actually mix from this. */
+        DataSize64  = SrcBufferSize;
+        DataSize64 -= BufferPadding+BufferPrePadding;
+        DataSize64 <<= FRACTIONBITS;
+        DataSize64 -= increment;
+        DataSize64 -= DataPosFrac;
+
+        DstBufferSize = (ALuint)((DataSize64+(increment-1)) / increment);
+        DstBufferSize = minu(DstBufferSize, (SamplesToDo-OutPos));
+
+        /* Some mixers like having a multiple of 4, so try to give that unless
+         * this is the last update. */
+        if(OutPos+DstBufferSize < SamplesToDo)
+            DstBufferSize &= ~3;
+
+        for(chan = 0;chan < NumChannels;chan++)
         {
-            const ALbuffer *ALBuffer = Source->queue->buffer;
-            const ALubyte *Data = ALBuffer->data;
-            ALuint DataSize;
-            ALuint pos;
+            ALfloat *SrcData = Device->SampleData1;
+            ALfloat *ResampledData = Device->SampleData2;
+            ALuint SrcDataSize = 0;
 
-            /* If current pos is beyond the loop range, do not loop */
-            if(Looping == AL_FALSE || DataPosInt >= (ALuint)ALBuffer->LoopEnd)
+            if(Source->SourceType == AL_STATIC)
             {
-                Looping = AL_FALSE;
+                const ALbuffer *ALBuffer = Source->queue->buffer;
+                const ALubyte *Data = ALBuffer->data;
+                ALuint DataSize;
+                ALuint pos;
 
-                if(DataPosInt >= BufferPrePadding)
-                    pos = DataPosInt - BufferPrePadding;
-                else
+                /* If current pos is beyond the loop range, do not loop */
+                if(Looping == AL_FALSE || DataPosInt >= (ALuint)ALBuffer->LoopEnd)
                 {
-                    DataSize = BufferPrePadding - DataPosInt;
-                    DataSize = minu(BufferSize, DataSize);
+                    Looping = AL_FALSE;
 
-                    SilenceStack(&SrcData[SrcDataSize*NumChannels],
-                                 DataSize*NumChannels);
-                    SrcDataSize += DataSize;
-                    BufferSize -= DataSize;
+                    if(DataPosInt >= BufferPrePadding)
+                        pos = DataPosInt - BufferPrePadding;
+                    else
+                    {
+                        DataSize = BufferPrePadding - DataPosInt;
+                        DataSize = minu(SrcBufferSize - SrcDataSize, DataSize);
 
-                    pos = 0;
-                }
+                        SilenceData(&SrcData[SrcDataSize], DataSize);
+                        SrcDataSize += DataSize;
 
-                /* Copy what's left to play in the source buffer, and clear the
-                 * rest of the temp buffer */
-                DataSize = ALBuffer->SampleLen - pos;
-                DataSize = minu(BufferSize, DataSize);
+                        pos = 0;
+                    }
 
-                LoadStack(&SrcData[SrcDataSize*NumChannels], &Data[pos*FrameSize],
-                          ALBuffer->FmtType, DataSize*NumChannels);
-                SrcDataSize += DataSize;
-                BufferSize -= DataSize;
+                    /* Copy what's left to play in the source buffer, and clear the
+                     * rest of the temp buffer */
+                    DataSize = minu(SrcBufferSize - SrcDataSize, ALBuffer->SampleLen - pos);
 
-                SilenceStack(&SrcData[SrcDataSize*NumChannels],
-                             BufferSize*NumChannels);
-                SrcDataSize += BufferSize;
-                BufferSize -= BufferSize;
-            }
-            else
-            {
-                ALuint LoopStart = ALBuffer->LoopStart;
-                ALuint LoopEnd   = ALBuffer->LoopEnd;
+                    LoadData(&SrcData[SrcDataSize], &Data[(pos*NumChannels + chan)*SampleSize],
+                             NumChannels, ALBuffer->FmtType, DataSize);
+                    SrcDataSize += DataSize;
 
-                if(DataPosInt >= LoopStart)
-                {
-                    pos = DataPosInt-LoopStart;
-                    while(pos < BufferPrePadding)
-                        pos += LoopEnd-LoopStart;
-                    pos -= BufferPrePadding;
-                    pos += LoopStart;
+                    SilenceData(&SrcData[SrcDataSize], SrcBufferSize - SrcDataSize);
+                    SrcDataSize += SrcBufferSize - SrcDataSize;
                 }
-                else if(DataPosInt >= BufferPrePadding)
-                    pos = DataPosInt - BufferPrePadding;
                 else
                 {
-                    DataSize = BufferPrePadding - DataPosInt;
-                    DataSize = minu(BufferSize, DataSize);
+                    ALuint LoopStart = ALBuffer->LoopStart;
+                    ALuint LoopEnd   = ALBuffer->LoopEnd;
 
-                    SilenceStack(&SrcData[SrcDataSize*NumChannels], DataSize*NumChannels);
-                    SrcDataSize += DataSize;
-                    BufferSize -= DataSize;
-
-                    pos = 0;
-                }
+                    if(DataPosInt >= LoopStart)
+                    {
+                        pos = DataPosInt-LoopStart;
+                        while(pos < BufferPrePadding)
+                            pos += LoopEnd-LoopStart;
+                        pos -= BufferPrePadding;
+                        pos += LoopStart;
+                    }
+                    else if(DataPosInt >= BufferPrePadding)
+                        pos = DataPosInt - BufferPrePadding;
+                    else
+                    {
+                        DataSize = BufferPrePadding - DataPosInt;
+                        DataSize = minu(SrcBufferSize - SrcDataSize, DataSize);
 
-                /* Copy what's left of this loop iteration, then copy repeats
-                 * of the loop section */
-                DataSize = LoopEnd - pos;
-                DataSize = minu(BufferSize, DataSize);
+                        SilenceData(&SrcData[SrcDataSize], DataSize);
+                        SrcDataSize += DataSize;
 
-                LoadStack(&SrcData[SrcDataSize*NumChannels], &Data[pos*FrameSize],
-                          ALBuffer->FmtType, DataSize*NumChannels);
-                SrcDataSize += DataSize;
-                BufferSize -= DataSize;
+                        pos = 0;
+                    }
 
-                DataSize = LoopEnd-LoopStart;
-                while(BufferSize > 0)
-                {
-                    DataSize = minu(BufferSize, DataSize);
+                    /* Copy what's left of this loop iteration, then copy repeats
+                     * of the loop section */
+                    DataSize = LoopEnd - pos;
+                    DataSize = minu(SrcBufferSize - SrcDataSize, DataSize);
 
-                    LoadStack(&SrcData[SrcDataSize*NumChannels], &Data[LoopStart*FrameSize],
-                              ALBuffer->FmtType, DataSize*NumChannels);
+                    LoadData(&SrcData[SrcDataSize], &Data[(pos*NumChannels + chan)*SampleSize],
+                             NumChannels, ALBuffer->FmtType, DataSize);
                     SrcDataSize += DataSize;
-                    BufferSize -= DataSize;
+
+                    DataSize = LoopEnd-LoopStart;
+                    while(SrcBufferSize > SrcDataSize)
+                    {
+                        DataSize = minu(SrcBufferSize - SrcDataSize, DataSize);
+
+                        LoadData(&SrcData[SrcDataSize], &Data[(LoopStart*NumChannels + chan)*SampleSize],
+                                 NumChannels, ALBuffer->FmtType, DataSize);
+                        SrcDataSize += DataSize;
+                    }
                 }
             }
-        }
-        else
-        {
-            /* Crawl the buffer queue to fill in the temp buffer */
-            ALbufferlistitem *tmpiter = BufferListItem;
-            ALuint pos;
-
-            if(DataPosInt >= BufferPrePadding)
-                pos = DataPosInt - BufferPrePadding;
             else
             {
-                pos = BufferPrePadding - DataPosInt;
-                while(pos > 0)
+                /* Crawl the buffer queue to fill in the temp buffer */
+                ALbufferlistitem *tmpiter = BufferListItem;
+                ALuint pos;
+
+                if(DataPosInt >= BufferPrePadding)
+                    pos = DataPosInt - BufferPrePadding;
+                else
                 {
-                    if(!tmpiter->prev && !Looping)
+                    pos = BufferPrePadding - DataPosInt;
+                    while(pos > 0)
                     {
-                        ALuint DataSize = minu(BufferSize, pos);
+                        if(!tmpiter->prev && !Looping)
+                        {
+                            ALuint DataSize = minu(SrcBufferSize - SrcDataSize, pos);
 
-                        SilenceStack(&SrcData[SrcDataSize*NumChannels], DataSize*NumChannels);
-                        SrcDataSize += DataSize;
-                        BufferSize -= DataSize;
+                            SilenceData(&SrcData[SrcDataSize], DataSize);
+                            SrcDataSize += DataSize;
 
-                        pos = 0;
-                        break;
-                    }
+                            pos = 0;
+                            break;
+                        }
 
-                    if(tmpiter->prev)
-                        tmpiter = tmpiter->prev;
-                    else
-                    {
-                        while(tmpiter->next)
-                            tmpiter = tmpiter->next;
-                    }
+                        if(tmpiter->prev)
+                            tmpiter = tmpiter->prev;
+                        else
+                        {
+                            while(tmpiter->next)
+                                tmpiter = tmpiter->next;
+                        }
 
-                    if(tmpiter->buffer)
-                    {
-                        if((ALuint)tmpiter->buffer->SampleLen > pos)
+                        if(tmpiter->buffer)
                         {
-                            pos = tmpiter->buffer->SampleLen - pos;
-                            break;
+                            if((ALuint)tmpiter->buffer->SampleLen > pos)
+                            {
+                                pos = tmpiter->buffer->SampleLen - pos;
+                                break;
+                            }
+                            pos -= tmpiter->buffer->SampleLen;
                         }
-                        pos -= tmpiter->buffer->SampleLen;
                     }
                 }
-            }
 
-            while(tmpiter && BufferSize > 0)
-            {
-                const ALbuffer *ALBuffer;
-                if((ALBuffer=tmpiter->buffer) != NULL)
+                while(tmpiter && SrcBufferSize > SrcDataSize)
                 {
-                    const ALubyte *Data = ALBuffer->data;
-                    ALuint DataSize = ALBuffer->SampleLen;
-
-                    /* Skip the data already played */
-                    if(DataSize <= pos)
-                        pos -= DataSize;
-                    else
+                    const ALbuffer *ALBuffer;
+                    if((ALBuffer=tmpiter->buffer) != NULL)
                     {
-                        Data += pos*FrameSize;
-                        DataSize -= pos;
-                        pos -= pos;
+                        const ALubyte *Data = ALBuffer->data;
+                        ALuint DataSize = ALBuffer->SampleLen;
 
-                        DataSize = minu(BufferSize, DataSize);
-                        LoadStack(&SrcData[SrcDataSize*NumChannels], Data,
-                                  ALBuffer->FmtType, DataSize*NumChannels);
-                        SrcDataSize += DataSize;
-                        BufferSize -= DataSize;
+                        /* Skip the data already played */
+                        if(DataSize <= pos)
+                            pos -= DataSize;
+                        else
+                        {
+                            Data += (pos*NumChannels + chan)*SampleSize;
+                            DataSize -= pos;
+                            pos -= pos;
+
+                            DataSize = minu(SrcBufferSize - SrcDataSize, DataSize);
+                            LoadData(&SrcData[SrcDataSize], Data, NumChannels,
+                                     ALBuffer->FmtType, DataSize);
+                            SrcDataSize += DataSize;
+                        }
+                    }
+                    tmpiter = tmpiter->next;
+                    if(!tmpiter && Looping)
+                        tmpiter = Source->queue;
+                    else if(!tmpiter)
+                    {
+                        SilenceData(&SrcData[SrcDataSize], SrcBufferSize - SrcDataSize);
+                        SrcDataSize += SrcBufferSize - SrcDataSize;
                     }
-                }
-                tmpiter = tmpiter->next;
-                if(!tmpiter && Looping)
-                    tmpiter = Source->queue;
-                else if(!tmpiter)
-                {
-                    SilenceStack(&SrcData[SrcDataSize*NumChannels], BufferSize*NumChannels);
-                    SrcDataSize += BufferSize;
-                    BufferSize -= BufferSize;
                 }
             }
-        }
 
-        /* Figure out how many samples we can mix. */
-        DataSize64  = SrcDataSize;
-        DataSize64 -= BufferPadding+BufferPrePadding;
-        DataSize64 <<= FRACTIONBITS;
-        DataSize64 -= increment;
-        DataSize64 -= DataPosFrac;
+            /* Now resample, then filter and mix to the appropriate outputs. */
+            Source->Params.Resample(&SrcData[BufferPrePadding], DataPosFrac,
+                                    increment, ResampledData, DstBufferSize);
+
+            {
+                DirectParams *directparms = &Source->Params.Direct;
 
-        BufferSize = (ALuint)((DataSize64+(increment-1)) / increment);
-        BufferSize = minu(BufferSize, (SamplesToDo-OutPos));
+                DoFilter(&directparms->LpFilter[chan], SrcData, ResampledData,
+                         DstBufferSize);
+                Source->Params.DryMix(directparms, SrcData, chan, OutPos,
+                                      SamplesToDo, DstBufferSize);
+            }
 
-        SrcData += BufferPrePadding*NumChannels;
-        Source->Params.DoMix(Source, Device, SrcData, &DataPosInt, &DataPosFrac,
-                             OutPos, SamplesToDo, BufferSize);
-        OutPos += BufferSize;
+            for(j = 0;j < Device->NumAuxSends;j++)
+            {
+                SendParams *sendparms = &Source->Params.Send[j];
+                if(!sendparms->OutBuffer)
+                    continue;
+
+                DoFilter(&sendparms->LpFilter[chan], SrcData, ResampledData,
+                         DstBufferSize);
+                Source->Params.WetMix(sendparms, SrcData, OutPos,
+                                      SamplesToDo, DstBufferSize);
+            }
+        }
+        /* Update positions */
+        for(j = 0;j < DstBufferSize;j++)
+        {
+            DataPosFrac += increment;
+            DataPosInt  += DataPosFrac>>FRACTIONBITS;
+            DataPosFrac &= FRACTIONMASK;
+        }
+        OutPos += DstBufferSize;
 
         /* Handle looping sources */
         while(1)
@@ -772,7 +372,7 @@ ALvoid MixSource(ALsource *Source, ALCdevice *Device, ALuint SamplesToDo)
                     break;
             }
 
-            if(Looping && Source->lSourceType == AL_STATIC)
+            if(Looping && Source->SourceType == AL_STATIC)
             {
                 DataPosInt = ((DataPosInt-LoopStart)%(LoopEnd-LoopStart)) + LoopStart;
                 break;
@@ -810,15 +410,12 @@ ALvoid MixSource(ALsource *Source, ALCdevice *Device, ALuint SamplesToDo)
     Source->BuffersPlayed     = BuffersPlayed;
     Source->position          = DataPosInt;
     Source->position_fraction = DataPosFrac;
-    Source->HrtfOffset       += OutPos;
+    Source->Hrtf.Offset      += OutPos;
     if(State == AL_PLAYING)
-    {
-        Source->HrtfCounter = maxu(Source->HrtfCounter, OutPos) - OutPos;
-        Source->HrtfMoving  = AL_TRUE;
-    }
+        Source->Hrtf.Counter = maxu(Source->Hrtf.Counter, OutPos) - OutPos;
     else
     {
-        Source->HrtfCounter = 0;
-        Source->HrtfMoving  = AL_FALSE;
+        Source->Hrtf.Counter = 0;
+        Source->Hrtf.Moving  = AL_FALSE;
     }
 }

+ 125 - 0
jni/openal-soft-android/Alc/mixer_c.c

@@ -0,0 +1,125 @@
+#include "config.h"
+
+#include <assert.h>
+
+#include "alMain.h"
+#include "alu.h"
+#include "alSource.h"
+#include "alAuxEffectSlot.h"
+
+
+static inline ALfloat point32(const ALfloat *vals, ALuint UNUSED(frac))
+{ return vals[0]; }
+static inline ALfloat lerp32(const ALfloat *vals, ALuint frac)
+{ return lerp(vals[0], vals[1], frac * (1.0f/FRACTIONONE)); }
+static inline ALfloat cubic32(const ALfloat *vals, ALuint frac)
+{ return cubic(vals[-1], vals[0], vals[1], vals[2], frac * (1.0f/FRACTIONONE)); }
+
+void Resample_copy32_C(const ALfloat *data, ALuint UNUSED(frac),
+  ALuint increment, ALfloat *restrict OutBuffer, ALuint BufferSize)
+{
+    assert(increment==FRACTIONONE);
+    memcpy(OutBuffer, data, (BufferSize+1)*sizeof(ALfloat));
+}
+
+#define DECL_TEMPLATE(Sampler)                                                \
+void Resample_##Sampler##_C(const ALfloat *data, ALuint frac,                 \
+  ALuint increment, ALfloat *restrict OutBuffer, ALuint BufferSize)           \
+{                                                                             \
+    ALuint pos = 0;                                                           \
+    ALuint i;                                                                 \
+                                                                              \
+    for(i = 0;i < BufferSize+1;i++)                                           \
+    {                                                                         \
+        OutBuffer[i] = Sampler(data + pos, frac);                             \
+                                                                              \
+        frac += increment;                                                    \
+        pos  += frac>>FRACTIONBITS;                                           \
+        frac &= FRACTIONMASK;                                                 \
+    }                                                                         \
+}
+
+DECL_TEMPLATE(point32)
+DECL_TEMPLATE(lerp32)
+DECL_TEMPLATE(cubic32)
+
+#undef DECL_TEMPLATE
+
+
+static inline void ApplyCoeffsStep(const ALuint IrSize,
+                                   ALfloat (*restrict Coeffs)[2],
+                                   const ALfloat (*restrict CoeffStep)[2])
+{
+    ALuint c;
+    for(c = 0;c < IrSize;c++)
+    {
+        Coeffs[c][0] += CoeffStep[c][0];
+        Coeffs[c][1] += CoeffStep[c][1];
+    }
+}
+
+static inline void ApplyCoeffs(ALuint Offset, ALfloat (*restrict Values)[2],
+                               const ALuint IrSize,
+                               ALfloat (*restrict Coeffs)[2],
+                               ALfloat left, ALfloat right)
+{
+    ALuint c;
+    for(c = 0;c < IrSize;c++)
+    {
+        const ALuint off = (Offset+c)&HRIR_MASK;
+        Values[off][0] += Coeffs[c][0] * left;
+        Values[off][1] += Coeffs[c][1] * right;
+    }
+}
+
+#define SUFFIX C
+#include "mixer_inc.c"
+#undef SUFFIX
+
+
+void MixDirect_C(const DirectParams *params, const ALfloat *restrict data, ALuint srcchan,
+  ALuint OutPos, ALuint SamplesToDo, ALuint BufferSize)
+{
+    ALfloat (*restrict OutBuffer)[BUFFERSIZE] = params->OutBuffer;
+    ALfloat *restrict ClickRemoval = params->ClickRemoval;
+    ALfloat *restrict PendingClicks = params->PendingClicks;
+    ALfloat DrySend;
+    ALuint pos;
+    ALuint c;
+
+    for(c = 0;c < MaxChannels;c++)
+    {
+        DrySend = params->Gains[srcchan][c];
+        if(!(DrySend > GAIN_SILENCE_THRESHOLD))
+            continue;
+
+        if(OutPos == 0)
+            ClickRemoval[c] -= data[0]*DrySend;
+        for(pos = 0;pos < BufferSize;pos++)
+            OutBuffer[c][OutPos+pos] += data[pos]*DrySend;
+        if(OutPos+pos == SamplesToDo)
+            PendingClicks[c] += data[pos]*DrySend;
+    }
+}
+
+
+void MixSend_C(const SendParams *params, const ALfloat *restrict data,
+  ALuint OutPos, ALuint SamplesToDo, ALuint BufferSize)
+{
+    ALfloat (*restrict OutBuffer)[BUFFERSIZE] = params->OutBuffer;
+    ALfloat *restrict ClickRemoval = params->ClickRemoval;
+    ALfloat *restrict PendingClicks = params->PendingClicks;
+    ALfloat WetSend;
+    ALuint pos;
+
+    WetSend = params->Gain;
+    if(!(WetSend > GAIN_SILENCE_THRESHOLD))
+        return;
+
+    if(OutPos == 0)
+        ClickRemoval[0] -= data[0] * WetSend;
+    for(pos = 0;pos < BufferSize;pos++)
+        OutBuffer[0][OutPos+pos] += data[pos] * WetSend;
+    if(OutPos+pos == SamplesToDo)
+        PendingClicks[0] += data[pos] * WetSend;
+}

+ 33 - 0
jni/openal-soft-android/Alc/mixer_defs.h

@@ -0,0 +1,33 @@
+#ifndef MIXER_DEFS_H
+#define MIXER_DEFS_H
+
+#include "AL/alc.h"
+#include "AL/al.h"
+#include "alMain.h"
+
+struct DirectParams;
+struct SendParams;
+
+/* C resamplers */
+void Resample_copy32_C(const ALfloat *src, ALuint frac, ALuint increment, ALfloat *restrict dst, ALuint dstlen);
+void Resample_point32_C(const ALfloat *src, ALuint frac, ALuint increment, ALfloat *restrict dst, ALuint dstlen);
+void Resample_lerp32_C(const ALfloat *src, ALuint frac, ALuint increment, ALfloat *restrict dst, ALuint dstlen);
+void Resample_cubic32_C(const ALfloat *src, ALuint frac, ALuint increment, ALfloat *restrict dst, ALuint dstlen);
+
+
+/* C mixers */
+void MixDirect_Hrtf_C(const struct DirectParams*,const ALfloat*restrict,ALuint,ALuint,ALuint,ALuint);
+void MixDirect_C(const struct DirectParams*,const ALfloat*restrict,ALuint,ALuint,ALuint,ALuint);
+void MixSend_C(const struct SendParams*,const ALfloat*restrict,ALuint,ALuint,ALuint);
+
+/* SSE mixers */
+void MixDirect_Hrtf_SSE(const struct DirectParams*,const ALfloat*restrict,ALuint,ALuint,ALuint,ALuint);
+void MixDirect_SSE(const struct DirectParams*,const ALfloat*restrict,ALuint,ALuint,ALuint,ALuint);
+void MixSend_SSE(const struct SendParams*,const ALfloat*restrict,ALuint,ALuint,ALuint);
+
+/* Neon mixers */
+void MixDirect_Hrtf_Neon(const struct DirectParams*,const ALfloat*restrict,ALuint,ALuint,ALuint,ALuint);
+void MixDirect_Neon(const struct DirectParams*,const ALfloat*restrict,ALuint,ALuint,ALuint,ALuint);
+void MixSend_Neon(const struct SendParams*,const ALfloat*restrict,ALuint,ALuint,ALuint);
+
+#endif /* MIXER_DEFS_H */

+ 140 - 0
jni/openal-soft-android/Alc/mixer_inc.c

@@ -0,0 +1,140 @@
+#include "config.h"
+
+#include "alMain.h"
+#include "alSource.h"
+#include "mixer_defs.h"
+
+#ifdef __GNUC__
+#define LIKELY(x) __builtin_expect(!!(x), 1)
+#define UNLIKELY(x) __builtin_expect(!!(x), 0)
+#else
+#define LIKELY(x) (x)
+#define UNLIKELY(x) (x)
+#endif
+
+#define REAL_MERGE2(a,b) a##b
+#define MERGE2(a,b) REAL_MERGE2(a,b)
+
+#define MixDirect_Hrtf MERGE2(MixDirect_Hrtf_,SUFFIX)
+
+
+static inline void ApplyCoeffsStep(const ALuint irSize,
+                                   ALfloat (*restrict Coeffs)[2],
+                                   const ALfloat (*restrict CoeffStep)[2]);
+static inline void ApplyCoeffs(ALuint Offset, ALfloat (*restrict Values)[2],
+                               const ALuint irSize,
+                               ALfloat (*restrict Coeffs)[2],
+                               ALfloat left, ALfloat right);
+
+
+void MixDirect_Hrtf(const DirectParams *params, const ALfloat *restrict data, ALuint srcchan,
+  ALuint OutPos, ALuint SamplesToDo, ALuint BufferSize)
+{
+    ALfloat (*restrict DryBuffer)[BUFFERSIZE] = params->OutBuffer;
+    ALfloat *restrict ClickRemoval = params->ClickRemoval;
+    ALfloat *restrict PendingClicks = params->PendingClicks;
+    const ALuint IrSize = params->Hrtf.Params.IrSize;
+    const ALint *restrict DelayStep = params->Hrtf.Params.DelayStep;
+    const ALfloat (*restrict CoeffStep)[2] = params->Hrtf.Params.CoeffStep;
+    const ALfloat (*restrict TargetCoeffs)[2] = params->Hrtf.Params.Coeffs[srcchan];
+    const ALuint *restrict TargetDelay = params->Hrtf.Params.Delay[srcchan];
+    ALfloat *restrict History = params->Hrtf.State->History[srcchan];
+    ALfloat (*restrict Values)[2] = params->Hrtf.State->Values[srcchan];
+    ALint Counter = maxu(params->Hrtf.State->Counter, OutPos) - OutPos;
+    ALuint Offset = params->Hrtf.State->Offset + OutPos;
+    ALIGN(16) ALfloat Coeffs[HRIR_LENGTH][2];
+    ALuint Delay[2];
+    ALfloat left, right;
+    ALuint pos;
+    ALuint c;
+
+    pos = 0;
+    for(c = 0;c < IrSize;c++)
+    {
+        Coeffs[c][0] = TargetCoeffs[c][0] - (CoeffStep[c][0]*Counter);
+        Coeffs[c][1] = TargetCoeffs[c][1] - (CoeffStep[c][1]*Counter);
+    }
+
+    Delay[0] = TargetDelay[0] - (DelayStep[0]*Counter);
+    Delay[1] = TargetDelay[1] - (DelayStep[1]*Counter);
+
+    if(LIKELY(OutPos == 0))
+    {
+        History[Offset&SRC_HISTORY_MASK] = data[pos];
+        left  = lerp(History[(Offset-(Delay[0]>>HRTFDELAY_BITS))&SRC_HISTORY_MASK],
+                     History[(Offset-(Delay[0]>>HRTFDELAY_BITS)-1)&SRC_HISTORY_MASK],
+                     (Delay[0]&HRTFDELAY_MASK)*(1.0f/HRTFDELAY_FRACONE));
+        right = lerp(History[(Offset-(Delay[1]>>HRTFDELAY_BITS))&SRC_HISTORY_MASK],
+                     History[(Offset-(Delay[1]>>HRTFDELAY_BITS)-1)&SRC_HISTORY_MASK],
+                     (Delay[1]&HRTFDELAY_MASK)*(1.0f/HRTFDELAY_FRACONE));
+
+        ClickRemoval[FrontLeft]  -= Values[(Offset+1)&HRIR_MASK][0] +
+                                    Coeffs[0][0] * left;
+        ClickRemoval[FrontRight] -= Values[(Offset+1)&HRIR_MASK][1] +
+                                    Coeffs[0][1] * right;
+    }
+    for(pos = 0;pos < BufferSize && Counter > 0;pos++)
+    {
+        History[Offset&SRC_HISTORY_MASK] = data[pos];
+        left  = lerp(History[(Offset-(Delay[0]>>HRTFDELAY_BITS))&SRC_HISTORY_MASK],
+                     History[(Offset-(Delay[0]>>HRTFDELAY_BITS)-1)&SRC_HISTORY_MASK],
+                     (Delay[0]&HRTFDELAY_MASK)*(1.0f/HRTFDELAY_FRACONE));
+        right = lerp(History[(Offset-(Delay[1]>>HRTFDELAY_BITS))&SRC_HISTORY_MASK],
+                     History[(Offset-(Delay[1]>>HRTFDELAY_BITS)-1)&SRC_HISTORY_MASK],
+                     (Delay[1]&HRTFDELAY_MASK)*(1.0f/HRTFDELAY_FRACONE));
+
+        Delay[0] += DelayStep[0];
+        Delay[1] += DelayStep[1];
+
+        Values[(Offset+IrSize)&HRIR_MASK][0] = 0.0f;
+        Values[(Offset+IrSize)&HRIR_MASK][1] = 0.0f;
+        Offset++;
+
+        ApplyCoeffs(Offset, Values, IrSize, Coeffs, left, right);
+        DryBuffer[FrontLeft][OutPos]  += Values[Offset&HRIR_MASK][0];
+        DryBuffer[FrontRight][OutPos] += Values[Offset&HRIR_MASK][1];
+        ApplyCoeffsStep(IrSize, Coeffs, CoeffStep);
+
+        OutPos++;
+        Counter--;
+    }
+
+    Delay[0] >>= HRTFDELAY_BITS;
+    Delay[1] >>= HRTFDELAY_BITS;
+    for(;pos < BufferSize;pos++)
+    {
+        History[Offset&SRC_HISTORY_MASK] = data[pos];
+        left = History[(Offset-Delay[0])&SRC_HISTORY_MASK];
+        right = History[(Offset-Delay[1])&SRC_HISTORY_MASK];
+
+        Values[(Offset+IrSize)&HRIR_MASK][0] = 0.0f;
+        Values[(Offset+IrSize)&HRIR_MASK][1] = 0.0f;
+        Offset++;
+
+        ApplyCoeffs(Offset, Values, IrSize, Coeffs, left, right);
+        DryBuffer[FrontLeft][OutPos]  += Values[Offset&HRIR_MASK][0];
+        DryBuffer[FrontRight][OutPos] += Values[Offset&HRIR_MASK][1];
+
+        OutPos++;
+    }
+    if(LIKELY(OutPos == SamplesToDo))
+    {
+        History[Offset&SRC_HISTORY_MASK] = data[pos];
+        left = History[(Offset-Delay[0])&SRC_HISTORY_MASK];
+        right = History[(Offset-Delay[1])&SRC_HISTORY_MASK];
+
+        PendingClicks[FrontLeft]  += Values[(Offset+1)&HRIR_MASK][0] +
+                                     Coeffs[0][0] * left;
+        PendingClicks[FrontRight] += Values[(Offset+1)&HRIR_MASK][1] +
+                                     Coeffs[0][1] * right;
+    }
+}
+
+
+#undef MixDirect_Hrtf
+
+#undef MERGE2
+#undef REAL_MERGE2
+
+#undef UNLIKELY
+#undef LIKELY

+ 130 - 0
jni/openal-soft-android/Alc/mixer_neon.c

@@ -0,0 +1,130 @@
+#include "config.h"
+
+#ifdef HAVE_ARM_NEON_H
+#include <arm_neon.h>
+#endif
+
+#include "AL/al.h"
+#include "AL/alc.h"
+#include "alMain.h"
+#include "alu.h"
+
+
+static inline void ApplyCoeffsStep(const ALuint IrSize,
+                                   ALfloat (*restrict Coeffs)[2],
+                                   const ALfloat (*restrict CoeffStep)[2])
+{
+    float32x4_t coeffs, deltas;
+    ALuint c;
+
+    for(c = 0;c < IrSize;c += 2)
+    {
+        coeffs = vld1q_f32(&Coeffs[c][0]);
+        deltas = vld1q_f32(&CoeffStep[c][0]);
+        coeffs = vaddq_f32(coeffs, deltas);
+        vst1q_f32(&Coeffs[c][0], coeffs);
+    }
+}
+
+static inline void ApplyCoeffs(ALuint Offset, ALfloat (*restrict Values)[2],
+                               const ALuint IrSize,
+                               ALfloat (*restrict Coeffs)[2],
+                               ALfloat left, ALfloat right)
+{
+    ALuint c;
+    float32x4_t leftright4;
+    {
+        float32x2_t leftright2 = vdup_n_f32(0.0);
+        leftright2 = vset_lane_f32(left, leftright2, 0);
+        leftright2 = vset_lane_f32(right, leftright2, 1);
+        leftright4 = vcombine_f32(leftright2, leftright2);
+    }
+    for(c = 0;c < IrSize;c += 2)
+    {
+        const ALuint o0 = (Offset+c)&HRIR_MASK;
+        const ALuint o1 = (o0+1)&HRIR_MASK;
+        float32x4_t vals = vcombine_f32(vld1_f32((float32_t*)&Values[o0][0]),
+                                        vld1_f32((float32_t*)&Values[o1][0]));
+        float32x4_t coefs = vld1q_f32((float32_t*)&Coeffs[c][0]);
+
+        vals = vmlaq_f32(vals, coefs, leftright4);
+
+        vst1_f32((float32_t*)&Values[o0][0], vget_low_f32(vals));
+        vst1_f32((float32_t*)&Values[o1][0], vget_high_f32(vals));
+    }
+}
+
+
+#define SUFFIX Neon
+#include "mixer_inc.c"
+#undef SUFFIX
+
+
+void MixDirect_Neon(const DirectParams *params, const ALfloat *restrict data, ALuint srcchan,
+  ALuint OutPos, ALuint SamplesToDo, ALuint BufferSize)
+{
+    ALfloat (*restrict OutBuffer)[BUFFERSIZE] = params->OutBuffer;
+    ALfloat *restrict ClickRemoval = params->ClickRemoval;
+    ALfloat *restrict PendingClicks = params->PendingClicks;
+    ALfloat DrySend;
+    float32x4_t gain;
+    ALuint pos;
+    ALuint c;
+
+    for(c = 0;c < MaxChannels;c++)
+    {
+        DrySend = params->Gains[srcchan][c];
+        if(!(DrySend > GAIN_SILENCE_THRESHOLD))
+            continue;
+
+        if(OutPos == 0)
+            ClickRemoval[c] -= data[0]*DrySend;
+
+        gain = vdupq_n_f32(DrySend);
+        for(pos = 0;BufferSize-pos > 3;pos += 4)
+        {
+            const float32x4_t val4 = vld1q_f32(&data[pos]);
+            float32x4_t dry4 = vld1q_f32(&OutBuffer[c][OutPos+pos]);
+            dry4 = vaddq_f32(dry4, vmulq_f32(val4, gain));
+            vst1q_f32(&OutBuffer[c][OutPos+pos], dry4);
+        }
+        for(;pos < BufferSize;pos++)
+            OutBuffer[c][OutPos+pos] += data[pos]*DrySend;
+
+        if(OutPos+pos == SamplesToDo)
+            PendingClicks[c] += data[pos]*DrySend;
+    }
+}
+
+
+void MixSend_Neon(const SendParams *params, const ALfloat *restrict data,
+  ALuint OutPos, ALuint SamplesToDo, ALuint BufferSize)
+{
+    ALfloat (*restrict OutBuffer)[BUFFERSIZE] = params->OutBuffer;
+    ALfloat *restrict ClickRemoval = params->ClickRemoval;
+    ALfloat *restrict PendingClicks = params->PendingClicks;
+    ALfloat WetGain;
+    float32x4_t gain;
+    ALuint pos;
+
+    WetGain = params->Gain;
+    if(!(WetGain > GAIN_SILENCE_THRESHOLD))
+        return;
+
+    if(OutPos == 0)
+        ClickRemoval[0] -= data[0] * WetGain;
+
+    gain = vdupq_n_f32(WetGain);
+    for(pos = 0;BufferSize-pos > 3;pos += 4)
+    {
+        const float32x4_t val4 = vld1q_f32(&data[pos]);
+        float32x4_t wet4 = vld1q_f32(&OutBuffer[0][OutPos+pos]);
+        wet4 = vaddq_f32(wet4, vmulq_f32(val4, gain));
+        vst1q_f32(&OutBuffer[0][OutPos+pos], wet4);
+    }
+    for(;pos < BufferSize;pos++)
+        OutBuffer[0][OutPos+pos] += data[pos] * WetGain;
+
+    if(OutPos+pos == SamplesToDo)
+        PendingClicks[0] += data[pos] * WetGain;
+}

+ 164 - 0
jni/openal-soft-android/Alc/mixer_sse.c

@@ -0,0 +1,164 @@
+#include "config.h"
+
+#ifdef HAVE_XMMINTRIN_H
+#ifdef IN_IDE_PARSER
+/* KDevelop's parser won't recognize these defines that get added by the -msse
+ * switch used to compile this source. Without them, xmmintrin.h fails to
+ * declare anything. */
+#define __MMX__
+#define __SSE__
+#endif
+#include <xmmintrin.h>
+#endif
+
+#include "AL/al.h"
+#include "AL/alc.h"
+#include "alMain.h"
+#include "alu.h"
+
+#include "alSource.h"
+#include "alAuxEffectSlot.h"
+#include "mixer_defs.h"
+
+
+static inline void ApplyCoeffsStep(const ALuint IrSize,
+                                   ALfloat (*restrict Coeffs)[2],
+                                   const ALfloat (*restrict CoeffStep)[2])
+{
+    __m128 coeffs, deltas;
+    ALuint i;
+
+    for(i = 0;i < IrSize;i += 2)
+    {
+        coeffs = _mm_load_ps(&Coeffs[i][0]);
+        deltas = _mm_load_ps(&CoeffStep[i][0]);
+        coeffs = _mm_add_ps(coeffs, deltas);
+        _mm_store_ps(&Coeffs[i][0], coeffs);
+    }
+}
+
+static inline void ApplyCoeffs(ALuint Offset, ALfloat (*restrict Values)[2],
+                               const ALuint IrSize,
+                               ALfloat (*restrict Coeffs)[2],
+                               ALfloat left, ALfloat right)
+{
+    const __m128 lrlr = { left, right, left, right };
+    __m128 vals = _mm_setzero_ps();
+    __m128 coeffs;
+    ALuint i;
+
+    if((Offset&1))
+    {
+        const ALuint o0 = Offset&HRIR_MASK;
+        const ALuint o1 = (Offset+IrSize-1)&HRIR_MASK;
+        __m128 imp0, imp1;
+
+        coeffs = _mm_load_ps(&Coeffs[0][0]);
+        vals = _mm_loadl_pi(vals, (__m64*)&Values[o0][0]);
+        imp0 = _mm_mul_ps(lrlr, coeffs);
+        vals = _mm_add_ps(imp0, vals);
+        _mm_storel_pi((__m64*)&Values[o0][0], vals);
+        for(i = 1;i < IrSize-1;i += 2)
+        {
+            const ALuint o2 = (Offset+i)&HRIR_MASK;
+
+            coeffs = _mm_load_ps(&Coeffs[i+1][0]);
+            vals = _mm_load_ps(&Values[o2][0]);
+            imp1 = _mm_mul_ps(lrlr, coeffs);
+            imp0 = _mm_shuffle_ps(imp0, imp1, _MM_SHUFFLE(1, 0, 3, 2));
+            vals = _mm_add_ps(imp0, vals);
+            _mm_store_ps(&Values[o2][0], vals);
+            imp0 = imp1;
+        }
+        vals = _mm_loadl_pi(vals, (__m64*)&Values[o1][0]);
+        imp0 = _mm_movehl_ps(imp0, imp0);
+        vals = _mm_add_ps(imp0, vals);
+        _mm_storel_pi((__m64*)&Values[o1][0], vals);
+    }
+    else
+    {
+        for(i = 0;i < IrSize;i += 2)
+        {
+            const ALuint o = (Offset + i)&HRIR_MASK;
+
+            coeffs = _mm_load_ps(&Coeffs[i][0]);
+            vals = _mm_load_ps(&Values[o][0]);
+            vals = _mm_add_ps(vals, _mm_mul_ps(lrlr, coeffs));
+            _mm_store_ps(&Values[o][0], vals);
+        }
+    }
+}
+
+#define SUFFIX SSE
+#include "mixer_inc.c"
+#undef SUFFIX
+
+
+void MixDirect_SSE(const DirectParams *params, const ALfloat *restrict data, ALuint srcchan,
+  ALuint OutPos, ALuint SamplesToDo, ALuint BufferSize)
+{
+    ALfloat (*restrict OutBuffer)[BUFFERSIZE] = params->OutBuffer;
+    ALfloat *restrict ClickRemoval = params->ClickRemoval;
+    ALfloat *restrict PendingClicks = params->PendingClicks;
+    ALfloat DrySend;
+    __m128 gain;
+    ALuint pos;
+    ALuint c;
+
+    for(c = 0;c < MaxChannels;c++)
+    {
+        DrySend = params->Gains[srcchan][c];
+        if(!(DrySend > GAIN_SILENCE_THRESHOLD))
+            continue;
+
+        if(OutPos == 0)
+            ClickRemoval[c] -= data[0]*DrySend;
+
+        gain = _mm_set1_ps(DrySend);
+        for(pos = 0;BufferSize-pos > 3;pos += 4)
+        {
+            const __m128 val4 = _mm_load_ps(&data[pos]);
+            __m128 dry4 = _mm_load_ps(&OutBuffer[c][OutPos+pos]);
+            dry4 = _mm_add_ps(dry4, _mm_mul_ps(val4, gain));
+            _mm_store_ps(&OutBuffer[c][OutPos+pos], dry4);
+        }
+        for(;pos < BufferSize;pos++)
+            OutBuffer[c][OutPos+pos] += data[pos]*DrySend;
+
+        if(OutPos+pos == SamplesToDo)
+            PendingClicks[c] += data[pos]*DrySend;
+    }
+}
+
+
+void MixSend_SSE(const SendParams *params, const ALfloat *restrict data,
+  ALuint OutPos, ALuint SamplesToDo, ALuint BufferSize)
+{
+    ALfloat (*restrict OutBuffer)[BUFFERSIZE] = params->OutBuffer;
+    ALfloat *restrict ClickRemoval = params->ClickRemoval;
+    ALfloat *restrict PendingClicks = params->PendingClicks;
+    ALfloat WetGain;
+    __m128 gain;
+    ALuint pos;
+
+    WetGain = params->Gain;
+    if(!(WetGain > GAIN_SILENCE_THRESHOLD))
+        return;
+
+    if(OutPos == 0)
+        ClickRemoval[0] -= data[0] * WetGain;
+
+    gain = _mm_set1_ps(WetGain);
+    for(pos = 0;BufferSize-pos > 3;pos += 4)
+    {
+        const __m128 val4 = _mm_load_ps(&data[pos]);
+        __m128 wet4 = _mm_load_ps(&OutBuffer[0][OutPos+pos]);
+        wet4 = _mm_add_ps(wet4, _mm_mul_ps(val4, gain));
+        _mm_store_ps(&OutBuffer[0][OutPos+pos], wet4);
+    }
+    for(;pos < BufferSize;pos++)
+        OutBuffer[0][OutPos+pos] += data[pos] * WetGain;
+
+    if(OutPos+pos == SamplesToDo)
+        PendingClicks[0] += data[pos] * WetGain;
+}

+ 280 - 144
jni/openal-soft-android/Alc/panning.c

@@ -31,8 +31,10 @@
 #include "AL/alc.h"
 #include "alu.h"
 
-static void SetSpeakerArrangement(const char *name, ALfloat SpeakerAngle[MAXCHANNELS],
-                                  enum Channel Speaker2Chan[MAXCHANNELS], ALint chans)
+extern inline void SetGains(const ALCdevice *device, ALfloat ingain, ALfloat gains[MaxChannels]);
+
+static void SetSpeakerArrangement(const char *name, ALfloat SpeakerAngle[MaxChannels],
+                                  enum Channel Speaker2Chan[MaxChannels], ALint chans)
 {
     char *confkey, *next;
     char *layout_str;
@@ -71,21 +73,21 @@ static void SetSpeakerArrangement(const char *name, ALfloat SpeakerAngle[MAXCHAN
         *(++end) = 0;
 
         if(strcmp(confkey, "fl") == 0 || strcmp(confkey, "front-left") == 0)
-            val = FRONT_LEFT;
+            val = FrontLeft;
         else if(strcmp(confkey, "fr") == 0 || strcmp(confkey, "front-right") == 0)
-            val = FRONT_RIGHT;
+            val = FrontRight;
         else if(strcmp(confkey, "fc") == 0 || strcmp(confkey, "front-center") == 0)
-            val = FRONT_CENTER;
+            val = FrontCenter;
         else if(strcmp(confkey, "bl") == 0 || strcmp(confkey, "back-left") == 0)
-            val = BACK_LEFT;
+            val = BackLeft;
         else if(strcmp(confkey, "br") == 0 || strcmp(confkey, "back-right") == 0)
-            val = BACK_RIGHT;
+            val = BackRight;
         else if(strcmp(confkey, "bc") == 0 || strcmp(confkey, "back-center") == 0)
-            val = BACK_CENTER;
+            val = BackCenter;
         else if(strcmp(confkey, "sl") == 0 || strcmp(confkey, "side-left") == 0)
-            val = SIDE_LEFT;
+            val = SideLeft;
         else if(strcmp(confkey, "sr") == 0 || strcmp(confkey, "side-right") == 0)
-            val = SIDE_RIGHT;
+            val = SideRight;
         else
         {
             ERR("Unknown speaker for %s: \"%s\"\n", name, confkey);
@@ -102,7 +104,7 @@ static void SetSpeakerArrangement(const char *name, ALfloat SpeakerAngle[MAXCHAN
             {
                 long angle = strtol(sep, NULL, 10);
                 if(angle >= -180 && angle <= 180)
-                    SpeakerAngle[i] = angle * F_PI/180.0f;
+                    SpeakerAngle[i] = DEG2RAD(angle);
                 else
                     ERR("Invalid angle for speaker \"%s\": %ld\n", confkey, angle);
                 break;
@@ -139,176 +141,310 @@ static void SetSpeakerArrangement(const char *name, ALfloat SpeakerAngle[MAXCHAN
     }
 }
 
-static ALfloat aluLUTpos2Angle(ALint pos)
-{
-    if(pos < QUADRANT_NUM)
-        return aluAtan((ALfloat)pos / (ALfloat)(QUADRANT_NUM - pos));
-    if(pos < 2 * QUADRANT_NUM)
-        return F_PI_2 + aluAtan((ALfloat)(pos - QUADRANT_NUM) / (ALfloat)(2 * QUADRANT_NUM - pos));
-    if(pos < 3 * QUADRANT_NUM)
-        return aluAtan((ALfloat)(pos - 2 * QUADRANT_NUM) / (ALfloat)(3 * QUADRANT_NUM - pos)) - F_PI;
-    return aluAtan((ALfloat)(pos - 3 * QUADRANT_NUM) / (ALfloat)(4 * QUADRANT_NUM - pos)) - F_PI_2;
-}
 
-ALint aluCart2LUTpos(ALfloat re, ALfloat im)
+void ComputeAngleGains(const ALCdevice *device, ALfloat angle, ALfloat hwidth, ALfloat ingain, ALfloat gains[MaxChannels])
 {
-    ALint pos = 0;
-    ALfloat denom = aluFabs(re) + aluFabs(im);
-    if(denom > 0.0f)
-        pos = (ALint)(QUADRANT_NUM*aluFabs(im) / denom + 0.5);
-
-    if(re < 0.0f)
-        pos = 2 * QUADRANT_NUM - pos;
-    if(im < 0.0f)
-        pos = LUT_NUM - pos;
-    return pos%LUT_NUM;
+    ALfloat tmpgains[MaxChannels] = { 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f };
+    enum Channel Speaker2Chan[MaxChannels];
+    ALfloat SpeakerAngle[MaxChannels];
+    ALfloat langle, rangle;
+    ALfloat a;
+    ALuint i;
+
+    for(i = 0;i < device->NumChan;i++)
+        Speaker2Chan[i] = device->Speaker2Chan[i];
+    for(i = 0;i < device->NumChan;i++)
+        SpeakerAngle[i] = device->SpeakerAngle[i];
+
+    /* Some easy special-cases first... */
+    if(device->NumChan <= 1 || hwidth >= F_PI)
+    {
+        /* Full coverage for all speakers. */
+        for(i = 0;i < MaxChannels;i++)
+            gains[i] = 0.0f;
+        for(i = 0;i < device->NumChan;i++)
+        {
+            enum Channel chan = Speaker2Chan[i];
+            gains[chan] = ingain;
+        }
+        return;
+    }
+    if(hwidth <= 0.0f)
+    {
+        /* Infinitely small sound point. */
+        for(i = 0;i < MaxChannels;i++)
+            gains[i] = 0.0f;
+        for(i = 0;i < device->NumChan-1;i++)
+        {
+            if(angle >= SpeakerAngle[i] && angle < SpeakerAngle[i+1])
+            {
+                /* Sound is between speakers i and i+1 */
+                a =             (angle-SpeakerAngle[i]) /
+                    (SpeakerAngle[i+1]-SpeakerAngle[i]);
+                gains[Speaker2Chan[i]]   = sqrtf(1.0f-a) * ingain;
+                gains[Speaker2Chan[i+1]] = sqrtf(     a) * ingain;
+                return;
+            }
+        }
+        /* Sound is between last and first speakers */
+        if(angle < SpeakerAngle[0])
+            angle += F_2PI;
+        a =                   (angle-SpeakerAngle[i]) /
+            (F_2PI + SpeakerAngle[0]-SpeakerAngle[i]);
+        gains[Speaker2Chan[i]] = sqrtf(1.0f-a) * ingain;
+        gains[Speaker2Chan[0]] = sqrtf(     a) * ingain;
+        return;
+    }
+
+    if(fabsf(angle)+hwidth > F_PI)
+    {
+        /* The coverage area would go outside of -pi...+pi. Instead, rotate the
+         * speaker angles so it would be as if angle=0, and keep them wrapped
+         * within -pi...+pi. */
+        if(angle > 0.0f)
+        {
+            ALuint done;
+            ALuint i = 0;
+            while(i < device->NumChan && device->SpeakerAngle[i]-angle < -F_PI)
+                i++;
+            for(done = 0;i < device->NumChan;done++)
+            {
+                SpeakerAngle[done] = device->SpeakerAngle[i]-angle;
+                Speaker2Chan[done] = device->Speaker2Chan[i];
+                i++;
+            }
+            for(i = 0;done < device->NumChan;i++)
+            {
+                SpeakerAngle[done] = device->SpeakerAngle[i]-angle + F_2PI;
+                Speaker2Chan[done] = device->Speaker2Chan[i];
+                done++;
+            }
+        }
+        else
+        {
+            /* NOTE: '< device->NumChan' on the iterators is correct here since
+             * we need to handle index 0. Because the iterators are unsigned,
+             * they'll underflow and wrap to become 0xFFFFFFFF, which will
+             * break as expected. */
+            ALuint done;
+            ALuint i = device->NumChan-1;
+            while(i < device->NumChan && device->SpeakerAngle[i]-angle > F_PI)
+                i--;
+            for(done = device->NumChan-1;i < device->NumChan;done--)
+            {
+                SpeakerAngle[done] = device->SpeakerAngle[i]-angle;
+                Speaker2Chan[done] = device->Speaker2Chan[i];
+                i--;
+            }
+            for(i = device->NumChan-1;done < device->NumChan;i--)
+            {
+                SpeakerAngle[done] = device->SpeakerAngle[i]-angle - F_2PI;
+                Speaker2Chan[done] = device->Speaker2Chan[i];
+                done--;
+            }
+        }
+        angle = 0.0f;
+    }
+    langle = angle - hwidth;
+    rangle = angle + hwidth;
+
+    /* First speaker */
+    i = 0;
+    do {
+        ALuint last = device->NumChan-1;
+        enum Channel chan = Speaker2Chan[i];
+
+        if(SpeakerAngle[i] >= langle && SpeakerAngle[i] <= rangle)
+        {
+            tmpgains[chan] = 1.0f;
+            continue;
+        }
+
+        if(SpeakerAngle[i] < langle && SpeakerAngle[i+1] > langle)
+        {
+            a =            (langle-SpeakerAngle[i]) /
+                (SpeakerAngle[i+1]-SpeakerAngle[i]);
+            tmpgains[chan] = lerp(tmpgains[chan], 1.0f, 1.0f-a);
+        }
+        if(SpeakerAngle[i] > rangle)
+        {
+            a =          (F_2PI + rangle-SpeakerAngle[last]) /
+                (F_2PI + SpeakerAngle[i]-SpeakerAngle[last]);
+            tmpgains[chan] = lerp(tmpgains[chan], 1.0f, a);
+        }
+        else if(SpeakerAngle[last] < rangle)
+        {
+            a =                  (rangle-SpeakerAngle[last]) /
+                (F_2PI + SpeakerAngle[i]-SpeakerAngle[last]);
+            tmpgains[chan] = lerp(tmpgains[chan], 1.0f, a);
+        }
+    } while(0);
+
+    for(i = 1;i < device->NumChan-1;i++)
+    {
+        enum Channel chan = Speaker2Chan[i];
+        if(SpeakerAngle[i] >= langle && SpeakerAngle[i] <= rangle)
+        {
+            tmpgains[chan] = 1.0f;
+            continue;
+        }
+
+        if(SpeakerAngle[i] < langle && SpeakerAngle[i+1] > langle)
+        {
+            a =            (langle-SpeakerAngle[i]) /
+                (SpeakerAngle[i+1]-SpeakerAngle[i]);
+            tmpgains[chan] = lerp(tmpgains[chan], 1.0f, 1.0f-a);
+        }
+        if(SpeakerAngle[i] > rangle && SpeakerAngle[i-1] < rangle)
+        {
+            a =          (rangle-SpeakerAngle[i-1]) /
+                (SpeakerAngle[i]-SpeakerAngle[i-1]);
+            tmpgains[chan] = lerp(tmpgains[chan], 1.0f, a);
+        }
+    }
+
+    /* Last speaker */
+    i = device->NumChan-1;
+    do {
+        enum Channel chan = Speaker2Chan[i];
+        if(SpeakerAngle[i] >= langle && SpeakerAngle[i] <= rangle)
+        {
+            tmpgains[Speaker2Chan[i]] = 1.0f;
+            continue;
+        }
+        if(SpeakerAngle[i] > rangle && SpeakerAngle[i-1] < rangle)
+        {
+            a =          (rangle-SpeakerAngle[i-1]) /
+                (SpeakerAngle[i]-SpeakerAngle[i-1]);
+            tmpgains[chan] = lerp(tmpgains[chan], 1.0f, a);
+        }
+        if(SpeakerAngle[i] < langle)
+        {
+            a =                  (langle-SpeakerAngle[i]) /
+                (F_2PI + SpeakerAngle[0]-SpeakerAngle[i]);
+            tmpgains[chan] = lerp(tmpgains[chan], 1.0f, 1.0f-a);
+        }
+        else if(SpeakerAngle[0] > langle)
+        {
+            a =          (F_2PI + langle-SpeakerAngle[i]) /
+                (F_2PI + SpeakerAngle[0]-SpeakerAngle[i]);
+            tmpgains[chan] = lerp(tmpgains[chan], 1.0f, 1.0f-a);
+        }
+    } while(0);
+
+    for(i = 0;i < device->NumChan;i++)
+    {
+        enum Channel chan = device->Speaker2Chan[i];
+        gains[chan] = sqrtf(tmpgains[chan]) * ingain;
+    }
 }
 
+
 ALvoid aluInitPanning(ALCdevice *Device)
 {
-    ALfloat SpeakerAngle[MAXCHANNELS];
+    const char *layoutname = NULL;
     enum Channel *Speaker2Chan;
-    ALfloat Alpha, Theta;
-    ALint pos;
-    ALuint s;
+    ALfloat *SpeakerAngle;
 
     Speaker2Chan = Device->Speaker2Chan;
+    SpeakerAngle = Device->SpeakerAngle;
     switch(Device->FmtChans)
     {
         case DevFmtMono:
             Device->NumChan = 1;
-            Speaker2Chan[0] = FRONT_CENTER;
-            SpeakerAngle[0] = F_PI/180.0f * 0.0f;
+            Speaker2Chan[0] = FrontCenter;
+            SpeakerAngle[0] = DEG2RAD(0.0f);
+            layoutname = NULL;
             break;
 
         case DevFmtStereo:
             Device->NumChan = 2;
-            Speaker2Chan[0] = FRONT_LEFT;
-            Speaker2Chan[1] = FRONT_RIGHT;
-            SpeakerAngle[0] = F_PI/180.0f * -90.0f;
-            SpeakerAngle[1] = F_PI/180.0f *  90.0f;
-            SetSpeakerArrangement("layout_STEREO", SpeakerAngle, Speaker2Chan, Device->NumChan);
+            Speaker2Chan[0] = FrontLeft;
+            Speaker2Chan[1] = FrontRight;
+            SpeakerAngle[0] = DEG2RAD(-90.0f);
+            SpeakerAngle[1] = DEG2RAD( 90.0f);
+            layoutname = "layout_stereo";
             break;
 
         case DevFmtQuad:
             Device->NumChan = 4;
-            Speaker2Chan[0] = BACK_LEFT;
-            Speaker2Chan[1] = FRONT_LEFT;
-            Speaker2Chan[2] = FRONT_RIGHT;
-            Speaker2Chan[3] = BACK_RIGHT;
-            SpeakerAngle[0] = F_PI/180.0f * -135.0f;
-            SpeakerAngle[1] = F_PI/180.0f *  -45.0f;
-            SpeakerAngle[2] = F_PI/180.0f *   45.0f;
-            SpeakerAngle[3] = F_PI/180.0f *  135.0f;
-            SetSpeakerArrangement("layout_QUAD", SpeakerAngle, Speaker2Chan, Device->NumChan);
+            Speaker2Chan[0] = BackLeft;
+            Speaker2Chan[1] = FrontLeft;
+            Speaker2Chan[2] = FrontRight;
+            Speaker2Chan[3] = BackRight;
+            SpeakerAngle[0] = DEG2RAD(-135.0f);
+            SpeakerAngle[1] = DEG2RAD( -45.0f);
+            SpeakerAngle[2] = DEG2RAD(  45.0f);
+            SpeakerAngle[3] = DEG2RAD( 135.0f);
+            layoutname = "layout_quad";
             break;
 
         case DevFmtX51:
             Device->NumChan = 5;
-            Speaker2Chan[0] = BACK_LEFT;
-            Speaker2Chan[1] = FRONT_LEFT;
-            Speaker2Chan[2] = FRONT_CENTER;
-            Speaker2Chan[3] = FRONT_RIGHT;
-            Speaker2Chan[4] = BACK_RIGHT;
-            SpeakerAngle[0] = F_PI/180.0f * -110.0f;
-            SpeakerAngle[1] = F_PI/180.0f *  -30.0f;
-            SpeakerAngle[2] = F_PI/180.0f *    0.0f;
-            SpeakerAngle[3] = F_PI/180.0f *   30.0f;
-            SpeakerAngle[4] = F_PI/180.0f *  110.0f;
-            SetSpeakerArrangement("layout_51CHN", SpeakerAngle, Speaker2Chan, Device->NumChan);
+            Speaker2Chan[0] = BackLeft;
+            Speaker2Chan[1] = FrontLeft;
+            Speaker2Chan[2] = FrontCenter;
+            Speaker2Chan[3] = FrontRight;
+            Speaker2Chan[4] = BackRight;
+            SpeakerAngle[0] = DEG2RAD(-110.0f);
+            SpeakerAngle[1] = DEG2RAD( -30.0f);
+            SpeakerAngle[2] = DEG2RAD(   0.0f);
+            SpeakerAngle[3] = DEG2RAD(  30.0f);
+            SpeakerAngle[4] = DEG2RAD( 110.0f);
+            layoutname = "layout_surround51";
             break;
 
         case DevFmtX51Side:
             Device->NumChan = 5;
-            Speaker2Chan[0] = SIDE_LEFT;
-            Speaker2Chan[1] = FRONT_LEFT;
-            Speaker2Chan[2] = FRONT_CENTER;
-            Speaker2Chan[3] = FRONT_RIGHT;
-            Speaker2Chan[4] = SIDE_RIGHT;
-            SpeakerAngle[0] = F_PI/180.0f * -90.0f;
-            SpeakerAngle[1] = F_PI/180.0f * -30.0f;
-            SpeakerAngle[2] = F_PI/180.0f *   0.0f;
-            SpeakerAngle[3] = F_PI/180.0f *  30.0f;
-            SpeakerAngle[4] = F_PI/180.0f *  90.0f;
-            SetSpeakerArrangement("layout_51SIDECHN", SpeakerAngle, Speaker2Chan, Device->NumChan);
+            Speaker2Chan[0] = SideLeft;
+            Speaker2Chan[1] = FrontLeft;
+            Speaker2Chan[2] = FrontCenter;
+            Speaker2Chan[3] = FrontRight;
+            Speaker2Chan[4] = SideRight;
+            SpeakerAngle[0] = DEG2RAD(-90.0f);
+            SpeakerAngle[1] = DEG2RAD(-30.0f);
+            SpeakerAngle[2] = DEG2RAD(  0.0f);
+            SpeakerAngle[3] = DEG2RAD( 30.0f);
+            SpeakerAngle[4] = DEG2RAD( 90.0f);
+            layoutname = "layout_side51";
             break;
 
         case DevFmtX61:
             Device->NumChan = 6;
-            Speaker2Chan[0] = SIDE_LEFT;
-            Speaker2Chan[1] = FRONT_LEFT;
-            Speaker2Chan[2] = FRONT_CENTER;
-            Speaker2Chan[3] = FRONT_RIGHT;
-            Speaker2Chan[4] = SIDE_RIGHT;
-            Speaker2Chan[5] = BACK_CENTER;
-            SpeakerAngle[0] = F_PI/180.0f * -90.0f;
-            SpeakerAngle[1] = F_PI/180.0f * -30.0f;
-            SpeakerAngle[2] = F_PI/180.0f *   0.0f;
-            SpeakerAngle[3] = F_PI/180.0f *  30.0f;
-            SpeakerAngle[4] = F_PI/180.0f *  90.0f;
-            SpeakerAngle[5] = F_PI/180.0f * 180.0f;
-            SetSpeakerArrangement("layout_61CHN", SpeakerAngle, Speaker2Chan, Device->NumChan);
+            Speaker2Chan[0] = SideLeft;
+            Speaker2Chan[1] = FrontLeft;
+            Speaker2Chan[2] = FrontCenter;
+            Speaker2Chan[3] = FrontRight;
+            Speaker2Chan[4] = SideRight;
+            Speaker2Chan[5] = BackCenter;
+            SpeakerAngle[0] = DEG2RAD(-90.0f);
+            SpeakerAngle[1] = DEG2RAD(-30.0f);
+            SpeakerAngle[2] = DEG2RAD(  0.0f);
+            SpeakerAngle[3] = DEG2RAD( 30.0f);
+            SpeakerAngle[4] = DEG2RAD( 90.0f);
+            SpeakerAngle[5] = DEG2RAD(180.0f);
+            layoutname = "layout_surround61";
             break;
 
         case DevFmtX71:
             Device->NumChan = 7;
-            Speaker2Chan[0] = BACK_LEFT;
-            Speaker2Chan[1] = SIDE_LEFT;
-            Speaker2Chan[2] = FRONT_LEFT;
-            Speaker2Chan[3] = FRONT_CENTER;
-            Speaker2Chan[4] = FRONT_RIGHT;
-            Speaker2Chan[5] = SIDE_RIGHT;
-            Speaker2Chan[6] = BACK_RIGHT;
-            SpeakerAngle[0] = F_PI/180.0f * -150.0f;
-            SpeakerAngle[1] = F_PI/180.0f *  -90.0f;
-            SpeakerAngle[2] = F_PI/180.0f *  -30.0f;
-            SpeakerAngle[3] = F_PI/180.0f *    0.0f;
-            SpeakerAngle[4] = F_PI/180.0f *   30.0f;
-            SpeakerAngle[5] = F_PI/180.0f *   90.0f;
-            SpeakerAngle[6] = F_PI/180.0f *  150.0f;
-            SetSpeakerArrangement("layout_71CHN", SpeakerAngle, Speaker2Chan, Device->NumChan);
+            Speaker2Chan[0] = BackLeft;
+            Speaker2Chan[1] = SideLeft;
+            Speaker2Chan[2] = FrontLeft;
+            Speaker2Chan[3] = FrontCenter;
+            Speaker2Chan[4] = FrontRight;
+            Speaker2Chan[5] = SideRight;
+            Speaker2Chan[6] = BackRight;
+            SpeakerAngle[0] = DEG2RAD(-150.0f);
+            SpeakerAngle[1] = DEG2RAD( -90.0f);
+            SpeakerAngle[2] = DEG2RAD( -30.0f);
+            SpeakerAngle[3] = DEG2RAD(   0.0f);
+            SpeakerAngle[4] = DEG2RAD(  30.0f);
+            SpeakerAngle[5] = DEG2RAD(  90.0f);
+            SpeakerAngle[6] = DEG2RAD( 150.0f);
+            layoutname = "layout_surround71";
             break;
     }
-
-    for(pos = 0; pos < LUT_NUM; pos++)
-    {
-        ALfloat *PanningLUT = Device->PanningLUT[pos];
-
-        /* clear all values */
-        for(s = 0; s < MAXCHANNELS; s++)
-            PanningLUT[s] = 0.0f;
-
-        if(Device->NumChan == 1)
-        {
-            PanningLUT[Speaker2Chan[0]] = 1.0f;
-            continue;
-        }
-
-        /* source angle */
-        Theta = aluLUTpos2Angle(pos);
-
-        /* set panning values */
-        for(s = 0; s < Device->NumChan - 1; s++)
-        {
-            if(Theta >= SpeakerAngle[s] && Theta < SpeakerAngle[s+1])
-            {
-                /* source between speaker s and speaker s+1 */
-                Alpha = (Theta-SpeakerAngle[s]) /
-                        (SpeakerAngle[s+1]-SpeakerAngle[s]);
-                PanningLUT[Speaker2Chan[s]]   = aluSqrt(1.0f-Alpha);
-                PanningLUT[Speaker2Chan[s+1]] = aluSqrt(     Alpha);
-                break;
-            }
-        }
-        if(s == Device->NumChan - 1)
-        {
-            /* source between last and first speaker */
-            if(Theta < SpeakerAngle[0])
-                Theta += F_PI*2.0f;
-            Alpha = (Theta-SpeakerAngle[s]) /
-                    (F_PI*2.0f + SpeakerAngle[0]-SpeakerAngle[s]);
-            PanningLUT[Speaker2Chan[s]] = aluSqrt(1.0f-Alpha);
-            PanningLUT[Speaker2Chan[0]] = aluSqrt(     Alpha);
-        }
-    }
+    if(layoutname && Device->Type != Loopback)
+        SetSpeakerArrangement(layoutname, SpeakerAngle, Speaker2Chan, Device->NumChan);
 }

+ 21 - 0
jni/openal-soft-android/Alc/rwlock.h

@@ -0,0 +1,21 @@
+#ifndef AL_RWLOCK_H
+#define AL_RWLOCK_H
+
+#include "AL/al.h"
+#include "atomic.h"
+
+typedef struct {
+    volatile RefCount read_count;
+    volatile RefCount write_count;
+    volatile ALenum read_lock;
+    volatile ALenum read_entry_lock;
+    volatile ALenum write_lock;
+} RWLock;
+
+void RWLockInit(RWLock *lock);
+void ReadLock(RWLock *lock);
+void ReadUnlock(RWLock *lock);
+void WriteLock(RWLock *lock);
+void WriteUnlock(RWLock *lock);
+
+#endif /* AL_RWLOCK_H */

+ 200 - 0
jni/openal-soft-android/Alc/threads.c

@@ -0,0 +1,200 @@
+/**
+ * OpenAL cross platform audio library
+ * Copyright (C) 1999-2007 by authors.
+ * This library is free software; you can redistribute it and/or
+ *  modify it under the terms of the GNU Library General Public
+ *  License as published by the Free Software Foundation; either
+ *  version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ *  but WITHOUT ANY WARRANTY; without even the implied warranty of
+ *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ *  Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public
+ *  License along with this library; if not, write to the
+ *  Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+ *  Boston, MA  02111-1307, USA.
+ * Or go to http://www.gnu.org/copyleft/lgpl.html
+ */
+
+#include "config.h"
+
+#include "threads.h"
+
+#include <stdlib.h>
+#include <errno.h>
+
+#include "alMain.h"
+#include "alThunk.h"
+
+#define THREAD_STACK_SIZE (1*1024*1024) /* 1MB */
+
+#ifdef _WIN32
+
+#define WIN32_LEAN_AND_MEAN
+#include <windows.h>
+
+typedef struct althread_info {
+    ALuint (*func)(ALvoid*);
+    ALvoid *ptr;
+    HANDLE hdl;
+} althread_info;
+
+static DWORD CALLBACK StarterFunc(void *ptr)
+{
+    althread_info *inf = (althread_info*)ptr;
+    ALuint ret;
+
+    ret = inf->func(inf->ptr);
+    ExitThread((DWORD)ret);
+
+    return (DWORD)ret;
+}
+
+
+ALboolean StartThread(althread_t *thread, ALuint (*func)(ALvoid*), ALvoid *ptr)
+{
+    althread_info *info;
+    DWORD dummy;
+
+    info = malloc(sizeof(*info));
+    if(!info) return AL_FALSE;
+
+    info->func = func;
+    info->ptr = ptr;
+
+    info->hdl = CreateThread(NULL, THREAD_STACK_SIZE, StarterFunc, info, 0, &dummy);
+    if(!info->hdl)
+    {
+        free(info);
+        return AL_FALSE;
+    }
+
+    *thread = info;
+    return AL_TRUE;
+}
+
+ALuint StopThread(althread_t thread)
+{
+    DWORD ret = 0;
+
+    WaitForSingleObject(thread->hdl, INFINITE);
+    GetExitCodeThread(thread->hdl, &ret);
+    CloseHandle(thread->hdl);
+
+    free(thread);
+
+    return (ALuint)ret;
+}
+
+
+void SetThreadName(const char *name)
+{
+#if defined(_MSC_VER)
+#define MS_VC_EXCEPTION 0x406D1388
+    struct {
+        DWORD dwType;     // Must be 0x1000.
+        LPCSTR szName;    // Pointer to name (in user addr space).
+        DWORD dwThreadID; // Thread ID (-1=caller thread).
+        DWORD dwFlags;    // Reserved for future use, must be zero.
+    } info;
+    info.dwType = 0x1000;
+    info.szName = name;
+    info.dwThreadID = -1;
+    info.dwFlags = 0;
+
+    __try {
+        RaiseException(MS_VC_EXCEPTION, 0, sizeof(info)/sizeof(DWORD), (ULONG_PTR*)&info);
+    }
+    __except(EXCEPTION_CONTINUE_EXECUTION) {
+    }
+#undef MS_VC_EXCEPTION
+#else
+    TRACE("Can't set thread %04lx name to \"%s\"\n", GetCurrentThreadId(), name);
+#endif
+}
+
+#else
+
+#include <pthread.h>
+
+typedef struct althread_info {
+    ALuint (*func)(ALvoid*);
+    ALvoid *ptr;
+    ALuint ret;
+    pthread_t hdl;
+} althread_info;
+
+static void *StarterFunc(void *ptr)
+{
+    althread_info *inf = (althread_info*)ptr;
+    inf->ret = inf->func(inf->ptr);
+    return NULL;
+}
+
+
+ALboolean StartThread(althread_t *thread, ALuint (*func)(ALvoid*), ALvoid *ptr)
+{
+    pthread_attr_t attr;
+    althread_info *info;
+
+    info = malloc(sizeof(*info));
+    if(!info) return AL_FALSE;
+
+    if(pthread_attr_init(&attr) != 0)
+    {
+        free(info);
+        return AL_FALSE;
+    }
+    if(pthread_attr_setstacksize(&attr, THREAD_STACK_SIZE) != 0)
+    {
+        pthread_attr_destroy(&attr);
+        free(info);
+        return AL_FALSE;
+    }
+
+    info->func = func;
+    info->ptr = ptr;
+    if(pthread_create(&info->hdl, &attr, StarterFunc, info) != 0)
+    {
+        pthread_attr_destroy(&attr);
+        free(info);
+        return AL_FALSE;
+    }
+    pthread_attr_destroy(&attr);
+
+    *thread = info;
+    return AL_TRUE;
+}
+
+ALuint StopThread(althread_t thread)
+{
+    ALuint ret;
+
+    pthread_join(thread->hdl, NULL);
+    ret = thread->ret;
+
+    free(thread);
+
+    return ret;
+}
+
+
+void SetThreadName(const char *name)
+{
+#if defined(HAVE_PTHREAD_SETNAME_NP)
+#if defined(__GNUC__)
+    if(pthread_setname_np(pthread_self(), name) != 0)
+#elif defined(__APPLE__)
+    if(pthread_setname_np(name) != 0)
+#endif
+        WARN("Failed to set thread name to \"%s\": %s\n", name, strerror(errno));
+#elif defined(HAVE_PTHREAD_SET_NAME_NP)
+    pthread_set_name_np(pthread_self(), name);
+#else
+    TRACE("Can't set thread name to \"%s\"\n", name);
+#endif
+}
+
+#endif

+ 34 - 0
jni/openal-soft-android/Alc/uintmap.h

@@ -0,0 +1,34 @@
+#ifndef AL_UINTMAP_H
+#define AL_UINTMAP_H
+
+#include "AL/al.h"
+#include "rwlock.h"
+
+typedef struct UIntMap {
+    struct {
+        ALuint key;
+        ALvoid *value;
+    } *array;
+    ALsizei size;
+    ALsizei maxsize;
+    ALsizei limit;
+    RWLock lock;
+} UIntMap;
+extern UIntMap TlsDestructor;
+
+void InitUIntMap(UIntMap *map, ALsizei limit);
+void ResetUIntMap(UIntMap *map);
+ALenum InsertUIntMapEntry(UIntMap *map, ALuint key, ALvoid *value);
+ALvoid *RemoveUIntMapKey(UIntMap *map, ALuint key);
+ALvoid *LookupUIntMapKey(UIntMap *map, ALuint key);
+
+inline void LockUIntMapRead(UIntMap *map)
+{ ReadLock(&map->lock); }
+inline void UnlockUIntMapRead(UIntMap *map)
+{ ReadUnlock(&map->lock); }
+inline void LockUIntMapWrite(UIntMap *map)
+{ WriteLock(&map->lock); }
+inline void UnlockUIntMapWrite(UIntMap *map)
+{ WriteUnlock(&map->lock); }
+
+#endif /* AL_UINTMAP_H */

+ 18 - 8
jni/openal-soft-android/Android.mk

@@ -4,24 +4,34 @@ LOCAL_PATH:= $(call my-dir)
 include $(CLEAR_VARS)
 
 LOCAL_MODULE    := libopenal
-LOCAL_CFLAGS    := -fexceptions -g -Dlinux -DAL_ALEXT_PROTOTYPES=1 -DHAVE_GCC_DESTRUCTOR=1 -DOPT_GENERIC -DREAL_IS_FLOAT
+LOCAL_CFLAGS    := -DAL_ALEXT_PROTOTYPES -DAL_BUILD_LIBRARY -DAL_LIBTYPE_STATIC -D_GNU_SOURCE=1 -D_POSIX_C_SOURCE=200809L -D_XOPEN_SOURCE=700 -std=c99 -Drestrict=__restrict
+
 LOCAL_CPPFLAGS  := ${LOCAL_CFLAGS}
 
 LOCAL_C_INCLUDES  :=  \
 	${LOCAL_PATH}/include \
+	${LOCAL_PATH}/Alc \
 	${LOCAL_PATH}/OpenAL32/Include
 		
 LOCAL_SRC_FILES := \
-	$(filter-out , $(subst $(LOCAL_PATH)/,,\
-	${LOCAL_PATH}/Alc/backends/loopback.c \
-	${LOCAL_PATH}/Alc/backends/null.c \
-	${LOCAL_PATH}/Alc/backends/android.c \
-	${LOCAL_PATH}/Alc/backends/wave.c \
-	$(wildcard ${LOCAL_PATH}/Alc/*.c) \
-	$(wildcard ${LOCAL_PATH}/OpenAL32/*.c) \
+	$(filter-out \
+	 Alc/mixer_neon.c \
+	 Alc/mixer_sse.c \
+	, $(subst $(LOCAL_PATH)/,,\
+		${LOCAL_PATH}/Alc/backends/base.c \
+		${LOCAL_PATH}/Alc/backends/loopback.c \
+		${LOCAL_PATH}/Alc/backends/null.c \
+		${LOCAL_PATH}/Alc/backends/opensl.c \
+		${LOCAL_PATH}/Alc/backends/wave.c \
+		$(wildcard ${LOCAL_PATH}/Alc/midi/*.c) \
+		$(wildcard ${LOCAL_PATH}/Alc/effects/*.c) \
+		$(wildcard ${LOCAL_PATH}/Alc/*.c) \
+		$(wildcard ${LOCAL_PATH}/OpenAL32/*.c) \
 	))
 
 # $(info libopenal: include dirs $(LOCAL_C_INCLUDES))
 # $(info libopenal: src files $(LOCAL_SRC_FILES))
 
+LOCAL_LDLIBS := -llog -lOpenSLES
+
 include $(BUILD_STATIC_LIBRARY)

+ 0 - 498
jni/openal-soft-android/CMakeCache.txt

@@ -1,498 +0,0 @@
-# This is the CMakeCache file.
-# For build in directory: /home/hagish/workspace/adt/love-native-android/jni/openal-soft-android
-# It was generated by CMake: /usr/bin/cmake
-# You can edit this file to change values found and used by cmake.
-# If you do not want to change any of the values, simply exit the editor.
-# If you do want to change a value, simply edit, save, and exit the editor.
-# The syntax for the file is as follows:
-# KEY:TYPE=VALUE
-# KEY is the name of a variable in the cache.
-# TYPE is a hint to GUI's for the type of VALUE, DO NOT EDIT TYPE!.
-# VALUE is the current value for the KEY.
-
-########################
-# EXTERNAL cache entries
-########################
-
-//Check for ALSA backend
-ALSA:BOOL=ON
-
-//Install alsoft.conf configuration file
-ALSOFT_CONFIG:BOOL=OFF
-
-//Check for Android backend
-ANDROID:BOOL=ON
-
-//android API level
-ANDROID_API_LEVEL:STRING=5
-
-//Enable Android low-latency backend
-ANDROID_LOW_LATENCY:BOOL=OFF
-
-//archive
-CMAKE_AR:PATH=/opt/android-ndk-r6/toolchains/arm-linux-androideabi-4.4.3/prebuilt/linux-x86/bin/arm-linux-androideabi-ar
-
-//For backwards compatibility, what version of CMake commands and
-// syntax should this version of CMake try to support.
-CMAKE_BACKWARDS_COMPATIBILITY:STRING=2.4
-
-//Choose the type of build, options are: Debug Release RelWithDebInfo
-// MinSizeRel.
-CMAKE_BUILD_TYPE:STRING=RelWithDebInfo
-
-//Enable/Disable color output during build.
-CMAKE_COLOR_MAKEFILE:BOOL=ON
-
-//g++
-CMAKE_CXX_COMPILER:PATH=/opt/android-ndk-r6/toolchains/arm-linux-androideabi-4.4.3/prebuilt/linux-x86/bin/arm-linux-androideabi-g++
-
-//c++ flags
-CMAKE_CXX_FLAGS:STRING=--sysroot=/opt/android-ndk-r6/platforms/android-5/arch-arm -fPIC -DANDROID -Wno-psabi -fsigned-char -mthumb
-
-//C compiler.
-CMAKE_C_COMPILER:FILEPATH=/opt/android-ndk-r6/toolchains/arm-linux-androideabi-4.4.3/prebuilt/linux-x86/bin/arm-linux-androideabi-gcc
-
-//c flags
-CMAKE_C_FLAGS:STRING=--sysroot=/opt/android-ndk-r6/platforms/android-5/arch-arm -fPIC -DANDROID -Wno-psabi -fsigned-char -mthumb
-
-//Flags used by the compiler during debug builds.
-CMAKE_C_FLAGS_DEBUG:STRING=-g3 -D_DEBUG
-
-//Flags used by the compiler during release minsize builds.
-CMAKE_C_FLAGS_MINSIZEREL:STRING=-Os -DNDEBUG
-
-//Flags used by the compiler during release builds
-CMAKE_C_FLAGS_RELEASE:STRING=-O2 -fomit-frame-pointer -DNDEBUG
-
-//Flags used by the compiler during Release with Debug Info builds.
-CMAKE_C_FLAGS_RELWITHDEBINFO:STRING=-g -O2 -D_DEBUG
-
-//Library postfix for debug builds. Normally left blank.
-CMAKE_DEBUG_POSTFIX:STRING=
-
-//linker flags
-CMAKE_EXE_LINKER_FLAGS:STRING=-Wl,--fix-cortex-a8 -L"/opt/android-ndk-r6/sources/cxx-stl/gnu-libstdc++/libs/armeabi" -L"/usr/local/libs/armeabi" -lstdc++ -lsupc++
-
-//Flags used by the linker during debug builds.
-CMAKE_EXE_LINKER_FLAGS_DEBUG:STRING=
-
-//Flags used by the linker during release minsize builds.
-CMAKE_EXE_LINKER_FLAGS_MINSIZEREL:STRING=
-
-//Flags used by the linker during release builds.
-CMAKE_EXE_LINKER_FLAGS_RELEASE:STRING=
-
-//Flags used by the linker during Release with Debug Info builds.
-CMAKE_EXE_LINKER_FLAGS_RELWITHDEBINFO:STRING=
-
-//Install path prefix, prepended onto install directories.
-CMAKE_INSTALL_PREFIX:PATH=/usr/local
-
-//linker
-CMAKE_LINKER:PATH=/opt/android-ndk-r6/toolchains/arm-linux-androideabi-4.4.3/prebuilt/linux-x86/bin/arm-linux-androideabi-ld
-
-//Path to a program.
-CMAKE_MAKE_PROGRAM:FILEPATH=/usr/bin/make
-
-//linker flags
-CMAKE_MODULE_LINKER_FLAGS:STRING=-Wl,--fix-cortex-a8 -L"/opt/android-ndk-r6/sources/cxx-stl/gnu-libstdc++/libs/armeabi" -L"/usr/local/libs/armeabi" -lstdc++ -lsupc++
-
-//Flags used by the linker during debug builds.
-CMAKE_MODULE_LINKER_FLAGS_DEBUG:STRING=
-
-//Flags used by the linker during release minsize builds.
-CMAKE_MODULE_LINKER_FLAGS_MINSIZEREL:STRING=
-
-//Flags used by the linker during release builds.
-CMAKE_MODULE_LINKER_FLAGS_RELEASE:STRING=
-
-//Flags used by the linker during Release with Debug Info builds.
-CMAKE_MODULE_LINKER_FLAGS_RELWITHDEBINFO:STRING=
-
-//nm
-CMAKE_NM:PATH=/opt/android-ndk-r6/toolchains/arm-linux-androideabi-4.4.3/prebuilt/linux-x86/bin/arm-linux-androideabi-nm
-
-//objcopy
-CMAKE_OBJCOPY:PATH=/opt/android-ndk-r6/toolchains/arm-linux-androideabi-4.4.3/prebuilt/linux-x86/bin/arm-linux-androideabi-objcopy
-
-//objdump
-CMAKE_OBJDUMP:PATH=/opt/android-ndk-r6/toolchains/arm-linux-androideabi-4.4.3/prebuilt/linux-x86/bin/arm-linux-androideabi-objdump
-
-//Value Computed by CMake
-CMAKE_PROJECT_NAME:STATIC=OpenAL
-
-//ranlib
-CMAKE_RANLIB:PATH=/opt/android-ndk-r6/toolchains/arm-linux-androideabi-4.4.3/prebuilt/linux-x86/bin/arm-linux-androideabi-ranlib
-
-//linker flags
-CMAKE_SHARED_LINKER_FLAGS:STRING=-Wl,--fix-cortex-a8 -L"/opt/android-ndk-r6/sources/cxx-stl/gnu-libstdc++/libs/armeabi" -L"/usr/local/libs/armeabi" -lstdc++ -lsupc++
-
-//Flags used by the linker during debug builds.
-CMAKE_SHARED_LINKER_FLAGS_DEBUG:STRING=
-
-//Flags used by the linker during release minsize builds.
-CMAKE_SHARED_LINKER_FLAGS_MINSIZEREL:STRING=
-
-//Flags used by the linker during release builds.
-CMAKE_SHARED_LINKER_FLAGS_RELEASE:STRING=
-
-//Flags used by the linker during Release with Debug Info builds.
-CMAKE_SHARED_LINKER_FLAGS_RELWITHDEBINFO:STRING=
-
-//If set, runtime paths are not added when using shared libraries.
-CMAKE_SKIP_RPATH:BOOL=OFF
-
-//strip
-CMAKE_STRIP:PATH=/opt/android-ndk-r6/toolchains/arm-linux-androideabi-4.4.3/prebuilt/linux-x86/bin/arm-linux-androideabi-strip
-
-//The CMake toolchain file
-CMAKE_TOOLCHAIN_FILE:FILEPATH=/home/hagish/workspace/adt/love-native-android/jni/openal-soft-android/toolchain.android.cmake
-
-//If true, cmake will use relative paths in makefiles and projects.
-CMAKE_USE_RELATIVE_PATHS:BOOL=OFF
-
-//If this value is on, makefiles will be generated without the
-// .SILENT directive, and all commands will be echoed to the console
-// during the make.  This is useful for debugging only. With Visual
-// Studio IDE projects all commands are done without /nologo.
-CMAKE_VERBOSE_MAKEFILE:BOOL=OFF
-
-//Check for CoreAudio backend
-COREAUDIO:BOOL=ON
-
-//Check for the dlopen API for loading optional libs
-DLOPEN:BOOL=ON
-
-//Check for DirectSound backend
-DSOUND:BOOL=ON
-
-//Single output directory for building all executables.
-EXECUTABLE_OUTPUT_PATH:PATH=
-
-//Use 32-bit ARM instructions instead of Thumb-1
-FORCE_ARM:BOOL=OFF
-
-//Single output directory for building all libraries.
-LIBRARY_OUTPUT_PATH:PATH=
-
-//Check for MMDevApi
-MMDEVAPI:BOOL=ON
-
-NDK_CPU_ARM:BOOL=ON
-
-//Check for OpenSL backend
-OPENSL:BOOL=ON
-
-//Check for OSS backend
-OSS:BOOL=ON
-
-//Value Computed by CMake
-OpenAL_BINARY_DIR:STATIC=/home/hagish/workspace/adt/love-native-android/jni/openal-soft-android
-
-//Value Computed by CMake
-OpenAL_SOURCE_DIR:STATIC=/home/hagish/workspace/adt/love-native-android/jni/openal-soft-android
-
-//Check for PortAudio backend
-PORTAUDIO:BOOL=ON
-
-//Check for PulseAudio backend
-PULSEAUDIO:BOOL=ON
-
-//Require ALSA backend
-REQUIRE_ALSA:BOOL=OFF
-
-//Require Android backend
-REQUIRE_ANDROID:BOOL=OFF
-
-//Require CoreAudio backend
-REQUIRE_COREAUDIO:BOOL=OFF
-
-//Require DirectSound backend
-REQUIRE_DSOUND:BOOL=OFF
-
-//Require MMDevApi
-REQUIRE_MMDEVAPI:BOOL=OFF
-
-//Require OpenSL backend
-REQUIRE_OPENSL:BOOL=OFF
-
-//Require OSS backend
-REQUIRE_OSS:BOOL=OFF
-
-//Require PortAudio backend
-REQUIRE_PORTAUDIO:BOOL=OFF
-
-//Require PulseAudio backend
-REQUIRE_PULSEAUDIO:BOOL=OFF
-
-//Require SndIO backend
-REQUIRE_SNDIO:BOOL=OFF
-
-//Require Solaris backend
-REQUIRE_SOLARIS:BOOL=OFF
-
-//Require Windows Multimedia backend
-REQUIRE_WINMM:BOOL=OFF
-
-//Check for SndIO backend
-SNDIO:BOOL=ON
-
-//Check for Solaris backend
-SOLARIS:BOOL=ON
-
-//Build and install utility programs
-UTILS:BOOL=ON
-
-//Enable Wave Writer backend
-WAVE:BOOL=ON
-
-//Treat compile warnings as errors
-WERROR:BOOL=OFF
-
-//Check for Windows Multimedia backend
-WINMM:BOOL=ON
-
-//Dependencies for the target
-openal_LIB_DEPENDS:STATIC=general;dl;general;m;
-
-
-########################
-# INTERNAL cache entries
-########################
-
-//ADVANCED property for variable: CMAKE_AR
-CMAKE_AR-ADVANCED:INTERNAL=1
-//ADVANCED property for variable: CMAKE_BUILD_TOOL
-CMAKE_BUILD_TOOL-ADVANCED:INTERNAL=1
-//What is the target build tool cmake is generating for.
-CMAKE_BUILD_TOOL:INTERNAL=/usr/bin/make
-//This is the directory where this CMakeCache.txt was created
-CMAKE_CACHEFILE_DIR:INTERNAL=/home/hagish/workspace/adt/love-native-android/jni/openal-soft-android
-//Major version of cmake used to create the current loaded cache
-CMAKE_CACHE_MAJOR_VERSION:INTERNAL=2
-//Minor version of cmake used to create the current loaded cache
-CMAKE_CACHE_MINOR_VERSION:INTERNAL=8
-//Patch version of cmake used to create the current loaded cache
-CMAKE_CACHE_PATCH_VERSION:INTERNAL=3
-//ADVANCED property for variable: CMAKE_COLOR_MAKEFILE
-CMAKE_COLOR_MAKEFILE-ADVANCED:INTERNAL=1
-//Path to CMake executable.
-CMAKE_COMMAND:INTERNAL=/usr/bin/cmake
-//Path to cpack program executable.
-CMAKE_CPACK_COMMAND:INTERNAL=/usr/bin/cpack
-//Path to ctest program executable.
-CMAKE_CTEST_COMMAND:INTERNAL=/usr/bin/ctest
-//ADVANCED property for variable: CMAKE_C_COMPILER
-CMAKE_C_COMPILER-ADVANCED:INTERNAL=1
-CMAKE_C_COMPILER_WORKS:INTERNAL=1
-//ADVANCED property for variable: CMAKE_C_FLAGS
-CMAKE_C_FLAGS-ADVANCED:INTERNAL=1
-//ADVANCED property for variable: CMAKE_C_FLAGS_DEBUG
-CMAKE_C_FLAGS_DEBUG-ADVANCED:INTERNAL=1
-//ADVANCED property for variable: CMAKE_C_FLAGS_MINSIZEREL
-CMAKE_C_FLAGS_MINSIZEREL-ADVANCED:INTERNAL=1
-//ADVANCED property for variable: CMAKE_C_FLAGS_RELEASE
-CMAKE_C_FLAGS_RELEASE-ADVANCED:INTERNAL=1
-//ADVANCED property for variable: CMAKE_C_FLAGS_RELWITHDEBINFO
-CMAKE_C_FLAGS_RELWITHDEBINFO-ADVANCED:INTERNAL=1
-//Path to cache edit program executable.
-CMAKE_EDIT_COMMAND:INTERNAL=/usr/bin/cmake-gui
-//ADVANCED property for variable: CMAKE_EXE_LINKER_FLAGS
-CMAKE_EXE_LINKER_FLAGS-ADVANCED:INTERNAL=1
-//ADVANCED property for variable: CMAKE_EXE_LINKER_FLAGS_DEBUG
-CMAKE_EXE_LINKER_FLAGS_DEBUG-ADVANCED:INTERNAL=1
-//ADVANCED property for variable: CMAKE_EXE_LINKER_FLAGS_MINSIZEREL
-CMAKE_EXE_LINKER_FLAGS_MINSIZEREL-ADVANCED:INTERNAL=1
-//ADVANCED property for variable: CMAKE_EXE_LINKER_FLAGS_RELEASE
-CMAKE_EXE_LINKER_FLAGS_RELEASE-ADVANCED:INTERNAL=1
-//ADVANCED property for variable: CMAKE_EXE_LINKER_FLAGS_RELWITHDEBINFO
-CMAKE_EXE_LINKER_FLAGS_RELWITHDEBINFO-ADVANCED:INTERNAL=1
-//Name of generator.
-CMAKE_GENERATOR:INTERNAL=Unix Makefiles
-//Start directory with the top level CMakeLists.txt file for this
-// project
-CMAKE_HOME_DIRECTORY:INTERNAL=/home/hagish/workspace/adt/love-native-android/jni/openal-soft-android
-//Install .so files without execute permission.
-CMAKE_INSTALL_SO_NO_EXE:INTERNAL=1
-//ADVANCED property for variable: CMAKE_LINKER
-CMAKE_LINKER-ADVANCED:INTERNAL=1
-//ADVANCED property for variable: CMAKE_MAKE_PROGRAM
-CMAKE_MAKE_PROGRAM-ADVANCED:INTERNAL=1
-//ADVANCED property for variable: CMAKE_MODULE_LINKER_FLAGS
-CMAKE_MODULE_LINKER_FLAGS-ADVANCED:INTERNAL=1
-//ADVANCED property for variable: CMAKE_MODULE_LINKER_FLAGS_DEBUG
-CMAKE_MODULE_LINKER_FLAGS_DEBUG-ADVANCED:INTERNAL=1
-//ADVANCED property for variable: CMAKE_MODULE_LINKER_FLAGS_MINSIZEREL
-CMAKE_MODULE_LINKER_FLAGS_MINSIZEREL-ADVANCED:INTERNAL=1
-//ADVANCED property for variable: CMAKE_MODULE_LINKER_FLAGS_RELEASE
-CMAKE_MODULE_LINKER_FLAGS_RELEASE-ADVANCED:INTERNAL=1
-//ADVANCED property for variable: CMAKE_MODULE_LINKER_FLAGS_RELWITHDEBINFO
-CMAKE_MODULE_LINKER_FLAGS_RELWITHDEBINFO-ADVANCED:INTERNAL=1
-//ADVANCED property for variable: CMAKE_NM
-CMAKE_NM-ADVANCED:INTERNAL=1
-//number of local generators
-CMAKE_NUMBER_OF_LOCAL_GENERATORS:INTERNAL=1
-//ADVANCED property for variable: CMAKE_OBJCOPY
-CMAKE_OBJCOPY-ADVANCED:INTERNAL=1
-//ADVANCED property for variable: CMAKE_OBJDUMP
-CMAKE_OBJDUMP-ADVANCED:INTERNAL=1
-//ADVANCED property for variable: CMAKE_RANLIB
-CMAKE_RANLIB-ADVANCED:INTERNAL=1
-//Path to CMake installation.
-CMAKE_ROOT:INTERNAL=/usr/share/cmake-2.8
-//ADVANCED property for variable: CMAKE_SHARED_LINKER_FLAGS
-CMAKE_SHARED_LINKER_FLAGS-ADVANCED:INTERNAL=1
-//ADVANCED property for variable: CMAKE_SHARED_LINKER_FLAGS_DEBUG
-CMAKE_SHARED_LINKER_FLAGS_DEBUG-ADVANCED:INTERNAL=1
-//ADVANCED property for variable: CMAKE_SHARED_LINKER_FLAGS_MINSIZEREL
-CMAKE_SHARED_LINKER_FLAGS_MINSIZEREL-ADVANCED:INTERNAL=1
-//ADVANCED property for variable: CMAKE_SHARED_LINKER_FLAGS_RELEASE
-CMAKE_SHARED_LINKER_FLAGS_RELEASE-ADVANCED:INTERNAL=1
-//ADVANCED property for variable: CMAKE_SHARED_LINKER_FLAGS_RELWITHDEBINFO
-CMAKE_SHARED_LINKER_FLAGS_RELWITHDEBINFO-ADVANCED:INTERNAL=1
-//ADVANCED property for variable: CMAKE_SKIP_RPATH
-CMAKE_SKIP_RPATH-ADVANCED:INTERNAL=1
-//ADVANCED property for variable: CMAKE_STRIP
-CMAKE_STRIP-ADVANCED:INTERNAL=1
-//Suppress Warnings that are meant for the author of the CMakeLists.txt
-// files.
-CMAKE_SUPPRESS_DEVELOPER_WARNINGS:INTERNAL=FALSE
-//uname command
-CMAKE_UNAME:INTERNAL=/bin/uname
-//ADVANCED property for variable: CMAKE_USE_RELATIVE_PATHS
-CMAKE_USE_RELATIVE_PATHS-ADVANCED:INTERNAL=1
-//ADVANCED property for variable: CMAKE_VERBOSE_MAKEFILE
-CMAKE_VERBOSE_MAKEFILE-ADVANCED:INTERNAL=1
-//ADVANCED property for variable: FORCE_ARM
-FORCE_ARM-ADVANCED:INTERNAL=1
-//Have symbol acosf
-HAVE_ACOSF:INTERNAL=1
-//Have include alsa/asoundlib.h
-HAVE_ALSA_ASOUNDLIB_H:INTERNAL=
-//Have include android/api-level.h
-HAVE_ANDROID_API_LEVEL_H:INTERNAL=1
-//Have symbol __ANDROID_API__
-HAVE_ANDROID_INTERNAL:INTERNAL=1
-//Have include arm_neon.h
-HAVE_ARM_NEON_H:INTERNAL=
-//Have symbol asinf
-HAVE_ASINF:INTERNAL=1
-//Have symbol atan2f
-HAVE_ATAN2F:INTERNAL=1
-//Have symbol atanf
-HAVE_ATANF:INTERNAL=1
-//Have include /System/Library/Frameworks/CoreAudio.framework/Headers/CoreAudio.h
-HAVE_COREAUDIO_FRAMEWORK:INTERNAL=
-//Have symbol cosf
-HAVE_COSF:INTERNAL=1
-//Have include dlfcn.h
-HAVE_DLFCN_H:INTERNAL=1
-//Have include dsound.h
-HAVE_DSOUND_H:INTERNAL=
-//Have symbol fabsf
-HAVE_FABSF:INTERNAL=1
-//Have include fenv.h
-HAVE_FENV_H:INTERNAL=
-//Have include float.h
-HAVE_FLOAT_H:INTERNAL=1
-//Have symbol floorf
-HAVE_FLOORF:INTERNAL=1
-//Have include fpu_control.h
-HAVE_FPU_CONTROL_H:INTERNAL=
-//Test HAVE_GCC_DESTRUCTOR
-HAVE_GCC_DESTRUCTOR:INTERNAL=1
-//Test HAVE_GCC_FORMAT
-HAVE_GCC_FORMAT:INTERNAL=1
-//Test HAVE_GCC_PROTECTED_VISIBILITY
-HAVE_GCC_PROTECTED_VISIBILITY:INTERNAL=1
-//Have function gettimeofday
-HAVE_GETTIMEOFDAY:INTERNAL=1
-//Have include guiddef.h
-HAVE_GUIDDEF_H:INTERNAL=
-//Have include ieeefp.h
-HAVE_IEEEFP_H:INTERNAL=
-//Have include initguid.h
-HAVE_INITGUID_H:INTERNAL=
-//Have symbol isfinite
-HAVE_ISFINITE:INTERNAL=1
-//Have symbol isnan
-HAVE_ISNAN:INTERNAL=1
-//Have library dl
-HAVE_LIBDL:INTERNAL=1
-//Have library m
-HAVE_LIBM:INTERNAL=1
-//Have library pthread
-HAVE_LIBPTHREAD:INTERNAL=
-//Have library rt
-HAVE_LIBRT:INTERNAL=
-//Have symbol timeGetTime in winmm
-HAVE_LIBWINMM:INTERNAL=
-//Have symbol log10f
-HAVE_LOG10F:INTERNAL=1
-//Have function nanosleep
-HAVE_NANOSLEEP:INTERNAL=1
-//Have include portaudio.h
-HAVE_PORTAUDIO_H:INTERNAL=
-//Have symbol powf
-HAVE_POWF:INTERNAL=1
-//Test HAVE_PTHREAD
-HAVE_PTHREAD:INTERNAL=
-//Have include pthread.h
-HAVE_PTHREAD_H:INTERNAL=1
-//Have includes HAVE_PTHREAD_NP_H
-HAVE_PTHREAD_NP_H:INTERNAL=
-//Have library pthread
-HAVE_PTHREAD_SETSCHEDPARAM:INTERNAL=
-//Have include pulse/pulseaudio.h
-HAVE_PULSE_PULSEAUDIO_H:INTERNAL=
-//Test HAVE_RESTRICT
-HAVE_RESTRICT:INTERNAL=
-//Have symbol sinf
-HAVE_SINF:INTERNAL=1
-//Result of TRY_COMPILE
-HAVE_SIZEOF_LONG:INTERNAL=TRUE
-//Result of TRY_COMPILE
-HAVE_SIZEOF_LONG_LONG:INTERNAL=TRUE
-//Have includes HAVE_SLES_OPENSLES_ANDROID_H
-HAVE_SLES_OPENSLES_ANDROID_H:INTERNAL=
-//Have include sndio.h
-HAVE_SNDIO_H:INTERNAL=
-//Have function snprintf
-HAVE_SNPRINTF:INTERNAL=1
-//Have symbol sqrtf
-HAVE_SQRTF:INTERNAL=1
-//Have function stat
-HAVE_STAT:INTERNAL=1
-//Have include stddef.h
-HAVE_STDDEF_H:INTERNAL=1
-//Have include stdint.h
-HAVE_STDINT_H:INTERNAL=1
-//Have function strcasecmp
-HAVE_STRCASECMP:INTERNAL=1
-//Have function strncasecmp
-HAVE_STRNCASECMP:INTERNAL=1
-//Have function strtof
-HAVE_STRTOF:INTERNAL=
-//Have include sys/audioio.h
-HAVE_SYS_AUDIOIO_H:INTERNAL=
-//Have include sys/soundcard.h
-HAVE_SYS_SOUNDCARD_H:INTERNAL=
-//Have include sys/types.h
-HAVE_SYS_TYPES_H:INTERNAL=1
-//Test HAVE_VISIBILITY_INTERNAL_SWITCH
-HAVE_VISIBILITY_INTERNAL_SWITCH:INTERNAL=1
-//Have function vsnprintf
-HAVE_VSNPRINTF:INTERNAL=1
-//Have include windows.h
-HAVE_WINDOWS_H:INTERNAL=
-//Test HAVE_W_EXTRA
-HAVE_W_EXTRA:INTERNAL=1
-//Have function _controlfp
-HAVE__CONTROLFP:INTERNAL=
-//Test HAVE___RESTRICT
-HAVE___RESTRICT:INTERNAL=1
-//CHECK_TYPE_SIZE: sizeof(long)
-SIZEOF_LONG:INTERNAL=4
-//CHECK_TYPE_SIZE: sizeof(long long)
-SIZEOF_LONG_LONG:INTERNAL=8
-

+ 0 - 44
jni/openal-soft-android/CMakeFiles/CMakeCCompiler.cmake

@@ -1,44 +0,0 @@
-SET(CMAKE_C_COMPILER "/opt/android-ndk-r6/toolchains/arm-linux-androideabi-4.4.3/prebuilt/linux-x86/bin/arm-linux-androideabi-gcc")
-SET(CMAKE_C_COMPILER_ARG1 "")
-SET(CMAKE_C_COMPILER_ID "GNU")
-SET(CMAKE_C_PLATFORM_ID "")
-
-SET(CMAKE_AR "/opt/android-ndk-r6/toolchains/arm-linux-androideabi-4.4.3/prebuilt/linux-x86/bin/arm-linux-androideabi-ar")
-SET(CMAKE_RANLIB "/opt/android-ndk-r6/toolchains/arm-linux-androideabi-4.4.3/prebuilt/linux-x86/bin/arm-linux-androideabi-ranlib")
-SET(CMAKE_LINKER "/opt/android-ndk-r6/toolchains/arm-linux-androideabi-4.4.3/prebuilt/linux-x86/bin/arm-linux-androideabi-ld")
-SET(CMAKE_COMPILER_IS_GNUCC 1)
-SET(CMAKE_C_COMPILER_LOADED 1)
-SET(CMAKE_COMPILER_IS_MINGW )
-SET(CMAKE_COMPILER_IS_CYGWIN )
-IF(CMAKE_COMPILER_IS_CYGWIN)
-  SET(CYGWIN 1)
-  SET(UNIX 1)
-ENDIF(CMAKE_COMPILER_IS_CYGWIN)
-
-SET(CMAKE_C_COMPILER_ENV_VAR "CC")
-
-IF(CMAKE_COMPILER_IS_MINGW)
-  SET(MINGW 1)
-ENDIF(CMAKE_COMPILER_IS_MINGW)
-SET(CMAKE_C_COMPILER_ID_RUN 1)
-SET(CMAKE_C_SOURCE_FILE_EXTENSIONS c)
-SET(CMAKE_C_IGNORE_EXTENSIONS h;H;o;O;obj;OBJ;def;DEF;rc;RC)
-SET(CMAKE_C_LINKER_PREFERENCE 10)
-
-# Save compiler ABI information.
-SET(CMAKE_C_SIZEOF_DATA_PTR "")
-SET(CMAKE_C_COMPILER_ABI "")
-
-IF(CMAKE_C_SIZEOF_DATA_PTR)
-  SET(CMAKE_SIZEOF_VOID_P "${CMAKE_C_SIZEOF_DATA_PTR}")
-ENDIF(CMAKE_C_SIZEOF_DATA_PTR)
-
-IF(CMAKE_C_COMPILER_ABI)
-  SET(CMAKE_INTERNAL_PLATFORM_ABI "${CMAKE_C_COMPILER_ABI}")
-ENDIF(CMAKE_C_COMPILER_ABI)
-
-SET(CMAKE_C_HAS_ISYSROOT "")
-
-
-SET(CMAKE_C_IMPLICIT_LINK_LIBRARIES "")
-SET(CMAKE_C_IMPLICIT_LINK_DIRECTORIES "")

+ 0 - 26
jni/openal-soft-android/CMakeFiles/CMakeDirectoryInformation.cmake

@@ -1,26 +0,0 @@
-# CMAKE generated file: DO NOT EDIT!
-# Generated by "Unix Makefiles" Generator, CMake Version 2.8
-
-# Relative path conversion top directories.
-SET(CMAKE_RELATIVE_PATH_TOP_SOURCE "/home/hagish/workspace/adt/love-native-android/jni/openal-soft-android")
-SET(CMAKE_RELATIVE_PATH_TOP_BINARY "/home/hagish/workspace/adt/love-native-android/jni/openal-soft-android")
-
-# Force unix paths in dependencies.
-SET(CMAKE_FORCE_UNIX_PATHS 1)
-
-# The C and CXX include file search paths:
-SET(CMAKE_C_INCLUDE_PATH
-  "/opt/android-ndk-r6/sources/cxx-stl/gnu-libstdc++/include"
-  "/opt/android-ndk-r6/sources/cxx-stl/gnu-libstdc++/libs/armeabi/include"
-  "OpenAL32/Include"
-  "include"
-  "."
-  )
-SET(CMAKE_CXX_INCLUDE_PATH ${CMAKE_C_INCLUDE_PATH})
-SET(CMAKE_Fortran_INCLUDE_PATH ${CMAKE_C_INCLUDE_PATH})
-
-# The C and CXX include file regular expressions for this directory.
-SET(CMAKE_C_INCLUDE_REGEX_SCAN "^.*$")
-SET(CMAKE_C_INCLUDE_REGEX_COMPLAIN "^$")
-SET(CMAKE_CXX_INCLUDE_REGEX_SCAN ${CMAKE_C_INCLUDE_REGEX_SCAN})
-SET(CMAKE_CXX_INCLUDE_REGEX_COMPLAIN ${CMAKE_C_INCLUDE_REGEX_COMPLAIN})

+ 0 - 437
jni/openal-soft-android/CMakeFiles/CMakeError.log

@@ -1,437 +0,0 @@
-Performing C SOURCE FILE Test HAVE_RESTRICT failed with the following output:
-Change Dir: /home/hagish/workspace/adt/love-native-android/jni/openal-soft-android/CMakeFiles/CMakeTmp
-
-Run Build Command:/usr/bin/make "cmTryCompileExec/fast"
-/usr/bin/make -f CMakeFiles/cmTryCompileExec.dir/build.make CMakeFiles/cmTryCompileExec.dir/build
-make[1]: Entering directory `/home/hagish/workspace/adt/love-native-android/jni/openal-soft-android/CMakeFiles/CMakeTmp'
-/usr/bin/cmake -E cmake_progress_report /home/hagish/workspace/adt/love-native-android/jni/openal-soft-android/CMakeFiles/CMakeTmp/CMakeFiles 1
-Building C object CMakeFiles/cmTryCompileExec.dir/src.c.o
-/opt/android-ndk-r6/toolchains/arm-linux-androideabi-4.4.3/prebuilt/linux-x86/bin/arm-linux-androideabi-gcc   --sysroot=/opt/android-ndk-r6/platforms/android-5/arch-arm -fPIC -DANDROID -Wno-psabi -fsigned-char -mthumb  -DHAVE_RESTRICT -I/opt/android-ndk-r6/sources/cxx-stl/gnu-libstdc++/include -I/opt/android-ndk-r6/sources/cxx-stl/gnu-libstdc++/libs/include   -o CMakeFiles/cmTryCompileExec.dir/src.c.o   -c /home/hagish/workspace/adt/love-native-android/jni/openal-soft-android/CMakeFiles/CMakeTmp/src.c
-/home/hagish/workspace/adt/love-native-android/jni/openal-soft-android/CMakeFiles/CMakeTmp/src.c:1: error: expected '=', ',', ';', 'asm' or '__attribute__' before 'foo'
-make[1]: *** [CMakeFiles/cmTryCompileExec.dir/src.c.o] Error 1
-make[1]: Leaving directory `/home/hagish/workspace/adt/love-native-android/jni/openal-soft-android/CMakeFiles/CMakeTmp'
-make: *** [cmTryCompileExec/fast] Error 2
-
-Source file was:
-int *restrict foo;
-                         int main() {return 0;}
-Determining if the include file fenv.h exists failed with the following output:
-Change Dir: /home/hagish/workspace/adt/love-native-android/jni/openal-soft-android/CMakeFiles/CMakeTmp
-
-Run Build Command:/usr/bin/make "cmTryCompileExec/fast"
-/usr/bin/make -f CMakeFiles/cmTryCompileExec.dir/build.make CMakeFiles/cmTryCompileExec.dir/build
-make[1]: Entering directory `/home/hagish/workspace/adt/love-native-android/jni/openal-soft-android/CMakeFiles/CMakeTmp'
-/usr/bin/cmake -E cmake_progress_report /home/hagish/workspace/adt/love-native-android/jni/openal-soft-android/CMakeFiles/CMakeTmp/CMakeFiles 1
-Building C object CMakeFiles/cmTryCompileExec.dir/CheckIncludeFile.c.o
-/opt/android-ndk-r6/toolchains/arm-linux-androideabi-4.4.3/prebuilt/linux-x86/bin/arm-linux-androideabi-gcc   --sysroot=/opt/android-ndk-r6/platforms/android-5/arch-arm -fPIC -DANDROID -Wno-psabi -fsigned-char -mthumb   -I/opt/android-ndk-r6/sources/cxx-stl/gnu-libstdc++/include -I/opt/android-ndk-r6/sources/cxx-stl/gnu-libstdc++/libs/include   -o CMakeFiles/cmTryCompileExec.dir/CheckIncludeFile.c.o   -c /home/hagish/workspace/adt/love-native-android/jni/openal-soft-android/CMakeFiles/CMakeTmp/CheckIncludeFile.c
-In file included from /home/hagish/workspace/adt/love-native-android/jni/openal-soft-android/CMakeFiles/CMakeTmp/CheckIncludeFile.c:1:
-/opt/android-ndk-r6/sources/cxx-stl/gnu-libstdc++/include/fenv.h:34:28: error: bits/c++config.h: No such file or directory
-make[1]: *** [CMakeFiles/cmTryCompileExec.dir/CheckIncludeFile.c.o] Error 1
-make[1]: Leaving directory `/home/hagish/workspace/adt/love-native-android/jni/openal-soft-android/CMakeFiles/CMakeTmp'
-make: *** [cmTryCompileExec/fast] Error 2
-
-
-Determining if the include file fpu_control.h exists failed with the following output:
-Change Dir: /home/hagish/workspace/adt/love-native-android/jni/openal-soft-android/CMakeFiles/CMakeTmp
-
-Run Build Command:/usr/bin/make "cmTryCompileExec/fast"
-/usr/bin/make -f CMakeFiles/cmTryCompileExec.dir/build.make CMakeFiles/cmTryCompileExec.dir/build
-make[1]: Entering directory `/home/hagish/workspace/adt/love-native-android/jni/openal-soft-android/CMakeFiles/CMakeTmp'
-/usr/bin/cmake -E cmake_progress_report /home/hagish/workspace/adt/love-native-android/jni/openal-soft-android/CMakeFiles/CMakeTmp/CMakeFiles 1
-Building C object CMakeFiles/cmTryCompileExec.dir/CheckIncludeFile.c.o
-/opt/android-ndk-r6/toolchains/arm-linux-androideabi-4.4.3/prebuilt/linux-x86/bin/arm-linux-androideabi-gcc   --sysroot=/opt/android-ndk-r6/platforms/android-5/arch-arm -fPIC -DANDROID -Wno-psabi -fsigned-char -mthumb   -I/opt/android-ndk-r6/sources/cxx-stl/gnu-libstdc++/include -I/opt/android-ndk-r6/sources/cxx-stl/gnu-libstdc++/libs/include   -o CMakeFiles/cmTryCompileExec.dir/CheckIncludeFile.c.o   -c /home/hagish/workspace/adt/love-native-android/jni/openal-soft-android/CMakeFiles/CMakeTmp/CheckIncludeFile.c
-/home/hagish/workspace/adt/love-native-android/jni/openal-soft-android/CMakeFiles/CMakeTmp/CheckIncludeFile.c:1:25: error: fpu_control.h: No such file or directory
-make[1]: *** [CMakeFiles/cmTryCompileExec.dir/CheckIncludeFile.c.o] Error 1
-make[1]: Leaving directory `/home/hagish/workspace/adt/love-native-android/jni/openal-soft-android/CMakeFiles/CMakeTmp'
-make: *** [cmTryCompileExec/fast] Error 2
-
-
-Determining if the include file ieeefp.h exists failed with the following output:
-Change Dir: /home/hagish/workspace/adt/love-native-android/jni/openal-soft-android/CMakeFiles/CMakeTmp
-
-Run Build Command:/usr/bin/make "cmTryCompileExec/fast"
-/usr/bin/make -f CMakeFiles/cmTryCompileExec.dir/build.make CMakeFiles/cmTryCompileExec.dir/build
-make[1]: Entering directory `/home/hagish/workspace/adt/love-native-android/jni/openal-soft-android/CMakeFiles/CMakeTmp'
-/usr/bin/cmake -E cmake_progress_report /home/hagish/workspace/adt/love-native-android/jni/openal-soft-android/CMakeFiles/CMakeTmp/CMakeFiles 1
-Building C object CMakeFiles/cmTryCompileExec.dir/CheckIncludeFile.c.o
-/opt/android-ndk-r6/toolchains/arm-linux-androideabi-4.4.3/prebuilt/linux-x86/bin/arm-linux-androideabi-gcc   --sysroot=/opt/android-ndk-r6/platforms/android-5/arch-arm -fPIC -DANDROID -Wno-psabi -fsigned-char -mthumb   -I/opt/android-ndk-r6/sources/cxx-stl/gnu-libstdc++/include -I/opt/android-ndk-r6/sources/cxx-stl/gnu-libstdc++/libs/include   -o CMakeFiles/cmTryCompileExec.dir/CheckIncludeFile.c.o   -c /home/hagish/workspace/adt/love-native-android/jni/openal-soft-android/CMakeFiles/CMakeTmp/CheckIncludeFile.c
-/home/hagish/workspace/adt/love-native-android/jni/openal-soft-android/CMakeFiles/CMakeTmp/CheckIncludeFile.c:1:20: error: ieeefp.h: No such file or directory
-make[1]: *** [CMakeFiles/cmTryCompileExec.dir/CheckIncludeFile.c.o] Error 1
-make[1]: Leaving directory `/home/hagish/workspace/adt/love-native-android/jni/openal-soft-android/CMakeFiles/CMakeTmp'
-make: *** [cmTryCompileExec/fast] Error 2
-
-
-Determining if the include file guiddef.h exists failed with the following output:
-Change Dir: /home/hagish/workspace/adt/love-native-android/jni/openal-soft-android/CMakeFiles/CMakeTmp
-
-Run Build Command:/usr/bin/make "cmTryCompileExec/fast"
-/usr/bin/make -f CMakeFiles/cmTryCompileExec.dir/build.make CMakeFiles/cmTryCompileExec.dir/build
-make[1]: Entering directory `/home/hagish/workspace/adt/love-native-android/jni/openal-soft-android/CMakeFiles/CMakeTmp'
-/usr/bin/cmake -E cmake_progress_report /home/hagish/workspace/adt/love-native-android/jni/openal-soft-android/CMakeFiles/CMakeTmp/CMakeFiles 1
-Building C object CMakeFiles/cmTryCompileExec.dir/CheckIncludeFile.c.o
-/opt/android-ndk-r6/toolchains/arm-linux-androideabi-4.4.3/prebuilt/linux-x86/bin/arm-linux-androideabi-gcc   --sysroot=/opt/android-ndk-r6/platforms/android-5/arch-arm -fPIC -DANDROID -Wno-psabi -fsigned-char -mthumb   -I/opt/android-ndk-r6/sources/cxx-stl/gnu-libstdc++/include -I/opt/android-ndk-r6/sources/cxx-stl/gnu-libstdc++/libs/include   -o CMakeFiles/cmTryCompileExec.dir/CheckIncludeFile.c.o   -c /home/hagish/workspace/adt/love-native-android/jni/openal-soft-android/CMakeFiles/CMakeTmp/CheckIncludeFile.c
-/home/hagish/workspace/adt/love-native-android/jni/openal-soft-android/CMakeFiles/CMakeTmp/CheckIncludeFile.c:1:21: error: guiddef.h: No such file or directory
-make[1]: *** [CMakeFiles/cmTryCompileExec.dir/CheckIncludeFile.c.o] Error 1
-make[1]: Leaving directory `/home/hagish/workspace/adt/love-native-android/jni/openal-soft-android/CMakeFiles/CMakeTmp'
-make: *** [cmTryCompileExec/fast] Error 2
-
-
-Determining if the include file initguid.h exists failed with the following output:
-Change Dir: /home/hagish/workspace/adt/love-native-android/jni/openal-soft-android/CMakeFiles/CMakeTmp
-
-Run Build Command:/usr/bin/make "cmTryCompileExec/fast"
-/usr/bin/make -f CMakeFiles/cmTryCompileExec.dir/build.make CMakeFiles/cmTryCompileExec.dir/build
-make[1]: Entering directory `/home/hagish/workspace/adt/love-native-android/jni/openal-soft-android/CMakeFiles/CMakeTmp'
-/usr/bin/cmake -E cmake_progress_report /home/hagish/workspace/adt/love-native-android/jni/openal-soft-android/CMakeFiles/CMakeTmp/CMakeFiles 1
-Building C object CMakeFiles/cmTryCompileExec.dir/CheckIncludeFile.c.o
-/opt/android-ndk-r6/toolchains/arm-linux-androideabi-4.4.3/prebuilt/linux-x86/bin/arm-linux-androideabi-gcc   --sysroot=/opt/android-ndk-r6/platforms/android-5/arch-arm -fPIC -DANDROID -Wno-psabi -fsigned-char -mthumb   -I/opt/android-ndk-r6/sources/cxx-stl/gnu-libstdc++/include -I/opt/android-ndk-r6/sources/cxx-stl/gnu-libstdc++/libs/include   -o CMakeFiles/cmTryCompileExec.dir/CheckIncludeFile.c.o   -c /home/hagish/workspace/adt/love-native-android/jni/openal-soft-android/CMakeFiles/CMakeTmp/CheckIncludeFile.c
-/home/hagish/workspace/adt/love-native-android/jni/openal-soft-android/CMakeFiles/CMakeTmp/CheckIncludeFile.c:1:22: error: initguid.h: No such file or directory
-make[1]: Leaving directory `/home/hagish/workspace/adt/love-native-android/jni/openal-soft-android/CMakeFiles/CMakeTmp'
-make[1]: *** [CMakeFiles/cmTryCompileExec.dir/CheckIncludeFile.c.o] Error 1
-make: *** [cmTryCompileExec/fast] Error 2
-
-
-Determining if the include file arm_neon.h exists failed with the following output:
-Change Dir: /home/hagish/workspace/adt/love-native-android/jni/openal-soft-android/CMakeFiles/CMakeTmp
-
-Run Build Command:/usr/bin/make "cmTryCompileExec/fast"
-/usr/bin/make -f CMakeFiles/cmTryCompileExec.dir/build.make CMakeFiles/cmTryCompileExec.dir/build
-make[1]: Entering directory `/home/hagish/workspace/adt/love-native-android/jni/openal-soft-android/CMakeFiles/CMakeTmp'
-/usr/bin/cmake -E cmake_progress_report /home/hagish/workspace/adt/love-native-android/jni/openal-soft-android/CMakeFiles/CMakeTmp/CMakeFiles 1
-Building C object CMakeFiles/cmTryCompileExec.dir/CheckIncludeFile.c.o
-/opt/android-ndk-r6/toolchains/arm-linux-androideabi-4.4.3/prebuilt/linux-x86/bin/arm-linux-androideabi-gcc   --sysroot=/opt/android-ndk-r6/platforms/android-5/arch-arm -fPIC -DANDROID -Wno-psabi -fsigned-char -mthumb   -I/opt/android-ndk-r6/sources/cxx-stl/gnu-libstdc++/include -I/opt/android-ndk-r6/sources/cxx-stl/gnu-libstdc++/libs/include   -o CMakeFiles/cmTryCompileExec.dir/CheckIncludeFile.c.o   -c /home/hagish/workspace/adt/love-native-android/jni/openal-soft-android/CMakeFiles/CMakeTmp/CheckIncludeFile.c
-In file included from /home/hagish/workspace/adt/love-native-android/jni/openal-soft-android/CMakeFiles/CMakeTmp/CheckIncludeFile.c:1:
-/opt/android-ndk-r6/toolchains/arm-linux-androideabi-4.4.3/prebuilt/linux-x86/bin/../lib/gcc/arm-linux-androideabi/4.4.3/include/arm_neon.h:32:2: error: #error You must enable NEON instructions (e.g. -mfloat-abi=softfp -mfpu=neon) to use arm_neon.h
-make[1]: *** [CMakeFiles/cmTryCompileExec.dir/CheckIncludeFile.c.o] Error 1
-make[1]: Leaving directory `/home/hagish/workspace/adt/love-native-android/jni/openal-soft-android/CMakeFiles/CMakeTmp'
-make: *** [cmTryCompileExec/fast] Error 2
-
-
-Determining if the function strtof exists failed with the following output:
-Change Dir: /home/hagish/workspace/adt/love-native-android/jni/openal-soft-android/CMakeFiles/CMakeTmp
-
-Run Build Command:/usr/bin/make "cmTryCompileExec/fast"
-/usr/bin/make -f CMakeFiles/cmTryCompileExec.dir/build.make CMakeFiles/cmTryCompileExec.dir/build
-make[1]: Entering directory `/home/hagish/workspace/adt/love-native-android/jni/openal-soft-android/CMakeFiles/CMakeTmp'
-/usr/bin/cmake -E cmake_progress_report /home/hagish/workspace/adt/love-native-android/jni/openal-soft-android/CMakeFiles/CMakeTmp/CMakeFiles 1
-Building C object CMakeFiles/cmTryCompileExec.dir/CheckFunctionExists.c.o
-/opt/android-ndk-r6/toolchains/arm-linux-androideabi-4.4.3/prebuilt/linux-x86/bin/arm-linux-androideabi-gcc   --sysroot=/opt/android-ndk-r6/platforms/android-5/arch-arm -fPIC -DANDROID -Wno-psabi -fsigned-char -mthumb  -DCHECK_FUNCTION_EXISTS=strtof -I/opt/android-ndk-r6/sources/cxx-stl/gnu-libstdc++/include -I/opt/android-ndk-r6/sources/cxx-stl/gnu-libstdc++/libs/include   -o CMakeFiles/cmTryCompileExec.dir/CheckFunctionExists.c.o   -c /usr/share/cmake-2.8/Modules/CheckFunctionExists.c
-Linking C executable cmTryCompileExec
-/usr/bin/cmake -E cmake_link_script CMakeFiles/cmTryCompileExec.dir/link.txt --verbose=1
-/opt/android-ndk-r6/toolchains/arm-linux-androideabi-4.4.3/prebuilt/linux-x86/bin/arm-linux-androideabi-gcc   --sysroot=/opt/android-ndk-r6/platforms/android-5/arch-arm -fPIC -DANDROID -Wno-psabi -fsigned-char -mthumb  -DCHECK_FUNCTION_EXISTS=strtof  -L"/opt/android-ndk-r6/sources/cxx-stl/gnu-libstdc++/libs/" -L"/libs/" -lstdc++ -lsupc++ CMakeFiles/cmTryCompileExec.dir/CheckFunctionExists.c.o  -o cmTryCompileExec -rdynamic -L/opt/android-ndk-r6/platforms/android-5/arch-arm/usr/lib -lm -Wl,-rpath,/opt/android-ndk-r6/platforms/android-5/arch-arm/usr/lib 
-CMakeFiles/cmTryCompileExec.dir/CheckFunctionExists.c.o: In function `main':
-CheckFunctionExists.c:(.text+0xa): undefined reference to `strtof'
-collect2: ld returned 1 exit status
-make[1]: *** [cmTryCompileExec] Error 1
-make[1]: Leaving directory `/home/hagish/workspace/adt/love-native-android/jni/openal-soft-android/CMakeFiles/CMakeTmp'
-make: *** [cmTryCompileExec/fast] Error 2
-
-
-Determining if the function _controlfp exists failed with the following output:
-Change Dir: /home/hagish/workspace/adt/love-native-android/jni/openal-soft-android/CMakeFiles/CMakeTmp
-
-Run Build Command:/usr/bin/make "cmTryCompileExec/fast"
-/usr/bin/make -f CMakeFiles/cmTryCompileExec.dir/build.make CMakeFiles/cmTryCompileExec.dir/build
-make[1]: Entering directory `/home/hagish/workspace/adt/love-native-android/jni/openal-soft-android/CMakeFiles/CMakeTmp'
-/usr/bin/cmake -E cmake_progress_report /home/hagish/workspace/adt/love-native-android/jni/openal-soft-android/CMakeFiles/CMakeTmp/CMakeFiles 1
-Building C object CMakeFiles/cmTryCompileExec.dir/CheckFunctionExists.c.o
-/opt/android-ndk-r6/toolchains/arm-linux-androideabi-4.4.3/prebuilt/linux-x86/bin/arm-linux-androideabi-gcc   --sysroot=/opt/android-ndk-r6/platforms/android-5/arch-arm -fPIC -DANDROID -Wno-psabi -fsigned-char -mthumb  -DCHECK_FUNCTION_EXISTS=_controlfp -I/opt/android-ndk-r6/sources/cxx-stl/gnu-libstdc++/include -I/opt/android-ndk-r6/sources/cxx-stl/gnu-libstdc++/libs/include   -o CMakeFiles/cmTryCompileExec.dir/CheckFunctionExists.c.o   -c /usr/share/cmake-2.8/Modules/CheckFunctionExists.c
-Linking C executable cmTryCompileExec
-/usr/bin/cmake -E cmake_link_script CMakeFiles/cmTryCompileExec.dir/link.txt --verbose=1
-/opt/android-ndk-r6/toolchains/arm-linux-androideabi-4.4.3/prebuilt/linux-x86/bin/arm-linux-androideabi-gcc   --sysroot=/opt/android-ndk-r6/platforms/android-5/arch-arm -fPIC -DANDROID -Wno-psabi -fsigned-char -mthumb  -DCHECK_FUNCTION_EXISTS=_controlfp  -L"/opt/android-ndk-r6/sources/cxx-stl/gnu-libstdc++/libs/" -L"/libs/" -lstdc++ -lsupc++ CMakeFiles/cmTryCompileExec.dir/CheckFunctionExists.c.o  -o cmTryCompileExec -rdynamic -L/opt/android-ndk-r6/platforms/android-5/arch-arm/usr/lib -lm -Wl,-rpath,/opt/android-ndk-r6/platforms/android-5/arch-arm/usr/lib 
-CMakeFiles/cmTryCompileExec.dir/CheckFunctionExists.c.o: In function `main':
-CheckFunctionExists.c:(.text+0xa): undefined reference to `_controlfp'
-collect2: ld returned 1 exit status
-make[1]: Leaving directory `/home/hagish/workspace/adt/love-native-android/jni/openal-soft-android/CMakeFiles/CMakeTmp'
-make[1]: *** [cmTryCompileExec] Error 1
-make: *** [cmTryCompileExec/fast] Error 2
-
-
-Determining if the include file windows.h exists failed with the following output:
-Change Dir: /home/hagish/workspace/adt/love-native-android/jni/openal-soft-android/CMakeFiles/CMakeTmp
-
-Run Build Command:/usr/bin/make "cmTryCompileExec/fast"
-/usr/bin/make -f CMakeFiles/cmTryCompileExec.dir/build.make CMakeFiles/cmTryCompileExec.dir/build
-make[1]: Entering directory `/home/hagish/workspace/adt/love-native-android/jni/openal-soft-android/CMakeFiles/CMakeTmp'
-/usr/bin/cmake -E cmake_progress_report /home/hagish/workspace/adt/love-native-android/jni/openal-soft-android/CMakeFiles/CMakeTmp/CMakeFiles 1
-Building C object CMakeFiles/cmTryCompileExec.dir/CheckIncludeFile.c.o
-/opt/android-ndk-r6/toolchains/arm-linux-androideabi-4.4.3/prebuilt/linux-x86/bin/arm-linux-androideabi-gcc   --sysroot=/opt/android-ndk-r6/platforms/android-5/arch-arm -fPIC -DANDROID -Wno-psabi -fsigned-char -mthumb -D_WIN32_WINNT=0x0500   -I/opt/android-ndk-r6/sources/cxx-stl/gnu-libstdc++/include -I/opt/android-ndk-r6/sources/cxx-stl/gnu-libstdc++/libs/include   -o CMakeFiles/cmTryCompileExec.dir/CheckIncludeFile.c.o   -c /home/hagish/workspace/adt/love-native-android/jni/openal-soft-android/CMakeFiles/CMakeTmp/CheckIncludeFile.c
-/home/hagish/workspace/adt/love-native-android/jni/openal-soft-android/CMakeFiles/CMakeTmp/CheckIncludeFile.c:1:21: error: windows.h: No such file or directory
-make[1]: Leaving directory `/home/hagish/workspace/adt/love-native-android/jni/openal-soft-android/CMakeFiles/CMakeTmp'
-make[1]: *** [CMakeFiles/cmTryCompileExec.dir/CheckIncludeFile.c.o] Error 1
-make: *** [cmTryCompileExec/fast] Error 2
-
-
-Performing C SOURCE FILE Test HAVE_PTHREAD failed with the following output:
-Change Dir: /home/hagish/workspace/adt/love-native-android/jni/openal-soft-android/CMakeFiles/CMakeTmp
-
-Run Build Command:/usr/bin/make "cmTryCompileExec/fast"
-/usr/bin/make -f CMakeFiles/cmTryCompileExec.dir/build.make CMakeFiles/cmTryCompileExec.dir/build
-make[1]: Entering directory `/home/hagish/workspace/adt/love-native-android/jni/openal-soft-android/CMakeFiles/CMakeTmp'
-/usr/bin/cmake -E cmake_progress_report /home/hagish/workspace/adt/love-native-android/jni/openal-soft-android/CMakeFiles/CMakeTmp/CMakeFiles 1
-Building C object CMakeFiles/cmTryCompileExec.dir/src.c.o
-/opt/android-ndk-r6/toolchains/arm-linux-androideabi-4.4.3/prebuilt/linux-x86/bin/arm-linux-androideabi-gcc   --sysroot=/opt/android-ndk-r6/platforms/android-5/arch-arm -fPIC -DANDROID -Wno-psabi -fsigned-char -mthumb  -pthread -I/opt/android-ndk-r6/sources/cxx-stl/gnu-libstdc++/include -I/opt/android-ndk-r6/sources/cxx-stl/gnu-libstdc++/libs/include   -o CMakeFiles/cmTryCompileExec.dir/src.c.o   -c /home/hagish/workspace/adt/love-native-android/jni/openal-soft-android/CMakeFiles/CMakeTmp/src.c
-Linking C executable cmTryCompileExec
-/usr/bin/cmake -E cmake_link_script CMakeFiles/cmTryCompileExec.dir/link.txt --verbose=1
-/opt/android-ndk-r6/toolchains/arm-linux-androideabi-4.4.3/prebuilt/linux-x86/bin/arm-linux-androideabi-gcc   --sysroot=/opt/android-ndk-r6/platforms/android-5/arch-arm -fPIC -DANDROID -Wno-psabi -fsigned-char -mthumb  -pthread  -L"/opt/android-ndk-r6/sources/cxx-stl/gnu-libstdc++/libs/" -L"/libs/" -lstdc++ -lsupc++ CMakeFiles/cmTryCompileExec.dir/src.c.o  -o cmTryCompileExec -rdynamic -L/opt/android-ndk-r6/platforms/android-5/arch-arm/usr/lib -lm -Wl,-rpath,/opt/android-ndk-r6/platforms/android-5/arch-arm/usr/lib 
-/opt/android-ndk-r6/toolchains/arm-linux-androideabi-4.4.3/prebuilt/linux-x86/bin/../lib/gcc/arm-linux-androideabi/4.4.3/../../../../arm-linux-androideabi/bin/ld: cannot find -lpthread
-collect2: ld returned 1 exit status
-make[1]: *** [cmTryCompileExec] Error 1
-make[1]: Leaving directory `/home/hagish/workspace/adt/love-native-android/jni/openal-soft-android/CMakeFiles/CMakeTmp'
-make: *** [cmTryCompileExec/fast] Error 2
-
-Source file was:
-
-Determining if files pthread.h;pthread_np.h exist failed with the following output:
-Change Dir: /home/hagish/workspace/adt/love-native-android/jni/openal-soft-android/CMakeFiles/CMakeTmp
-
-Run Build Command:/usr/bin/make "cmTryCompileExec/fast"
-/usr/bin/make -f CMakeFiles/cmTryCompileExec.dir/build.make CMakeFiles/cmTryCompileExec.dir/build
-make[1]: Entering directory `/home/hagish/workspace/adt/love-native-android/jni/openal-soft-android/CMakeFiles/CMakeTmp'
-/usr/bin/cmake -E cmake_progress_report /home/hagish/workspace/adt/love-native-android/jni/openal-soft-android/CMakeFiles/CMakeTmp/CMakeFiles 1
-Building C object CMakeFiles/cmTryCompileExec.dir/CheckIncludeFiles.c.o
-/opt/android-ndk-r6/toolchains/arm-linux-androideabi-4.4.3/prebuilt/linux-x86/bin/arm-linux-androideabi-gcc   --sysroot=/opt/android-ndk-r6/platforms/android-5/arch-arm -fPIC -DANDROID -Wno-psabi -fsigned-char -mthumb   -I/opt/android-ndk-r6/sources/cxx-stl/gnu-libstdc++/include -I/opt/android-ndk-r6/sources/cxx-stl/gnu-libstdc++/libs/include   -o CMakeFiles/cmTryCompileExec.dir/CheckIncludeFiles.c.o   -c /home/hagish/workspace/adt/love-native-android/jni/openal-soft-android/CMakeFiles/CMakeTmp/CheckIncludeFiles.c
-/home/hagish/workspace/adt/love-native-android/jni/openal-soft-android/CMakeFiles/CMakeTmp/CheckIncludeFiles.c:3:24: error: pthread_np.h: No such file or directory
-make[1]: *** [CMakeFiles/cmTryCompileExec.dir/CheckIncludeFiles.c.o] Error 1
-make[1]: Leaving directory `/home/hagish/workspace/adt/love-native-android/jni/openal-soft-android/CMakeFiles/CMakeTmp'
-make: *** [cmTryCompileExec/fast] Error 2
-
-Source:
-/* */
-#include <pthread.h>
-#include <pthread_np.h>
-
-
-int main(){return 0;}
-
-Determining if the function pthread_create exists in the pthread failed with the following output:
-Change Dir: /home/hagish/workspace/adt/love-native-android/jni/openal-soft-android/CMakeFiles/CMakeTmp
-
-Run Build Command:/usr/bin/make "cmTryCompileExec/fast"
-/usr/bin/make -f CMakeFiles/cmTryCompileExec.dir/build.make CMakeFiles/cmTryCompileExec.dir/build
-make[1]: Entering directory `/home/hagish/workspace/adt/love-native-android/jni/openal-soft-android/CMakeFiles/CMakeTmp'
-/usr/bin/cmake -E cmake_progress_report /home/hagish/workspace/adt/love-native-android/jni/openal-soft-android/CMakeFiles/CMakeTmp/CMakeFiles 1
-Building C object CMakeFiles/cmTryCompileExec.dir/CheckFunctionExists.c.o
-/opt/android-ndk-r6/toolchains/arm-linux-androideabi-4.4.3/prebuilt/linux-x86/bin/arm-linux-androideabi-gcc   --sysroot=/opt/android-ndk-r6/platforms/android-5/arch-arm -fPIC -DANDROID -Wno-psabi -fsigned-char -mthumb  -DCHECK_FUNCTION_EXISTS=pthread_create -I/opt/android-ndk-r6/sources/cxx-stl/gnu-libstdc++/include -I/opt/android-ndk-r6/sources/cxx-stl/gnu-libstdc++/libs/include   -o CMakeFiles/cmTryCompileExec.dir/CheckFunctionExists.c.o   -c /usr/share/cmake-2.8/Modules/CheckFunctionExists.c
-Linking C executable cmTryCompileExec
-/usr/bin/cmake -E cmake_link_script CMakeFiles/cmTryCompileExec.dir/link.txt --verbose=1
-/opt/android-ndk-r6/toolchains/arm-linux-androideabi-4.4.3/prebuilt/linux-x86/bin/arm-linux-androideabi-gcc   --sysroot=/opt/android-ndk-r6/platforms/android-5/arch-arm -fPIC -DANDROID -Wno-psabi -fsigned-char -mthumb  -DCHECK_FUNCTION_EXISTS=pthread_create  -L"/opt/android-ndk-r6/sources/cxx-stl/gnu-libstdc++/libs/" -L"/libs/" -lstdc++ -lsupc++ CMakeFiles/cmTryCompileExec.dir/CheckFunctionExists.c.o  -o cmTryCompileExec -rdynamic -L/opt/android-ndk-r6/platforms/android-5/arch-arm/usr/lib -lpthread -lm -Wl,-rpath,/opt/android-ndk-r6/platforms/android-5/arch-arm/usr/lib 
-/opt/android-ndk-r6/toolchains/arm-linux-androideabi-4.4.3/prebuilt/linux-x86/bin/../lib/gcc/arm-linux-androideabi/4.4.3/../../../../arm-linux-androideabi/bin/ld: cannot find -lpthread
-collect2: ld returned 1 exit status
-make[1]: *** [cmTryCompileExec] Error 1
-make[1]: Leaving directory `/home/hagish/workspace/adt/love-native-android/jni/openal-soft-android/CMakeFiles/CMakeTmp'
-make: *** [cmTryCompileExec/fast] Error 2
-
-
-Determining if the function pthread_setschedparam exists in the pthread failed with the following output:
-Change Dir: /home/hagish/workspace/adt/love-native-android/jni/openal-soft-android/CMakeFiles/CMakeTmp
-
-Run Build Command:/usr/bin/make "cmTryCompileExec/fast"
-/usr/bin/make -f CMakeFiles/cmTryCompileExec.dir/build.make CMakeFiles/cmTryCompileExec.dir/build
-make[1]: Entering directory `/home/hagish/workspace/adt/love-native-android/jni/openal-soft-android/CMakeFiles/CMakeTmp'
-/usr/bin/cmake -E cmake_progress_report /home/hagish/workspace/adt/love-native-android/jni/openal-soft-android/CMakeFiles/CMakeTmp/CMakeFiles 1
-Building C object CMakeFiles/cmTryCompileExec.dir/CheckFunctionExists.c.o
-/opt/android-ndk-r6/toolchains/arm-linux-androideabi-4.4.3/prebuilt/linux-x86/bin/arm-linux-androideabi-gcc   --sysroot=/opt/android-ndk-r6/platforms/android-5/arch-arm -fPIC -DANDROID -Wno-psabi -fsigned-char -mthumb  -DCHECK_FUNCTION_EXISTS=pthread_setschedparam -I/opt/android-ndk-r6/sources/cxx-stl/gnu-libstdc++/include -I/opt/android-ndk-r6/sources/cxx-stl/gnu-libstdc++/libs/include   -o CMakeFiles/cmTryCompileExec.dir/CheckFunctionExists.c.o   -c /usr/share/cmake-2.8/Modules/CheckFunctionExists.c
-Linking C executable cmTryCompileExec
-/usr/bin/cmake -E cmake_link_script CMakeFiles/cmTryCompileExec.dir/link.txt --verbose=1
-/opt/android-ndk-r6/toolchains/arm-linux-androideabi-4.4.3/prebuilt/linux-x86/bin/arm-linux-androideabi-gcc   --sysroot=/opt/android-ndk-r6/platforms/android-5/arch-arm -fPIC -DANDROID -Wno-psabi -fsigned-char -mthumb  -DCHECK_FUNCTION_EXISTS=pthread_setschedparam  -L"/opt/android-ndk-r6/sources/cxx-stl/gnu-libstdc++/libs/" -L"/libs/" -lstdc++ -lsupc++ CMakeFiles/cmTryCompileExec.dir/CheckFunctionExists.c.o  -o cmTryCompileExec -rdynamic -L/opt/android-ndk-r6/platforms/android-5/arch-arm/usr/lib -lpthread -lm -Wl,-rpath,/opt/android-ndk-r6/platforms/android-5/arch-arm/usr/lib 
-/opt/android-ndk-r6/toolchains/arm-linux-androideabi-4.4.3/prebuilt/linux-x86/bin/../lib/gcc/arm-linux-androideabi/4.4.3/../../../../arm-linux-androideabi/bin/ld: cannot find -lpthread
-collect2: ld returned 1 exit status
-make[1]: *** [cmTryCompileExec] Error 1
-make[1]: Leaving directory `/home/hagish/workspace/adt/love-native-android/jni/openal-soft-android/CMakeFiles/CMakeTmp'
-make: *** [cmTryCompileExec/fast] Error 2
-
-
-Determining if the function clock_gettime exists in the rt failed with the following output:
-Change Dir: /home/hagish/workspace/adt/love-native-android/jni/openal-soft-android/CMakeFiles/CMakeTmp
-
-Run Build Command:/usr/bin/make "cmTryCompileExec/fast"
-/usr/bin/make -f CMakeFiles/cmTryCompileExec.dir/build.make CMakeFiles/cmTryCompileExec.dir/build
-make[1]: Entering directory `/home/hagish/workspace/adt/love-native-android/jni/openal-soft-android/CMakeFiles/CMakeTmp'
-/usr/bin/cmake -E cmake_progress_report /home/hagish/workspace/adt/love-native-android/jni/openal-soft-android/CMakeFiles/CMakeTmp/CMakeFiles 1
-Building C object CMakeFiles/cmTryCompileExec.dir/CheckFunctionExists.c.o
-/opt/android-ndk-r6/toolchains/arm-linux-androideabi-4.4.3/prebuilt/linux-x86/bin/arm-linux-androideabi-gcc   --sysroot=/opt/android-ndk-r6/platforms/android-5/arch-arm -fPIC -DANDROID -Wno-psabi -fsigned-char -mthumb  -DCHECK_FUNCTION_EXISTS=clock_gettime -I/opt/android-ndk-r6/sources/cxx-stl/gnu-libstdc++/include -I/opt/android-ndk-r6/sources/cxx-stl/gnu-libstdc++/libs/include   -o CMakeFiles/cmTryCompileExec.dir/CheckFunctionExists.c.o   -c /usr/share/cmake-2.8/Modules/CheckFunctionExists.c
-Linking C executable cmTryCompileExec
-/usr/bin/cmake -E cmake_link_script CMakeFiles/cmTryCompileExec.dir/link.txt --verbose=1
-/opt/android-ndk-r6/toolchains/arm-linux-androideabi-4.4.3/prebuilt/linux-x86/bin/arm-linux-androideabi-gcc   --sysroot=/opt/android-ndk-r6/platforms/android-5/arch-arm -fPIC -DANDROID -Wno-psabi -fsigned-char -mthumb  -DCHECK_FUNCTION_EXISTS=clock_gettime  -L"/opt/android-ndk-r6/sources/cxx-stl/gnu-libstdc++/libs/" -L"/libs/" -lstdc++ -lsupc++ CMakeFiles/cmTryCompileExec.dir/CheckFunctionExists.c.o  -o cmTryCompileExec -rdynamic -L/opt/android-ndk-r6/platforms/android-5/arch-arm/usr/lib -lrt -lm -Wl,-rpath,/opt/android-ndk-r6/platforms/android-5/arch-arm/usr/lib 
-/opt/android-ndk-r6/toolchains/arm-linux-androideabi-4.4.3/prebuilt/linux-x86/bin/../lib/gcc/arm-linux-androideabi/4.4.3/../../../../arm-linux-androideabi/bin/ld: cannot find -lrt
-collect2: ld returned 1 exit status
-make[1]: *** [cmTryCompileExec] Error 1
-make[1]: Leaving directory `/home/hagish/workspace/adt/love-native-android/jni/openal-soft-android/CMakeFiles/CMakeTmp'
-make: *** [cmTryCompileExec/fast] Error 2
-
-
-Determining if the timeGetTime exist in winmm failed with the following output:
-Change Dir: /home/hagish/workspace/adt/love-native-android/jni/openal-soft-android/CMakeFiles/CMakeTmp
-
-Run Build Command:/usr/bin/make "cmTryCompileExec/fast"
-/usr/bin/make -f CMakeFiles/cmTryCompileExec.dir/build.make CMakeFiles/cmTryCompileExec.dir/build
-make[1]: Entering directory `/home/hagish/workspace/adt/love-native-android/jni/openal-soft-android/CMakeFiles/CMakeTmp'
-/usr/bin/cmake -E cmake_progress_report /home/hagish/workspace/adt/love-native-android/jni/openal-soft-android/CMakeFiles/CMakeTmp/CMakeFiles 1
-Building C object CMakeFiles/cmTryCompileExec.dir/CheckSymbolExists.c.o
-/opt/android-ndk-r6/toolchains/arm-linux-androideabi-4.4.3/prebuilt/linux-x86/bin/arm-linux-androideabi-gcc   --sysroot=/opt/android-ndk-r6/platforms/android-5/arch-arm -fPIC -DANDROID -Wno-psabi -fsigned-char -mthumb   -I/opt/android-ndk-r6/sources/cxx-stl/gnu-libstdc++/include -I/opt/android-ndk-r6/sources/cxx-stl/gnu-libstdc++/libs/include   -o CMakeFiles/cmTryCompileExec.dir/CheckSymbolExists.c.o   -c /home/hagish/workspace/adt/love-native-android/jni/openal-soft-android/CMakeFiles/CMakeTmp/CheckSymbolExists.c
-/home/hagish/workspace/adt/love-native-android/jni/openal-soft-android/CMakeFiles/CMakeTmp/CheckSymbolExists.c:2:21: error: windows.h: No such file or directory
-/home/hagish/workspace/adt/love-native-android/jni/openal-soft-android/CMakeFiles/CMakeTmp/CheckSymbolExists.c:3:22: error: mmsystem.h: No such file or directory
-/home/hagish/workspace/adt/love-native-android/jni/openal-soft-android/CMakeFiles/CMakeTmp/CheckSymbolExists.c: In function 'main':
-/home/hagish/workspace/adt/love-native-android/jni/openal-soft-android/CMakeFiles/CMakeTmp/CheckSymbolExists.c:8: error: 'timeGetTime' undeclared (first use in this function)
-/home/hagish/workspace/adt/love-native-android/jni/openal-soft-android/CMakeFiles/CMakeTmp/CheckSymbolExists.c:8: error: (Each undeclared identifier is reported only once
-/home/hagish/workspace/adt/love-native-android/jni/openal-soft-android/CMakeFiles/CMakeTmp/CheckSymbolExists.c:8: error: for each function it appears in.)
-make[1]: *** [CMakeFiles/cmTryCompileExec.dir/CheckSymbolExists.c.o] Error 1
-make[1]: Leaving directory `/home/hagish/workspace/adt/love-native-android/jni/openal-soft-android/CMakeFiles/CMakeTmp'
-make: *** [cmTryCompileExec/fast] Error 2
-
-File /home/hagish/workspace/adt/love-native-android/jni/openal-soft-android/CMakeFiles/CMakeTmp/CheckSymbolExists.c:
-/* */
-#include <windows.h>
-#include <mmsystem.h>
-
-void cmakeRequireSymbol(int dummy,...){(void)dummy;}
-int main()
-{
-  cmakeRequireSymbol(0,&timeGetTime);
-  return 0;
-}
-
-Determining if the include file alsa/asoundlib.h exists failed with the following output:
-Change Dir: /home/hagish/workspace/adt/love-native-android/jni/openal-soft-android/CMakeFiles/CMakeTmp
-
-Run Build Command:/usr/bin/make "cmTryCompileExec/fast"
-/usr/bin/make -f CMakeFiles/cmTryCompileExec.dir/build.make CMakeFiles/cmTryCompileExec.dir/build
-make[1]: Entering directory `/home/hagish/workspace/adt/love-native-android/jni/openal-soft-android/CMakeFiles/CMakeTmp'
-/usr/bin/cmake -E cmake_progress_report /home/hagish/workspace/adt/love-native-android/jni/openal-soft-android/CMakeFiles/CMakeTmp/CMakeFiles 1
-Building C object CMakeFiles/cmTryCompileExec.dir/CheckIncludeFile.c.o
-/opt/android-ndk-r6/toolchains/arm-linux-androideabi-4.4.3/prebuilt/linux-x86/bin/arm-linux-androideabi-gcc   --sysroot=/opt/android-ndk-r6/platforms/android-5/arch-arm -fPIC -DANDROID -Wno-psabi -fsigned-char -mthumb   -I/opt/android-ndk-r6/sources/cxx-stl/gnu-libstdc++/include -I/opt/android-ndk-r6/sources/cxx-stl/gnu-libstdc++/libs/include   -o CMakeFiles/cmTryCompileExec.dir/CheckIncludeFile.c.o   -c /home/hagish/workspace/adt/love-native-android/jni/openal-soft-android/CMakeFiles/CMakeTmp/CheckIncludeFile.c
-/home/hagish/workspace/adt/love-native-android/jni/openal-soft-android/CMakeFiles/CMakeTmp/CheckIncludeFile.c:1:28: error: alsa/asoundlib.h: No such file or directory
-make[1]: *** [CMakeFiles/cmTryCompileExec.dir/CheckIncludeFile.c.o] Error 1
-make[1]: Leaving directory `/home/hagish/workspace/adt/love-native-android/jni/openal-soft-android/CMakeFiles/CMakeTmp'
-make: *** [cmTryCompileExec/fast] Error 2
-
-
-Determining if the include file sys/soundcard.h exists failed with the following output:
-Change Dir: /home/hagish/workspace/adt/love-native-android/jni/openal-soft-android/CMakeFiles/CMakeTmp
-
-Run Build Command:/usr/bin/make "cmTryCompileExec/fast"
-/usr/bin/make -f CMakeFiles/cmTryCompileExec.dir/build.make CMakeFiles/cmTryCompileExec.dir/build
-make[1]: Entering directory `/home/hagish/workspace/adt/love-native-android/jni/openal-soft-android/CMakeFiles/CMakeTmp'
-/usr/bin/cmake -E cmake_progress_report /home/hagish/workspace/adt/love-native-android/jni/openal-soft-android/CMakeFiles/CMakeTmp/CMakeFiles 1
-Building C object CMakeFiles/cmTryCompileExec.dir/CheckIncludeFile.c.o
-/opt/android-ndk-r6/toolchains/arm-linux-androideabi-4.4.3/prebuilt/linux-x86/bin/arm-linux-androideabi-gcc   --sysroot=/opt/android-ndk-r6/platforms/android-5/arch-arm -fPIC -DANDROID -Wno-psabi -fsigned-char -mthumb   -I/opt/android-ndk-r6/sources/cxx-stl/gnu-libstdc++/include -I/opt/android-ndk-r6/sources/cxx-stl/gnu-libstdc++/libs/include   -o CMakeFiles/cmTryCompileExec.dir/CheckIncludeFile.c.o   -c /home/hagish/workspace/adt/love-native-android/jni/openal-soft-android/CMakeFiles/CMakeTmp/CheckIncludeFile.c
-/home/hagish/workspace/adt/love-native-android/jni/openal-soft-android/CMakeFiles/CMakeTmp/CheckIncludeFile.c:1:27: error: sys/soundcard.h: No such file or directory
-make[1]: *** [CMakeFiles/cmTryCompileExec.dir/CheckIncludeFile.c.o] Error 1
-make[1]: Leaving directory `/home/hagish/workspace/adt/love-native-android/jni/openal-soft-android/CMakeFiles/CMakeTmp'
-make: *** [cmTryCompileExec/fast] Error 2
-
-
-Determining if the include file sys/audioio.h exists failed with the following output:
-Change Dir: /home/hagish/workspace/adt/love-native-android/jni/openal-soft-android/CMakeFiles/CMakeTmp
-
-Run Build Command:/usr/bin/make "cmTryCompileExec/fast"
-/usr/bin/make -f CMakeFiles/cmTryCompileExec.dir/build.make CMakeFiles/cmTryCompileExec.dir/build
-make[1]: Entering directory `/home/hagish/workspace/adt/love-native-android/jni/openal-soft-android/CMakeFiles/CMakeTmp'
-/usr/bin/cmake -E cmake_progress_report /home/hagish/workspace/adt/love-native-android/jni/openal-soft-android/CMakeFiles/CMakeTmp/CMakeFiles 1
-Building C object CMakeFiles/cmTryCompileExec.dir/CheckIncludeFile.c.o
-/opt/android-ndk-r6/toolchains/arm-linux-androideabi-4.4.3/prebuilt/linux-x86/bin/arm-linux-androideabi-gcc   --sysroot=/opt/android-ndk-r6/platforms/android-5/arch-arm -fPIC -DANDROID -Wno-psabi -fsigned-char -mthumb   -I/opt/android-ndk-r6/sources/cxx-stl/gnu-libstdc++/include -I/opt/android-ndk-r6/sources/cxx-stl/gnu-libstdc++/libs/include   -o CMakeFiles/cmTryCompileExec.dir/CheckIncludeFile.c.o   -c /home/hagish/workspace/adt/love-native-android/jni/openal-soft-android/CMakeFiles/CMakeTmp/CheckIncludeFile.c
-/home/hagish/workspace/adt/love-native-android/jni/openal-soft-android/CMakeFiles/CMakeTmp/CheckIncludeFile.c:1:25: error: sys/audioio.h: No such file or directory
-make[1]: *** [CMakeFiles/cmTryCompileExec.dir/CheckIncludeFile.c.o] Error 1
-make[1]: Leaving directory `/home/hagish/workspace/adt/love-native-android/jni/openal-soft-android/CMakeFiles/CMakeTmp'
-make: *** [cmTryCompileExec/fast] Error 2
-
-
-Determining if the include file sndio.h exists failed with the following output:
-Change Dir: /home/hagish/workspace/adt/love-native-android/jni/openal-soft-android/CMakeFiles/CMakeTmp
-
-Run Build Command:/usr/bin/make "cmTryCompileExec/fast"
-/usr/bin/make -f CMakeFiles/cmTryCompileExec.dir/build.make CMakeFiles/cmTryCompileExec.dir/build
-make[1]: Entering directory `/home/hagish/workspace/adt/love-native-android/jni/openal-soft-android/CMakeFiles/CMakeTmp'
-/usr/bin/cmake -E cmake_progress_report /home/hagish/workspace/adt/love-native-android/jni/openal-soft-android/CMakeFiles/CMakeTmp/CMakeFiles 1
-Building C object CMakeFiles/cmTryCompileExec.dir/CheckIncludeFile.c.o
-/opt/android-ndk-r6/toolchains/arm-linux-androideabi-4.4.3/prebuilt/linux-x86/bin/arm-linux-androideabi-gcc   --sysroot=/opt/android-ndk-r6/platforms/android-5/arch-arm -fPIC -DANDROID -Wno-psabi -fsigned-char -mthumb   -I/opt/android-ndk-r6/sources/cxx-stl/gnu-libstdc++/include -I/opt/android-ndk-r6/sources/cxx-stl/gnu-libstdc++/libs/include   -o CMakeFiles/cmTryCompileExec.dir/CheckIncludeFile.c.o   -c /home/hagish/workspace/adt/love-native-android/jni/openal-soft-android/CMakeFiles/CMakeTmp/CheckIncludeFile.c
-/home/hagish/workspace/adt/love-native-android/jni/openal-soft-android/CMakeFiles/CMakeTmp/CheckIncludeFile.c:1:19: error: sndio.h: No such file or directory
-make[1]: Leaving directory `/home/hagish/workspace/adt/love-native-android/jni/openal-soft-android/CMakeFiles/CMakeTmp'
-make[1]: *** [CMakeFiles/cmTryCompileExec.dir/CheckIncludeFile.c.o] Error 1
-make: *** [cmTryCompileExec/fast] Error 2
-
-
-Determining if the include file dsound.h exists failed with the following output:
-Change Dir: /home/hagish/workspace/adt/love-native-android/jni/openal-soft-android/CMakeFiles/CMakeTmp
-
-Run Build Command:/usr/bin/make "cmTryCompileExec/fast"
-/usr/bin/make -f CMakeFiles/cmTryCompileExec.dir/build.make CMakeFiles/cmTryCompileExec.dir/build
-make[1]: Entering directory `/home/hagish/workspace/adt/love-native-android/jni/openal-soft-android/CMakeFiles/CMakeTmp'
-/usr/bin/cmake -E cmake_progress_report /home/hagish/workspace/adt/love-native-android/jni/openal-soft-android/CMakeFiles/CMakeTmp/CMakeFiles 1
-Building C object CMakeFiles/cmTryCompileExec.dir/CheckIncludeFile.c.o
-/opt/android-ndk-r6/toolchains/arm-linux-androideabi-4.4.3/prebuilt/linux-x86/bin/arm-linux-androideabi-gcc   --sysroot=/opt/android-ndk-r6/platforms/android-5/arch-arm -fPIC -DANDROID -Wno-psabi -fsigned-char -mthumb   -I/opt/android-ndk-r6/sources/cxx-stl/gnu-libstdc++/include -I/opt/android-ndk-r6/sources/cxx-stl/gnu-libstdc++/libs/include   -o CMakeFiles/cmTryCompileExec.dir/CheckIncludeFile.c.o   -c /home/hagish/workspace/adt/love-native-android/jni/openal-soft-android/CMakeFiles/CMakeTmp/CheckIncludeFile.c
-/home/hagish/workspace/adt/love-native-android/jni/openal-soft-android/CMakeFiles/CMakeTmp/CheckIncludeFile.c:1:20: error: dsound.h: No such file or directory
-make[1]: Leaving directory `/home/hagish/workspace/adt/love-native-android/jni/openal-soft-android/CMakeFiles/CMakeTmp'
-make[1]: *** [CMakeFiles/cmTryCompileExec.dir/CheckIncludeFile.c.o] Error 1
-make: *** [cmTryCompileExec/fast] Error 2
-
-
-Determining if the include file portaudio.h exists failed with the following output:
-Change Dir: /home/hagish/workspace/adt/love-native-android/jni/openal-soft-android/CMakeFiles/CMakeTmp
-
-Run Build Command:/usr/bin/make "cmTryCompileExec/fast"
-/usr/bin/make -f CMakeFiles/cmTryCompileExec.dir/build.make CMakeFiles/cmTryCompileExec.dir/build
-make[1]: Entering directory `/home/hagish/workspace/adt/love-native-android/jni/openal-soft-android/CMakeFiles/CMakeTmp'
-/usr/bin/cmake -E cmake_progress_report /home/hagish/workspace/adt/love-native-android/jni/openal-soft-android/CMakeFiles/CMakeTmp/CMakeFiles 1
-Building C object CMakeFiles/cmTryCompileExec.dir/CheckIncludeFile.c.o
-/opt/android-ndk-r6/toolchains/arm-linux-androideabi-4.4.3/prebuilt/linux-x86/bin/arm-linux-androideabi-gcc   --sysroot=/opt/android-ndk-r6/platforms/android-5/arch-arm -fPIC -DANDROID -Wno-psabi -fsigned-char -mthumb   -I/opt/android-ndk-r6/sources/cxx-stl/gnu-libstdc++/include -I/opt/android-ndk-r6/sources/cxx-stl/gnu-libstdc++/libs/include   -o CMakeFiles/cmTryCompileExec.dir/CheckIncludeFile.c.o   -c /home/hagish/workspace/adt/love-native-android/jni/openal-soft-android/CMakeFiles/CMakeTmp/CheckIncludeFile.c
-/home/hagish/workspace/adt/love-native-android/jni/openal-soft-android/CMakeFiles/CMakeTmp/CheckIncludeFile.c:1:23: error: portaudio.h: No such file or directory
-make[1]: *** [CMakeFiles/cmTryCompileExec.dir/CheckIncludeFile.c.o] Error 1
-make[1]: Leaving directory `/home/hagish/workspace/adt/love-native-android/jni/openal-soft-android/CMakeFiles/CMakeTmp'
-make: *** [cmTryCompileExec/fast] Error 2
-
-
-Determining if the include file pulse/pulseaudio.h exists failed with the following output:
-Change Dir: /home/hagish/workspace/adt/love-native-android/jni/openal-soft-android/CMakeFiles/CMakeTmp
-
-Run Build Command:/usr/bin/make "cmTryCompileExec/fast"
-/usr/bin/make -f CMakeFiles/cmTryCompileExec.dir/build.make CMakeFiles/cmTryCompileExec.dir/build
-make[1]: Entering directory `/home/hagish/workspace/adt/love-native-android/jni/openal-soft-android/CMakeFiles/CMakeTmp'
-/usr/bin/cmake -E cmake_progress_report /home/hagish/workspace/adt/love-native-android/jni/openal-soft-android/CMakeFiles/CMakeTmp/CMakeFiles 1
-Building C object CMakeFiles/cmTryCompileExec.dir/CheckIncludeFile.c.o
-/opt/android-ndk-r6/toolchains/arm-linux-androideabi-4.4.3/prebuilt/linux-x86/bin/arm-linux-androideabi-gcc   --sysroot=/opt/android-ndk-r6/platforms/android-5/arch-arm -fPIC -DANDROID -Wno-psabi -fsigned-char -mthumb   -I/opt/android-ndk-r6/sources/cxx-stl/gnu-libstdc++/include -I/opt/android-ndk-r6/sources/cxx-stl/gnu-libstdc++/libs/include   -o CMakeFiles/cmTryCompileExec.dir/CheckIncludeFile.c.o   -c /home/hagish/workspace/adt/love-native-android/jni/openal-soft-android/CMakeFiles/CMakeTmp/CheckIncludeFile.c
-/home/hagish/workspace/adt/love-native-android/jni/openal-soft-android/CMakeFiles/CMakeTmp/CheckIncludeFile.c:1:30: error: pulse/pulseaudio.h: No such file or directory
-make[1]: *** [CMakeFiles/cmTryCompileExec.dir/CheckIncludeFile.c.o] Error 1
-make[1]: Leaving directory `/home/hagish/workspace/adt/love-native-android/jni/openal-soft-android/CMakeFiles/CMakeTmp'
-make: *** [cmTryCompileExec/fast] Error 2
-
-
-Determining if the include file /System/Library/Frameworks/CoreAudio.framework/Headers/CoreAudio.h exists failed with the following output:
-Change Dir: /home/hagish/workspace/adt/love-native-android/jni/openal-soft-android/CMakeFiles/CMakeTmp
-
-Run Build Command:/usr/bin/make "cmTryCompileExec/fast"
-/usr/bin/make -f CMakeFiles/cmTryCompileExec.dir/build.make CMakeFiles/cmTryCompileExec.dir/build
-make[1]: Entering directory `/home/hagish/workspace/adt/love-native-android/jni/openal-soft-android/CMakeFiles/CMakeTmp'
-/usr/bin/cmake -E cmake_progress_report /home/hagish/workspace/adt/love-native-android/jni/openal-soft-android/CMakeFiles/CMakeTmp/CMakeFiles 1
-Building C object CMakeFiles/cmTryCompileExec.dir/CheckIncludeFile.c.o
-/opt/android-ndk-r6/toolchains/arm-linux-androideabi-4.4.3/prebuilt/linux-x86/bin/arm-linux-androideabi-gcc   --sysroot=/opt/android-ndk-r6/platforms/android-5/arch-arm -fPIC -DANDROID -Wno-psabi -fsigned-char -mthumb   -I/opt/android-ndk-r6/sources/cxx-stl/gnu-libstdc++/include -I/opt/android-ndk-r6/sources/cxx-stl/gnu-libstdc++/libs/include   -o CMakeFiles/cmTryCompileExec.dir/CheckIncludeFile.c.o   -c /home/hagish/workspace/adt/love-native-android/jni/openal-soft-android/CMakeFiles/CMakeTmp/CheckIncludeFile.c
-/home/hagish/workspace/adt/love-native-android/jni/openal-soft-android/CMakeFiles/CMakeTmp/CheckIncludeFile.c:1:78: error: /System/Library/Frameworks/CoreAudio.framework/Headers/CoreAudio.h: No such file or directory
-make[1]: *** [CMakeFiles/cmTryCompileExec.dir/CheckIncludeFile.c.o] Error 1
-make[1]: Leaving directory `/home/hagish/workspace/adt/love-native-android/jni/openal-soft-android/CMakeFiles/CMakeTmp'
-make: *** [cmTryCompileExec/fast] Error 2
-
-
-Determining if files SLES/OpenSLES.h;SLES/OpenSLES_Android.h exist failed with the following output:
-Change Dir: /home/hagish/workspace/adt/love-native-android/jni/openal-soft-android/CMakeFiles/CMakeTmp
-
-Run Build Command:/usr/bin/make "cmTryCompileExec/fast"
-/usr/bin/make -f CMakeFiles/cmTryCompileExec.dir/build.make CMakeFiles/cmTryCompileExec.dir/build
-make[1]: Entering directory `/home/hagish/workspace/adt/love-native-android/jni/openal-soft-android/CMakeFiles/CMakeTmp'
-/usr/bin/cmake -E cmake_progress_report /home/hagish/workspace/adt/love-native-android/jni/openal-soft-android/CMakeFiles/CMakeTmp/CMakeFiles 1
-Building C object CMakeFiles/cmTryCompileExec.dir/CheckIncludeFiles.c.o
-/opt/android-ndk-r6/toolchains/arm-linux-androideabi-4.4.3/prebuilt/linux-x86/bin/arm-linux-androideabi-gcc   --sysroot=/opt/android-ndk-r6/platforms/android-5/arch-arm -fPIC -DANDROID -Wno-psabi -fsigned-char -mthumb   -I/opt/android-ndk-r6/sources/cxx-stl/gnu-libstdc++/include -I/opt/android-ndk-r6/sources/cxx-stl/gnu-libstdc++/libs/include   -o CMakeFiles/cmTryCompileExec.dir/CheckIncludeFiles.c.o   -c /home/hagish/workspace/adt/love-native-android/jni/openal-soft-android/CMakeFiles/CMakeTmp/CheckIncludeFiles.c
-/home/hagish/workspace/adt/love-native-android/jni/openal-soft-android/CMakeFiles/CMakeTmp/CheckIncludeFiles.c:2:27: error: SLES/OpenSLES.h: No such file or directory
-/home/hagish/workspace/adt/love-native-android/jni/openal-soft-android/CMakeFiles/CMakeTmp/CheckIncludeFiles.c:3:35: error: SLES/OpenSLES_Android.h: No such file or directory
-make[1]: *** [CMakeFiles/cmTryCompileExec.dir/CheckIncludeFiles.c.o] Error 1
-make[1]: Leaving directory `/home/hagish/workspace/adt/love-native-android/jni/openal-soft-android/CMakeFiles/CMakeTmp'
-make: *** [cmTryCompileExec/fast] Error 2
-
-Source:
-/* */
-#include <SLES/OpenSLES.h>
-#include <SLES/OpenSLES_Android.h>
-
-
-int main(){return 0;}
-

+ 0 - 755
jni/openal-soft-android/CMakeFiles/CMakeOutput.log

@@ -1,755 +0,0 @@
-The target system is: Linux - 1 - 
-The host system is: Linux - 2.6.38-12-generic-pae - i686
-Determining if the include file sys/types.h exists passed with the following output:
-Change Dir: /home/hagish/workspace/adt/love-native-android/jni/openal-soft-android/CMakeFiles/CMakeTmp
-
-Run Build Command:/usr/bin/make "cmTryCompileExec/fast"
-/usr/bin/make -f CMakeFiles/cmTryCompileExec.dir/build.make CMakeFiles/cmTryCompileExec.dir/build
-make[1]: Entering directory `/home/hagish/workspace/adt/love-native-android/jni/openal-soft-android/CMakeFiles/CMakeTmp'
-/usr/bin/cmake -E cmake_progress_report /home/hagish/workspace/adt/love-native-android/jni/openal-soft-android/CMakeFiles/CMakeTmp/CMakeFiles 1
-Building C object CMakeFiles/cmTryCompileExec.dir/CheckIncludeFile.c.o
-/opt/android-ndk-r6/toolchains/arm-linux-androideabi-4.4.3/prebuilt/linux-x86/bin/arm-linux-androideabi-gcc   --sysroot=/opt/android-ndk-r6/platforms/android-5/arch-arm -fPIC -DANDROID -Wno-psabi -fsigned-char -mthumb   -I/opt/android-ndk-r6/sources/cxx-stl/gnu-libstdc++/include -I/opt/android-ndk-r6/sources/cxx-stl/gnu-libstdc++/libs/include   -o CMakeFiles/cmTryCompileExec.dir/CheckIncludeFile.c.o   -c /home/hagish/workspace/adt/love-native-android/jni/openal-soft-android/CMakeFiles/CMakeTmp/CheckIncludeFile.c
-Linking C executable cmTryCompileExec
-/usr/bin/cmake -E cmake_link_script CMakeFiles/cmTryCompileExec.dir/link.txt --verbose=1
-/opt/android-ndk-r6/toolchains/arm-linux-androideabi-4.4.3/prebuilt/linux-x86/bin/arm-linux-androideabi-gcc   --sysroot=/opt/android-ndk-r6/platforms/android-5/arch-arm -fPIC -DANDROID -Wno-psabi -fsigned-char -mthumb    -L"/opt/android-ndk-r6/sources/cxx-stl/gnu-libstdc++/libs/" -L"/libs/" -lstdc++ -lsupc++ CMakeFiles/cmTryCompileExec.dir/CheckIncludeFile.c.o  -o cmTryCompileExec -rdynamic -L/opt/android-ndk-r6/platforms/android-5/arch-arm/usr/lib 
-make[1]: Leaving directory `/home/hagish/workspace/adt/love-native-android/jni/openal-soft-android/CMakeFiles/CMakeTmp'
-
-
-Determining if the include file stdint.h exists passed with the following output:
-Change Dir: /home/hagish/workspace/adt/love-native-android/jni/openal-soft-android/CMakeFiles/CMakeTmp
-
-Run Build Command:/usr/bin/make "cmTryCompileExec/fast"
-/usr/bin/make -f CMakeFiles/cmTryCompileExec.dir/build.make CMakeFiles/cmTryCompileExec.dir/build
-make[1]: Entering directory `/home/hagish/workspace/adt/love-native-android/jni/openal-soft-android/CMakeFiles/CMakeTmp'
-/usr/bin/cmake -E cmake_progress_report /home/hagish/workspace/adt/love-native-android/jni/openal-soft-android/CMakeFiles/CMakeTmp/CMakeFiles 1
-Building C object CMakeFiles/cmTryCompileExec.dir/CheckIncludeFile.c.o
-/opt/android-ndk-r6/toolchains/arm-linux-androideabi-4.4.3/prebuilt/linux-x86/bin/arm-linux-androideabi-gcc   --sysroot=/opt/android-ndk-r6/platforms/android-5/arch-arm -fPIC -DANDROID -Wno-psabi -fsigned-char -mthumb   -I/opt/android-ndk-r6/sources/cxx-stl/gnu-libstdc++/include -I/opt/android-ndk-r6/sources/cxx-stl/gnu-libstdc++/libs/include   -o CMakeFiles/cmTryCompileExec.dir/CheckIncludeFile.c.o   -c /home/hagish/workspace/adt/love-native-android/jni/openal-soft-android/CMakeFiles/CMakeTmp/CheckIncludeFile.c
-Linking C executable cmTryCompileExec
-/usr/bin/cmake -E cmake_link_script CMakeFiles/cmTryCompileExec.dir/link.txt --verbose=1
-/opt/android-ndk-r6/toolchains/arm-linux-androideabi-4.4.3/prebuilt/linux-x86/bin/arm-linux-androideabi-gcc   --sysroot=/opt/android-ndk-r6/platforms/android-5/arch-arm -fPIC -DANDROID -Wno-psabi -fsigned-char -mthumb    -L"/opt/android-ndk-r6/sources/cxx-stl/gnu-libstdc++/libs/" -L"/libs/" -lstdc++ -lsupc++ CMakeFiles/cmTryCompileExec.dir/CheckIncludeFile.c.o  -o cmTryCompileExec -rdynamic -L/opt/android-ndk-r6/platforms/android-5/arch-arm/usr/lib 
-make[1]: Leaving directory `/home/hagish/workspace/adt/love-native-android/jni/openal-soft-android/CMakeFiles/CMakeTmp'
-
-
-Determining if the include file stddef.h exists passed with the following output:
-Change Dir: /home/hagish/workspace/adt/love-native-android/jni/openal-soft-android/CMakeFiles/CMakeTmp
-
-Run Build Command:/usr/bin/make "cmTryCompileExec/fast"
-/usr/bin/make -f CMakeFiles/cmTryCompileExec.dir/build.make CMakeFiles/cmTryCompileExec.dir/build
-make[1]: Entering directory `/home/hagish/workspace/adt/love-native-android/jni/openal-soft-android/CMakeFiles/CMakeTmp'
-/usr/bin/cmake -E cmake_progress_report /home/hagish/workspace/adt/love-native-android/jni/openal-soft-android/CMakeFiles/CMakeTmp/CMakeFiles 1
-Building C object CMakeFiles/cmTryCompileExec.dir/CheckIncludeFile.c.o
-/opt/android-ndk-r6/toolchains/arm-linux-androideabi-4.4.3/prebuilt/linux-x86/bin/arm-linux-androideabi-gcc   --sysroot=/opt/android-ndk-r6/platforms/android-5/arch-arm -fPIC -DANDROID -Wno-psabi -fsigned-char -mthumb   -I/opt/android-ndk-r6/sources/cxx-stl/gnu-libstdc++/include -I/opt/android-ndk-r6/sources/cxx-stl/gnu-libstdc++/libs/include   -o CMakeFiles/cmTryCompileExec.dir/CheckIncludeFile.c.o   -c /home/hagish/workspace/adt/love-native-android/jni/openal-soft-android/CMakeFiles/CMakeTmp/CheckIncludeFile.c
-Linking C executable cmTryCompileExec
-/usr/bin/cmake -E cmake_link_script CMakeFiles/cmTryCompileExec.dir/link.txt --verbose=1
-/opt/android-ndk-r6/toolchains/arm-linux-androideabi-4.4.3/prebuilt/linux-x86/bin/arm-linux-androideabi-gcc   --sysroot=/opt/android-ndk-r6/platforms/android-5/arch-arm -fPIC -DANDROID -Wno-psabi -fsigned-char -mthumb    -L"/opt/android-ndk-r6/sources/cxx-stl/gnu-libstdc++/libs/" -L"/libs/" -lstdc++ -lsupc++ CMakeFiles/cmTryCompileExec.dir/CheckIncludeFile.c.o  -o cmTryCompileExec -rdynamic -L/opt/android-ndk-r6/platforms/android-5/arch-arm/usr/lib 
-make[1]: Leaving directory `/home/hagish/workspace/adt/love-native-android/jni/openal-soft-android/CMakeFiles/CMakeTmp'
-
-
-Determining size of long passed with the following output:
-Change Dir: /home/hagish/workspace/adt/love-native-android/jni/openal-soft-android/CMakeFiles/CMakeTmp
-
-Run Build Command:/usr/bin/make "cmTryCompileExec/fast"
-/usr/bin/make -f CMakeFiles/cmTryCompileExec.dir/build.make CMakeFiles/cmTryCompileExec.dir/build
-make[1]: Entering directory `/home/hagish/workspace/adt/love-native-android/jni/openal-soft-android/CMakeFiles/CMakeTmp'
-/usr/bin/cmake -E cmake_progress_report /home/hagish/workspace/adt/love-native-android/jni/openal-soft-android/CMakeFiles/CMakeTmp/CMakeFiles 1
-Building C object CMakeFiles/cmTryCompileExec.dir/SIZEOF_LONG.c.o
-/opt/android-ndk-r6/toolchains/arm-linux-androideabi-4.4.3/prebuilt/linux-x86/bin/arm-linux-androideabi-gcc   --sysroot=/opt/android-ndk-r6/platforms/android-5/arch-arm -fPIC -DANDROID -Wno-psabi -fsigned-char -mthumb   -I/opt/android-ndk-r6/sources/cxx-stl/gnu-libstdc++/include -I/opt/android-ndk-r6/sources/cxx-stl/gnu-libstdc++/libs/include   -o CMakeFiles/cmTryCompileExec.dir/SIZEOF_LONG.c.o   -c /home/hagish/workspace/adt/love-native-android/jni/openal-soft-android/CMakeFiles/CheckTypeSize/SIZEOF_LONG.c
-Linking C executable cmTryCompileExec
-/usr/bin/cmake -E cmake_link_script CMakeFiles/cmTryCompileExec.dir/link.txt --verbose=1
-/opt/android-ndk-r6/toolchains/arm-linux-androideabi-4.4.3/prebuilt/linux-x86/bin/arm-linux-androideabi-gcc   --sysroot=/opt/android-ndk-r6/platforms/android-5/arch-arm -fPIC -DANDROID -Wno-psabi -fsigned-char -mthumb    -L"/opt/android-ndk-r6/sources/cxx-stl/gnu-libstdc++/libs/" -L"/libs/" -lstdc++ -lsupc++ CMakeFiles/cmTryCompileExec.dir/SIZEOF_LONG.c.o  -o cmTryCompileExec -rdynamic -L/opt/android-ndk-r6/platforms/android-5/arch-arm/usr/lib 
-make[1]: Leaving directory `/home/hagish/workspace/adt/love-native-android/jni/openal-soft-android/CMakeFiles/CMakeTmp'
-
-
-Determining size of long long passed with the following output:
-Change Dir: /home/hagish/workspace/adt/love-native-android/jni/openal-soft-android/CMakeFiles/CMakeTmp
-
-Run Build Command:/usr/bin/make "cmTryCompileExec/fast"
-/usr/bin/make -f CMakeFiles/cmTryCompileExec.dir/build.make CMakeFiles/cmTryCompileExec.dir/build
-make[1]: Entering directory `/home/hagish/workspace/adt/love-native-android/jni/openal-soft-android/CMakeFiles/CMakeTmp'
-/usr/bin/cmake -E cmake_progress_report /home/hagish/workspace/adt/love-native-android/jni/openal-soft-android/CMakeFiles/CMakeTmp/CMakeFiles 1
-Building C object CMakeFiles/cmTryCompileExec.dir/SIZEOF_LONG_LONG.c.o
-/opt/android-ndk-r6/toolchains/arm-linux-androideabi-4.4.3/prebuilt/linux-x86/bin/arm-linux-androideabi-gcc   --sysroot=/opt/android-ndk-r6/platforms/android-5/arch-arm -fPIC -DANDROID -Wno-psabi -fsigned-char -mthumb   -I/opt/android-ndk-r6/sources/cxx-stl/gnu-libstdc++/include -I/opt/android-ndk-r6/sources/cxx-stl/gnu-libstdc++/libs/include   -o CMakeFiles/cmTryCompileExec.dir/SIZEOF_LONG_LONG.c.o   -c /home/hagish/workspace/adt/love-native-android/jni/openal-soft-android/CMakeFiles/CheckTypeSize/SIZEOF_LONG_LONG.c
-Linking C executable cmTryCompileExec
-/usr/bin/cmake -E cmake_link_script CMakeFiles/cmTryCompileExec.dir/link.txt --verbose=1
-/opt/android-ndk-r6/toolchains/arm-linux-androideabi-4.4.3/prebuilt/linux-x86/bin/arm-linux-androideabi-gcc   --sysroot=/opt/android-ndk-r6/platforms/android-5/arch-arm -fPIC -DANDROID -Wno-psabi -fsigned-char -mthumb    -L"/opt/android-ndk-r6/sources/cxx-stl/gnu-libstdc++/libs/" -L"/libs/" -lstdc++ -lsupc++ CMakeFiles/cmTryCompileExec.dir/SIZEOF_LONG_LONG.c.o  -o cmTryCompileExec -rdynamic -L/opt/android-ndk-r6/platforms/android-5/arch-arm/usr/lib 
-make[1]: Leaving directory `/home/hagish/workspace/adt/love-native-android/jni/openal-soft-android/CMakeFiles/CMakeTmp'
-
-
-Performing C SOURCE FILE Test HAVE___RESTRICT succeded with the following output:
-Change Dir: /home/hagish/workspace/adt/love-native-android/jni/openal-soft-android/CMakeFiles/CMakeTmp
-
-Run Build Command:/usr/bin/make "cmTryCompileExec/fast"
-/usr/bin/make -f CMakeFiles/cmTryCompileExec.dir/build.make CMakeFiles/cmTryCompileExec.dir/build
-make[1]: Entering directory `/home/hagish/workspace/adt/love-native-android/jni/openal-soft-android/CMakeFiles/CMakeTmp'
-/usr/bin/cmake -E cmake_progress_report /home/hagish/workspace/adt/love-native-android/jni/openal-soft-android/CMakeFiles/CMakeTmp/CMakeFiles 1
-Building C object CMakeFiles/cmTryCompileExec.dir/src.c.o
-/opt/android-ndk-r6/toolchains/arm-linux-androideabi-4.4.3/prebuilt/linux-x86/bin/arm-linux-androideabi-gcc   --sysroot=/opt/android-ndk-r6/platforms/android-5/arch-arm -fPIC -DANDROID -Wno-psabi -fsigned-char -mthumb  -DHAVE___RESTRICT -I/opt/android-ndk-r6/sources/cxx-stl/gnu-libstdc++/include -I/opt/android-ndk-r6/sources/cxx-stl/gnu-libstdc++/libs/include   -o CMakeFiles/cmTryCompileExec.dir/src.c.o   -c /home/hagish/workspace/adt/love-native-android/jni/openal-soft-android/CMakeFiles/CMakeTmp/src.c
-Linking C executable cmTryCompileExec
-/usr/bin/cmake -E cmake_link_script CMakeFiles/cmTryCompileExec.dir/link.txt --verbose=1
-/opt/android-ndk-r6/toolchains/arm-linux-androideabi-4.4.3/prebuilt/linux-x86/bin/arm-linux-androideabi-gcc   --sysroot=/opt/android-ndk-r6/platforms/android-5/arch-arm -fPIC -DANDROID -Wno-psabi -fsigned-char -mthumb  -DHAVE___RESTRICT  -L"/opt/android-ndk-r6/sources/cxx-stl/gnu-libstdc++/libs/" -L"/libs/" -lstdc++ -lsupc++ CMakeFiles/cmTryCompileExec.dir/src.c.o  -o cmTryCompileExec -rdynamic -L/opt/android-ndk-r6/platforms/android-5/arch-arm/usr/lib 
-make[1]: Leaving directory `/home/hagish/workspace/adt/love-native-android/jni/openal-soft-android/CMakeFiles/CMakeTmp'
-
-Source file was:
-int *__restrict foo;
-                         int main() {return 0;}
-Performing C SOURCE FILE Test HAVE_W_EXTRA succeded with the following output:
-Change Dir: /home/hagish/workspace/adt/love-native-android/jni/openal-soft-android/CMakeFiles/CMakeTmp
-
-Run Build Command:/usr/bin/make "cmTryCompileExec/fast"
-/usr/bin/make -f CMakeFiles/cmTryCompileExec.dir/build.make CMakeFiles/cmTryCompileExec.dir/build
-make[1]: Entering directory `/home/hagish/workspace/adt/love-native-android/jni/openal-soft-android/CMakeFiles/CMakeTmp'
-/usr/bin/cmake -E cmake_progress_report /home/hagish/workspace/adt/love-native-android/jni/openal-soft-android/CMakeFiles/CMakeTmp/CMakeFiles 1
-Building C object CMakeFiles/cmTryCompileExec.dir/src.c.o
-/opt/android-ndk-r6/toolchains/arm-linux-androideabi-4.4.3/prebuilt/linux-x86/bin/arm-linux-androideabi-gcc   --sysroot=/opt/android-ndk-r6/platforms/android-5/arch-arm -fPIC -DANDROID -Wno-psabi -fsigned-char -mthumb  -Wextra -I/opt/android-ndk-r6/sources/cxx-stl/gnu-libstdc++/include -I/opt/android-ndk-r6/sources/cxx-stl/gnu-libstdc++/libs/include   -o CMakeFiles/cmTryCompileExec.dir/src.c.o   -c /home/hagish/workspace/adt/love-native-android/jni/openal-soft-android/CMakeFiles/CMakeTmp/src.c
-Linking C executable cmTryCompileExec
-/usr/bin/cmake -E cmake_link_script CMakeFiles/cmTryCompileExec.dir/link.txt --verbose=1
-/opt/android-ndk-r6/toolchains/arm-linux-androideabi-4.4.3/prebuilt/linux-x86/bin/arm-linux-androideabi-gcc   --sysroot=/opt/android-ndk-r6/platforms/android-5/arch-arm -fPIC -DANDROID -Wno-psabi -fsigned-char -mthumb  -Wextra  -L"/opt/android-ndk-r6/sources/cxx-stl/gnu-libstdc++/libs/" -L"/libs/" -lstdc++ -lsupc++ CMakeFiles/cmTryCompileExec.dir/src.c.o  -o cmTryCompileExec -rdynamic -L/opt/android-ndk-r6/platforms/android-5/arch-arm/usr/lib 
-make[1]: Leaving directory `/home/hagish/workspace/adt/love-native-android/jni/openal-soft-android/CMakeFiles/CMakeTmp'
-
-Source file was:
-
-Performing C SOURCE FILE Test HAVE_GCC_DESTRUCTOR succeded with the following output:
-Change Dir: /home/hagish/workspace/adt/love-native-android/jni/openal-soft-android/CMakeFiles/CMakeTmp
-
-Run Build Command:/usr/bin/make "cmTryCompileExec/fast"
-/usr/bin/make -f CMakeFiles/cmTryCompileExec.dir/build.make CMakeFiles/cmTryCompileExec.dir/build
-make[1]: Entering directory `/home/hagish/workspace/adt/love-native-android/jni/openal-soft-android/CMakeFiles/CMakeTmp'
-/usr/bin/cmake -E cmake_progress_report /home/hagish/workspace/adt/love-native-android/jni/openal-soft-android/CMakeFiles/CMakeTmp/CMakeFiles 1
-Building C object CMakeFiles/cmTryCompileExec.dir/src.c.o
-/opt/android-ndk-r6/toolchains/arm-linux-androideabi-4.4.3/prebuilt/linux-x86/bin/arm-linux-androideabi-gcc   --sysroot=/opt/android-ndk-r6/platforms/android-5/arch-arm -fPIC -DANDROID -Wno-psabi -fsigned-char -mthumb  -DHAVE_GCC_DESTRUCTOR -I/opt/android-ndk-r6/sources/cxx-stl/gnu-libstdc++/include -I/opt/android-ndk-r6/sources/cxx-stl/gnu-libstdc++/libs/include   -o CMakeFiles/cmTryCompileExec.dir/src.c.o   -c /home/hagish/workspace/adt/love-native-android/jni/openal-soft-android/CMakeFiles/CMakeTmp/src.c
-Linking C executable cmTryCompileExec
-/usr/bin/cmake -E cmake_link_script CMakeFiles/cmTryCompileExec.dir/link.txt --verbose=1
-/opt/android-ndk-r6/toolchains/arm-linux-androideabi-4.4.3/prebuilt/linux-x86/bin/arm-linux-androideabi-gcc   --sysroot=/opt/android-ndk-r6/platforms/android-5/arch-arm -fPIC -DANDROID -Wno-psabi -fsigned-char -mthumb  -DHAVE_GCC_DESTRUCTOR  -L"/opt/android-ndk-r6/sources/cxx-stl/gnu-libstdc++/libs/" -L"/libs/" -lstdc++ -lsupc++ CMakeFiles/cmTryCompileExec.dir/src.c.o  -o cmTryCompileExec -rdynamic -L/opt/android-ndk-r6/platforms/android-5/arch-arm/usr/lib 
-make[1]: Leaving directory `/home/hagish/workspace/adt/love-native-android/jni/openal-soft-android/CMakeFiles/CMakeTmp'
-
-Source file was:
-int foo() __attribute__((destructor));
-                             int main() {return 0;}
-Performing C SOURCE FILE Test HAVE_GCC_PROTECTED_VISIBILITY succeded with the following output:
-Change Dir: /home/hagish/workspace/adt/love-native-android/jni/openal-soft-android/CMakeFiles/CMakeTmp
-
-Run Build Command:/usr/bin/make "cmTryCompileExec/fast"
-/usr/bin/make -f CMakeFiles/cmTryCompileExec.dir/build.make CMakeFiles/cmTryCompileExec.dir/build
-make[1]: Entering directory `/home/hagish/workspace/adt/love-native-android/jni/openal-soft-android/CMakeFiles/CMakeTmp'
-/usr/bin/cmake -E cmake_progress_report /home/hagish/workspace/adt/love-native-android/jni/openal-soft-android/CMakeFiles/CMakeTmp/CMakeFiles 1
-Building C object CMakeFiles/cmTryCompileExec.dir/src.c.o
-/opt/android-ndk-r6/toolchains/arm-linux-androideabi-4.4.3/prebuilt/linux-x86/bin/arm-linux-androideabi-gcc   --sysroot=/opt/android-ndk-r6/platforms/android-5/arch-arm -fPIC -DANDROID -Wno-psabi -fsigned-char -mthumb  -DHAVE_GCC_PROTECTED_VISIBILITY  -Wattributes -Werror -I/opt/android-ndk-r6/sources/cxx-stl/gnu-libstdc++/include -I/opt/android-ndk-r6/sources/cxx-stl/gnu-libstdc++/libs/include   -o CMakeFiles/cmTryCompileExec.dir/src.c.o   -c /home/hagish/workspace/adt/love-native-android/jni/openal-soft-android/CMakeFiles/CMakeTmp/src.c
-Linking C executable cmTryCompileExec
-/usr/bin/cmake -E cmake_link_script CMakeFiles/cmTryCompileExec.dir/link.txt --verbose=1
-/opt/android-ndk-r6/toolchains/arm-linux-androideabi-4.4.3/prebuilt/linux-x86/bin/arm-linux-androideabi-gcc   --sysroot=/opt/android-ndk-r6/platforms/android-5/arch-arm -fPIC -DANDROID -Wno-psabi -fsigned-char -mthumb  -DHAVE_GCC_PROTECTED_VISIBILITY  -Wattributes -Werror  -L"/opt/android-ndk-r6/sources/cxx-stl/gnu-libstdc++/libs/" -L"/libs/" -lstdc++ -lsupc++ CMakeFiles/cmTryCompileExec.dir/src.c.o  -o cmTryCompileExec -rdynamic -L/opt/android-ndk-r6/platforms/android-5/arch-arm/usr/lib 
-make[1]: Leaving directory `/home/hagish/workspace/adt/love-native-android/jni/openal-soft-android/CMakeFiles/CMakeTmp'
-
-Source file was:
-int foo() __attribute__((visibility("protected")));
-                             int main() {return 0;}
-Performing C SOURCE FILE Test HAVE_VISIBILITY_INTERNAL_SWITCH succeded with the following output:
-Change Dir: /home/hagish/workspace/adt/love-native-android/jni/openal-soft-android/CMakeFiles/CMakeTmp
-
-Run Build Command:/usr/bin/make "cmTryCompileExec/fast"
-/usr/bin/make -f CMakeFiles/cmTryCompileExec.dir/build.make CMakeFiles/cmTryCompileExec.dir/build
-make[1]: Entering directory `/home/hagish/workspace/adt/love-native-android/jni/openal-soft-android/CMakeFiles/CMakeTmp'
-/usr/bin/cmake -E cmake_progress_report /home/hagish/workspace/adt/love-native-android/jni/openal-soft-android/CMakeFiles/CMakeTmp/CMakeFiles 1
-Building C object CMakeFiles/cmTryCompileExec.dir/src.c.o
-/opt/android-ndk-r6/toolchains/arm-linux-androideabi-4.4.3/prebuilt/linux-x86/bin/arm-linux-androideabi-gcc   --sysroot=/opt/android-ndk-r6/platforms/android-5/arch-arm -fPIC -DANDROID -Wno-psabi -fsigned-char -mthumb  -fvisibility=internal  -Wattributes -Werror -I/opt/android-ndk-r6/sources/cxx-stl/gnu-libstdc++/include -I/opt/android-ndk-r6/sources/cxx-stl/gnu-libstdc++/libs/include   -o CMakeFiles/cmTryCompileExec.dir/src.c.o   -c /home/hagish/workspace/adt/love-native-android/jni/openal-soft-android/CMakeFiles/CMakeTmp/src.c
-Linking C executable cmTryCompileExec
-/usr/bin/cmake -E cmake_link_script CMakeFiles/cmTryCompileExec.dir/link.txt --verbose=1
-/opt/android-ndk-r6/toolchains/arm-linux-androideabi-4.4.3/prebuilt/linux-x86/bin/arm-linux-androideabi-gcc   --sysroot=/opt/android-ndk-r6/platforms/android-5/arch-arm -fPIC -DANDROID -Wno-psabi -fsigned-char -mthumb  -fvisibility=internal  -Wattributes -Werror  -L"/opt/android-ndk-r6/sources/cxx-stl/gnu-libstdc++/libs/" -L"/libs/" -lstdc++ -lsupc++ CMakeFiles/cmTryCompileExec.dir/src.c.o  -o cmTryCompileExec -rdynamic -L/opt/android-ndk-r6/platforms/android-5/arch-arm/usr/lib 
-make[1]: Leaving directory `/home/hagish/workspace/adt/love-native-android/jni/openal-soft-android/CMakeFiles/CMakeTmp'
-
-Source file was:
-
-Performing C SOURCE FILE Test HAVE_GCC_FORMAT succeded with the following output:
-Change Dir: /home/hagish/workspace/adt/love-native-android/jni/openal-soft-android/CMakeFiles/CMakeTmp
-
-Run Build Command:/usr/bin/make "cmTryCompileExec/fast"
-/usr/bin/make -f CMakeFiles/cmTryCompileExec.dir/build.make CMakeFiles/cmTryCompileExec.dir/build
-make[1]: Entering directory `/home/hagish/workspace/adt/love-native-android/jni/openal-soft-android/CMakeFiles/CMakeTmp'
-/usr/bin/cmake -E cmake_progress_report /home/hagish/workspace/adt/love-native-android/jni/openal-soft-android/CMakeFiles/CMakeTmp/CMakeFiles 1
-Building C object CMakeFiles/cmTryCompileExec.dir/src.c.o
-/opt/android-ndk-r6/toolchains/arm-linux-androideabi-4.4.3/prebuilt/linux-x86/bin/arm-linux-androideabi-gcc   --sysroot=/opt/android-ndk-r6/platforms/android-5/arch-arm -fPIC -DANDROID -Wno-psabi -fsigned-char -mthumb  -DHAVE_GCC_FORMAT -I/opt/android-ndk-r6/sources/cxx-stl/gnu-libstdc++/include -I/opt/android-ndk-r6/sources/cxx-stl/gnu-libstdc++/libs/include   -o CMakeFiles/cmTryCompileExec.dir/src.c.o   -c /home/hagish/workspace/adt/love-native-android/jni/openal-soft-android/CMakeFiles/CMakeTmp/src.c
-Linking C executable cmTryCompileExec
-/usr/bin/cmake -E cmake_link_script CMakeFiles/cmTryCompileExec.dir/link.txt --verbose=1
-/opt/android-ndk-r6/toolchains/arm-linux-androideabi-4.4.3/prebuilt/linux-x86/bin/arm-linux-androideabi-gcc   --sysroot=/opt/android-ndk-r6/platforms/android-5/arch-arm -fPIC -DANDROID -Wno-psabi -fsigned-char -mthumb  -DHAVE_GCC_FORMAT  -L"/opt/android-ndk-r6/sources/cxx-stl/gnu-libstdc++/libs/" -L"/libs/" -lstdc++ -lsupc++ CMakeFiles/cmTryCompileExec.dir/src.c.o  -o cmTryCompileExec -rdynamic -L/opt/android-ndk-r6/platforms/android-5/arch-arm/usr/lib 
-make[1]: Leaving directory `/home/hagish/workspace/adt/love-native-android/jni/openal-soft-android/CMakeFiles/CMakeTmp'
-
-Source file was:
-int foo(const char *str, ...) __attribute__((format(printf, 1, 2)));
-                         int main() {return 0;}
-Determining if the include file float.h exists passed with the following output:
-Change Dir: /home/hagish/workspace/adt/love-native-android/jni/openal-soft-android/CMakeFiles/CMakeTmp
-
-Run Build Command:/usr/bin/make "cmTryCompileExec/fast"
-/usr/bin/make -f CMakeFiles/cmTryCompileExec.dir/build.make CMakeFiles/cmTryCompileExec.dir/build
-make[1]: Entering directory `/home/hagish/workspace/adt/love-native-android/jni/openal-soft-android/CMakeFiles/CMakeTmp'
-/usr/bin/cmake -E cmake_progress_report /home/hagish/workspace/adt/love-native-android/jni/openal-soft-android/CMakeFiles/CMakeTmp/CMakeFiles 1
-Building C object CMakeFiles/cmTryCompileExec.dir/CheckIncludeFile.c.o
-/opt/android-ndk-r6/toolchains/arm-linux-androideabi-4.4.3/prebuilt/linux-x86/bin/arm-linux-androideabi-gcc   --sysroot=/opt/android-ndk-r6/platforms/android-5/arch-arm -fPIC -DANDROID -Wno-psabi -fsigned-char -mthumb   -I/opt/android-ndk-r6/sources/cxx-stl/gnu-libstdc++/include -I/opt/android-ndk-r6/sources/cxx-stl/gnu-libstdc++/libs/include   -o CMakeFiles/cmTryCompileExec.dir/CheckIncludeFile.c.o   -c /home/hagish/workspace/adt/love-native-android/jni/openal-soft-android/CMakeFiles/CMakeTmp/CheckIncludeFile.c
-Linking C executable cmTryCompileExec
-/usr/bin/cmake -E cmake_link_script CMakeFiles/cmTryCompileExec.dir/link.txt --verbose=1
-/opt/android-ndk-r6/toolchains/arm-linux-androideabi-4.4.3/prebuilt/linux-x86/bin/arm-linux-androideabi-gcc   --sysroot=/opt/android-ndk-r6/platforms/android-5/arch-arm -fPIC -DANDROID -Wno-psabi -fsigned-char -mthumb    -L"/opt/android-ndk-r6/sources/cxx-stl/gnu-libstdc++/libs/" -L"/libs/" -lstdc++ -lsupc++ CMakeFiles/cmTryCompileExec.dir/CheckIncludeFile.c.o  -o cmTryCompileExec -rdynamic -L/opt/android-ndk-r6/platforms/android-5/arch-arm/usr/lib 
-make[1]: Leaving directory `/home/hagish/workspace/adt/love-native-android/jni/openal-soft-android/CMakeFiles/CMakeTmp'
-
-
-Determining if the function pow exists in the m passed with the following output:
-Change Dir: /home/hagish/workspace/adt/love-native-android/jni/openal-soft-android/CMakeFiles/CMakeTmp
-
-Run Build Command:/usr/bin/make "cmTryCompileExec/fast"
-/usr/bin/make -f CMakeFiles/cmTryCompileExec.dir/build.make CMakeFiles/cmTryCompileExec.dir/build
-make[1]: Entering directory `/home/hagish/workspace/adt/love-native-android/jni/openal-soft-android/CMakeFiles/CMakeTmp'
-/usr/bin/cmake -E cmake_progress_report /home/hagish/workspace/adt/love-native-android/jni/openal-soft-android/CMakeFiles/CMakeTmp/CMakeFiles 1
-Building C object CMakeFiles/cmTryCompileExec.dir/CheckFunctionExists.c.o
-/opt/android-ndk-r6/toolchains/arm-linux-androideabi-4.4.3/prebuilt/linux-x86/bin/arm-linux-androideabi-gcc   --sysroot=/opt/android-ndk-r6/platforms/android-5/arch-arm -fPIC -DANDROID -Wno-psabi -fsigned-char -mthumb  -DCHECK_FUNCTION_EXISTS=pow -I/opt/android-ndk-r6/sources/cxx-stl/gnu-libstdc++/include -I/opt/android-ndk-r6/sources/cxx-stl/gnu-libstdc++/libs/include   -o CMakeFiles/cmTryCompileExec.dir/CheckFunctionExists.c.o   -c /usr/share/cmake-2.8/Modules/CheckFunctionExists.c
-/usr/share/cmake-2.8/Modules/CheckFunctionExists.c:3: warning: conflicting types for built-in function 'pow'
-Linking C executable cmTryCompileExec
-/usr/bin/cmake -E cmake_link_script CMakeFiles/cmTryCompileExec.dir/link.txt --verbose=1
-/opt/android-ndk-r6/toolchains/arm-linux-androideabi-4.4.3/prebuilt/linux-x86/bin/arm-linux-androideabi-gcc   --sysroot=/opt/android-ndk-r6/platforms/android-5/arch-arm -fPIC -DANDROID -Wno-psabi -fsigned-char -mthumb  -DCHECK_FUNCTION_EXISTS=pow  -L"/opt/android-ndk-r6/sources/cxx-stl/gnu-libstdc++/libs/" -L"/libs/" -lstdc++ -lsupc++ CMakeFiles/cmTryCompileExec.dir/CheckFunctionExists.c.o  -o cmTryCompileExec -rdynamic -L/opt/android-ndk-r6/platforms/android-5/arch-arm/usr/lib -lm -Wl,-rpath,/opt/android-ndk-r6/platforms/android-5/arch-arm/usr/lib 
-make[1]: Leaving directory `/home/hagish/workspace/adt/love-native-android/jni/openal-soft-android/CMakeFiles/CMakeTmp'
-
-
-Determining if the powf exist passed with the following output:
-Change Dir: /home/hagish/workspace/adt/love-native-android/jni/openal-soft-android/CMakeFiles/CMakeTmp
-
-Run Build Command:/usr/bin/make "cmTryCompileExec/fast"
-/usr/bin/make -f CMakeFiles/cmTryCompileExec.dir/build.make CMakeFiles/cmTryCompileExec.dir/build
-make[1]: Entering directory `/home/hagish/workspace/adt/love-native-android/jni/openal-soft-android/CMakeFiles/CMakeTmp'
-/usr/bin/cmake -E cmake_progress_report /home/hagish/workspace/adt/love-native-android/jni/openal-soft-android/CMakeFiles/CMakeTmp/CMakeFiles 1
-Building C object CMakeFiles/cmTryCompileExec.dir/CheckSymbolExists.c.o
-/opt/android-ndk-r6/toolchains/arm-linux-androideabi-4.4.3/prebuilt/linux-x86/bin/arm-linux-androideabi-gcc   --sysroot=/opt/android-ndk-r6/platforms/android-5/arch-arm -fPIC -DANDROID -Wno-psabi -fsigned-char -mthumb   -I/opt/android-ndk-r6/sources/cxx-stl/gnu-libstdc++/include -I/opt/android-ndk-r6/sources/cxx-stl/gnu-libstdc++/libs/include   -o CMakeFiles/cmTryCompileExec.dir/CheckSymbolExists.c.o   -c /home/hagish/workspace/adt/love-native-android/jni/openal-soft-android/CMakeFiles/CMakeTmp/CheckSymbolExists.c
-Linking C executable cmTryCompileExec
-/usr/bin/cmake -E cmake_link_script CMakeFiles/cmTryCompileExec.dir/link.txt --verbose=1
-/opt/android-ndk-r6/toolchains/arm-linux-androideabi-4.4.3/prebuilt/linux-x86/bin/arm-linux-androideabi-gcc   --sysroot=/opt/android-ndk-r6/platforms/android-5/arch-arm -fPIC -DANDROID -Wno-psabi -fsigned-char -mthumb    -L"/opt/android-ndk-r6/sources/cxx-stl/gnu-libstdc++/libs/" -L"/libs/" -lstdc++ -lsupc++ CMakeFiles/cmTryCompileExec.dir/CheckSymbolExists.c.o  -o cmTryCompileExec -rdynamic -L/opt/android-ndk-r6/platforms/android-5/arch-arm/usr/lib -lm -Wl,-rpath,/opt/android-ndk-r6/platforms/android-5/arch-arm/usr/lib 
-make[1]: Leaving directory `/home/hagish/workspace/adt/love-native-android/jni/openal-soft-android/CMakeFiles/CMakeTmp'
-
-File /home/hagish/workspace/adt/love-native-android/jni/openal-soft-android/CMakeFiles/CMakeTmp/CheckSymbolExists.c:
-/* */
-#include <math.h>
-
-void cmakeRequireSymbol(int dummy,...){(void)dummy;}
-int main()
-{
-#ifndef powf
-  cmakeRequireSymbol(0,&powf);
-#endif
-  return 0;
-}
-
-Determining if the sqrtf exist passed with the following output:
-Change Dir: /home/hagish/workspace/adt/love-native-android/jni/openal-soft-android/CMakeFiles/CMakeTmp
-
-Run Build Command:/usr/bin/make "cmTryCompileExec/fast"
-/usr/bin/make -f CMakeFiles/cmTryCompileExec.dir/build.make CMakeFiles/cmTryCompileExec.dir/build
-make[1]: Entering directory `/home/hagish/workspace/adt/love-native-android/jni/openal-soft-android/CMakeFiles/CMakeTmp'
-/usr/bin/cmake -E cmake_progress_report /home/hagish/workspace/adt/love-native-android/jni/openal-soft-android/CMakeFiles/CMakeTmp/CMakeFiles 1
-Building C object CMakeFiles/cmTryCompileExec.dir/CheckSymbolExists.c.o
-/opt/android-ndk-r6/toolchains/arm-linux-androideabi-4.4.3/prebuilt/linux-x86/bin/arm-linux-androideabi-gcc   --sysroot=/opt/android-ndk-r6/platforms/android-5/arch-arm -fPIC -DANDROID -Wno-psabi -fsigned-char -mthumb   -I/opt/android-ndk-r6/sources/cxx-stl/gnu-libstdc++/include -I/opt/android-ndk-r6/sources/cxx-stl/gnu-libstdc++/libs/include   -o CMakeFiles/cmTryCompileExec.dir/CheckSymbolExists.c.o   -c /home/hagish/workspace/adt/love-native-android/jni/openal-soft-android/CMakeFiles/CMakeTmp/CheckSymbolExists.c
-Linking C executable cmTryCompileExec
-/usr/bin/cmake -E cmake_link_script CMakeFiles/cmTryCompileExec.dir/link.txt --verbose=1
-/opt/android-ndk-r6/toolchains/arm-linux-androideabi-4.4.3/prebuilt/linux-x86/bin/arm-linux-androideabi-gcc   --sysroot=/opt/android-ndk-r6/platforms/android-5/arch-arm -fPIC -DANDROID -Wno-psabi -fsigned-char -mthumb    -L"/opt/android-ndk-r6/sources/cxx-stl/gnu-libstdc++/libs/" -L"/libs/" -lstdc++ -lsupc++ CMakeFiles/cmTryCompileExec.dir/CheckSymbolExists.c.o  -o cmTryCompileExec -rdynamic -L/opt/android-ndk-r6/platforms/android-5/arch-arm/usr/lib -lm -Wl,-rpath,/opt/android-ndk-r6/platforms/android-5/arch-arm/usr/lib 
-make[1]: Leaving directory `/home/hagish/workspace/adt/love-native-android/jni/openal-soft-android/CMakeFiles/CMakeTmp'
-
-File /home/hagish/workspace/adt/love-native-android/jni/openal-soft-android/CMakeFiles/CMakeTmp/CheckSymbolExists.c:
-/* */
-#include <math.h>
-
-void cmakeRequireSymbol(int dummy,...){(void)dummy;}
-int main()
-{
-#ifndef sqrtf
-  cmakeRequireSymbol(0,&sqrtf);
-#endif
-  return 0;
-}
-
-Determining if the cosf exist passed with the following output:
-Change Dir: /home/hagish/workspace/adt/love-native-android/jni/openal-soft-android/CMakeFiles/CMakeTmp
-
-Run Build Command:/usr/bin/make "cmTryCompileExec/fast"
-/usr/bin/make -f CMakeFiles/cmTryCompileExec.dir/build.make CMakeFiles/cmTryCompileExec.dir/build
-make[1]: Entering directory `/home/hagish/workspace/adt/love-native-android/jni/openal-soft-android/CMakeFiles/CMakeTmp'
-/usr/bin/cmake -E cmake_progress_report /home/hagish/workspace/adt/love-native-android/jni/openal-soft-android/CMakeFiles/CMakeTmp/CMakeFiles 1
-Building C object CMakeFiles/cmTryCompileExec.dir/CheckSymbolExists.c.o
-/opt/android-ndk-r6/toolchains/arm-linux-androideabi-4.4.3/prebuilt/linux-x86/bin/arm-linux-androideabi-gcc   --sysroot=/opt/android-ndk-r6/platforms/android-5/arch-arm -fPIC -DANDROID -Wno-psabi -fsigned-char -mthumb   -I/opt/android-ndk-r6/sources/cxx-stl/gnu-libstdc++/include -I/opt/android-ndk-r6/sources/cxx-stl/gnu-libstdc++/libs/include   -o CMakeFiles/cmTryCompileExec.dir/CheckSymbolExists.c.o   -c /home/hagish/workspace/adt/love-native-android/jni/openal-soft-android/CMakeFiles/CMakeTmp/CheckSymbolExists.c
-Linking C executable cmTryCompileExec
-/usr/bin/cmake -E cmake_link_script CMakeFiles/cmTryCompileExec.dir/link.txt --verbose=1
-/opt/android-ndk-r6/toolchains/arm-linux-androideabi-4.4.3/prebuilt/linux-x86/bin/arm-linux-androideabi-gcc   --sysroot=/opt/android-ndk-r6/platforms/android-5/arch-arm -fPIC -DANDROID -Wno-psabi -fsigned-char -mthumb    -L"/opt/android-ndk-r6/sources/cxx-stl/gnu-libstdc++/libs/" -L"/libs/" -lstdc++ -lsupc++ CMakeFiles/cmTryCompileExec.dir/CheckSymbolExists.c.o  -o cmTryCompileExec -rdynamic -L/opt/android-ndk-r6/platforms/android-5/arch-arm/usr/lib -lm -Wl,-rpath,/opt/android-ndk-r6/platforms/android-5/arch-arm/usr/lib 
-make[1]: Leaving directory `/home/hagish/workspace/adt/love-native-android/jni/openal-soft-android/CMakeFiles/CMakeTmp'
-
-File /home/hagish/workspace/adt/love-native-android/jni/openal-soft-android/CMakeFiles/CMakeTmp/CheckSymbolExists.c:
-/* */
-#include <math.h>
-
-void cmakeRequireSymbol(int dummy,...){(void)dummy;}
-int main()
-{
-#ifndef cosf
-  cmakeRequireSymbol(0,&cosf);
-#endif
-  return 0;
-}
-
-Determining if the sinf exist passed with the following output:
-Change Dir: /home/hagish/workspace/adt/love-native-android/jni/openal-soft-android/CMakeFiles/CMakeTmp
-
-Run Build Command:/usr/bin/make "cmTryCompileExec/fast"
-/usr/bin/make -f CMakeFiles/cmTryCompileExec.dir/build.make CMakeFiles/cmTryCompileExec.dir/build
-make[1]: Entering directory `/home/hagish/workspace/adt/love-native-android/jni/openal-soft-android/CMakeFiles/CMakeTmp'
-/usr/bin/cmake -E cmake_progress_report /home/hagish/workspace/adt/love-native-android/jni/openal-soft-android/CMakeFiles/CMakeTmp/CMakeFiles 1
-Building C object CMakeFiles/cmTryCompileExec.dir/CheckSymbolExists.c.o
-/opt/android-ndk-r6/toolchains/arm-linux-androideabi-4.4.3/prebuilt/linux-x86/bin/arm-linux-androideabi-gcc   --sysroot=/opt/android-ndk-r6/platforms/android-5/arch-arm -fPIC -DANDROID -Wno-psabi -fsigned-char -mthumb   -I/opt/android-ndk-r6/sources/cxx-stl/gnu-libstdc++/include -I/opt/android-ndk-r6/sources/cxx-stl/gnu-libstdc++/libs/include   -o CMakeFiles/cmTryCompileExec.dir/CheckSymbolExists.c.o   -c /home/hagish/workspace/adt/love-native-android/jni/openal-soft-android/CMakeFiles/CMakeTmp/CheckSymbolExists.c
-Linking C executable cmTryCompileExec
-/usr/bin/cmake -E cmake_link_script CMakeFiles/cmTryCompileExec.dir/link.txt --verbose=1
-/opt/android-ndk-r6/toolchains/arm-linux-androideabi-4.4.3/prebuilt/linux-x86/bin/arm-linux-androideabi-gcc   --sysroot=/opt/android-ndk-r6/platforms/android-5/arch-arm -fPIC -DANDROID -Wno-psabi -fsigned-char -mthumb    -L"/opt/android-ndk-r6/sources/cxx-stl/gnu-libstdc++/libs/" -L"/libs/" -lstdc++ -lsupc++ CMakeFiles/cmTryCompileExec.dir/CheckSymbolExists.c.o  -o cmTryCompileExec -rdynamic -L/opt/android-ndk-r6/platforms/android-5/arch-arm/usr/lib -lm -Wl,-rpath,/opt/android-ndk-r6/platforms/android-5/arch-arm/usr/lib 
-make[1]: Leaving directory `/home/hagish/workspace/adt/love-native-android/jni/openal-soft-android/CMakeFiles/CMakeTmp'
-
-File /home/hagish/workspace/adt/love-native-android/jni/openal-soft-android/CMakeFiles/CMakeTmp/CheckSymbolExists.c:
-/* */
-#include <math.h>
-
-void cmakeRequireSymbol(int dummy,...){(void)dummy;}
-int main()
-{
-#ifndef sinf
-  cmakeRequireSymbol(0,&sinf);
-#endif
-  return 0;
-}
-
-Determining if the acosf exist passed with the following output:
-Change Dir: /home/hagish/workspace/adt/love-native-android/jni/openal-soft-android/CMakeFiles/CMakeTmp
-
-Run Build Command:/usr/bin/make "cmTryCompileExec/fast"
-/usr/bin/make -f CMakeFiles/cmTryCompileExec.dir/build.make CMakeFiles/cmTryCompileExec.dir/build
-make[1]: Entering directory `/home/hagish/workspace/adt/love-native-android/jni/openal-soft-android/CMakeFiles/CMakeTmp'
-/usr/bin/cmake -E cmake_progress_report /home/hagish/workspace/adt/love-native-android/jni/openal-soft-android/CMakeFiles/CMakeTmp/CMakeFiles 1
-Building C object CMakeFiles/cmTryCompileExec.dir/CheckSymbolExists.c.o
-/opt/android-ndk-r6/toolchains/arm-linux-androideabi-4.4.3/prebuilt/linux-x86/bin/arm-linux-androideabi-gcc   --sysroot=/opt/android-ndk-r6/platforms/android-5/arch-arm -fPIC -DANDROID -Wno-psabi -fsigned-char -mthumb   -I/opt/android-ndk-r6/sources/cxx-stl/gnu-libstdc++/include -I/opt/android-ndk-r6/sources/cxx-stl/gnu-libstdc++/libs/include   -o CMakeFiles/cmTryCompileExec.dir/CheckSymbolExists.c.o   -c /home/hagish/workspace/adt/love-native-android/jni/openal-soft-android/CMakeFiles/CMakeTmp/CheckSymbolExists.c
-Linking C executable cmTryCompileExec
-/usr/bin/cmake -E cmake_link_script CMakeFiles/cmTryCompileExec.dir/link.txt --verbose=1
-/opt/android-ndk-r6/toolchains/arm-linux-androideabi-4.4.3/prebuilt/linux-x86/bin/arm-linux-androideabi-gcc   --sysroot=/opt/android-ndk-r6/platforms/android-5/arch-arm -fPIC -DANDROID -Wno-psabi -fsigned-char -mthumb    -L"/opt/android-ndk-r6/sources/cxx-stl/gnu-libstdc++/libs/" -L"/libs/" -lstdc++ -lsupc++ CMakeFiles/cmTryCompileExec.dir/CheckSymbolExists.c.o  -o cmTryCompileExec -rdynamic -L/opt/android-ndk-r6/platforms/android-5/arch-arm/usr/lib -lm -Wl,-rpath,/opt/android-ndk-r6/platforms/android-5/arch-arm/usr/lib 
-make[1]: Leaving directory `/home/hagish/workspace/adt/love-native-android/jni/openal-soft-android/CMakeFiles/CMakeTmp'
-
-File /home/hagish/workspace/adt/love-native-android/jni/openal-soft-android/CMakeFiles/CMakeTmp/CheckSymbolExists.c:
-/* */
-#include <math.h>
-
-void cmakeRequireSymbol(int dummy,...){(void)dummy;}
-int main()
-{
-#ifndef acosf
-  cmakeRequireSymbol(0,&acosf);
-#endif
-  return 0;
-}
-
-Determining if the asinf exist passed with the following output:
-Change Dir: /home/hagish/workspace/adt/love-native-android/jni/openal-soft-android/CMakeFiles/CMakeTmp
-
-Run Build Command:/usr/bin/make "cmTryCompileExec/fast"
-/usr/bin/make -f CMakeFiles/cmTryCompileExec.dir/build.make CMakeFiles/cmTryCompileExec.dir/build
-make[1]: Entering directory `/home/hagish/workspace/adt/love-native-android/jni/openal-soft-android/CMakeFiles/CMakeTmp'
-/usr/bin/cmake -E cmake_progress_report /home/hagish/workspace/adt/love-native-android/jni/openal-soft-android/CMakeFiles/CMakeTmp/CMakeFiles 1
-Building C object CMakeFiles/cmTryCompileExec.dir/CheckSymbolExists.c.o
-/opt/android-ndk-r6/toolchains/arm-linux-androideabi-4.4.3/prebuilt/linux-x86/bin/arm-linux-androideabi-gcc   --sysroot=/opt/android-ndk-r6/platforms/android-5/arch-arm -fPIC -DANDROID -Wno-psabi -fsigned-char -mthumb   -I/opt/android-ndk-r6/sources/cxx-stl/gnu-libstdc++/include -I/opt/android-ndk-r6/sources/cxx-stl/gnu-libstdc++/libs/include   -o CMakeFiles/cmTryCompileExec.dir/CheckSymbolExists.c.o   -c /home/hagish/workspace/adt/love-native-android/jni/openal-soft-android/CMakeFiles/CMakeTmp/CheckSymbolExists.c
-Linking C executable cmTryCompileExec
-/usr/bin/cmake -E cmake_link_script CMakeFiles/cmTryCompileExec.dir/link.txt --verbose=1
-/opt/android-ndk-r6/toolchains/arm-linux-androideabi-4.4.3/prebuilt/linux-x86/bin/arm-linux-androideabi-gcc   --sysroot=/opt/android-ndk-r6/platforms/android-5/arch-arm -fPIC -DANDROID -Wno-psabi -fsigned-char -mthumb    -L"/opt/android-ndk-r6/sources/cxx-stl/gnu-libstdc++/libs/" -L"/libs/" -lstdc++ -lsupc++ CMakeFiles/cmTryCompileExec.dir/CheckSymbolExists.c.o  -o cmTryCompileExec -rdynamic -L/opt/android-ndk-r6/platforms/android-5/arch-arm/usr/lib -lm -Wl,-rpath,/opt/android-ndk-r6/platforms/android-5/arch-arm/usr/lib 
-make[1]: Leaving directory `/home/hagish/workspace/adt/love-native-android/jni/openal-soft-android/CMakeFiles/CMakeTmp'
-
-File /home/hagish/workspace/adt/love-native-android/jni/openal-soft-android/CMakeFiles/CMakeTmp/CheckSymbolExists.c:
-/* */
-#include <math.h>
-
-void cmakeRequireSymbol(int dummy,...){(void)dummy;}
-int main()
-{
-#ifndef asinf
-  cmakeRequireSymbol(0,&asinf);
-#endif
-  return 0;
-}
-
-Determining if the atanf exist passed with the following output:
-Change Dir: /home/hagish/workspace/adt/love-native-android/jni/openal-soft-android/CMakeFiles/CMakeTmp
-
-Run Build Command:/usr/bin/make "cmTryCompileExec/fast"
-/usr/bin/make -f CMakeFiles/cmTryCompileExec.dir/build.make CMakeFiles/cmTryCompileExec.dir/build
-make[1]: Entering directory `/home/hagish/workspace/adt/love-native-android/jni/openal-soft-android/CMakeFiles/CMakeTmp'
-/usr/bin/cmake -E cmake_progress_report /home/hagish/workspace/adt/love-native-android/jni/openal-soft-android/CMakeFiles/CMakeTmp/CMakeFiles 1
-Building C object CMakeFiles/cmTryCompileExec.dir/CheckSymbolExists.c.o
-/opt/android-ndk-r6/toolchains/arm-linux-androideabi-4.4.3/prebuilt/linux-x86/bin/arm-linux-androideabi-gcc   --sysroot=/opt/android-ndk-r6/platforms/android-5/arch-arm -fPIC -DANDROID -Wno-psabi -fsigned-char -mthumb   -I/opt/android-ndk-r6/sources/cxx-stl/gnu-libstdc++/include -I/opt/android-ndk-r6/sources/cxx-stl/gnu-libstdc++/libs/include   -o CMakeFiles/cmTryCompileExec.dir/CheckSymbolExists.c.o   -c /home/hagish/workspace/adt/love-native-android/jni/openal-soft-android/CMakeFiles/CMakeTmp/CheckSymbolExists.c
-Linking C executable cmTryCompileExec
-/usr/bin/cmake -E cmake_link_script CMakeFiles/cmTryCompileExec.dir/link.txt --verbose=1
-/opt/android-ndk-r6/toolchains/arm-linux-androideabi-4.4.3/prebuilt/linux-x86/bin/arm-linux-androideabi-gcc   --sysroot=/opt/android-ndk-r6/platforms/android-5/arch-arm -fPIC -DANDROID -Wno-psabi -fsigned-char -mthumb    -L"/opt/android-ndk-r6/sources/cxx-stl/gnu-libstdc++/libs/" -L"/libs/" -lstdc++ -lsupc++ CMakeFiles/cmTryCompileExec.dir/CheckSymbolExists.c.o  -o cmTryCompileExec -rdynamic -L/opt/android-ndk-r6/platforms/android-5/arch-arm/usr/lib -lm -Wl,-rpath,/opt/android-ndk-r6/platforms/android-5/arch-arm/usr/lib 
-make[1]: Leaving directory `/home/hagish/workspace/adt/love-native-android/jni/openal-soft-android/CMakeFiles/CMakeTmp'
-
-File /home/hagish/workspace/adt/love-native-android/jni/openal-soft-android/CMakeFiles/CMakeTmp/CheckSymbolExists.c:
-/* */
-#include <math.h>
-
-void cmakeRequireSymbol(int dummy,...){(void)dummy;}
-int main()
-{
-#ifndef atanf
-  cmakeRequireSymbol(0,&atanf);
-#endif
-  return 0;
-}
-
-Determining if the atan2f exist passed with the following output:
-Change Dir: /home/hagish/workspace/adt/love-native-android/jni/openal-soft-android/CMakeFiles/CMakeTmp
-
-Run Build Command:/usr/bin/make "cmTryCompileExec/fast"
-/usr/bin/make -f CMakeFiles/cmTryCompileExec.dir/build.make CMakeFiles/cmTryCompileExec.dir/build
-make[1]: Entering directory `/home/hagish/workspace/adt/love-native-android/jni/openal-soft-android/CMakeFiles/CMakeTmp'
-/usr/bin/cmake -E cmake_progress_report /home/hagish/workspace/adt/love-native-android/jni/openal-soft-android/CMakeFiles/CMakeTmp/CMakeFiles 1
-Building C object CMakeFiles/cmTryCompileExec.dir/CheckSymbolExists.c.o
-/opt/android-ndk-r6/toolchains/arm-linux-androideabi-4.4.3/prebuilt/linux-x86/bin/arm-linux-androideabi-gcc   --sysroot=/opt/android-ndk-r6/platforms/android-5/arch-arm -fPIC -DANDROID -Wno-psabi -fsigned-char -mthumb   -I/opt/android-ndk-r6/sources/cxx-stl/gnu-libstdc++/include -I/opt/android-ndk-r6/sources/cxx-stl/gnu-libstdc++/libs/include   -o CMakeFiles/cmTryCompileExec.dir/CheckSymbolExists.c.o   -c /home/hagish/workspace/adt/love-native-android/jni/openal-soft-android/CMakeFiles/CMakeTmp/CheckSymbolExists.c
-Linking C executable cmTryCompileExec
-/usr/bin/cmake -E cmake_link_script CMakeFiles/cmTryCompileExec.dir/link.txt --verbose=1
-/opt/android-ndk-r6/toolchains/arm-linux-androideabi-4.4.3/prebuilt/linux-x86/bin/arm-linux-androideabi-gcc   --sysroot=/opt/android-ndk-r6/platforms/android-5/arch-arm -fPIC -DANDROID -Wno-psabi -fsigned-char -mthumb    -L"/opt/android-ndk-r6/sources/cxx-stl/gnu-libstdc++/libs/" -L"/libs/" -lstdc++ -lsupc++ CMakeFiles/cmTryCompileExec.dir/CheckSymbolExists.c.o  -o cmTryCompileExec -rdynamic -L/opt/android-ndk-r6/platforms/android-5/arch-arm/usr/lib -lm -Wl,-rpath,/opt/android-ndk-r6/platforms/android-5/arch-arm/usr/lib 
-make[1]: Leaving directory `/home/hagish/workspace/adt/love-native-android/jni/openal-soft-android/CMakeFiles/CMakeTmp'
-
-File /home/hagish/workspace/adt/love-native-android/jni/openal-soft-android/CMakeFiles/CMakeTmp/CheckSymbolExists.c:
-/* */
-#include <math.h>
-
-void cmakeRequireSymbol(int dummy,...){(void)dummy;}
-int main()
-{
-#ifndef atan2f
-  cmakeRequireSymbol(0,&atan2f);
-#endif
-  return 0;
-}
-
-Determining if the fabsf exist passed with the following output:
-Change Dir: /home/hagish/workspace/adt/love-native-android/jni/openal-soft-android/CMakeFiles/CMakeTmp
-
-Run Build Command:/usr/bin/make "cmTryCompileExec/fast"
-/usr/bin/make -f CMakeFiles/cmTryCompileExec.dir/build.make CMakeFiles/cmTryCompileExec.dir/build
-make[1]: Entering directory `/home/hagish/workspace/adt/love-native-android/jni/openal-soft-android/CMakeFiles/CMakeTmp'
-/usr/bin/cmake -E cmake_progress_report /home/hagish/workspace/adt/love-native-android/jni/openal-soft-android/CMakeFiles/CMakeTmp/CMakeFiles 1
-Building C object CMakeFiles/cmTryCompileExec.dir/CheckSymbolExists.c.o
-/opt/android-ndk-r6/toolchains/arm-linux-androideabi-4.4.3/prebuilt/linux-x86/bin/arm-linux-androideabi-gcc   --sysroot=/opt/android-ndk-r6/platforms/android-5/arch-arm -fPIC -DANDROID -Wno-psabi -fsigned-char -mthumb   -I/opt/android-ndk-r6/sources/cxx-stl/gnu-libstdc++/include -I/opt/android-ndk-r6/sources/cxx-stl/gnu-libstdc++/libs/include   -o CMakeFiles/cmTryCompileExec.dir/CheckSymbolExists.c.o   -c /home/hagish/workspace/adt/love-native-android/jni/openal-soft-android/CMakeFiles/CMakeTmp/CheckSymbolExists.c
-Linking C executable cmTryCompileExec
-/usr/bin/cmake -E cmake_link_script CMakeFiles/cmTryCompileExec.dir/link.txt --verbose=1
-/opt/android-ndk-r6/toolchains/arm-linux-androideabi-4.4.3/prebuilt/linux-x86/bin/arm-linux-androideabi-gcc   --sysroot=/opt/android-ndk-r6/platforms/android-5/arch-arm -fPIC -DANDROID -Wno-psabi -fsigned-char -mthumb    -L"/opt/android-ndk-r6/sources/cxx-stl/gnu-libstdc++/libs/" -L"/libs/" -lstdc++ -lsupc++ CMakeFiles/cmTryCompileExec.dir/CheckSymbolExists.c.o  -o cmTryCompileExec -rdynamic -L/opt/android-ndk-r6/platforms/android-5/arch-arm/usr/lib -lm -Wl,-rpath,/opt/android-ndk-r6/platforms/android-5/arch-arm/usr/lib 
-make[1]: Leaving directory `/home/hagish/workspace/adt/love-native-android/jni/openal-soft-android/CMakeFiles/CMakeTmp'
-
-File /home/hagish/workspace/adt/love-native-android/jni/openal-soft-android/CMakeFiles/CMakeTmp/CheckSymbolExists.c:
-/* */
-#include <math.h>
-
-void cmakeRequireSymbol(int dummy,...){(void)dummy;}
-int main()
-{
-#ifndef fabsf
-  cmakeRequireSymbol(0,&fabsf);
-#endif
-  return 0;
-}
-
-Determining if the log10f exist passed with the following output:
-Change Dir: /home/hagish/workspace/adt/love-native-android/jni/openal-soft-android/CMakeFiles/CMakeTmp
-
-Run Build Command:/usr/bin/make "cmTryCompileExec/fast"
-/usr/bin/make -f CMakeFiles/cmTryCompileExec.dir/build.make CMakeFiles/cmTryCompileExec.dir/build
-make[1]: Entering directory `/home/hagish/workspace/adt/love-native-android/jni/openal-soft-android/CMakeFiles/CMakeTmp'
-/usr/bin/cmake -E cmake_progress_report /home/hagish/workspace/adt/love-native-android/jni/openal-soft-android/CMakeFiles/CMakeTmp/CMakeFiles 1
-Building C object CMakeFiles/cmTryCompileExec.dir/CheckSymbolExists.c.o
-/opt/android-ndk-r6/toolchains/arm-linux-androideabi-4.4.3/prebuilt/linux-x86/bin/arm-linux-androideabi-gcc   --sysroot=/opt/android-ndk-r6/platforms/android-5/arch-arm -fPIC -DANDROID -Wno-psabi -fsigned-char -mthumb   -I/opt/android-ndk-r6/sources/cxx-stl/gnu-libstdc++/include -I/opt/android-ndk-r6/sources/cxx-stl/gnu-libstdc++/libs/include   -o CMakeFiles/cmTryCompileExec.dir/CheckSymbolExists.c.o   -c /home/hagish/workspace/adt/love-native-android/jni/openal-soft-android/CMakeFiles/CMakeTmp/CheckSymbolExists.c
-Linking C executable cmTryCompileExec
-/usr/bin/cmake -E cmake_link_script CMakeFiles/cmTryCompileExec.dir/link.txt --verbose=1
-/opt/android-ndk-r6/toolchains/arm-linux-androideabi-4.4.3/prebuilt/linux-x86/bin/arm-linux-androideabi-gcc   --sysroot=/opt/android-ndk-r6/platforms/android-5/arch-arm -fPIC -DANDROID -Wno-psabi -fsigned-char -mthumb    -L"/opt/android-ndk-r6/sources/cxx-stl/gnu-libstdc++/libs/" -L"/libs/" -lstdc++ -lsupc++ CMakeFiles/cmTryCompileExec.dir/CheckSymbolExists.c.o  -o cmTryCompileExec -rdynamic -L/opt/android-ndk-r6/platforms/android-5/arch-arm/usr/lib -lm -Wl,-rpath,/opt/android-ndk-r6/platforms/android-5/arch-arm/usr/lib 
-make[1]: Leaving directory `/home/hagish/workspace/adt/love-native-android/jni/openal-soft-android/CMakeFiles/CMakeTmp'
-
-File /home/hagish/workspace/adt/love-native-android/jni/openal-soft-android/CMakeFiles/CMakeTmp/CheckSymbolExists.c:
-/* */
-#include <math.h>
-
-void cmakeRequireSymbol(int dummy,...){(void)dummy;}
-int main()
-{
-#ifndef log10f
-  cmakeRequireSymbol(0,&log10f);
-#endif
-  return 0;
-}
-
-Determining if the floorf exist passed with the following output:
-Change Dir: /home/hagish/workspace/adt/love-native-android/jni/openal-soft-android/CMakeFiles/CMakeTmp
-
-Run Build Command:/usr/bin/make "cmTryCompileExec/fast"
-/usr/bin/make -f CMakeFiles/cmTryCompileExec.dir/build.make CMakeFiles/cmTryCompileExec.dir/build
-make[1]: Entering directory `/home/hagish/workspace/adt/love-native-android/jni/openal-soft-android/CMakeFiles/CMakeTmp'
-/usr/bin/cmake -E cmake_progress_report /home/hagish/workspace/adt/love-native-android/jni/openal-soft-android/CMakeFiles/CMakeTmp/CMakeFiles 1
-Building C object CMakeFiles/cmTryCompileExec.dir/CheckSymbolExists.c.o
-/opt/android-ndk-r6/toolchains/arm-linux-androideabi-4.4.3/prebuilt/linux-x86/bin/arm-linux-androideabi-gcc   --sysroot=/opt/android-ndk-r6/platforms/android-5/arch-arm -fPIC -DANDROID -Wno-psabi -fsigned-char -mthumb   -I/opt/android-ndk-r6/sources/cxx-stl/gnu-libstdc++/include -I/opt/android-ndk-r6/sources/cxx-stl/gnu-libstdc++/libs/include   -o CMakeFiles/cmTryCompileExec.dir/CheckSymbolExists.c.o   -c /home/hagish/workspace/adt/love-native-android/jni/openal-soft-android/CMakeFiles/CMakeTmp/CheckSymbolExists.c
-Linking C executable cmTryCompileExec
-/usr/bin/cmake -E cmake_link_script CMakeFiles/cmTryCompileExec.dir/link.txt --verbose=1
-/opt/android-ndk-r6/toolchains/arm-linux-androideabi-4.4.3/prebuilt/linux-x86/bin/arm-linux-androideabi-gcc   --sysroot=/opt/android-ndk-r6/platforms/android-5/arch-arm -fPIC -DANDROID -Wno-psabi -fsigned-char -mthumb    -L"/opt/android-ndk-r6/sources/cxx-stl/gnu-libstdc++/libs/" -L"/libs/" -lstdc++ -lsupc++ CMakeFiles/cmTryCompileExec.dir/CheckSymbolExists.c.o  -o cmTryCompileExec -rdynamic -L/opt/android-ndk-r6/platforms/android-5/arch-arm/usr/lib -lm -Wl,-rpath,/opt/android-ndk-r6/platforms/android-5/arch-arm/usr/lib 
-make[1]: Leaving directory `/home/hagish/workspace/adt/love-native-android/jni/openal-soft-android/CMakeFiles/CMakeTmp'
-
-File /home/hagish/workspace/adt/love-native-android/jni/openal-soft-android/CMakeFiles/CMakeTmp/CheckSymbolExists.c:
-/* */
-#include <math.h>
-
-void cmakeRequireSymbol(int dummy,...){(void)dummy;}
-int main()
-{
-#ifndef floorf
-  cmakeRequireSymbol(0,&floorf);
-#endif
-  return 0;
-}
-
-Determining if the function stat exists passed with the following output:
-Change Dir: /home/hagish/workspace/adt/love-native-android/jni/openal-soft-android/CMakeFiles/CMakeTmp
-
-Run Build Command:/usr/bin/make "cmTryCompileExec/fast"
-/usr/bin/make -f CMakeFiles/cmTryCompileExec.dir/build.make CMakeFiles/cmTryCompileExec.dir/build
-make[1]: Entering directory `/home/hagish/workspace/adt/love-native-android/jni/openal-soft-android/CMakeFiles/CMakeTmp'
-/usr/bin/cmake -E cmake_progress_report /home/hagish/workspace/adt/love-native-android/jni/openal-soft-android/CMakeFiles/CMakeTmp/CMakeFiles 1
-Building C object CMakeFiles/cmTryCompileExec.dir/CheckFunctionExists.c.o
-/opt/android-ndk-r6/toolchains/arm-linux-androideabi-4.4.3/prebuilt/linux-x86/bin/arm-linux-androideabi-gcc   --sysroot=/opt/android-ndk-r6/platforms/android-5/arch-arm -fPIC -DANDROID -Wno-psabi -fsigned-char -mthumb  -DCHECK_FUNCTION_EXISTS=stat -I/opt/android-ndk-r6/sources/cxx-stl/gnu-libstdc++/include -I/opt/android-ndk-r6/sources/cxx-stl/gnu-libstdc++/libs/include   -o CMakeFiles/cmTryCompileExec.dir/CheckFunctionExists.c.o   -c /usr/share/cmake-2.8/Modules/CheckFunctionExists.c
-Linking C executable cmTryCompileExec
-/usr/bin/cmake -E cmake_link_script CMakeFiles/cmTryCompileExec.dir/link.txt --verbose=1
-/opt/android-ndk-r6/toolchains/arm-linux-androideabi-4.4.3/prebuilt/linux-x86/bin/arm-linux-androideabi-gcc   --sysroot=/opt/android-ndk-r6/platforms/android-5/arch-arm -fPIC -DANDROID -Wno-psabi -fsigned-char -mthumb  -DCHECK_FUNCTION_EXISTS=stat  -L"/opt/android-ndk-r6/sources/cxx-stl/gnu-libstdc++/libs/" -L"/libs/" -lstdc++ -lsupc++ CMakeFiles/cmTryCompileExec.dir/CheckFunctionExists.c.o  -o cmTryCompileExec -rdynamic -L/opt/android-ndk-r6/platforms/android-5/arch-arm/usr/lib -lm -Wl,-rpath,/opt/android-ndk-r6/platforms/android-5/arch-arm/usr/lib 
-make[1]: Leaving directory `/home/hagish/workspace/adt/love-native-android/jni/openal-soft-android/CMakeFiles/CMakeTmp'
-
-
-Determining if the function strcasecmp exists passed with the following output:
-Change Dir: /home/hagish/workspace/adt/love-native-android/jni/openal-soft-android/CMakeFiles/CMakeTmp
-
-Run Build Command:/usr/bin/make "cmTryCompileExec/fast"
-/usr/bin/make -f CMakeFiles/cmTryCompileExec.dir/build.make CMakeFiles/cmTryCompileExec.dir/build
-make[1]: Entering directory `/home/hagish/workspace/adt/love-native-android/jni/openal-soft-android/CMakeFiles/CMakeTmp'
-/usr/bin/cmake -E cmake_progress_report /home/hagish/workspace/adt/love-native-android/jni/openal-soft-android/CMakeFiles/CMakeTmp/CMakeFiles 1
-Building C object CMakeFiles/cmTryCompileExec.dir/CheckFunctionExists.c.o
-/opt/android-ndk-r6/toolchains/arm-linux-androideabi-4.4.3/prebuilt/linux-x86/bin/arm-linux-androideabi-gcc   --sysroot=/opt/android-ndk-r6/platforms/android-5/arch-arm -fPIC -DANDROID -Wno-psabi -fsigned-char -mthumb  -DCHECK_FUNCTION_EXISTS=strcasecmp -I/opt/android-ndk-r6/sources/cxx-stl/gnu-libstdc++/include -I/opt/android-ndk-r6/sources/cxx-stl/gnu-libstdc++/libs/include   -o CMakeFiles/cmTryCompileExec.dir/CheckFunctionExists.c.o   -c /usr/share/cmake-2.8/Modules/CheckFunctionExists.c
-/usr/share/cmake-2.8/Modules/CheckFunctionExists.c:3: warning: conflicting types for built-in function 'strcasecmp'
-Linking C executable cmTryCompileExec
-/usr/bin/cmake -E cmake_link_script CMakeFiles/cmTryCompileExec.dir/link.txt --verbose=1
-/opt/android-ndk-r6/toolchains/arm-linux-androideabi-4.4.3/prebuilt/linux-x86/bin/arm-linux-androideabi-gcc   --sysroot=/opt/android-ndk-r6/platforms/android-5/arch-arm -fPIC -DANDROID -Wno-psabi -fsigned-char -mthumb  -DCHECK_FUNCTION_EXISTS=strcasecmp  -L"/opt/android-ndk-r6/sources/cxx-stl/gnu-libstdc++/libs/" -L"/libs/" -lstdc++ -lsupc++ CMakeFiles/cmTryCompileExec.dir/CheckFunctionExists.c.o  -o cmTryCompileExec -rdynamic -L/opt/android-ndk-r6/platforms/android-5/arch-arm/usr/lib -lm -Wl,-rpath,/opt/android-ndk-r6/platforms/android-5/arch-arm/usr/lib 
-make[1]: Leaving directory `/home/hagish/workspace/adt/love-native-android/jni/openal-soft-android/CMakeFiles/CMakeTmp'
-
-
-Determining if the function strncasecmp exists passed with the following output:
-Change Dir: /home/hagish/workspace/adt/love-native-android/jni/openal-soft-android/CMakeFiles/CMakeTmp
-
-Run Build Command:/usr/bin/make "cmTryCompileExec/fast"
-/usr/bin/make -f CMakeFiles/cmTryCompileExec.dir/build.make CMakeFiles/cmTryCompileExec.dir/build
-make[1]: Entering directory `/home/hagish/workspace/adt/love-native-android/jni/openal-soft-android/CMakeFiles/CMakeTmp'
-/usr/bin/cmake -E cmake_progress_report /home/hagish/workspace/adt/love-native-android/jni/openal-soft-android/CMakeFiles/CMakeTmp/CMakeFiles 1
-Building C object CMakeFiles/cmTryCompileExec.dir/CheckFunctionExists.c.o
-/opt/android-ndk-r6/toolchains/arm-linux-androideabi-4.4.3/prebuilt/linux-x86/bin/arm-linux-androideabi-gcc   --sysroot=/opt/android-ndk-r6/platforms/android-5/arch-arm -fPIC -DANDROID -Wno-psabi -fsigned-char -mthumb  -DCHECK_FUNCTION_EXISTS=strncasecmp -I/opt/android-ndk-r6/sources/cxx-stl/gnu-libstdc++/include -I/opt/android-ndk-r6/sources/cxx-stl/gnu-libstdc++/libs/include   -o CMakeFiles/cmTryCompileExec.dir/CheckFunctionExists.c.o   -c /usr/share/cmake-2.8/Modules/CheckFunctionExists.c
-/usr/share/cmake-2.8/Modules/CheckFunctionExists.c:3: warning: conflicting types for built-in function 'strncasecmp'
-Linking C executable cmTryCompileExec
-/usr/bin/cmake -E cmake_link_script CMakeFiles/cmTryCompileExec.dir/link.txt --verbose=1
-/opt/android-ndk-r6/toolchains/arm-linux-androideabi-4.4.3/prebuilt/linux-x86/bin/arm-linux-androideabi-gcc   --sysroot=/opt/android-ndk-r6/platforms/android-5/arch-arm -fPIC -DANDROID -Wno-psabi -fsigned-char -mthumb  -DCHECK_FUNCTION_EXISTS=strncasecmp  -L"/opt/android-ndk-r6/sources/cxx-stl/gnu-libstdc++/libs/" -L"/libs/" -lstdc++ -lsupc++ CMakeFiles/cmTryCompileExec.dir/CheckFunctionExists.c.o  -o cmTryCompileExec -rdynamic -L/opt/android-ndk-r6/platforms/android-5/arch-arm/usr/lib -lm -Wl,-rpath,/opt/android-ndk-r6/platforms/android-5/arch-arm/usr/lib 
-make[1]: Leaving directory `/home/hagish/workspace/adt/love-native-android/jni/openal-soft-android/CMakeFiles/CMakeTmp'
-
-
-Determining if the function snprintf exists passed with the following output:
-Change Dir: /home/hagish/workspace/adt/love-native-android/jni/openal-soft-android/CMakeFiles/CMakeTmp
-
-Run Build Command:/usr/bin/make "cmTryCompileExec/fast"
-/usr/bin/make -f CMakeFiles/cmTryCompileExec.dir/build.make CMakeFiles/cmTryCompileExec.dir/build
-make[1]: Entering directory `/home/hagish/workspace/adt/love-native-android/jni/openal-soft-android/CMakeFiles/CMakeTmp'
-/usr/bin/cmake -E cmake_progress_report /home/hagish/workspace/adt/love-native-android/jni/openal-soft-android/CMakeFiles/CMakeTmp/CMakeFiles 1
-Building C object CMakeFiles/cmTryCompileExec.dir/CheckFunctionExists.c.o
-/opt/android-ndk-r6/toolchains/arm-linux-androideabi-4.4.3/prebuilt/linux-x86/bin/arm-linux-androideabi-gcc   --sysroot=/opt/android-ndk-r6/platforms/android-5/arch-arm -fPIC -DANDROID -Wno-psabi -fsigned-char -mthumb  -DCHECK_FUNCTION_EXISTS=snprintf -I/opt/android-ndk-r6/sources/cxx-stl/gnu-libstdc++/include -I/opt/android-ndk-r6/sources/cxx-stl/gnu-libstdc++/libs/include   -o CMakeFiles/cmTryCompileExec.dir/CheckFunctionExists.c.o   -c /usr/share/cmake-2.8/Modules/CheckFunctionExists.c
-/usr/share/cmake-2.8/Modules/CheckFunctionExists.c:3: warning: conflicting types for built-in function 'snprintf'
-Linking C executable cmTryCompileExec
-/usr/bin/cmake -E cmake_link_script CMakeFiles/cmTryCompileExec.dir/link.txt --verbose=1
-/opt/android-ndk-r6/toolchains/arm-linux-androideabi-4.4.3/prebuilt/linux-x86/bin/arm-linux-androideabi-gcc   --sysroot=/opt/android-ndk-r6/platforms/android-5/arch-arm -fPIC -DANDROID -Wno-psabi -fsigned-char -mthumb  -DCHECK_FUNCTION_EXISTS=snprintf  -L"/opt/android-ndk-r6/sources/cxx-stl/gnu-libstdc++/libs/" -L"/libs/" -lstdc++ -lsupc++ CMakeFiles/cmTryCompileExec.dir/CheckFunctionExists.c.o  -o cmTryCompileExec -rdynamic -L/opt/android-ndk-r6/platforms/android-5/arch-arm/usr/lib -lm -Wl,-rpath,/opt/android-ndk-r6/platforms/android-5/arch-arm/usr/lib 
-make[1]: Leaving directory `/home/hagish/workspace/adt/love-native-android/jni/openal-soft-android/CMakeFiles/CMakeTmp'
-
-
-Determining if the function vsnprintf exists passed with the following output:
-Change Dir: /home/hagish/workspace/adt/love-native-android/jni/openal-soft-android/CMakeFiles/CMakeTmp
-
-Run Build Command:/usr/bin/make "cmTryCompileExec/fast"
-/usr/bin/make -f CMakeFiles/cmTryCompileExec.dir/build.make CMakeFiles/cmTryCompileExec.dir/build
-make[1]: Entering directory `/home/hagish/workspace/adt/love-native-android/jni/openal-soft-android/CMakeFiles/CMakeTmp'
-/usr/bin/cmake -E cmake_progress_report /home/hagish/workspace/adt/love-native-android/jni/openal-soft-android/CMakeFiles/CMakeTmp/CMakeFiles 1
-Building C object CMakeFiles/cmTryCompileExec.dir/CheckFunctionExists.c.o
-/opt/android-ndk-r6/toolchains/arm-linux-androideabi-4.4.3/prebuilt/linux-x86/bin/arm-linux-androideabi-gcc   --sysroot=/opt/android-ndk-r6/platforms/android-5/arch-arm -fPIC -DANDROID -Wno-psabi -fsigned-char -mthumb  -DCHECK_FUNCTION_EXISTS=vsnprintf -I/opt/android-ndk-r6/sources/cxx-stl/gnu-libstdc++/include -I/opt/android-ndk-r6/sources/cxx-stl/gnu-libstdc++/libs/include   -o CMakeFiles/cmTryCompileExec.dir/CheckFunctionExists.c.o   -c /usr/share/cmake-2.8/Modules/CheckFunctionExists.c
-/usr/share/cmake-2.8/Modules/CheckFunctionExists.c:3: warning: conflicting types for built-in function 'vsnprintf'
-Linking C executable cmTryCompileExec
-/usr/bin/cmake -E cmake_link_script CMakeFiles/cmTryCompileExec.dir/link.txt --verbose=1
-/opt/android-ndk-r6/toolchains/arm-linux-androideabi-4.4.3/prebuilt/linux-x86/bin/arm-linux-androideabi-gcc   --sysroot=/opt/android-ndk-r6/platforms/android-5/arch-arm -fPIC -DANDROID -Wno-psabi -fsigned-char -mthumb  -DCHECK_FUNCTION_EXISTS=vsnprintf  -L"/opt/android-ndk-r6/sources/cxx-stl/gnu-libstdc++/libs/" -L"/libs/" -lstdc++ -lsupc++ CMakeFiles/cmTryCompileExec.dir/CheckFunctionExists.c.o  -o cmTryCompileExec -rdynamic -L/opt/android-ndk-r6/platforms/android-5/arch-arm/usr/lib -lm -Wl,-rpath,/opt/android-ndk-r6/platforms/android-5/arch-arm/usr/lib 
-make[1]: Leaving directory `/home/hagish/workspace/adt/love-native-android/jni/openal-soft-android/CMakeFiles/CMakeTmp'
-
-
-Determining if the isfinite exist passed with the following output:
-Change Dir: /home/hagish/workspace/adt/love-native-android/jni/openal-soft-android/CMakeFiles/CMakeTmp
-
-Run Build Command:/usr/bin/make "cmTryCompileExec/fast"
-/usr/bin/make -f CMakeFiles/cmTryCompileExec.dir/build.make CMakeFiles/cmTryCompileExec.dir/build
-make[1]: Entering directory `/home/hagish/workspace/adt/love-native-android/jni/openal-soft-android/CMakeFiles/CMakeTmp'
-/usr/bin/cmake -E cmake_progress_report /home/hagish/workspace/adt/love-native-android/jni/openal-soft-android/CMakeFiles/CMakeTmp/CMakeFiles 1
-Building C object CMakeFiles/cmTryCompileExec.dir/CheckSymbolExists.c.o
-/opt/android-ndk-r6/toolchains/arm-linux-androideabi-4.4.3/prebuilt/linux-x86/bin/arm-linux-androideabi-gcc   --sysroot=/opt/android-ndk-r6/platforms/android-5/arch-arm -fPIC -DANDROID -Wno-psabi -fsigned-char -mthumb   -I/opt/android-ndk-r6/sources/cxx-stl/gnu-libstdc++/include -I/opt/android-ndk-r6/sources/cxx-stl/gnu-libstdc++/libs/include   -o CMakeFiles/cmTryCompileExec.dir/CheckSymbolExists.c.o   -c /home/hagish/workspace/adt/love-native-android/jni/openal-soft-android/CMakeFiles/CMakeTmp/CheckSymbolExists.c
-Linking C executable cmTryCompileExec
-/usr/bin/cmake -E cmake_link_script CMakeFiles/cmTryCompileExec.dir/link.txt --verbose=1
-/opt/android-ndk-r6/toolchains/arm-linux-androideabi-4.4.3/prebuilt/linux-x86/bin/arm-linux-androideabi-gcc   --sysroot=/opt/android-ndk-r6/platforms/android-5/arch-arm -fPIC -DANDROID -Wno-psabi -fsigned-char -mthumb    -L"/opt/android-ndk-r6/sources/cxx-stl/gnu-libstdc++/libs/" -L"/libs/" -lstdc++ -lsupc++ CMakeFiles/cmTryCompileExec.dir/CheckSymbolExists.c.o  -o cmTryCompileExec -rdynamic -L/opt/android-ndk-r6/platforms/android-5/arch-arm/usr/lib -lm -Wl,-rpath,/opt/android-ndk-r6/platforms/android-5/arch-arm/usr/lib 
-make[1]: Leaving directory `/home/hagish/workspace/adt/love-native-android/jni/openal-soft-android/CMakeFiles/CMakeTmp'
-
-File /home/hagish/workspace/adt/love-native-android/jni/openal-soft-android/CMakeFiles/CMakeTmp/CheckSymbolExists.c:
-/* */
-#include <math.h>
-
-void cmakeRequireSymbol(int dummy,...){(void)dummy;}
-int main()
-{
-#ifndef isfinite
-  cmakeRequireSymbol(0,&isfinite);
-#endif
-  return 0;
-}
-
-Determining if the isnan exist passed with the following output:
-Change Dir: /home/hagish/workspace/adt/love-native-android/jni/openal-soft-android/CMakeFiles/CMakeTmp
-
-Run Build Command:/usr/bin/make "cmTryCompileExec/fast"
-/usr/bin/make -f CMakeFiles/cmTryCompileExec.dir/build.make CMakeFiles/cmTryCompileExec.dir/build
-make[1]: Entering directory `/home/hagish/workspace/adt/love-native-android/jni/openal-soft-android/CMakeFiles/CMakeTmp'
-/usr/bin/cmake -E cmake_progress_report /home/hagish/workspace/adt/love-native-android/jni/openal-soft-android/CMakeFiles/CMakeTmp/CMakeFiles 1
-Building C object CMakeFiles/cmTryCompileExec.dir/CheckSymbolExists.c.o
-/opt/android-ndk-r6/toolchains/arm-linux-androideabi-4.4.3/prebuilt/linux-x86/bin/arm-linux-androideabi-gcc   --sysroot=/opt/android-ndk-r6/platforms/android-5/arch-arm -fPIC -DANDROID -Wno-psabi -fsigned-char -mthumb   -I/opt/android-ndk-r6/sources/cxx-stl/gnu-libstdc++/include -I/opt/android-ndk-r6/sources/cxx-stl/gnu-libstdc++/libs/include   -o CMakeFiles/cmTryCompileExec.dir/CheckSymbolExists.c.o   -c /home/hagish/workspace/adt/love-native-android/jni/openal-soft-android/CMakeFiles/CMakeTmp/CheckSymbolExists.c
-Linking C executable cmTryCompileExec
-/usr/bin/cmake -E cmake_link_script CMakeFiles/cmTryCompileExec.dir/link.txt --verbose=1
-/opt/android-ndk-r6/toolchains/arm-linux-androideabi-4.4.3/prebuilt/linux-x86/bin/arm-linux-androideabi-gcc   --sysroot=/opt/android-ndk-r6/platforms/android-5/arch-arm -fPIC -DANDROID -Wno-psabi -fsigned-char -mthumb    -L"/opt/android-ndk-r6/sources/cxx-stl/gnu-libstdc++/libs/" -L"/libs/" -lstdc++ -lsupc++ CMakeFiles/cmTryCompileExec.dir/CheckSymbolExists.c.o  -o cmTryCompileExec -rdynamic -L/opt/android-ndk-r6/platforms/android-5/arch-arm/usr/lib -lm -Wl,-rpath,/opt/android-ndk-r6/platforms/android-5/arch-arm/usr/lib 
-make[1]: Leaving directory `/home/hagish/workspace/adt/love-native-android/jni/openal-soft-android/CMakeFiles/CMakeTmp'
-
-File /home/hagish/workspace/adt/love-native-android/jni/openal-soft-android/CMakeFiles/CMakeTmp/CheckSymbolExists.c:
-/* */
-#include <math.h>
-
-void cmakeRequireSymbol(int dummy,...){(void)dummy;}
-int main()
-{
-#ifndef isnan
-  cmakeRequireSymbol(0,&isnan);
-#endif
-  return 0;
-}
-
-Determining if the include file dlfcn.h exists passed with the following output:
-Change Dir: /home/hagish/workspace/adt/love-native-android/jni/openal-soft-android/CMakeFiles/CMakeTmp
-
-Run Build Command:/usr/bin/make "cmTryCompileExec/fast"
-/usr/bin/make -f CMakeFiles/cmTryCompileExec.dir/build.make CMakeFiles/cmTryCompileExec.dir/build
-make[1]: Entering directory `/home/hagish/workspace/adt/love-native-android/jni/openal-soft-android/CMakeFiles/CMakeTmp'
-/usr/bin/cmake -E cmake_progress_report /home/hagish/workspace/adt/love-native-android/jni/openal-soft-android/CMakeFiles/CMakeTmp/CMakeFiles 1
-Building C object CMakeFiles/cmTryCompileExec.dir/CheckIncludeFile.c.o
-/opt/android-ndk-r6/toolchains/arm-linux-androideabi-4.4.3/prebuilt/linux-x86/bin/arm-linux-androideabi-gcc   --sysroot=/opt/android-ndk-r6/platforms/android-5/arch-arm -fPIC -DANDROID -Wno-psabi -fsigned-char -mthumb   -I/opt/android-ndk-r6/sources/cxx-stl/gnu-libstdc++/include -I/opt/android-ndk-r6/sources/cxx-stl/gnu-libstdc++/libs/include   -o CMakeFiles/cmTryCompileExec.dir/CheckIncludeFile.c.o   -c /home/hagish/workspace/adt/love-native-android/jni/openal-soft-android/CMakeFiles/CMakeTmp/CheckIncludeFile.c
-Linking C executable cmTryCompileExec
-/usr/bin/cmake -E cmake_link_script CMakeFiles/cmTryCompileExec.dir/link.txt --verbose=1
-/opt/android-ndk-r6/toolchains/arm-linux-androideabi-4.4.3/prebuilt/linux-x86/bin/arm-linux-androideabi-gcc   --sysroot=/opt/android-ndk-r6/platforms/android-5/arch-arm -fPIC -DANDROID -Wno-psabi -fsigned-char -mthumb    -L"/opt/android-ndk-r6/sources/cxx-stl/gnu-libstdc++/libs/" -L"/libs/" -lstdc++ -lsupc++ CMakeFiles/cmTryCompileExec.dir/CheckIncludeFile.c.o  -o cmTryCompileExec -rdynamic -L/opt/android-ndk-r6/platforms/android-5/arch-arm/usr/lib 
-make[1]: Leaving directory `/home/hagish/workspace/adt/love-native-android/jni/openal-soft-android/CMakeFiles/CMakeTmp'
-
-
-Determining if the function dlopen exists in the dl passed with the following output:
-Change Dir: /home/hagish/workspace/adt/love-native-android/jni/openal-soft-android/CMakeFiles/CMakeTmp
-
-Run Build Command:/usr/bin/make "cmTryCompileExec/fast"
-/usr/bin/make -f CMakeFiles/cmTryCompileExec.dir/build.make CMakeFiles/cmTryCompileExec.dir/build
-make[1]: Entering directory `/home/hagish/workspace/adt/love-native-android/jni/openal-soft-android/CMakeFiles/CMakeTmp'
-/usr/bin/cmake -E cmake_progress_report /home/hagish/workspace/adt/love-native-android/jni/openal-soft-android/CMakeFiles/CMakeTmp/CMakeFiles 1
-Building C object CMakeFiles/cmTryCompileExec.dir/CheckFunctionExists.c.o
-/opt/android-ndk-r6/toolchains/arm-linux-androideabi-4.4.3/prebuilt/linux-x86/bin/arm-linux-androideabi-gcc   --sysroot=/opt/android-ndk-r6/platforms/android-5/arch-arm -fPIC -DANDROID -Wno-psabi -fsigned-char -mthumb  -DCHECK_FUNCTION_EXISTS=dlopen -I/opt/android-ndk-r6/sources/cxx-stl/gnu-libstdc++/include -I/opt/android-ndk-r6/sources/cxx-stl/gnu-libstdc++/libs/include   -o CMakeFiles/cmTryCompileExec.dir/CheckFunctionExists.c.o   -c /usr/share/cmake-2.8/Modules/CheckFunctionExists.c
-Linking C executable cmTryCompileExec
-/usr/bin/cmake -E cmake_link_script CMakeFiles/cmTryCompileExec.dir/link.txt --verbose=1
-/opt/android-ndk-r6/toolchains/arm-linux-androideabi-4.4.3/prebuilt/linux-x86/bin/arm-linux-androideabi-gcc   --sysroot=/opt/android-ndk-r6/platforms/android-5/arch-arm -fPIC -DANDROID -Wno-psabi -fsigned-char -mthumb  -DCHECK_FUNCTION_EXISTS=dlopen  -L"/opt/android-ndk-r6/sources/cxx-stl/gnu-libstdc++/libs/" -L"/libs/" -lstdc++ -lsupc++ CMakeFiles/cmTryCompileExec.dir/CheckFunctionExists.c.o  -o cmTryCompileExec -rdynamic -L/opt/android-ndk-r6/platforms/android-5/arch-arm/usr/lib -ldl -lm -Wl,-rpath,/opt/android-ndk-r6/platforms/android-5/arch-arm/usr/lib 
-make[1]: Leaving directory `/home/hagish/workspace/adt/love-native-android/jni/openal-soft-android/CMakeFiles/CMakeTmp'
-
-
-Determining if the function gettimeofday exists passed with the following output:
-Change Dir: /home/hagish/workspace/adt/love-native-android/jni/openal-soft-android/CMakeFiles/CMakeTmp
-
-Run Build Command:/usr/bin/make "cmTryCompileExec/fast"
-/usr/bin/make -f CMakeFiles/cmTryCompileExec.dir/build.make CMakeFiles/cmTryCompileExec.dir/build
-make[1]: Entering directory `/home/hagish/workspace/adt/love-native-android/jni/openal-soft-android/CMakeFiles/CMakeTmp'
-/usr/bin/cmake -E cmake_progress_report /home/hagish/workspace/adt/love-native-android/jni/openal-soft-android/CMakeFiles/CMakeTmp/CMakeFiles 1
-Building C object CMakeFiles/cmTryCompileExec.dir/CheckFunctionExists.c.o
-/opt/android-ndk-r6/toolchains/arm-linux-androideabi-4.4.3/prebuilt/linux-x86/bin/arm-linux-androideabi-gcc   --sysroot=/opt/android-ndk-r6/platforms/android-5/arch-arm -fPIC -DANDROID -Wno-psabi -fsigned-char -mthumb  -DCHECK_FUNCTION_EXISTS=gettimeofday -I/opt/android-ndk-r6/sources/cxx-stl/gnu-libstdc++/include -I/opt/android-ndk-r6/sources/cxx-stl/gnu-libstdc++/libs/include   -o CMakeFiles/cmTryCompileExec.dir/CheckFunctionExists.c.o   -c /usr/share/cmake-2.8/Modules/CheckFunctionExists.c
-Linking C executable cmTryCompileExec
-/usr/bin/cmake -E cmake_link_script CMakeFiles/cmTryCompileExec.dir/link.txt --verbose=1
-/opt/android-ndk-r6/toolchains/arm-linux-androideabi-4.4.3/prebuilt/linux-x86/bin/arm-linux-androideabi-gcc   --sysroot=/opt/android-ndk-r6/platforms/android-5/arch-arm -fPIC -DANDROID -Wno-psabi -fsigned-char -mthumb  -DCHECK_FUNCTION_EXISTS=gettimeofday  -L"/opt/android-ndk-r6/sources/cxx-stl/gnu-libstdc++/libs/" -L"/libs/" -lstdc++ -lsupc++ CMakeFiles/cmTryCompileExec.dir/CheckFunctionExists.c.o  -o cmTryCompileExec -rdynamic -L/opt/android-ndk-r6/platforms/android-5/arch-arm/usr/lib -lm -Wl,-rpath,/opt/android-ndk-r6/platforms/android-5/arch-arm/usr/lib 
-make[1]: Leaving directory `/home/hagish/workspace/adt/love-native-android/jni/openal-soft-android/CMakeFiles/CMakeTmp'
-
-
-Determining if the function nanosleep exists passed with the following output:
-Change Dir: /home/hagish/workspace/adt/love-native-android/jni/openal-soft-android/CMakeFiles/CMakeTmp
-
-Run Build Command:/usr/bin/make "cmTryCompileExec/fast"
-/usr/bin/make -f CMakeFiles/cmTryCompileExec.dir/build.make CMakeFiles/cmTryCompileExec.dir/build
-make[1]: Entering directory `/home/hagish/workspace/adt/love-native-android/jni/openal-soft-android/CMakeFiles/CMakeTmp'
-/usr/bin/cmake -E cmake_progress_report /home/hagish/workspace/adt/love-native-android/jni/openal-soft-android/CMakeFiles/CMakeTmp/CMakeFiles 1
-Building C object CMakeFiles/cmTryCompileExec.dir/CheckFunctionExists.c.o
-/opt/android-ndk-r6/toolchains/arm-linux-androideabi-4.4.3/prebuilt/linux-x86/bin/arm-linux-androideabi-gcc   --sysroot=/opt/android-ndk-r6/platforms/android-5/arch-arm -fPIC -DANDROID -Wno-psabi -fsigned-char -mthumb  -DCHECK_FUNCTION_EXISTS=nanosleep -I/opt/android-ndk-r6/sources/cxx-stl/gnu-libstdc++/include -I/opt/android-ndk-r6/sources/cxx-stl/gnu-libstdc++/libs/include   -o CMakeFiles/cmTryCompileExec.dir/CheckFunctionExists.c.o   -c /usr/share/cmake-2.8/Modules/CheckFunctionExists.c
-Linking C executable cmTryCompileExec
-/usr/bin/cmake -E cmake_link_script CMakeFiles/cmTryCompileExec.dir/link.txt --verbose=1
-/opt/android-ndk-r6/toolchains/arm-linux-androideabi-4.4.3/prebuilt/linux-x86/bin/arm-linux-androideabi-gcc   --sysroot=/opt/android-ndk-r6/platforms/android-5/arch-arm -fPIC -DANDROID -Wno-psabi -fsigned-char -mthumb  -DCHECK_FUNCTION_EXISTS=nanosleep  -L"/opt/android-ndk-r6/sources/cxx-stl/gnu-libstdc++/libs/" -L"/libs/" -lstdc++ -lsupc++ CMakeFiles/cmTryCompileExec.dir/CheckFunctionExists.c.o  -o cmTryCompileExec -rdynamic -L/opt/android-ndk-r6/platforms/android-5/arch-arm/usr/lib -lm -Wl,-rpath,/opt/android-ndk-r6/platforms/android-5/arch-arm/usr/lib 
-make[1]: Leaving directory `/home/hagish/workspace/adt/love-native-android/jni/openal-soft-android/CMakeFiles/CMakeTmp'
-
-
-Determining if the include file pthread.h exists passed with the following output:
-Change Dir: /home/hagish/workspace/adt/love-native-android/jni/openal-soft-android/CMakeFiles/CMakeTmp
-
-Run Build Command:/usr/bin/make "cmTryCompileExec/fast"
-/usr/bin/make -f CMakeFiles/cmTryCompileExec.dir/build.make CMakeFiles/cmTryCompileExec.dir/build
-make[1]: Entering directory `/home/hagish/workspace/adt/love-native-android/jni/openal-soft-android/CMakeFiles/CMakeTmp'
-/usr/bin/cmake -E cmake_progress_report /home/hagish/workspace/adt/love-native-android/jni/openal-soft-android/CMakeFiles/CMakeTmp/CMakeFiles 1
-Building C object CMakeFiles/cmTryCompileExec.dir/CheckIncludeFile.c.o
-/opt/android-ndk-r6/toolchains/arm-linux-androideabi-4.4.3/prebuilt/linux-x86/bin/arm-linux-androideabi-gcc   --sysroot=/opt/android-ndk-r6/platforms/android-5/arch-arm -fPIC -DANDROID -Wno-psabi -fsigned-char -mthumb   -I/opt/android-ndk-r6/sources/cxx-stl/gnu-libstdc++/include -I/opt/android-ndk-r6/sources/cxx-stl/gnu-libstdc++/libs/include   -o CMakeFiles/cmTryCompileExec.dir/CheckIncludeFile.c.o   -c /home/hagish/workspace/adt/love-native-android/jni/openal-soft-android/CMakeFiles/CMakeTmp/CheckIncludeFile.c
-Linking C executable cmTryCompileExec
-/usr/bin/cmake -E cmake_link_script CMakeFiles/cmTryCompileExec.dir/link.txt --verbose=1
-/opt/android-ndk-r6/toolchains/arm-linux-androideabi-4.4.3/prebuilt/linux-x86/bin/arm-linux-androideabi-gcc   --sysroot=/opt/android-ndk-r6/platforms/android-5/arch-arm -fPIC -DANDROID -Wno-psabi -fsigned-char -mthumb    -L"/opt/android-ndk-r6/sources/cxx-stl/gnu-libstdc++/libs/" -L"/libs/" -lstdc++ -lsupc++ CMakeFiles/cmTryCompileExec.dir/CheckIncludeFile.c.o  -o cmTryCompileExec -rdynamic -L/opt/android-ndk-r6/platforms/android-5/arch-arm/usr/lib 
-make[1]: Leaving directory `/home/hagish/workspace/adt/love-native-android/jni/openal-soft-android/CMakeFiles/CMakeTmp'
-
-
-Determining if the include file android/api-level.h exists passed with the following output:
-Change Dir: /home/hagish/workspace/adt/love-native-android/jni/openal-soft-android/CMakeFiles/CMakeTmp
-
-Run Build Command:/usr/bin/make "cmTryCompileExec/fast"
-/usr/bin/make -f CMakeFiles/cmTryCompileExec.dir/build.make CMakeFiles/cmTryCompileExec.dir/build
-make[1]: Entering directory `/home/hagish/workspace/adt/love-native-android/jni/openal-soft-android/CMakeFiles/CMakeTmp'
-/usr/bin/cmake -E cmake_progress_report /home/hagish/workspace/adt/love-native-android/jni/openal-soft-android/CMakeFiles/CMakeTmp/CMakeFiles 1
-Building C object CMakeFiles/cmTryCompileExec.dir/CheckIncludeFile.c.o
-/opt/android-ndk-r6/toolchains/arm-linux-androideabi-4.4.3/prebuilt/linux-x86/bin/arm-linux-androideabi-gcc   --sysroot=/opt/android-ndk-r6/platforms/android-5/arch-arm -fPIC -DANDROID -Wno-psabi -fsigned-char -mthumb   -I/opt/android-ndk-r6/sources/cxx-stl/gnu-libstdc++/include -I/opt/android-ndk-r6/sources/cxx-stl/gnu-libstdc++/libs/include   -o CMakeFiles/cmTryCompileExec.dir/CheckIncludeFile.c.o   -c /home/hagish/workspace/adt/love-native-android/jni/openal-soft-android/CMakeFiles/CMakeTmp/CheckIncludeFile.c
-Linking C executable cmTryCompileExec
-/usr/bin/cmake -E cmake_link_script CMakeFiles/cmTryCompileExec.dir/link.txt --verbose=1
-/opt/android-ndk-r6/toolchains/arm-linux-androideabi-4.4.3/prebuilt/linux-x86/bin/arm-linux-androideabi-gcc   --sysroot=/opt/android-ndk-r6/platforms/android-5/arch-arm -fPIC -DANDROID -Wno-psabi -fsigned-char -mthumb    -L"/opt/android-ndk-r6/sources/cxx-stl/gnu-libstdc++/libs/" -L"/libs/" -lstdc++ -lsupc++ CMakeFiles/cmTryCompileExec.dir/CheckIncludeFile.c.o  -o cmTryCompileExec -rdynamic -L/opt/android-ndk-r6/platforms/android-5/arch-arm/usr/lib 
-make[1]: Leaving directory `/home/hagish/workspace/adt/love-native-android/jni/openal-soft-android/CMakeFiles/CMakeTmp'
-
-
-Determining if the __ANDROID_API__ exist passed with the following output:
-Change Dir: /home/hagish/workspace/adt/love-native-android/jni/openal-soft-android/CMakeFiles/CMakeTmp
-
-Run Build Command:/usr/bin/make "cmTryCompileExec/fast"
-/usr/bin/make -f CMakeFiles/cmTryCompileExec.dir/build.make CMakeFiles/cmTryCompileExec.dir/build
-make[1]: Entering directory `/home/hagish/workspace/adt/love-native-android/jni/openal-soft-android/CMakeFiles/CMakeTmp'
-/usr/bin/cmake -E cmake_progress_report /home/hagish/workspace/adt/love-native-android/jni/openal-soft-android/CMakeFiles/CMakeTmp/CMakeFiles 1
-Building C object CMakeFiles/cmTryCompileExec.dir/CheckSymbolExists.c.o
-/opt/android-ndk-r6/toolchains/arm-linux-androideabi-4.4.3/prebuilt/linux-x86/bin/arm-linux-androideabi-gcc   --sysroot=/opt/android-ndk-r6/platforms/android-5/arch-arm -fPIC -DANDROID -Wno-psabi -fsigned-char -mthumb   -I/opt/android-ndk-r6/sources/cxx-stl/gnu-libstdc++/include -I/opt/android-ndk-r6/sources/cxx-stl/gnu-libstdc++/libs/include   -o CMakeFiles/cmTryCompileExec.dir/CheckSymbolExists.c.o   -c /home/hagish/workspace/adt/love-native-android/jni/openal-soft-android/CMakeFiles/CMakeTmp/CheckSymbolExists.c
-Linking C executable cmTryCompileExec
-/usr/bin/cmake -E cmake_link_script CMakeFiles/cmTryCompileExec.dir/link.txt --verbose=1
-/opt/android-ndk-r6/toolchains/arm-linux-androideabi-4.4.3/prebuilt/linux-x86/bin/arm-linux-androideabi-gcc   --sysroot=/opt/android-ndk-r6/platforms/android-5/arch-arm -fPIC -DANDROID -Wno-psabi -fsigned-char -mthumb    -L"/opt/android-ndk-r6/sources/cxx-stl/gnu-libstdc++/libs/" -L"/libs/" -lstdc++ -lsupc++ CMakeFiles/cmTryCompileExec.dir/CheckSymbolExists.c.o  -o cmTryCompileExec -rdynamic -L/opt/android-ndk-r6/platforms/android-5/arch-arm/usr/lib -lm -Wl,-rpath,/opt/android-ndk-r6/platforms/android-5/arch-arm/usr/lib 
-make[1]: Leaving directory `/home/hagish/workspace/adt/love-native-android/jni/openal-soft-android/CMakeFiles/CMakeTmp'
-
-File /home/hagish/workspace/adt/love-native-android/jni/openal-soft-android/CMakeFiles/CMakeTmp/CheckSymbolExists.c:
-/* */
-#include <android/api-level.h>
-
-void cmakeRequireSymbol(int dummy,...){(void)dummy;}
-int main()
-{
-#ifndef __ANDROID_API__
-  cmakeRequireSymbol(0,&__ANDROID_API__);
-#endif
-  return 0;
-}
-

+ 0 - 15
jni/openal-soft-android/CMakeFiles/CMakeSystem.cmake

@@ -1,15 +0,0 @@
-INCLUDE("/home/hagish/workspace/adt/love-native-android/jni/openal-soft-android/toolchain.android.cmake")
-
-SET(CMAKE_SYSTEM "Linux-1")
-SET(CMAKE_SYSTEM_NAME "Linux")
-SET(CMAKE_SYSTEM_VERSION "1")
-SET(CMAKE_SYSTEM_PROCESSOR "")
-
-SET(CMAKE_HOST_SYSTEM "Linux-2.6.38-12-generic-pae")
-SET(CMAKE_HOST_SYSTEM_NAME "Linux")
-SET(CMAKE_HOST_SYSTEM_VERSION "2.6.38-12-generic-pae")
-SET(CMAKE_HOST_SYSTEM_PROCESSOR "i686")
-
-SET(CMAKE_CROSSCOMPILING "TRUE")
-
-SET(CMAKE_SYSTEM_LOADED 1)

BIN
jni/openal-soft-android/CMakeFiles/CheckTypeSize/SIZEOF_LONG.bin


+ 0 - 40
jni/openal-soft-android/CMakeFiles/CheckTypeSize/SIZEOF_LONG.c

@@ -1,40 +0,0 @@
-#include <sys/types.h>
-#include <stdint.h>
-#include <stddef.h>
-
-
-#undef KEY
-#if defined(__i386)
-# define KEY '_','_','i','3','8','6'
-#elif defined(__x86_64)
-# define KEY '_','_','x','8','6','_','6','4'
-#elif defined(__ppc__)
-# define KEY '_','_','p','p','c','_','_'
-#elif defined(__ppc64__)
-# define KEY '_','_','p','p','c','6','4','_','_'
-#endif
-
-#define SIZE (sizeof(long))
-char info_size[] =  {'I', 'N', 'F', 'O', ':', 's','i','z','e','[',
-  ('0' + ((SIZE / 10000)%10)),
-  ('0' + ((SIZE / 1000)%10)),
-  ('0' + ((SIZE / 100)%10)),
-  ('0' + ((SIZE / 10)%10)),
-  ('0' +  (SIZE    % 10)),
-  ']',
-#ifdef KEY
-  ' ','k','e','y','[', KEY, ']',
-#endif
-  '\0'};
-
-#ifdef __CLASSIC_C__
-int main(argc, argv) int argc; char *argv[];
-#else
-int main(int argc, char *argv[])
-#endif
-{
-  int require = 0;
-  require += info_size[argc];
-  (void)argv;
-  return require;
-}

BIN
jni/openal-soft-android/CMakeFiles/CheckTypeSize/SIZEOF_LONG_LONG.bin


+ 0 - 40
jni/openal-soft-android/CMakeFiles/CheckTypeSize/SIZEOF_LONG_LONG.c

@@ -1,40 +0,0 @@
-#include <sys/types.h>
-#include <stdint.h>
-#include <stddef.h>
-
-
-#undef KEY
-#if defined(__i386)
-# define KEY '_','_','i','3','8','6'
-#elif defined(__x86_64)
-# define KEY '_','_','x','8','6','_','6','4'
-#elif defined(__ppc__)
-# define KEY '_','_','p','p','c','_','_'
-#elif defined(__ppc64__)
-# define KEY '_','_','p','p','c','6','4','_','_'
-#endif
-
-#define SIZE (sizeof(long long))
-char info_size[] =  {'I', 'N', 'F', 'O', ':', 's','i','z','e','[',
-  ('0' + ((SIZE / 10000)%10)),
-  ('0' + ((SIZE / 1000)%10)),
-  ('0' + ((SIZE / 100)%10)),
-  ('0' + ((SIZE / 10)%10)),
-  ('0' +  (SIZE    % 10)),
-  ']',
-#ifdef KEY
-  ' ','k','e','y','[', KEY, ']',
-#endif
-  '\0'};
-
-#ifdef __CLASSIC_C__
-int main(argc, argv) int argc; char *argv[];
-#else
-int main(int argc, char *argv[])
-#endif
-{
-  int require = 0;
-  require += info_size[argc];
-  (void)argv;
-  return require;
-}

+ 0 - 220
jni/openal-soft-android/CMakeFiles/CompilerIdC/CMakeCCompilerId.c

@@ -1,220 +0,0 @@
-#ifdef __cplusplus
-# error "A C++ compiler has been selected for C."
-#endif
-
-#if defined(__18CXX)
-# define ID_VOID_MAIN
-#endif
-
-#if defined(__INTEL_COMPILER) || defined(__ICC)
-# define COMPILER_ID "Intel"
-
-#elif defined(__clang__)
-# define COMPILER_ID "Clang"
-
-#elif defined(__BORLANDC__)
-# define COMPILER_ID "Borland"
-
-#elif defined(__WATCOMC__)
-# define COMPILER_ID "Watcom"
-
-#elif defined(__SUNPRO_C)
-# define COMPILER_ID "SunPro"
-
-#elif defined(__HP_cc)
-# define COMPILER_ID "HP"
-
-#elif defined(__DECC)
-# define COMPILER_ID "Compaq"
-
-#elif defined(__IBMC__)
-# if defined(__COMPILER_VER__)
-#  define COMPILER_ID "zOS"
-# elif __IBMC__ >= 800
-#  define COMPILER_ID "XL"
-# else
-#  define COMPILER_ID "VisualAge"
-# endif
-
-#elif defined(__PGI)
-# define COMPILER_ID "PGI"
-
-#elif defined(__PATHSCALE__)
-# define COMPILER_ID "PathScale"
-
-#elif defined(__GNUC__)
-# define COMPILER_ID "GNU"
-
-#elif defined(_MSC_VER)
-# define COMPILER_ID "MSVC"
-
-#elif defined(__ADSPBLACKFIN__) || defined(__ADSPTS__) || defined(__ADSP21000__)
-/* Analog Devices C++ compiler for Blackfin, TigerSHARC and
-   SHARC (21000) DSPs */
-# define COMPILER_ID "ADSP"
-
-/* IAR Systems compiler for embedded systems.
-   http://www.iar.com
-   Not supported yet by CMake
-#elif defined(__IAR_SYSTEMS_ICC__)
-# define COMPILER_ID "IAR" */
-
-/* sdcc, the small devices C compiler for embedded systems,
-   http://sdcc.sourceforge.net  */
-#elif defined(SDCC)
-# define COMPILER_ID "SDCC"
-
-#elif defined(_SGI_COMPILER_VERSION) || defined(_COMPILER_VERSION)
-# define COMPILER_ID "MIPSpro"
-
-/* This compiler is either not known or is too old to define an
-   identification macro.  Try to identify the platform and guess that
-   it is the native compiler.  */
-#elif defined(__sgi)
-# define COMPILER_ID "MIPSpro"
-
-#elif defined(__hpux) || defined(__hpua)
-# define COMPILER_ID "HP"
-
-#else /* unknown compiler */
-# define COMPILER_ID ""
-
-#endif
-
-/* Construct the string literal in pieces to prevent the source from
-   getting matched.  Store it in a pointer rather than an array
-   because some compilers will just produce instructions to fill the
-   array rather than assigning a pointer to a static array.  */
-char* info_compiler = "INFO" ":" "compiler[" COMPILER_ID "]";
-
-/* Identify known platforms by name.  */
-#if defined(__linux) || defined(__linux__) || defined(linux)
-# define PLATFORM_ID "Linux"
-
-#elif defined(__CYGWIN__)
-# define PLATFORM_ID "Cygwin"
-
-#elif defined(__MINGW32__)
-# define PLATFORM_ID "MinGW"
-
-#elif defined(__APPLE__)
-# define PLATFORM_ID "Darwin"
-
-#elif defined(_WIN32) || defined(__WIN32__) || defined(WIN32)
-# define PLATFORM_ID "Windows"
-
-#elif defined(__FreeBSD__) || defined(__FreeBSD)
-# define PLATFORM_ID "FreeBSD"
-
-#elif defined(__NetBSD__) || defined(__NetBSD)
-# define PLATFORM_ID "NetBSD"
-
-#elif defined(__OpenBSD__) || defined(__OPENBSD)
-# define PLATFORM_ID "OpenBSD"
-
-#elif defined(__sun) || defined(sun)
-# define PLATFORM_ID "SunOS"
-
-#elif defined(_AIX) || defined(__AIX) || defined(__AIX__) || defined(__aix) || defined(__aix__)
-# define PLATFORM_ID "AIX"
-
-#elif defined(__sgi) || defined(__sgi__) || defined(_SGI)
-# define PLATFORM_ID "IRIX"
-
-#elif defined(__hpux) || defined(__hpux__)
-# define PLATFORM_ID "HP-UX"
-
-#elif defined(__HAIKU) || defined(__HAIKU__) || defined(_HAIKU)
-# define PLATFORM_ID "Haiku"
-/* Haiku also defines __BEOS__ so we must 
-   put it prior to the check for __BEOS__
-*/
-
-#elif defined(__BeOS) || defined(__BEOS__) || defined(_BEOS)
-# define PLATFORM_ID "BeOS"
-
-#elif defined(__QNX__) || defined(__QNXNTO__)
-# define PLATFORM_ID "QNX"
-
-#elif defined(__tru64) || defined(_tru64) || defined(__TRU64__)
-# define PLATFORM_ID "Tru64"
-
-#elif defined(__riscos) || defined(__riscos__)
-# define PLATFORM_ID "RISCos"
-
-#elif defined(__sinix) || defined(__sinix__) || defined(__SINIX__)
-# define PLATFORM_ID "SINIX"
-
-#elif defined(__UNIX_SV__)
-# define PLATFORM_ID "UNIX_SV"
-
-#elif defined(__bsdos__)
-# define PLATFORM_ID "BSDOS"
-
-#elif defined(_MPRAS) || defined(MPRAS)
-# define PLATFORM_ID "MP-RAS"
-
-#elif defined(__osf) || defined(__osf__)
-# define PLATFORM_ID "OSF1"
-
-#elif defined(_SCO_SV) || defined(SCO_SV) || defined(sco_sv)
-# define PLATFORM_ID "SCO_SV"
-
-#elif defined(__ultrix) || defined(__ultrix__) || defined(_ULTRIX)
-# define PLATFORM_ID "ULTRIX"
-
-#elif defined(__XENIX__) || defined(_XENIX) || defined(XENIX)
-# define PLATFORM_ID "Xenix"
-
-#else /* unknown platform */
-# define PLATFORM_ID ""
-
-#endif
-
-/* For windows compilers MSVC and Intel we can determine
-   the architecture of the compiler being used.  This is becase
-   the compilers do not have flags that can change the architecture,
-   but rather depend on which compiler is being used
-*/
-#if defined(_WIN32) && defined(_MSC_VER)
-# if defined(_M_IA64)
-#  define ARCHITECTURE_ID "IA64"
-
-# elif defined(_M_X64) || defined(_M_AMD64)
-#  define ARCHITECTURE_ID "x64" 
-
-# elif defined(_M_IX86)
-#  define ARCHITECTURE_ID "X86"
-
-# else /* unknown architecture */
-#  define ARCHITECTURE_ID ""
-# endif
-
-#else
-#  define ARCHITECTURE_ID ""
-#endif
-
-/* Construct the string literal in pieces to prevent the source from
-   getting matched.  Store it in a pointer rather than an array
-   because some compilers will just produce instructions to fill the
-   array rather than assigning a pointer to a static array.  */
-char* info_platform = "INFO" ":" "platform[" PLATFORM_ID "]";
-char* info_arch = "INFO" ":" "arch[" ARCHITECTURE_ID "]";
-
-
-
-/*--------------------------------------------------------------------------*/
-
-#ifdef ID_VOID_MAIN
-void main() {}
-#else
-int main(int argc, char* argv[])
-{
-  int require = 0;
-  require += info_compiler[argc];
-  require += info_platform[argc];
-  require += info_arch[argc];
-  (void)argv;
-  return require;
-}
-#endif

+ 0 - 53
jni/openal-soft-android/CMakeFiles/Makefile.cmake

@@ -1,53 +0,0 @@
-# CMAKE generated file: DO NOT EDIT!
-# Generated by "Unix Makefiles" Generator, CMake Version 2.8
-
-# The generator used is:
-SET(CMAKE_DEPENDS_GENERATOR "Unix Makefiles")
-
-# The top level Makefile was generated from the following files:
-SET(CMAKE_MAKEFILE_DEPENDS
-  "CMakeCache.txt"
-  "CMakeFiles/CMakeCCompiler.cmake"
-  "CMakeFiles/CMakeSystem.cmake"
-  "CMakeLists.txt"
-  "cmake/CheckCCompilerFlag.cmake"
-  "cmake/CheckSharedFunctionExists.cmake"
-  "config.h.in"
-  "openal.pc.in"
-  "toolchain.android.cmake"
-  "/usr/share/cmake-2.8/Modules/CMakeCInformation.cmake"
-  "/usr/share/cmake-2.8/Modules/CMakeCommonLanguageInclude.cmake"
-  "/usr/share/cmake-2.8/Modules/CMakeForceCompiler.cmake"
-  "/usr/share/cmake-2.8/Modules/CMakeGenericSystem.cmake"
-  "/usr/share/cmake-2.8/Modules/CMakeSystemSpecificInformation.cmake"
-  "/usr/share/cmake-2.8/Modules/CheckCSourceCompiles.cmake"
-  "/usr/share/cmake-2.8/Modules/CheckFunctionExists.cmake"
-  "/usr/share/cmake-2.8/Modules/CheckIncludeFile.cmake"
-  "/usr/share/cmake-2.8/Modules/CheckIncludeFiles.cmake"
-  "/usr/share/cmake-2.8/Modules/CheckLibraryExists.cmake"
-  "/usr/share/cmake-2.8/Modules/CheckSymbolExists.cmake"
-  "/usr/share/cmake-2.8/Modules/CheckTypeSize.cmake"
-  "/usr/share/cmake-2.8/Modules/Compiler/GNU-C.cmake"
-  "/usr/share/cmake-2.8/Modules/Compiler/GNU.cmake"
-  "/usr/share/cmake-2.8/Modules/Platform/Linux-GNU-C.cmake"
-  "/usr/share/cmake-2.8/Modules/Platform/Linux-GNU.cmake"
-  "/usr/share/cmake-2.8/Modules/Platform/Linux.cmake"
-  "/usr/share/cmake-2.8/Modules/Platform/UnixPaths.cmake"
-  )
-
-# The corresponding makefile is:
-SET(CMAKE_MAKEFILE_OUTPUTS
-  "Makefile"
-  "CMakeFiles/cmake.check_cache"
-  )
-
-# Byproducts of CMake generate step:
-SET(CMAKE_MAKEFILE_PRODUCTS
-  "CMakeFiles/CMakeDirectoryInformation.cmake"
-  )
-
-# Dependency information for all targets:
-SET(CMAKE_DEPEND_INFO_FILES
-  "CMakeFiles/openal.dir/DependInfo.cmake"
-  "CMakeFiles/openal-info.dir/DependInfo.cmake"
-  )

+ 0 - 152
jni/openal-soft-android/CMakeFiles/Makefile2

@@ -1,152 +0,0 @@
-# CMAKE generated file: DO NOT EDIT!
-# Generated by "Unix Makefiles" Generator, CMake Version 2.8
-
-# Default target executed when no arguments are given to make.
-default_target: all
-.PHONY : default_target
-
-# The main recursive all target
-all:
-.PHONY : all
-
-# The main recursive preinstall target
-preinstall:
-.PHONY : preinstall
-
-#=============================================================================
-# Special targets provided by cmake.
-
-# Disable implicit rules so canoncical targets will work.
-.SUFFIXES:
-
-# Remove some rules from gmake that .SUFFIXES does not remove.
-SUFFIXES =
-
-.SUFFIXES: .hpux_make_needs_suffix_list
-
-# Suppress display of executed commands.
-$(VERBOSE).SILENT:
-
-# A target that is always out of date.
-cmake_force:
-.PHONY : cmake_force
-
-#=============================================================================
-# Set environment variables for the build.
-
-# The shell in which to execute make rules.
-SHELL = /bin/sh
-
-# The CMake executable.
-CMAKE_COMMAND = /usr/bin/cmake
-
-# The command to remove a file.
-RM = /usr/bin/cmake -E remove -f
-
-# The program to use to edit the cache.
-CMAKE_EDIT_COMMAND = /usr/bin/cmake-gui
-
-# The top-level source directory on which CMake was run.
-CMAKE_SOURCE_DIR = /home/hagish/workspace/adt/love-native-android/jni/openal-soft-android
-
-# The top-level build directory on which CMake was run.
-CMAKE_BINARY_DIR = /home/hagish/workspace/adt/love-native-android/jni/openal-soft-android
-
-#=============================================================================
-# Target rules for target CMakeFiles/openal.dir
-
-# All Build rule for target.
-CMakeFiles/openal.dir/all:
-	$(MAKE) -f CMakeFiles/openal.dir/build.make CMakeFiles/openal.dir/depend
-	$(MAKE) -f CMakeFiles/openal.dir/build.make CMakeFiles/openal.dir/build
-	$(CMAKE_COMMAND) -E cmake_progress_report /home/hagish/workspace/adt/love-native-android/jni/openal-soft-android/CMakeFiles  1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28
-	@echo "Built target openal"
-.PHONY : CMakeFiles/openal.dir/all
-
-# Include target in all.
-all: CMakeFiles/openal.dir/all
-.PHONY : all
-
-# Build rule for subdir invocation for target.
-CMakeFiles/openal.dir/rule: cmake_check_build_system
-	$(CMAKE_COMMAND) -E cmake_progress_start /home/hagish/workspace/adt/love-native-android/jni/openal-soft-android/CMakeFiles 28
-	$(MAKE) -f CMakeFiles/Makefile2 CMakeFiles/openal.dir/all
-	$(CMAKE_COMMAND) -E cmake_progress_start /home/hagish/workspace/adt/love-native-android/jni/openal-soft-android/CMakeFiles 0
-.PHONY : CMakeFiles/openal.dir/rule
-
-# Convenience name for target.
-openal: CMakeFiles/openal.dir/rule
-.PHONY : openal
-
-# Pre-install relink rule for target.
-CMakeFiles/openal.dir/preinstall:
-	$(MAKE) -f CMakeFiles/openal.dir/build.make CMakeFiles/openal.dir/preinstall
-.PHONY : CMakeFiles/openal.dir/preinstall
-
-# Prepare target for install.
-preinstall: CMakeFiles/openal.dir/preinstall
-.PHONY : preinstall
-
-# clean rule for target.
-CMakeFiles/openal.dir/clean:
-	$(MAKE) -f CMakeFiles/openal.dir/build.make CMakeFiles/openal.dir/clean
-.PHONY : CMakeFiles/openal.dir/clean
-
-# clean rule for target.
-clean: CMakeFiles/openal.dir/clean
-.PHONY : clean
-
-#=============================================================================
-# Target rules for target CMakeFiles/openal-info.dir
-
-# All Build rule for target.
-CMakeFiles/openal-info.dir/all: CMakeFiles/openal.dir/all
-	$(MAKE) -f CMakeFiles/openal-info.dir/build.make CMakeFiles/openal-info.dir/depend
-	$(MAKE) -f CMakeFiles/openal-info.dir/build.make CMakeFiles/openal-info.dir/build
-	$(CMAKE_COMMAND) -E cmake_progress_report /home/hagish/workspace/adt/love-native-android/jni/openal-soft-android/CMakeFiles  29
-	@echo "Built target openal-info"
-.PHONY : CMakeFiles/openal-info.dir/all
-
-# Include target in all.
-all: CMakeFiles/openal-info.dir/all
-.PHONY : all
-
-# Build rule for subdir invocation for target.
-CMakeFiles/openal-info.dir/rule: cmake_check_build_system
-	$(CMAKE_COMMAND) -E cmake_progress_start /home/hagish/workspace/adt/love-native-android/jni/openal-soft-android/CMakeFiles 29
-	$(MAKE) -f CMakeFiles/Makefile2 CMakeFiles/openal-info.dir/all
-	$(CMAKE_COMMAND) -E cmake_progress_start /home/hagish/workspace/adt/love-native-android/jni/openal-soft-android/CMakeFiles 0
-.PHONY : CMakeFiles/openal-info.dir/rule
-
-# Convenience name for target.
-openal-info: CMakeFiles/openal-info.dir/rule
-.PHONY : openal-info
-
-# Pre-install relink rule for target.
-CMakeFiles/openal-info.dir/preinstall:
-	$(MAKE) -f CMakeFiles/openal-info.dir/build.make CMakeFiles/openal-info.dir/preinstall
-.PHONY : CMakeFiles/openal-info.dir/preinstall
-
-# Prepare target for install.
-preinstall: CMakeFiles/openal-info.dir/preinstall
-.PHONY : preinstall
-
-# clean rule for target.
-CMakeFiles/openal-info.dir/clean:
-	$(MAKE) -f CMakeFiles/openal-info.dir/build.make CMakeFiles/openal-info.dir/clean
-.PHONY : CMakeFiles/openal-info.dir/clean
-
-# clean rule for target.
-clean: CMakeFiles/openal-info.dir/clean
-.PHONY : clean
-
-#=============================================================================
-# Special targets to cleanup operation of make.
-
-# Special rule to run CMake to check the build system integrity.
-# No rule that depends on this can have commands that come from listfiles
-# because they might be regenerated.
-cmake_check_build_system:
-	$(CMAKE_COMMAND) -H$(CMAKE_SOURCE_DIR) -B$(CMAKE_BINARY_DIR) --check-build-system CMakeFiles/Makefile.cmake 0
-.PHONY : cmake_check_build_system
-

+ 0 - 2
jni/openal-soft-android/CMakeFiles/TargetDirectories.txt

@@ -1,2 +0,0 @@
-/home/hagish/workspace/adt/love-native-android/jni/openal-soft-android/CMakeFiles/openal.dir
-/home/hagish/workspace/adt/love-native-android/jni/openal-soft-android/CMakeFiles/openal-info.dir

+ 0 - 1
jni/openal-soft-android/CMakeFiles/cmake.check_cache

@@ -1 +0,0 @@
-# This file is generated by cmake for dependency checking of the CMakeCache.txt file

+ 0 - 32
jni/openal-soft-android/CMakeFiles/openal-info.dir/C.includecache

@@ -1,32 +0,0 @@
-#IncludeRegexLine: ^[ 	]*#[ 	]*(include|import)[ 	]*[<"]([^">]+)([">])
-
-#IncludeRegexScan: ^.*$
-
-#IncludeRegexComplain: ^$
-
-#IncludeRegexTransform: 
-
-/home/hagish/workspace/adt/love-native-android/jni/openal-soft-android/utils/openal-info.c
-stdio.h
--
-string.h
--
-AL/alc.h
-/home/hagish/workspace/adt/love-native-android/jni/openal-soft-android/utils/AL/alc.h
-AL/al.h
-/home/hagish/workspace/adt/love-native-android/jni/openal-soft-android/utils/AL/al.h
-AL/alext.h
-/home/hagish/workspace/adt/love-native-android/jni/openal-soft-android/utils/AL/alext.h
-
-include/AL/al.h
-
-include/AL/alc.h
-
-include/AL/alext.h
-stddef.h
--
-efx.h
-include/AL/efx.h
-
-include/AL/efx.h
-

+ 0 - 19
jni/openal-soft-android/CMakeFiles/openal-info.dir/DependInfo.cmake

@@ -1,19 +0,0 @@
-# The set of languages for which implicit dependencies are needed:
-SET(CMAKE_DEPENDS_LANGUAGES
-  "C"
-  )
-# The set of files for implicit dependencies of each language:
-SET(CMAKE_DEPENDS_CHECK_C
-  "/home/hagish/workspace/adt/love-native-android/jni/openal-soft-android/utils/openal-info.c" "/home/hagish/workspace/adt/love-native-android/jni/openal-soft-android/CMakeFiles/openal-info.dir/utils/openal-info.o"
-  )
-SET(CMAKE_C_COMPILER_ID "GNU")
-
-# Preprocessor definitions for this target.
-SET(CMAKE_TARGET_DEFINITIONS
-  "_GNU_SOURCE=1"
-  )
-
-# Targets to which this target links.
-SET(CMAKE_TARGET_LINKED_INFO_FILES
-  "/home/hagish/workspace/adt/love-native-android/jni/openal-soft-android/CMakeFiles/openal.dir/DependInfo.cmake"
-  )

+ 0 - 122
jni/openal-soft-android/CMakeFiles/openal-info.dir/build.make

@@ -1,122 +0,0 @@
-# CMAKE generated file: DO NOT EDIT!
-# Generated by "Unix Makefiles" Generator, CMake Version 2.8
-
-#=============================================================================
-# Special targets provided by cmake.
-
-# Disable implicit rules so canoncical targets will work.
-.SUFFIXES:
-
-# Remove some rules from gmake that .SUFFIXES does not remove.
-SUFFIXES =
-
-.SUFFIXES: .hpux_make_needs_suffix_list
-
-# Suppress display of executed commands.
-$(VERBOSE).SILENT:
-
-# A target that is always out of date.
-cmake_force:
-.PHONY : cmake_force
-
-#=============================================================================
-# Set environment variables for the build.
-
-# The shell in which to execute make rules.
-SHELL = /bin/sh
-
-# The CMake executable.
-CMAKE_COMMAND = /usr/bin/cmake
-
-# The command to remove a file.
-RM = /usr/bin/cmake -E remove -f
-
-# The program to use to edit the cache.
-CMAKE_EDIT_COMMAND = /usr/bin/cmake-gui
-
-# The top-level source directory on which CMake was run.
-CMAKE_SOURCE_DIR = /home/hagish/workspace/adt/love-native-android/jni/openal-soft-android
-
-# The top-level build directory on which CMake was run.
-CMAKE_BINARY_DIR = /home/hagish/workspace/adt/love-native-android/jni/openal-soft-android
-
-# Include any dependencies generated for this target.
-include CMakeFiles/openal-info.dir/depend.make
-
-# Include the progress variables for this target.
-include CMakeFiles/openal-info.dir/progress.make
-
-# Include the compile flags for this target's objects.
-include CMakeFiles/openal-info.dir/flags.make
-
-CMakeFiles/openal-info.dir/utils/openal-info.o: CMakeFiles/openal-info.dir/flags.make
-CMakeFiles/openal-info.dir/utils/openal-info.o: utils/openal-info.c
-	$(CMAKE_COMMAND) -E cmake_progress_report /home/hagish/workspace/adt/love-native-android/jni/openal-soft-android/CMakeFiles $(CMAKE_PROGRESS_1)
-	@$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Building C object CMakeFiles/openal-info.dir/utils/openal-info.o"
-	/opt/android-ndk-r6/toolchains/arm-linux-androideabi-4.4.3/prebuilt/linux-x86/bin/arm-linux-androideabi-gcc  $(C_DEFINES) $(C_FLAGS) -o CMakeFiles/openal-info.dir/utils/openal-info.o   -c /home/hagish/workspace/adt/love-native-android/jni/openal-soft-android/utils/openal-info.c
-
-CMakeFiles/openal-info.dir/utils/openal-info.i: cmake_force
-	@$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Preprocessing C source to CMakeFiles/openal-info.dir/utils/openal-info.i"
-	/opt/android-ndk-r6/toolchains/arm-linux-androideabi-4.4.3/prebuilt/linux-x86/bin/arm-linux-androideabi-gcc  $(C_DEFINES) $(C_FLAGS) -E /home/hagish/workspace/adt/love-native-android/jni/openal-soft-android/utils/openal-info.c > CMakeFiles/openal-info.dir/utils/openal-info.i
-
-CMakeFiles/openal-info.dir/utils/openal-info.s: cmake_force
-	@$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Compiling C source to assembly CMakeFiles/openal-info.dir/utils/openal-info.s"
-	/opt/android-ndk-r6/toolchains/arm-linux-androideabi-4.4.3/prebuilt/linux-x86/bin/arm-linux-androideabi-gcc  $(C_DEFINES) $(C_FLAGS) -S /home/hagish/workspace/adt/love-native-android/jni/openal-soft-android/utils/openal-info.c -o CMakeFiles/openal-info.dir/utils/openal-info.s
-
-CMakeFiles/openal-info.dir/utils/openal-info.o.requires:
-.PHONY : CMakeFiles/openal-info.dir/utils/openal-info.o.requires
-
-CMakeFiles/openal-info.dir/utils/openal-info.o.provides: CMakeFiles/openal-info.dir/utils/openal-info.o.requires
-	$(MAKE) -f CMakeFiles/openal-info.dir/build.make CMakeFiles/openal-info.dir/utils/openal-info.o.provides.build
-.PHONY : CMakeFiles/openal-info.dir/utils/openal-info.o.provides
-
-CMakeFiles/openal-info.dir/utils/openal-info.o.provides.build: CMakeFiles/openal-info.dir/utils/openal-info.o
-.PHONY : CMakeFiles/openal-info.dir/utils/openal-info.o.provides.build
-
-# Object files for target openal-info
-openal__info_OBJECTS = \
-"CMakeFiles/openal-info.dir/utils/openal-info.o"
-
-# External object files for target openal-info
-openal__info_EXTERNAL_OBJECTS =
-
-openal-info: CMakeFiles/openal-info.dir/utils/openal-info.o
-openal-info: libopenal.so.1.13.0
-openal-info: CMakeFiles/openal-info.dir/build.make
-openal-info: CMakeFiles/openal-info.dir/link.txt
-	@$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --red --bold "Linking C executable openal-info"
-	$(CMAKE_COMMAND) -E cmake_link_script CMakeFiles/openal-info.dir/link.txt --verbose=$(VERBOSE)
-
-# Rule to build all files generated by this target.
-CMakeFiles/openal-info.dir/build: openal-info
-.PHONY : CMakeFiles/openal-info.dir/build
-
-# Object files for target openal-info
-openal__info_OBJECTS = \
-"CMakeFiles/openal-info.dir/utils/openal-info.o"
-
-# External object files for target openal-info
-openal__info_EXTERNAL_OBJECTS =
-
-CMakeFiles/CMakeRelink.dir/openal-info: CMakeFiles/openal-info.dir/utils/openal-info.o
-CMakeFiles/CMakeRelink.dir/openal-info: libopenal.so.1.13.0
-CMakeFiles/CMakeRelink.dir/openal-info: CMakeFiles/openal-info.dir/build.make
-CMakeFiles/CMakeRelink.dir/openal-info: CMakeFiles/openal-info.dir/relink.txt
-	@$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --red --bold "Linking C executable CMakeFiles/CMakeRelink.dir/openal-info"
-	$(CMAKE_COMMAND) -E cmake_link_script CMakeFiles/openal-info.dir/relink.txt --verbose=$(VERBOSE)
-
-# Rule to relink during preinstall.
-CMakeFiles/openal-info.dir/preinstall: CMakeFiles/CMakeRelink.dir/openal-info
-.PHONY : CMakeFiles/openal-info.dir/preinstall
-
-CMakeFiles/openal-info.dir/requires: CMakeFiles/openal-info.dir/utils/openal-info.o.requires
-.PHONY : CMakeFiles/openal-info.dir/requires
-
-CMakeFiles/openal-info.dir/clean:
-	$(CMAKE_COMMAND) -P CMakeFiles/openal-info.dir/cmake_clean.cmake
-.PHONY : CMakeFiles/openal-info.dir/clean
-
-CMakeFiles/openal-info.dir/depend:
-	cd /home/hagish/workspace/adt/love-native-android/jni/openal-soft-android && $(CMAKE_COMMAND) -E cmake_depends "Unix Makefiles" /home/hagish/workspace/adt/love-native-android/jni/openal-soft-android /home/hagish/workspace/adt/love-native-android/jni/openal-soft-android /home/hagish/workspace/adt/love-native-android/jni/openal-soft-android /home/hagish/workspace/adt/love-native-android/jni/openal-soft-android /home/hagish/workspace/adt/love-native-android/jni/openal-soft-android/CMakeFiles/openal-info.dir/DependInfo.cmake --color=$(COLOR)
-.PHONY : CMakeFiles/openal-info.dir/depend
-

+ 0 - 12
jni/openal-soft-android/CMakeFiles/openal-info.dir/cmake_clean.cmake

@@ -1,12 +0,0 @@
-FILE(REMOVE_RECURSE
-  "CMakeFiles/openal-info.dir/utils/openal-info.o"
-  "openal-info.pdb"
-  "openal-info"
-  "CMakeFiles/CMakeRelink.dir/openal-info.pdb"
-  "CMakeFiles/CMakeRelink.dir/openal-info"
-)
-
-# Per-language clean rules from dependency scanning.
-FOREACH(lang C)
-  INCLUDE(CMakeFiles/openal-info.dir/cmake_clean_${lang}.cmake OPTIONAL)
-ENDFOREACH(lang)

+ 0 - 9
jni/openal-soft-android/CMakeFiles/openal-info.dir/depend.internal

@@ -1,9 +0,0 @@
-# CMAKE generated file: DO NOT EDIT!
-# Generated by "Unix Makefiles" Generator, CMake Version 2.8
-
-CMakeFiles/openal-info.dir/utils/openal-info.o
- /home/hagish/workspace/adt/love-native-android/jni/openal-soft-android/utils/openal-info.c
- include/AL/al.h
- include/AL/alc.h
- include/AL/alext.h
- include/AL/efx.h

+ 0 - 9
jni/openal-soft-android/CMakeFiles/openal-info.dir/depend.make

@@ -1,9 +0,0 @@
-# CMAKE generated file: DO NOT EDIT!
-# Generated by "Unix Makefiles" Generator, CMake Version 2.8
-
-CMakeFiles/openal-info.dir/utils/openal-info.o: utils/openal-info.c
-CMakeFiles/openal-info.dir/utils/openal-info.o: include/AL/al.h
-CMakeFiles/openal-info.dir/utils/openal-info.o: include/AL/alc.h
-CMakeFiles/openal-info.dir/utils/openal-info.o: include/AL/alext.h
-CMakeFiles/openal-info.dir/utils/openal-info.o: include/AL/efx.h
-

+ 0 - 8
jni/openal-soft-android/CMakeFiles/openal-info.dir/flags.make

@@ -1,8 +0,0 @@
-# CMAKE generated file: DO NOT EDIT!
-# Generated by "Unix Makefiles" Generator, CMake Version 2.8
-
-# compile C with /opt/android-ndk-r6/toolchains/arm-linux-androideabi-4.4.3/prebuilt/linux-x86/bin/arm-linux-androideabi-gcc
-C_FLAGS = --sysroot=/opt/android-ndk-r6/platforms/android-5/arch-arm -fPIC -DANDROID -Wno-psabi -fsigned-char -mthumb -g -O2 -D_DEBUG -I/opt/android-ndk-r6/sources/cxx-stl/gnu-libstdc++/include -I/opt/android-ndk-r6/sources/cxx-stl/gnu-libstdc++/libs/armeabi/include -I/home/hagish/workspace/adt/love-native-android/jni/openal-soft-android/OpenAL32/Include -I/home/hagish/workspace/adt/love-native-android/jni/openal-soft-android/include -I/home/hagish/workspace/adt/love-native-android/jni/openal-soft-android   -Winline -Wall -Wextra -fvisibility=internal
-
-C_DEFINES = -D_GNU_SOURCE=1
-

+ 0 - 1
jni/openal-soft-android/CMakeFiles/openal-info.dir/link.txt

@@ -1 +0,0 @@
-/opt/android-ndk-r6/toolchains/arm-linux-androideabi-4.4.3/prebuilt/linux-x86/bin/arm-linux-androideabi-gcc  --sysroot=/opt/android-ndk-r6/platforms/android-5/arch-arm -fPIC -DANDROID -Wno-psabi -fsigned-char -mthumb -g -O2 -D_DEBUG  -Wl,--fix-cortex-a8 -L"/opt/android-ndk-r6/sources/cxx-stl/gnu-libstdc++/libs/armeabi" -L"/usr/local/libs/armeabi" -lstdc++ -lsupc++ CMakeFiles/openal-info.dir/utils/openal-info.o  -o openal-info -rdynamic -L/opt/android-ndk-r6/platforms/android-5/arch-arm/usr/lib libopenal.so.1.13.0 -ldl -lm -Wl,-rpath,/opt/android-ndk-r6/platforms/android-5/arch-arm/usr/lib:/home/hagish/workspace/adt/love-native-android/jni/openal-soft-android 

+ 0 - 2
jni/openal-soft-android/CMakeFiles/openal-info.dir/progress.make

@@ -1,2 +0,0 @@
-CMAKE_PROGRESS_1 = 29
-

+ 0 - 1
jni/openal-soft-android/CMakeFiles/openal-info.dir/relink.txt

@@ -1 +0,0 @@
-/opt/android-ndk-r6/toolchains/arm-linux-androideabi-4.4.3/prebuilt/linux-x86/bin/arm-linux-androideabi-gcc  --sysroot=/opt/android-ndk-r6/platforms/android-5/arch-arm -fPIC -DANDROID -Wno-psabi -fsigned-char -mthumb -g -O2 -D_DEBUG  -Wl,--fix-cortex-a8 -L"/opt/android-ndk-r6/sources/cxx-stl/gnu-libstdc++/libs/armeabi" -L"/usr/local/libs/armeabi" -lstdc++ -lsupc++ CMakeFiles/openal-info.dir/utils/openal-info.o  -o CMakeFiles/CMakeRelink.dir/openal-info -rdynamic -L/opt/android-ndk-r6/platforms/android-5/arch-arm/usr/lib libopenal.so.1.13.0 -ldl -lm 

+ 0 - 684
jni/openal-soft-android/CMakeFiles/openal.dir/C.includecache

@@ -1,684 +0,0 @@
-#IncludeRegexLine: ^[ 	]*#[ 	]*(include|import)[ 	]*[<"]([^">]+)([">])
-
-#IncludeRegexScan: ^.*$
-
-#IncludeRegexComplain: ^$
-
-#IncludeRegexTransform: 
-
-/home/hagish/workspace/adt/love-native-android/jni/openal-soft-android/Alc/ALc.c
-config.h
-/home/hagish/workspace/adt/love-native-android/jni/openal-soft-android/Alc/config.h
-math.h
--
-stdlib.h
--
-stdio.h
--
-memory.h
--
-ctype.h
--
-signal.h
--
-alMain.h
-/home/hagish/workspace/adt/love-native-android/jni/openal-soft-android/Alc/alMain.h
-alSource.h
-/home/hagish/workspace/adt/love-native-android/jni/openal-soft-android/Alc/alSource.h
-AL/al.h
-/home/hagish/workspace/adt/love-native-android/jni/openal-soft-android/Alc/AL/al.h
-AL/alc.h
-/home/hagish/workspace/adt/love-native-android/jni/openal-soft-android/Alc/AL/alc.h
-alThunk.h
-/home/hagish/workspace/adt/love-native-android/jni/openal-soft-android/Alc/alThunk.h
-alSource.h
-/home/hagish/workspace/adt/love-native-android/jni/openal-soft-android/Alc/alSource.h
-alBuffer.h
-/home/hagish/workspace/adt/love-native-android/jni/openal-soft-android/Alc/alBuffer.h
-alAuxEffectSlot.h
-/home/hagish/workspace/adt/love-native-android/jni/openal-soft-android/Alc/alAuxEffectSlot.h
-alError.h
-/home/hagish/workspace/adt/love-native-android/jni/openal-soft-android/Alc/alError.h
-bs2b.h
-/home/hagish/workspace/adt/love-native-android/jni/openal-soft-android/Alc/bs2b.h
-alu.h
-/home/hagish/workspace/adt/love-native-android/jni/openal-soft-android/Alc/alu.h
-
-/home/hagish/workspace/adt/love-native-android/jni/openal-soft-android/Alc/ALu.c
-config.h
-/home/hagish/workspace/adt/love-native-android/jni/openal-soft-android/Alc/config.h
-math.h
--
-stdlib.h
--
-string.h
--
-ctype.h
--
-assert.h
--
-alMain.h
-/home/hagish/workspace/adt/love-native-android/jni/openal-soft-android/Alc/alMain.h
-AL/al.h
-/home/hagish/workspace/adt/love-native-android/jni/openal-soft-android/Alc/AL/al.h
-AL/alc.h
-/home/hagish/workspace/adt/love-native-android/jni/openal-soft-android/Alc/AL/alc.h
-alSource.h
-/home/hagish/workspace/adt/love-native-android/jni/openal-soft-android/Alc/alSource.h
-alBuffer.h
-/home/hagish/workspace/adt/love-native-android/jni/openal-soft-android/Alc/alBuffer.h
-alListener.h
-/home/hagish/workspace/adt/love-native-android/jni/openal-soft-android/Alc/alListener.h
-alAuxEffectSlot.h
-/home/hagish/workspace/adt/love-native-android/jni/openal-soft-android/Alc/alAuxEffectSlot.h
-alu.h
-/home/hagish/workspace/adt/love-native-android/jni/openal-soft-android/Alc/alu.h
-bs2b.h
-/home/hagish/workspace/adt/love-native-android/jni/openal-soft-android/Alc/bs2b.h
-
-/home/hagish/workspace/adt/love-native-android/jni/openal-soft-android/Alc/alcConfig.c
-config.h
-/home/hagish/workspace/adt/love-native-android/jni/openal-soft-android/Alc/config.h
-stdlib.h
--
-stdio.h
--
-ctype.h
--
-string.h
--
-alMain.h
-/home/hagish/workspace/adt/love-native-android/jni/openal-soft-android/Alc/alMain.h
-shlobj.h
--
-
-/home/hagish/workspace/adt/love-native-android/jni/openal-soft-android/Alc/alcDedicated.c
-config.h
-/home/hagish/workspace/adt/love-native-android/jni/openal-soft-android/Alc/config.h
-stdlib.h
--
-alMain.h
-/home/hagish/workspace/adt/love-native-android/jni/openal-soft-android/Alc/alMain.h
-alFilter.h
-/home/hagish/workspace/adt/love-native-android/jni/openal-soft-android/Alc/alFilter.h
-alAuxEffectSlot.h
-/home/hagish/workspace/adt/love-native-android/jni/openal-soft-android/Alc/alAuxEffectSlot.h
-alError.h
-/home/hagish/workspace/adt/love-native-android/jni/openal-soft-android/Alc/alError.h
-alu.h
-/home/hagish/workspace/adt/love-native-android/jni/openal-soft-android/Alc/alu.h
-
-/home/hagish/workspace/adt/love-native-android/jni/openal-soft-android/Alc/alcEcho.c
-config.h
-/home/hagish/workspace/adt/love-native-android/jni/openal-soft-android/Alc/config.h
-math.h
--
-stdlib.h
--
-alMain.h
-/home/hagish/workspace/adt/love-native-android/jni/openal-soft-android/Alc/alMain.h
-alFilter.h
-/home/hagish/workspace/adt/love-native-android/jni/openal-soft-android/Alc/alFilter.h
-alAuxEffectSlot.h
-/home/hagish/workspace/adt/love-native-android/jni/openal-soft-android/Alc/alAuxEffectSlot.h
-alError.h
-/home/hagish/workspace/adt/love-native-android/jni/openal-soft-android/Alc/alError.h
-alu.h
-/home/hagish/workspace/adt/love-native-android/jni/openal-soft-android/Alc/alu.h
-
-/home/hagish/workspace/adt/love-native-android/jni/openal-soft-android/Alc/alcModulator.c
-config.h
-/home/hagish/workspace/adt/love-native-android/jni/openal-soft-android/Alc/config.h
-math.h
--
-stdlib.h
--
-alMain.h
-/home/hagish/workspace/adt/love-native-android/jni/openal-soft-android/Alc/alMain.h
-alFilter.h
-/home/hagish/workspace/adt/love-native-android/jni/openal-soft-android/Alc/alFilter.h
-alAuxEffectSlot.h
-/home/hagish/workspace/adt/love-native-android/jni/openal-soft-android/Alc/alAuxEffectSlot.h
-alError.h
-/home/hagish/workspace/adt/love-native-android/jni/openal-soft-android/Alc/alError.h
-alu.h
-/home/hagish/workspace/adt/love-native-android/jni/openal-soft-android/Alc/alu.h
-
-/home/hagish/workspace/adt/love-native-android/jni/openal-soft-android/Alc/alcReverb.c
-config.h
-/home/hagish/workspace/adt/love-native-android/jni/openal-soft-android/Alc/config.h
-stdio.h
--
-stdlib.h
--
-math.h
--
-AL/al.h
-/home/hagish/workspace/adt/love-native-android/jni/openal-soft-android/Alc/AL/al.h
-AL/alc.h
-/home/hagish/workspace/adt/love-native-android/jni/openal-soft-android/Alc/AL/alc.h
-alMain.h
-/home/hagish/workspace/adt/love-native-android/jni/openal-soft-android/Alc/alMain.h
-alAuxEffectSlot.h
-/home/hagish/workspace/adt/love-native-android/jni/openal-soft-android/Alc/alAuxEffectSlot.h
-alEffect.h
-/home/hagish/workspace/adt/love-native-android/jni/openal-soft-android/Alc/alEffect.h
-alError.h
-/home/hagish/workspace/adt/love-native-android/jni/openal-soft-android/Alc/alError.h
-alu.h
-/home/hagish/workspace/adt/love-native-android/jni/openal-soft-android/Alc/alu.h
-
-/home/hagish/workspace/adt/love-native-android/jni/openal-soft-android/Alc/alcRing.c
-config.h
-/home/hagish/workspace/adt/love-native-android/jni/openal-soft-android/Alc/config.h
-string.h
--
-stdlib.h
--
-alMain.h
-/home/hagish/workspace/adt/love-native-android/jni/openal-soft-android/Alc/alMain.h
-
-/home/hagish/workspace/adt/love-native-android/jni/openal-soft-android/Alc/alcThread.c
-config.h
-/home/hagish/workspace/adt/love-native-android/jni/openal-soft-android/Alc/config.h
-stdlib.h
--
-alMain.h
-/home/hagish/workspace/adt/love-native-android/jni/openal-soft-android/Alc/alMain.h
-alThunk.h
-/home/hagish/workspace/adt/love-native-android/jni/openal-soft-android/Alc/alThunk.h
-pthread.h
--
-
-/home/hagish/workspace/adt/love-native-android/jni/openal-soft-android/Alc/backends/android.c
-config.h
-/home/hagish/workspace/adt/love-native-android/jni/openal-soft-android/Alc/backends/config.h
-stdlib.h
--
-jni.h
--
-pthread.h
--
-alMain.h
-/home/hagish/workspace/adt/love-native-android/jni/openal-soft-android/Alc/backends/alMain.h
-AL/al.h
-/home/hagish/workspace/adt/love-native-android/jni/openal-soft-android/Alc/backends/AL/al.h
-AL/alc.h
-/home/hagish/workspace/adt/love-native-android/jni/openal-soft-android/Alc/backends/AL/alc.h
-
-/home/hagish/workspace/adt/love-native-android/jni/openal-soft-android/Alc/backends/loopback.c
-config.h
-/home/hagish/workspace/adt/love-native-android/jni/openal-soft-android/Alc/backends/config.h
-stdlib.h
--
-alMain.h
-/home/hagish/workspace/adt/love-native-android/jni/openal-soft-android/Alc/backends/alMain.h
-AL/al.h
-/home/hagish/workspace/adt/love-native-android/jni/openal-soft-android/Alc/backends/AL/al.h
-AL/alc.h
-/home/hagish/workspace/adt/love-native-android/jni/openal-soft-android/Alc/backends/AL/alc.h
-
-/home/hagish/workspace/adt/love-native-android/jni/openal-soft-android/Alc/backends/null.c
-config.h
-/home/hagish/workspace/adt/love-native-android/jni/openal-soft-android/Alc/backends/config.h
-stdlib.h
--
-alMain.h
-/home/hagish/workspace/adt/love-native-android/jni/openal-soft-android/Alc/backends/alMain.h
-AL/al.h
-/home/hagish/workspace/adt/love-native-android/jni/openal-soft-android/Alc/backends/AL/al.h
-AL/alc.h
-/home/hagish/workspace/adt/love-native-android/jni/openal-soft-android/Alc/backends/AL/alc.h
-
-/home/hagish/workspace/adt/love-native-android/jni/openal-soft-android/Alc/backends/wave.c
-config.h
-/home/hagish/workspace/adt/love-native-android/jni/openal-soft-android/Alc/backends/config.h
-stdlib.h
--
-stdio.h
--
-memory.h
--
-alMain.h
-/home/hagish/workspace/adt/love-native-android/jni/openal-soft-android/Alc/backends/alMain.h
-AL/al.h
-/home/hagish/workspace/adt/love-native-android/jni/openal-soft-android/Alc/backends/AL/al.h
-AL/alc.h
-/home/hagish/workspace/adt/love-native-android/jni/openal-soft-android/Alc/backends/AL/alc.h
-
-/home/hagish/workspace/adt/love-native-android/jni/openal-soft-android/Alc/bs2b.c
-config.h
-/home/hagish/workspace/adt/love-native-android/jni/openal-soft-android/Alc/config.h
-math.h
--
-bs2b.h
-/home/hagish/workspace/adt/love-native-android/jni/openal-soft-android/Alc/bs2b.h
-
-/home/hagish/workspace/adt/love-native-android/jni/openal-soft-android/Alc/helpers.c
-config.h
-/home/hagish/workspace/adt/love-native-android/jni/openal-soft-android/Alc/config.h
-stdlib.h
--
-dlfcn.h
--
-windows.h
--
-guiddef.h
--
-initguid.h
--
-alMain.h
-/home/hagish/workspace/adt/love-native-android/jni/openal-soft-android/Alc/alMain.h
-
-/home/hagish/workspace/adt/love-native-android/jni/openal-soft-android/Alc/hrtf.c
-config.h
-/home/hagish/workspace/adt/love-native-android/jni/openal-soft-android/Alc/config.h
-stdlib.h
--
-ctype.h
--
-AL/al.h
-/home/hagish/workspace/adt/love-native-android/jni/openal-soft-android/Alc/AL/al.h
-AL/alc.h
-/home/hagish/workspace/adt/love-native-android/jni/openal-soft-android/Alc/AL/alc.h
-alMain.h
-/home/hagish/workspace/adt/love-native-android/jni/openal-soft-android/Alc/alMain.h
-alSource.h
-/home/hagish/workspace/adt/love-native-android/jni/openal-soft-android/Alc/alSource.h
-hrtf_tables.inc
-/home/hagish/workspace/adt/love-native-android/jni/openal-soft-android/Alc/hrtf_tables.inc
-
-/home/hagish/workspace/adt/love-native-android/jni/openal-soft-android/Alc/hrtf_tables.inc
-
-/home/hagish/workspace/adt/love-native-android/jni/openal-soft-android/Alc/mixer.c
-config.h
-/home/hagish/workspace/adt/love-native-android/jni/openal-soft-android/Alc/config.h
-math.h
--
-stdlib.h
--
-string.h
--
-ctype.h
--
-assert.h
--
-alMain.h
-/home/hagish/workspace/adt/love-native-android/jni/openal-soft-android/Alc/alMain.h
-AL/al.h
-/home/hagish/workspace/adt/love-native-android/jni/openal-soft-android/Alc/AL/al.h
-AL/alc.h
-/home/hagish/workspace/adt/love-native-android/jni/openal-soft-android/Alc/AL/alc.h
-alSource.h
-/home/hagish/workspace/adt/love-native-android/jni/openal-soft-android/Alc/alSource.h
-alBuffer.h
-/home/hagish/workspace/adt/love-native-android/jni/openal-soft-android/Alc/alBuffer.h
-alListener.h
-/home/hagish/workspace/adt/love-native-android/jni/openal-soft-android/Alc/alListener.h
-alAuxEffectSlot.h
-/home/hagish/workspace/adt/love-native-android/jni/openal-soft-android/Alc/alAuxEffectSlot.h
-alu.h
-/home/hagish/workspace/adt/love-native-android/jni/openal-soft-android/Alc/alu.h
-bs2b.h
-/home/hagish/workspace/adt/love-native-android/jni/openal-soft-android/Alc/bs2b.h
-arm_neon.h
--
-
-/home/hagish/workspace/adt/love-native-android/jni/openal-soft-android/Alc/panning.c
-config.h
-/home/hagish/workspace/adt/love-native-android/jni/openal-soft-android/Alc/config.h
-math.h
--
-stdlib.h
--
-string.h
--
-ctype.h
--
-assert.h
--
-alMain.h
-/home/hagish/workspace/adt/love-native-android/jni/openal-soft-android/Alc/alMain.h
-AL/al.h
-/home/hagish/workspace/adt/love-native-android/jni/openal-soft-android/Alc/AL/al.h
-AL/alc.h
-/home/hagish/workspace/adt/love-native-android/jni/openal-soft-android/Alc/AL/alc.h
-alu.h
-/home/hagish/workspace/adt/love-native-android/jni/openal-soft-android/Alc/alu.h
-
-/home/hagish/workspace/adt/love-native-android/jni/openal-soft-android/OpenAL32/alAuxEffectSlot.c
-config.h
-/home/hagish/workspace/adt/love-native-android/jni/openal-soft-android/OpenAL32/config.h
-stdlib.h
--
-math.h
--
-AL/al.h
-/home/hagish/workspace/adt/love-native-android/jni/openal-soft-android/OpenAL32/AL/al.h
-AL/alc.h
-/home/hagish/workspace/adt/love-native-android/jni/openal-soft-android/OpenAL32/AL/alc.h
-alMain.h
-/home/hagish/workspace/adt/love-native-android/jni/openal-soft-android/OpenAL32/alMain.h
-alAuxEffectSlot.h
-/home/hagish/workspace/adt/love-native-android/jni/openal-soft-android/OpenAL32/alAuxEffectSlot.h
-alThunk.h
-/home/hagish/workspace/adt/love-native-android/jni/openal-soft-android/OpenAL32/alThunk.h
-alError.h
-/home/hagish/workspace/adt/love-native-android/jni/openal-soft-android/OpenAL32/alError.h
-alSource.h
-/home/hagish/workspace/adt/love-native-android/jni/openal-soft-android/OpenAL32/alSource.h
-
-/home/hagish/workspace/adt/love-native-android/jni/openal-soft-android/OpenAL32/alBuffer.c
-config.h
-/home/hagish/workspace/adt/love-native-android/jni/openal-soft-android/OpenAL32/config.h
-stdlib.h
--
-stdio.h
--
-assert.h
--
-limits.h
--
-alMain.h
-/home/hagish/workspace/adt/love-native-android/jni/openal-soft-android/OpenAL32/alMain.h
-AL/al.h
-/home/hagish/workspace/adt/love-native-android/jni/openal-soft-android/OpenAL32/AL/al.h
-AL/alc.h
-/home/hagish/workspace/adt/love-native-android/jni/openal-soft-android/OpenAL32/AL/alc.h
-alError.h
-/home/hagish/workspace/adt/love-native-android/jni/openal-soft-android/OpenAL32/alError.h
-alBuffer.h
-/home/hagish/workspace/adt/love-native-android/jni/openal-soft-android/OpenAL32/alBuffer.h
-alThunk.h
-/home/hagish/workspace/adt/love-native-android/jni/openal-soft-android/OpenAL32/alThunk.h
-
-/home/hagish/workspace/adt/love-native-android/jni/openal-soft-android/OpenAL32/alEffect.c
-config.h
-/home/hagish/workspace/adt/love-native-android/jni/openal-soft-android/OpenAL32/config.h
-stdlib.h
--
-math.h
--
-AL/al.h
-/home/hagish/workspace/adt/love-native-android/jni/openal-soft-android/OpenAL32/AL/al.h
-AL/alc.h
-/home/hagish/workspace/adt/love-native-android/jni/openal-soft-android/OpenAL32/AL/alc.h
-alMain.h
-/home/hagish/workspace/adt/love-native-android/jni/openal-soft-android/OpenAL32/alMain.h
-alEffect.h
-/home/hagish/workspace/adt/love-native-android/jni/openal-soft-android/OpenAL32/alEffect.h
-alThunk.h
-/home/hagish/workspace/adt/love-native-android/jni/openal-soft-android/OpenAL32/alThunk.h
-alError.h
-/home/hagish/workspace/adt/love-native-android/jni/openal-soft-android/OpenAL32/alError.h
-
-/home/hagish/workspace/adt/love-native-android/jni/openal-soft-android/OpenAL32/alError.c
-config.h
-/home/hagish/workspace/adt/love-native-android/jni/openal-soft-android/OpenAL32/config.h
-signal.h
--
-alMain.h
-/home/hagish/workspace/adt/love-native-android/jni/openal-soft-android/OpenAL32/alMain.h
-AL/alc.h
-/home/hagish/workspace/adt/love-native-android/jni/openal-soft-android/OpenAL32/AL/alc.h
-alError.h
-/home/hagish/workspace/adt/love-native-android/jni/openal-soft-android/OpenAL32/alError.h
-
-/home/hagish/workspace/adt/love-native-android/jni/openal-soft-android/OpenAL32/alExtension.c
-config.h
-/home/hagish/workspace/adt/love-native-android/jni/openal-soft-android/OpenAL32/config.h
-stdlib.h
--
-string.h
--
-ctype.h
--
-alError.h
-/home/hagish/workspace/adt/love-native-android/jni/openal-soft-android/OpenAL32/alError.h
-alMain.h
-/home/hagish/workspace/adt/love-native-android/jni/openal-soft-android/OpenAL32/alMain.h
-alFilter.h
-/home/hagish/workspace/adt/love-native-android/jni/openal-soft-android/OpenAL32/alFilter.h
-alEffect.h
-/home/hagish/workspace/adt/love-native-android/jni/openal-soft-android/OpenAL32/alEffect.h
-alAuxEffectSlot.h
-/home/hagish/workspace/adt/love-native-android/jni/openal-soft-android/OpenAL32/alAuxEffectSlot.h
-alSource.h
-/home/hagish/workspace/adt/love-native-android/jni/openal-soft-android/OpenAL32/alSource.h
-alBuffer.h
-/home/hagish/workspace/adt/love-native-android/jni/openal-soft-android/OpenAL32/alBuffer.h
-AL/al.h
-/home/hagish/workspace/adt/love-native-android/jni/openal-soft-android/OpenAL32/AL/al.h
-AL/alc.h
-/home/hagish/workspace/adt/love-native-android/jni/openal-soft-android/OpenAL32/AL/alc.h
-
-/home/hagish/workspace/adt/love-native-android/jni/openal-soft-android/OpenAL32/alFilter.c
-config.h
-/home/hagish/workspace/adt/love-native-android/jni/openal-soft-android/OpenAL32/config.h
-stdlib.h
--
-AL/al.h
-/home/hagish/workspace/adt/love-native-android/jni/openal-soft-android/OpenAL32/AL/al.h
-AL/alc.h
-/home/hagish/workspace/adt/love-native-android/jni/openal-soft-android/OpenAL32/AL/alc.h
-alMain.h
-/home/hagish/workspace/adt/love-native-android/jni/openal-soft-android/OpenAL32/alMain.h
-alFilter.h
-/home/hagish/workspace/adt/love-native-android/jni/openal-soft-android/OpenAL32/alFilter.h
-alThunk.h
-/home/hagish/workspace/adt/love-native-android/jni/openal-soft-android/OpenAL32/alThunk.h
-alError.h
-/home/hagish/workspace/adt/love-native-android/jni/openal-soft-android/OpenAL32/alError.h
-
-/home/hagish/workspace/adt/love-native-android/jni/openal-soft-android/OpenAL32/alListener.c
-config.h
-/home/hagish/workspace/adt/love-native-android/jni/openal-soft-android/OpenAL32/config.h
-alMain.h
-/home/hagish/workspace/adt/love-native-android/jni/openal-soft-android/OpenAL32/alMain.h
-AL/alc.h
-/home/hagish/workspace/adt/love-native-android/jni/openal-soft-android/OpenAL32/AL/alc.h
-alError.h
-/home/hagish/workspace/adt/love-native-android/jni/openal-soft-android/OpenAL32/alError.h
-alListener.h
-/home/hagish/workspace/adt/love-native-android/jni/openal-soft-android/OpenAL32/alListener.h
-alSource.h
-/home/hagish/workspace/adt/love-native-android/jni/openal-soft-android/OpenAL32/alSource.h
-
-/home/hagish/workspace/adt/love-native-android/jni/openal-soft-android/OpenAL32/alSource.c
-config.h
-/home/hagish/workspace/adt/love-native-android/jni/openal-soft-android/OpenAL32/config.h
-stdlib.h
--
-math.h
--
-float.h
--
-alMain.h
-/home/hagish/workspace/adt/love-native-android/jni/openal-soft-android/OpenAL32/alMain.h
-AL/al.h
-/home/hagish/workspace/adt/love-native-android/jni/openal-soft-android/OpenAL32/AL/al.h
-AL/alc.h
-/home/hagish/workspace/adt/love-native-android/jni/openal-soft-android/OpenAL32/AL/alc.h
-alError.h
-/home/hagish/workspace/adt/love-native-android/jni/openal-soft-android/OpenAL32/alError.h
-alSource.h
-/home/hagish/workspace/adt/love-native-android/jni/openal-soft-android/OpenAL32/alSource.h
-alBuffer.h
-/home/hagish/workspace/adt/love-native-android/jni/openal-soft-android/OpenAL32/alBuffer.h
-alThunk.h
-/home/hagish/workspace/adt/love-native-android/jni/openal-soft-android/OpenAL32/alThunk.h
-alAuxEffectSlot.h
-/home/hagish/workspace/adt/love-native-android/jni/openal-soft-android/OpenAL32/alAuxEffectSlot.h
-
-/home/hagish/workspace/adt/love-native-android/jni/openal-soft-android/OpenAL32/alState.c
-config.h
-/home/hagish/workspace/adt/love-native-android/jni/openal-soft-android/OpenAL32/config.h
-stdlib.h
--
-alMain.h
-/home/hagish/workspace/adt/love-native-android/jni/openal-soft-android/OpenAL32/alMain.h
-AL/alc.h
-/home/hagish/workspace/adt/love-native-android/jni/openal-soft-android/OpenAL32/AL/alc.h
-AL/alext.h
-/home/hagish/workspace/adt/love-native-android/jni/openal-soft-android/OpenAL32/AL/alext.h
-alError.h
-/home/hagish/workspace/adt/love-native-android/jni/openal-soft-android/OpenAL32/alError.h
-alSource.h
-/home/hagish/workspace/adt/love-native-android/jni/openal-soft-android/OpenAL32/alSource.h
-alAuxEffectSlot.h
-/home/hagish/workspace/adt/love-native-android/jni/openal-soft-android/OpenAL32/alAuxEffectSlot.h
-alState.h
-/home/hagish/workspace/adt/love-native-android/jni/openal-soft-android/OpenAL32/alState.h
-
-/home/hagish/workspace/adt/love-native-android/jni/openal-soft-android/OpenAL32/alThunk.c
-config.h
-/home/hagish/workspace/adt/love-native-android/jni/openal-soft-android/OpenAL32/config.h
-stdlib.h
--
-alMain.h
-/home/hagish/workspace/adt/love-native-android/jni/openal-soft-android/OpenAL32/alMain.h
-alThunk.h
-/home/hagish/workspace/adt/love-native-android/jni/openal-soft-android/OpenAL32/alThunk.h
-
-/opt/android-ndk-r6/sources/cxx-stl/gnu-libstdc++/include/fenv.h
-bits/c++config.h
--
-tr1_impl/cfenv
--
-tr1_impl/cfenv
--
-
-/opt/android-ndk-r6/sources/cxx-stl/gnu-libstdc++/include/tr1_impl/cfenv
-
-/opt/android-ndk-r6/sources/cxx-stl/gnu-libstdc++/libs/armeabi/include/bits/c++config.h
-bits/os_defines.h
--
-bits/cpu_defines.h
--
-
-/opt/android-ndk-r6/sources/cxx-stl/gnu-libstdc++/libs/armeabi/include/bits/cpu_defines.h
-
-/opt/android-ndk-r6/sources/cxx-stl/gnu-libstdc++/libs/armeabi/include/bits/os_defines.h
-
-OpenAL32/Include/alAuxEffectSlot.h
-AL/al.h
-OpenAL32/Include/AL/al.h
-alEffect.h
-OpenAL32/Include/alEffect.h
-alFilter.h
-OpenAL32/Include/alFilter.h
-
-OpenAL32/Include/alBuffer.h
-AL/al.h
-OpenAL32/Include/AL/al.h
-
-OpenAL32/Include/alEffect.h
-AL/al.h
-OpenAL32/Include/AL/al.h
-
-OpenAL32/Include/alError.h
-AL/al.h
-OpenAL32/Include/AL/al.h
-AL/alc.h
-OpenAL32/Include/AL/alc.h
-
-OpenAL32/Include/alFilter.h
-AL/al.h
-OpenAL32/Include/AL/al.h
-alu.h
-OpenAL32/Include/alu.h
-
-OpenAL32/Include/alListener.h
-AL/al.h
-OpenAL32/Include/AL/al.h
-
-OpenAL32/Include/alMain.h
-string.h
--
-stdio.h
--
-stdarg.h
--
-fenv.h
--
-fpu_control.h
--
-AL/al.h
-OpenAL32/Include/AL/al.h
-AL/alc.h
-OpenAL32/Include/AL/alc.h
-AL/alext.h
-OpenAL32/Include/AL/alext.h
-stdint.h
--
-windows.h
--
-unistd.h
--
-assert.h
--
-pthread.h
--
-pthread_np.h
--
-sys/time.h
--
-time.h
--
-errno.h
--
-libkern/OSAtomic.h
--
-alListener.h
-OpenAL32/Include/alListener.h
-alu.h
-OpenAL32/Include/alu.h
-
-OpenAL32/Include/alSource.h
-alFilter.h
-OpenAL32/Include/alFilter.h
-alu.h
-OpenAL32/Include/alu.h
-AL/al.h
-OpenAL32/Include/AL/al.h
-
-OpenAL32/Include/alState.h
-AL/al.h
-OpenAL32/Include/AL/al.h
-
-OpenAL32/Include/alThunk.h
-alMain.h
-OpenAL32/Include/alMain.h
-
-OpenAL32/Include/alu.h
-AL/al.h
-OpenAL32/Include/AL/al.h
-AL/alc.h
-OpenAL32/Include/AL/alc.h
-AL/alext.h
-OpenAL32/Include/AL/alext.h
-limits.h
--
-math.h
--
-float.h
--
-ieeefp.h
--
-
-OpenAL32/Include/bs2b.h
-
-config.h
-
-include/AL/al.h
-
-include/AL/alc.h
-
-include/AL/alext.h
-stddef.h
--
-efx.h
-include/AL/efx.h
-
-include/AL/efx.h
-

+ 0 - 54
jni/openal-soft-android/CMakeFiles/openal.dir/DependInfo.cmake

@@ -1,54 +0,0 @@
-# The set of languages for which implicit dependencies are needed:
-SET(CMAKE_DEPENDS_LANGUAGES
-  "C"
-  )
-# The set of files for implicit dependencies of each language:
-SET(CMAKE_DEPENDS_CHECK_C
-  "/home/hagish/workspace/adt/love-native-android/jni/openal-soft-android/Alc/ALc.c" "/home/hagish/workspace/adt/love-native-android/jni/openal-soft-android/CMakeFiles/openal.dir/Alc/ALc.o"
-  "/home/hagish/workspace/adt/love-native-android/jni/openal-soft-android/Alc/ALu.c" "/home/hagish/workspace/adt/love-native-android/jni/openal-soft-android/CMakeFiles/openal.dir/Alc/ALu.o"
-  "/home/hagish/workspace/adt/love-native-android/jni/openal-soft-android/Alc/alcConfig.c" "/home/hagish/workspace/adt/love-native-android/jni/openal-soft-android/CMakeFiles/openal.dir/Alc/alcConfig.o"
-  "/home/hagish/workspace/adt/love-native-android/jni/openal-soft-android/Alc/alcDedicated.c" "/home/hagish/workspace/adt/love-native-android/jni/openal-soft-android/CMakeFiles/openal.dir/Alc/alcDedicated.o"
-  "/home/hagish/workspace/adt/love-native-android/jni/openal-soft-android/Alc/alcEcho.c" "/home/hagish/workspace/adt/love-native-android/jni/openal-soft-android/CMakeFiles/openal.dir/Alc/alcEcho.o"
-  "/home/hagish/workspace/adt/love-native-android/jni/openal-soft-android/Alc/alcModulator.c" "/home/hagish/workspace/adt/love-native-android/jni/openal-soft-android/CMakeFiles/openal.dir/Alc/alcModulator.o"
-  "/home/hagish/workspace/adt/love-native-android/jni/openal-soft-android/Alc/alcReverb.c" "/home/hagish/workspace/adt/love-native-android/jni/openal-soft-android/CMakeFiles/openal.dir/Alc/alcReverb.o"
-  "/home/hagish/workspace/adt/love-native-android/jni/openal-soft-android/Alc/alcRing.c" "/home/hagish/workspace/adt/love-native-android/jni/openal-soft-android/CMakeFiles/openal.dir/Alc/alcRing.o"
-  "/home/hagish/workspace/adt/love-native-android/jni/openal-soft-android/Alc/alcThread.c" "/home/hagish/workspace/adt/love-native-android/jni/openal-soft-android/CMakeFiles/openal.dir/Alc/alcThread.o"
-  "/home/hagish/workspace/adt/love-native-android/jni/openal-soft-android/Alc/backends/android.c" "/home/hagish/workspace/adt/love-native-android/jni/openal-soft-android/CMakeFiles/openal.dir/Alc/backends/android.o"
-  "/home/hagish/workspace/adt/love-native-android/jni/openal-soft-android/Alc/backends/loopback.c" "/home/hagish/workspace/adt/love-native-android/jni/openal-soft-android/CMakeFiles/openal.dir/Alc/backends/loopback.o"
-  "/home/hagish/workspace/adt/love-native-android/jni/openal-soft-android/Alc/backends/null.c" "/home/hagish/workspace/adt/love-native-android/jni/openal-soft-android/CMakeFiles/openal.dir/Alc/backends/null.o"
-  "/home/hagish/workspace/adt/love-native-android/jni/openal-soft-android/Alc/backends/wave.c" "/home/hagish/workspace/adt/love-native-android/jni/openal-soft-android/CMakeFiles/openal.dir/Alc/backends/wave.o"
-  "/home/hagish/workspace/adt/love-native-android/jni/openal-soft-android/Alc/bs2b.c" "/home/hagish/workspace/adt/love-native-android/jni/openal-soft-android/CMakeFiles/openal.dir/Alc/bs2b.o"
-  "/home/hagish/workspace/adt/love-native-android/jni/openal-soft-android/Alc/helpers.c" "/home/hagish/workspace/adt/love-native-android/jni/openal-soft-android/CMakeFiles/openal.dir/Alc/helpers.o"
-  "/home/hagish/workspace/adt/love-native-android/jni/openal-soft-android/Alc/hrtf.c" "/home/hagish/workspace/adt/love-native-android/jni/openal-soft-android/CMakeFiles/openal.dir/Alc/hrtf.o"
-  "/home/hagish/workspace/adt/love-native-android/jni/openal-soft-android/Alc/mixer.c" "/home/hagish/workspace/adt/love-native-android/jni/openal-soft-android/CMakeFiles/openal.dir/Alc/mixer.o"
-  "/home/hagish/workspace/adt/love-native-android/jni/openal-soft-android/Alc/panning.c" "/home/hagish/workspace/adt/love-native-android/jni/openal-soft-android/CMakeFiles/openal.dir/Alc/panning.o"
-  "/home/hagish/workspace/adt/love-native-android/jni/openal-soft-android/OpenAL32/alAuxEffectSlot.c" "/home/hagish/workspace/adt/love-native-android/jni/openal-soft-android/CMakeFiles/openal.dir/OpenAL32/alAuxEffectSlot.o"
-  "/home/hagish/workspace/adt/love-native-android/jni/openal-soft-android/OpenAL32/alBuffer.c" "/home/hagish/workspace/adt/love-native-android/jni/openal-soft-android/CMakeFiles/openal.dir/OpenAL32/alBuffer.o"
-  "/home/hagish/workspace/adt/love-native-android/jni/openal-soft-android/OpenAL32/alEffect.c" "/home/hagish/workspace/adt/love-native-android/jni/openal-soft-android/CMakeFiles/openal.dir/OpenAL32/alEffect.o"
-  "/home/hagish/workspace/adt/love-native-android/jni/openal-soft-android/OpenAL32/alError.c" "/home/hagish/workspace/adt/love-native-android/jni/openal-soft-android/CMakeFiles/openal.dir/OpenAL32/alError.o"
-  "/home/hagish/workspace/adt/love-native-android/jni/openal-soft-android/OpenAL32/alExtension.c" "/home/hagish/workspace/adt/love-native-android/jni/openal-soft-android/CMakeFiles/openal.dir/OpenAL32/alExtension.o"
-  "/home/hagish/workspace/adt/love-native-android/jni/openal-soft-android/OpenAL32/alFilter.c" "/home/hagish/workspace/adt/love-native-android/jni/openal-soft-android/CMakeFiles/openal.dir/OpenAL32/alFilter.o"
-  "/home/hagish/workspace/adt/love-native-android/jni/openal-soft-android/OpenAL32/alListener.c" "/home/hagish/workspace/adt/love-native-android/jni/openal-soft-android/CMakeFiles/openal.dir/OpenAL32/alListener.o"
-  "/home/hagish/workspace/adt/love-native-android/jni/openal-soft-android/OpenAL32/alSource.c" "/home/hagish/workspace/adt/love-native-android/jni/openal-soft-android/CMakeFiles/openal.dir/OpenAL32/alSource.o"
-  "/home/hagish/workspace/adt/love-native-android/jni/openal-soft-android/OpenAL32/alState.c" "/home/hagish/workspace/adt/love-native-android/jni/openal-soft-android/CMakeFiles/openal.dir/OpenAL32/alState.o"
-  "/home/hagish/workspace/adt/love-native-android/jni/openal-soft-android/OpenAL32/alThunk.c" "/home/hagish/workspace/adt/love-native-android/jni/openal-soft-android/CMakeFiles/openal.dir/OpenAL32/alThunk.o"
-  )
-SET(CMAKE_C_COMPILER_ID "GNU")
-
-# Preprocessor definitions for this target.
-SET(CMAKE_TARGET_DEFINITIONS
-  "_GNU_SOURCE=1"
-  )
-
-# Pairs of files generated by the same build rule.
-SET(CMAKE_MULTIPLE_OUTPUT_PAIRS
-  "/home/hagish/workspace/adt/love-native-android/jni/openal-soft-android/CMakeFiles/CMakeRelink.dir/libopenal.so" "/home/hagish/workspace/adt/love-native-android/jni/openal-soft-android/CMakeFiles/CMakeRelink.dir/libopenal.so.1.13.0"
-  "/home/hagish/workspace/adt/love-native-android/jni/openal-soft-android/CMakeFiles/CMakeRelink.dir/libopenal.so.1" "/home/hagish/workspace/adt/love-native-android/jni/openal-soft-android/CMakeFiles/CMakeRelink.dir/libopenal.so.1.13.0"
-  "/home/hagish/workspace/adt/love-native-android/jni/openal-soft-android/libopenal.so" "/home/hagish/workspace/adt/love-native-android/jni/openal-soft-android/libopenal.so.1.13.0"
-  "/home/hagish/workspace/adt/love-native-android/jni/openal-soft-android/libopenal.so.1" "/home/hagish/workspace/adt/love-native-android/jni/openal-soft-android/libopenal.so.1.13.0"
-  )
-
-
-# Targets to which this target links.
-SET(CMAKE_TARGET_LINKED_INFO_FILES
-  )

+ 0 - 913
jni/openal-soft-android/CMakeFiles/openal.dir/build.make

@@ -1,913 +0,0 @@
-# CMAKE generated file: DO NOT EDIT!
-# Generated by "Unix Makefiles" Generator, CMake Version 2.8
-
-#=============================================================================
-# Special targets provided by cmake.
-
-# Disable implicit rules so canoncical targets will work.
-.SUFFIXES:
-
-# Remove some rules from gmake that .SUFFIXES does not remove.
-SUFFIXES =
-
-.SUFFIXES: .hpux_make_needs_suffix_list
-
-# Suppress display of executed commands.
-$(VERBOSE).SILENT:
-
-# A target that is always out of date.
-cmake_force:
-.PHONY : cmake_force
-
-#=============================================================================
-# Set environment variables for the build.
-
-# The shell in which to execute make rules.
-SHELL = /bin/sh
-
-# The CMake executable.
-CMAKE_COMMAND = /usr/bin/cmake
-
-# The command to remove a file.
-RM = /usr/bin/cmake -E remove -f
-
-# The program to use to edit the cache.
-CMAKE_EDIT_COMMAND = /usr/bin/cmake-gui
-
-# The top-level source directory on which CMake was run.
-CMAKE_SOURCE_DIR = /home/hagish/workspace/adt/love-native-android/jni/openal-soft-android
-
-# The top-level build directory on which CMake was run.
-CMAKE_BINARY_DIR = /home/hagish/workspace/adt/love-native-android/jni/openal-soft-android
-
-# Include any dependencies generated for this target.
-include CMakeFiles/openal.dir/depend.make
-
-# Include the progress variables for this target.
-include CMakeFiles/openal.dir/progress.make
-
-# Include the compile flags for this target's objects.
-include CMakeFiles/openal.dir/flags.make
-
-CMakeFiles/openal.dir/OpenAL32/alAuxEffectSlot.o: CMakeFiles/openal.dir/flags.make
-CMakeFiles/openal.dir/OpenAL32/alAuxEffectSlot.o: OpenAL32/alAuxEffectSlot.c
-	$(CMAKE_COMMAND) -E cmake_progress_report /home/hagish/workspace/adt/love-native-android/jni/openal-soft-android/CMakeFiles $(CMAKE_PROGRESS_1)
-	@$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Building C object CMakeFiles/openal.dir/OpenAL32/alAuxEffectSlot.o"
-	/opt/android-ndk-r6/toolchains/arm-linux-androideabi-4.4.3/prebuilt/linux-x86/bin/arm-linux-androideabi-gcc  $(C_DEFINES) $(C_FLAGS) -DAL_ALEXT_PROTOTYPES -o CMakeFiles/openal.dir/OpenAL32/alAuxEffectSlot.o   -c /home/hagish/workspace/adt/love-native-android/jni/openal-soft-android/OpenAL32/alAuxEffectSlot.c
-
-CMakeFiles/openal.dir/OpenAL32/alAuxEffectSlot.i: cmake_force
-	@$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Preprocessing C source to CMakeFiles/openal.dir/OpenAL32/alAuxEffectSlot.i"
-	/opt/android-ndk-r6/toolchains/arm-linux-androideabi-4.4.3/prebuilt/linux-x86/bin/arm-linux-androideabi-gcc  $(C_DEFINES) $(C_FLAGS) -DAL_ALEXT_PROTOTYPES -E /home/hagish/workspace/adt/love-native-android/jni/openal-soft-android/OpenAL32/alAuxEffectSlot.c > CMakeFiles/openal.dir/OpenAL32/alAuxEffectSlot.i
-
-CMakeFiles/openal.dir/OpenAL32/alAuxEffectSlot.s: cmake_force
-	@$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Compiling C source to assembly CMakeFiles/openal.dir/OpenAL32/alAuxEffectSlot.s"
-	/opt/android-ndk-r6/toolchains/arm-linux-androideabi-4.4.3/prebuilt/linux-x86/bin/arm-linux-androideabi-gcc  $(C_DEFINES) $(C_FLAGS) -DAL_ALEXT_PROTOTYPES -S /home/hagish/workspace/adt/love-native-android/jni/openal-soft-android/OpenAL32/alAuxEffectSlot.c -o CMakeFiles/openal.dir/OpenAL32/alAuxEffectSlot.s
-
-CMakeFiles/openal.dir/OpenAL32/alAuxEffectSlot.o.requires:
-.PHONY : CMakeFiles/openal.dir/OpenAL32/alAuxEffectSlot.o.requires
-
-CMakeFiles/openal.dir/OpenAL32/alAuxEffectSlot.o.provides: CMakeFiles/openal.dir/OpenAL32/alAuxEffectSlot.o.requires
-	$(MAKE) -f CMakeFiles/openal.dir/build.make CMakeFiles/openal.dir/OpenAL32/alAuxEffectSlot.o.provides.build
-.PHONY : CMakeFiles/openal.dir/OpenAL32/alAuxEffectSlot.o.provides
-
-CMakeFiles/openal.dir/OpenAL32/alAuxEffectSlot.o.provides.build: CMakeFiles/openal.dir/OpenAL32/alAuxEffectSlot.o
-.PHONY : CMakeFiles/openal.dir/OpenAL32/alAuxEffectSlot.o.provides.build
-
-CMakeFiles/openal.dir/OpenAL32/alBuffer.o: CMakeFiles/openal.dir/flags.make
-CMakeFiles/openal.dir/OpenAL32/alBuffer.o: OpenAL32/alBuffer.c
-	$(CMAKE_COMMAND) -E cmake_progress_report /home/hagish/workspace/adt/love-native-android/jni/openal-soft-android/CMakeFiles $(CMAKE_PROGRESS_2)
-	@$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Building C object CMakeFiles/openal.dir/OpenAL32/alBuffer.o"
-	/opt/android-ndk-r6/toolchains/arm-linux-androideabi-4.4.3/prebuilt/linux-x86/bin/arm-linux-androideabi-gcc  $(C_DEFINES) $(C_FLAGS) -DAL_ALEXT_PROTOTYPES -o CMakeFiles/openal.dir/OpenAL32/alBuffer.o   -c /home/hagish/workspace/adt/love-native-android/jni/openal-soft-android/OpenAL32/alBuffer.c
-
-CMakeFiles/openal.dir/OpenAL32/alBuffer.i: cmake_force
-	@$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Preprocessing C source to CMakeFiles/openal.dir/OpenAL32/alBuffer.i"
-	/opt/android-ndk-r6/toolchains/arm-linux-androideabi-4.4.3/prebuilt/linux-x86/bin/arm-linux-androideabi-gcc  $(C_DEFINES) $(C_FLAGS) -DAL_ALEXT_PROTOTYPES -E /home/hagish/workspace/adt/love-native-android/jni/openal-soft-android/OpenAL32/alBuffer.c > CMakeFiles/openal.dir/OpenAL32/alBuffer.i
-
-CMakeFiles/openal.dir/OpenAL32/alBuffer.s: cmake_force
-	@$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Compiling C source to assembly CMakeFiles/openal.dir/OpenAL32/alBuffer.s"
-	/opt/android-ndk-r6/toolchains/arm-linux-androideabi-4.4.3/prebuilt/linux-x86/bin/arm-linux-androideabi-gcc  $(C_DEFINES) $(C_FLAGS) -DAL_ALEXT_PROTOTYPES -S /home/hagish/workspace/adt/love-native-android/jni/openal-soft-android/OpenAL32/alBuffer.c -o CMakeFiles/openal.dir/OpenAL32/alBuffer.s
-
-CMakeFiles/openal.dir/OpenAL32/alBuffer.o.requires:
-.PHONY : CMakeFiles/openal.dir/OpenAL32/alBuffer.o.requires
-
-CMakeFiles/openal.dir/OpenAL32/alBuffer.o.provides: CMakeFiles/openal.dir/OpenAL32/alBuffer.o.requires
-	$(MAKE) -f CMakeFiles/openal.dir/build.make CMakeFiles/openal.dir/OpenAL32/alBuffer.o.provides.build
-.PHONY : CMakeFiles/openal.dir/OpenAL32/alBuffer.o.provides
-
-CMakeFiles/openal.dir/OpenAL32/alBuffer.o.provides.build: CMakeFiles/openal.dir/OpenAL32/alBuffer.o
-.PHONY : CMakeFiles/openal.dir/OpenAL32/alBuffer.o.provides.build
-
-CMakeFiles/openal.dir/OpenAL32/alEffect.o: CMakeFiles/openal.dir/flags.make
-CMakeFiles/openal.dir/OpenAL32/alEffect.o: OpenAL32/alEffect.c
-	$(CMAKE_COMMAND) -E cmake_progress_report /home/hagish/workspace/adt/love-native-android/jni/openal-soft-android/CMakeFiles $(CMAKE_PROGRESS_3)
-	@$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Building C object CMakeFiles/openal.dir/OpenAL32/alEffect.o"
-	/opt/android-ndk-r6/toolchains/arm-linux-androideabi-4.4.3/prebuilt/linux-x86/bin/arm-linux-androideabi-gcc  $(C_DEFINES) $(C_FLAGS) -DAL_ALEXT_PROTOTYPES -o CMakeFiles/openal.dir/OpenAL32/alEffect.o   -c /home/hagish/workspace/adt/love-native-android/jni/openal-soft-android/OpenAL32/alEffect.c
-
-CMakeFiles/openal.dir/OpenAL32/alEffect.i: cmake_force
-	@$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Preprocessing C source to CMakeFiles/openal.dir/OpenAL32/alEffect.i"
-	/opt/android-ndk-r6/toolchains/arm-linux-androideabi-4.4.3/prebuilt/linux-x86/bin/arm-linux-androideabi-gcc  $(C_DEFINES) $(C_FLAGS) -DAL_ALEXT_PROTOTYPES -E /home/hagish/workspace/adt/love-native-android/jni/openal-soft-android/OpenAL32/alEffect.c > CMakeFiles/openal.dir/OpenAL32/alEffect.i
-
-CMakeFiles/openal.dir/OpenAL32/alEffect.s: cmake_force
-	@$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Compiling C source to assembly CMakeFiles/openal.dir/OpenAL32/alEffect.s"
-	/opt/android-ndk-r6/toolchains/arm-linux-androideabi-4.4.3/prebuilt/linux-x86/bin/arm-linux-androideabi-gcc  $(C_DEFINES) $(C_FLAGS) -DAL_ALEXT_PROTOTYPES -S /home/hagish/workspace/adt/love-native-android/jni/openal-soft-android/OpenAL32/alEffect.c -o CMakeFiles/openal.dir/OpenAL32/alEffect.s
-
-CMakeFiles/openal.dir/OpenAL32/alEffect.o.requires:
-.PHONY : CMakeFiles/openal.dir/OpenAL32/alEffect.o.requires
-
-CMakeFiles/openal.dir/OpenAL32/alEffect.o.provides: CMakeFiles/openal.dir/OpenAL32/alEffect.o.requires
-	$(MAKE) -f CMakeFiles/openal.dir/build.make CMakeFiles/openal.dir/OpenAL32/alEffect.o.provides.build
-.PHONY : CMakeFiles/openal.dir/OpenAL32/alEffect.o.provides
-
-CMakeFiles/openal.dir/OpenAL32/alEffect.o.provides.build: CMakeFiles/openal.dir/OpenAL32/alEffect.o
-.PHONY : CMakeFiles/openal.dir/OpenAL32/alEffect.o.provides.build
-
-CMakeFiles/openal.dir/OpenAL32/alError.o: CMakeFiles/openal.dir/flags.make
-CMakeFiles/openal.dir/OpenAL32/alError.o: OpenAL32/alError.c
-	$(CMAKE_COMMAND) -E cmake_progress_report /home/hagish/workspace/adt/love-native-android/jni/openal-soft-android/CMakeFiles $(CMAKE_PROGRESS_4)
-	@$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Building C object CMakeFiles/openal.dir/OpenAL32/alError.o"
-	/opt/android-ndk-r6/toolchains/arm-linux-androideabi-4.4.3/prebuilt/linux-x86/bin/arm-linux-androideabi-gcc  $(C_DEFINES) $(C_FLAGS) -DAL_ALEXT_PROTOTYPES -o CMakeFiles/openal.dir/OpenAL32/alError.o   -c /home/hagish/workspace/adt/love-native-android/jni/openal-soft-android/OpenAL32/alError.c
-
-CMakeFiles/openal.dir/OpenAL32/alError.i: cmake_force
-	@$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Preprocessing C source to CMakeFiles/openal.dir/OpenAL32/alError.i"
-	/opt/android-ndk-r6/toolchains/arm-linux-androideabi-4.4.3/prebuilt/linux-x86/bin/arm-linux-androideabi-gcc  $(C_DEFINES) $(C_FLAGS) -DAL_ALEXT_PROTOTYPES -E /home/hagish/workspace/adt/love-native-android/jni/openal-soft-android/OpenAL32/alError.c > CMakeFiles/openal.dir/OpenAL32/alError.i
-
-CMakeFiles/openal.dir/OpenAL32/alError.s: cmake_force
-	@$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Compiling C source to assembly CMakeFiles/openal.dir/OpenAL32/alError.s"
-	/opt/android-ndk-r6/toolchains/arm-linux-androideabi-4.4.3/prebuilt/linux-x86/bin/arm-linux-androideabi-gcc  $(C_DEFINES) $(C_FLAGS) -DAL_ALEXT_PROTOTYPES -S /home/hagish/workspace/adt/love-native-android/jni/openal-soft-android/OpenAL32/alError.c -o CMakeFiles/openal.dir/OpenAL32/alError.s
-
-CMakeFiles/openal.dir/OpenAL32/alError.o.requires:
-.PHONY : CMakeFiles/openal.dir/OpenAL32/alError.o.requires
-
-CMakeFiles/openal.dir/OpenAL32/alError.o.provides: CMakeFiles/openal.dir/OpenAL32/alError.o.requires
-	$(MAKE) -f CMakeFiles/openal.dir/build.make CMakeFiles/openal.dir/OpenAL32/alError.o.provides.build
-.PHONY : CMakeFiles/openal.dir/OpenAL32/alError.o.provides
-
-CMakeFiles/openal.dir/OpenAL32/alError.o.provides.build: CMakeFiles/openal.dir/OpenAL32/alError.o
-.PHONY : CMakeFiles/openal.dir/OpenAL32/alError.o.provides.build
-
-CMakeFiles/openal.dir/OpenAL32/alExtension.o: CMakeFiles/openal.dir/flags.make
-CMakeFiles/openal.dir/OpenAL32/alExtension.o: OpenAL32/alExtension.c
-	$(CMAKE_COMMAND) -E cmake_progress_report /home/hagish/workspace/adt/love-native-android/jni/openal-soft-android/CMakeFiles $(CMAKE_PROGRESS_5)
-	@$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Building C object CMakeFiles/openal.dir/OpenAL32/alExtension.o"
-	/opt/android-ndk-r6/toolchains/arm-linux-androideabi-4.4.3/prebuilt/linux-x86/bin/arm-linux-androideabi-gcc  $(C_DEFINES) $(C_FLAGS) -DAL_ALEXT_PROTOTYPES -o CMakeFiles/openal.dir/OpenAL32/alExtension.o   -c /home/hagish/workspace/adt/love-native-android/jni/openal-soft-android/OpenAL32/alExtension.c
-
-CMakeFiles/openal.dir/OpenAL32/alExtension.i: cmake_force
-	@$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Preprocessing C source to CMakeFiles/openal.dir/OpenAL32/alExtension.i"
-	/opt/android-ndk-r6/toolchains/arm-linux-androideabi-4.4.3/prebuilt/linux-x86/bin/arm-linux-androideabi-gcc  $(C_DEFINES) $(C_FLAGS) -DAL_ALEXT_PROTOTYPES -E /home/hagish/workspace/adt/love-native-android/jni/openal-soft-android/OpenAL32/alExtension.c > CMakeFiles/openal.dir/OpenAL32/alExtension.i
-
-CMakeFiles/openal.dir/OpenAL32/alExtension.s: cmake_force
-	@$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Compiling C source to assembly CMakeFiles/openal.dir/OpenAL32/alExtension.s"
-	/opt/android-ndk-r6/toolchains/arm-linux-androideabi-4.4.3/prebuilt/linux-x86/bin/arm-linux-androideabi-gcc  $(C_DEFINES) $(C_FLAGS) -DAL_ALEXT_PROTOTYPES -S /home/hagish/workspace/adt/love-native-android/jni/openal-soft-android/OpenAL32/alExtension.c -o CMakeFiles/openal.dir/OpenAL32/alExtension.s
-
-CMakeFiles/openal.dir/OpenAL32/alExtension.o.requires:
-.PHONY : CMakeFiles/openal.dir/OpenAL32/alExtension.o.requires
-
-CMakeFiles/openal.dir/OpenAL32/alExtension.o.provides: CMakeFiles/openal.dir/OpenAL32/alExtension.o.requires
-	$(MAKE) -f CMakeFiles/openal.dir/build.make CMakeFiles/openal.dir/OpenAL32/alExtension.o.provides.build
-.PHONY : CMakeFiles/openal.dir/OpenAL32/alExtension.o.provides
-
-CMakeFiles/openal.dir/OpenAL32/alExtension.o.provides.build: CMakeFiles/openal.dir/OpenAL32/alExtension.o
-.PHONY : CMakeFiles/openal.dir/OpenAL32/alExtension.o.provides.build
-
-CMakeFiles/openal.dir/OpenAL32/alFilter.o: CMakeFiles/openal.dir/flags.make
-CMakeFiles/openal.dir/OpenAL32/alFilter.o: OpenAL32/alFilter.c
-	$(CMAKE_COMMAND) -E cmake_progress_report /home/hagish/workspace/adt/love-native-android/jni/openal-soft-android/CMakeFiles $(CMAKE_PROGRESS_6)
-	@$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Building C object CMakeFiles/openal.dir/OpenAL32/alFilter.o"
-	/opt/android-ndk-r6/toolchains/arm-linux-androideabi-4.4.3/prebuilt/linux-x86/bin/arm-linux-androideabi-gcc  $(C_DEFINES) $(C_FLAGS) -DAL_ALEXT_PROTOTYPES -o CMakeFiles/openal.dir/OpenAL32/alFilter.o   -c /home/hagish/workspace/adt/love-native-android/jni/openal-soft-android/OpenAL32/alFilter.c
-
-CMakeFiles/openal.dir/OpenAL32/alFilter.i: cmake_force
-	@$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Preprocessing C source to CMakeFiles/openal.dir/OpenAL32/alFilter.i"
-	/opt/android-ndk-r6/toolchains/arm-linux-androideabi-4.4.3/prebuilt/linux-x86/bin/arm-linux-androideabi-gcc  $(C_DEFINES) $(C_FLAGS) -DAL_ALEXT_PROTOTYPES -E /home/hagish/workspace/adt/love-native-android/jni/openal-soft-android/OpenAL32/alFilter.c > CMakeFiles/openal.dir/OpenAL32/alFilter.i
-
-CMakeFiles/openal.dir/OpenAL32/alFilter.s: cmake_force
-	@$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Compiling C source to assembly CMakeFiles/openal.dir/OpenAL32/alFilter.s"
-	/opt/android-ndk-r6/toolchains/arm-linux-androideabi-4.4.3/prebuilt/linux-x86/bin/arm-linux-androideabi-gcc  $(C_DEFINES) $(C_FLAGS) -DAL_ALEXT_PROTOTYPES -S /home/hagish/workspace/adt/love-native-android/jni/openal-soft-android/OpenAL32/alFilter.c -o CMakeFiles/openal.dir/OpenAL32/alFilter.s
-
-CMakeFiles/openal.dir/OpenAL32/alFilter.o.requires:
-.PHONY : CMakeFiles/openal.dir/OpenAL32/alFilter.o.requires
-
-CMakeFiles/openal.dir/OpenAL32/alFilter.o.provides: CMakeFiles/openal.dir/OpenAL32/alFilter.o.requires
-	$(MAKE) -f CMakeFiles/openal.dir/build.make CMakeFiles/openal.dir/OpenAL32/alFilter.o.provides.build
-.PHONY : CMakeFiles/openal.dir/OpenAL32/alFilter.o.provides
-
-CMakeFiles/openal.dir/OpenAL32/alFilter.o.provides.build: CMakeFiles/openal.dir/OpenAL32/alFilter.o
-.PHONY : CMakeFiles/openal.dir/OpenAL32/alFilter.o.provides.build
-
-CMakeFiles/openal.dir/OpenAL32/alListener.o: CMakeFiles/openal.dir/flags.make
-CMakeFiles/openal.dir/OpenAL32/alListener.o: OpenAL32/alListener.c
-	$(CMAKE_COMMAND) -E cmake_progress_report /home/hagish/workspace/adt/love-native-android/jni/openal-soft-android/CMakeFiles $(CMAKE_PROGRESS_7)
-	@$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Building C object CMakeFiles/openal.dir/OpenAL32/alListener.o"
-	/opt/android-ndk-r6/toolchains/arm-linux-androideabi-4.4.3/prebuilt/linux-x86/bin/arm-linux-androideabi-gcc  $(C_DEFINES) $(C_FLAGS) -DAL_ALEXT_PROTOTYPES -o CMakeFiles/openal.dir/OpenAL32/alListener.o   -c /home/hagish/workspace/adt/love-native-android/jni/openal-soft-android/OpenAL32/alListener.c
-
-CMakeFiles/openal.dir/OpenAL32/alListener.i: cmake_force
-	@$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Preprocessing C source to CMakeFiles/openal.dir/OpenAL32/alListener.i"
-	/opt/android-ndk-r6/toolchains/arm-linux-androideabi-4.4.3/prebuilt/linux-x86/bin/arm-linux-androideabi-gcc  $(C_DEFINES) $(C_FLAGS) -DAL_ALEXT_PROTOTYPES -E /home/hagish/workspace/adt/love-native-android/jni/openal-soft-android/OpenAL32/alListener.c > CMakeFiles/openal.dir/OpenAL32/alListener.i
-
-CMakeFiles/openal.dir/OpenAL32/alListener.s: cmake_force
-	@$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Compiling C source to assembly CMakeFiles/openal.dir/OpenAL32/alListener.s"
-	/opt/android-ndk-r6/toolchains/arm-linux-androideabi-4.4.3/prebuilt/linux-x86/bin/arm-linux-androideabi-gcc  $(C_DEFINES) $(C_FLAGS) -DAL_ALEXT_PROTOTYPES -S /home/hagish/workspace/adt/love-native-android/jni/openal-soft-android/OpenAL32/alListener.c -o CMakeFiles/openal.dir/OpenAL32/alListener.s
-
-CMakeFiles/openal.dir/OpenAL32/alListener.o.requires:
-.PHONY : CMakeFiles/openal.dir/OpenAL32/alListener.o.requires
-
-CMakeFiles/openal.dir/OpenAL32/alListener.o.provides: CMakeFiles/openal.dir/OpenAL32/alListener.o.requires
-	$(MAKE) -f CMakeFiles/openal.dir/build.make CMakeFiles/openal.dir/OpenAL32/alListener.o.provides.build
-.PHONY : CMakeFiles/openal.dir/OpenAL32/alListener.o.provides
-
-CMakeFiles/openal.dir/OpenAL32/alListener.o.provides.build: CMakeFiles/openal.dir/OpenAL32/alListener.o
-.PHONY : CMakeFiles/openal.dir/OpenAL32/alListener.o.provides.build
-
-CMakeFiles/openal.dir/OpenAL32/alSource.o: CMakeFiles/openal.dir/flags.make
-CMakeFiles/openal.dir/OpenAL32/alSource.o: OpenAL32/alSource.c
-	$(CMAKE_COMMAND) -E cmake_progress_report /home/hagish/workspace/adt/love-native-android/jni/openal-soft-android/CMakeFiles $(CMAKE_PROGRESS_8)
-	@$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Building C object CMakeFiles/openal.dir/OpenAL32/alSource.o"
-	/opt/android-ndk-r6/toolchains/arm-linux-androideabi-4.4.3/prebuilt/linux-x86/bin/arm-linux-androideabi-gcc  $(C_DEFINES) $(C_FLAGS) -DAL_ALEXT_PROTOTYPES -o CMakeFiles/openal.dir/OpenAL32/alSource.o   -c /home/hagish/workspace/adt/love-native-android/jni/openal-soft-android/OpenAL32/alSource.c
-
-CMakeFiles/openal.dir/OpenAL32/alSource.i: cmake_force
-	@$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Preprocessing C source to CMakeFiles/openal.dir/OpenAL32/alSource.i"
-	/opt/android-ndk-r6/toolchains/arm-linux-androideabi-4.4.3/prebuilt/linux-x86/bin/arm-linux-androideabi-gcc  $(C_DEFINES) $(C_FLAGS) -DAL_ALEXT_PROTOTYPES -E /home/hagish/workspace/adt/love-native-android/jni/openal-soft-android/OpenAL32/alSource.c > CMakeFiles/openal.dir/OpenAL32/alSource.i
-
-CMakeFiles/openal.dir/OpenAL32/alSource.s: cmake_force
-	@$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Compiling C source to assembly CMakeFiles/openal.dir/OpenAL32/alSource.s"
-	/opt/android-ndk-r6/toolchains/arm-linux-androideabi-4.4.3/prebuilt/linux-x86/bin/arm-linux-androideabi-gcc  $(C_DEFINES) $(C_FLAGS) -DAL_ALEXT_PROTOTYPES -S /home/hagish/workspace/adt/love-native-android/jni/openal-soft-android/OpenAL32/alSource.c -o CMakeFiles/openal.dir/OpenAL32/alSource.s
-
-CMakeFiles/openal.dir/OpenAL32/alSource.o.requires:
-.PHONY : CMakeFiles/openal.dir/OpenAL32/alSource.o.requires
-
-CMakeFiles/openal.dir/OpenAL32/alSource.o.provides: CMakeFiles/openal.dir/OpenAL32/alSource.o.requires
-	$(MAKE) -f CMakeFiles/openal.dir/build.make CMakeFiles/openal.dir/OpenAL32/alSource.o.provides.build
-.PHONY : CMakeFiles/openal.dir/OpenAL32/alSource.o.provides
-
-CMakeFiles/openal.dir/OpenAL32/alSource.o.provides.build: CMakeFiles/openal.dir/OpenAL32/alSource.o
-.PHONY : CMakeFiles/openal.dir/OpenAL32/alSource.o.provides.build
-
-CMakeFiles/openal.dir/OpenAL32/alState.o: CMakeFiles/openal.dir/flags.make
-CMakeFiles/openal.dir/OpenAL32/alState.o: OpenAL32/alState.c
-	$(CMAKE_COMMAND) -E cmake_progress_report /home/hagish/workspace/adt/love-native-android/jni/openal-soft-android/CMakeFiles $(CMAKE_PROGRESS_9)
-	@$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Building C object CMakeFiles/openal.dir/OpenAL32/alState.o"
-	/opt/android-ndk-r6/toolchains/arm-linux-androideabi-4.4.3/prebuilt/linux-x86/bin/arm-linux-androideabi-gcc  $(C_DEFINES) $(C_FLAGS) -DAL_ALEXT_PROTOTYPES -o CMakeFiles/openal.dir/OpenAL32/alState.o   -c /home/hagish/workspace/adt/love-native-android/jni/openal-soft-android/OpenAL32/alState.c
-
-CMakeFiles/openal.dir/OpenAL32/alState.i: cmake_force
-	@$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Preprocessing C source to CMakeFiles/openal.dir/OpenAL32/alState.i"
-	/opt/android-ndk-r6/toolchains/arm-linux-androideabi-4.4.3/prebuilt/linux-x86/bin/arm-linux-androideabi-gcc  $(C_DEFINES) $(C_FLAGS) -DAL_ALEXT_PROTOTYPES -E /home/hagish/workspace/adt/love-native-android/jni/openal-soft-android/OpenAL32/alState.c > CMakeFiles/openal.dir/OpenAL32/alState.i
-
-CMakeFiles/openal.dir/OpenAL32/alState.s: cmake_force
-	@$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Compiling C source to assembly CMakeFiles/openal.dir/OpenAL32/alState.s"
-	/opt/android-ndk-r6/toolchains/arm-linux-androideabi-4.4.3/prebuilt/linux-x86/bin/arm-linux-androideabi-gcc  $(C_DEFINES) $(C_FLAGS) -DAL_ALEXT_PROTOTYPES -S /home/hagish/workspace/adt/love-native-android/jni/openal-soft-android/OpenAL32/alState.c -o CMakeFiles/openal.dir/OpenAL32/alState.s
-
-CMakeFiles/openal.dir/OpenAL32/alState.o.requires:
-.PHONY : CMakeFiles/openal.dir/OpenAL32/alState.o.requires
-
-CMakeFiles/openal.dir/OpenAL32/alState.o.provides: CMakeFiles/openal.dir/OpenAL32/alState.o.requires
-	$(MAKE) -f CMakeFiles/openal.dir/build.make CMakeFiles/openal.dir/OpenAL32/alState.o.provides.build
-.PHONY : CMakeFiles/openal.dir/OpenAL32/alState.o.provides
-
-CMakeFiles/openal.dir/OpenAL32/alState.o.provides.build: CMakeFiles/openal.dir/OpenAL32/alState.o
-.PHONY : CMakeFiles/openal.dir/OpenAL32/alState.o.provides.build
-
-CMakeFiles/openal.dir/OpenAL32/alThunk.o: CMakeFiles/openal.dir/flags.make
-CMakeFiles/openal.dir/OpenAL32/alThunk.o: OpenAL32/alThunk.c
-	$(CMAKE_COMMAND) -E cmake_progress_report /home/hagish/workspace/adt/love-native-android/jni/openal-soft-android/CMakeFiles $(CMAKE_PROGRESS_10)
-	@$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Building C object CMakeFiles/openal.dir/OpenAL32/alThunk.o"
-	/opt/android-ndk-r6/toolchains/arm-linux-androideabi-4.4.3/prebuilt/linux-x86/bin/arm-linux-androideabi-gcc  $(C_DEFINES) $(C_FLAGS) -DAL_ALEXT_PROTOTYPES -o CMakeFiles/openal.dir/OpenAL32/alThunk.o   -c /home/hagish/workspace/adt/love-native-android/jni/openal-soft-android/OpenAL32/alThunk.c
-
-CMakeFiles/openal.dir/OpenAL32/alThunk.i: cmake_force
-	@$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Preprocessing C source to CMakeFiles/openal.dir/OpenAL32/alThunk.i"
-	/opt/android-ndk-r6/toolchains/arm-linux-androideabi-4.4.3/prebuilt/linux-x86/bin/arm-linux-androideabi-gcc  $(C_DEFINES) $(C_FLAGS) -DAL_ALEXT_PROTOTYPES -E /home/hagish/workspace/adt/love-native-android/jni/openal-soft-android/OpenAL32/alThunk.c > CMakeFiles/openal.dir/OpenAL32/alThunk.i
-
-CMakeFiles/openal.dir/OpenAL32/alThunk.s: cmake_force
-	@$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Compiling C source to assembly CMakeFiles/openal.dir/OpenAL32/alThunk.s"
-	/opt/android-ndk-r6/toolchains/arm-linux-androideabi-4.4.3/prebuilt/linux-x86/bin/arm-linux-androideabi-gcc  $(C_DEFINES) $(C_FLAGS) -DAL_ALEXT_PROTOTYPES -S /home/hagish/workspace/adt/love-native-android/jni/openal-soft-android/OpenAL32/alThunk.c -o CMakeFiles/openal.dir/OpenAL32/alThunk.s
-
-CMakeFiles/openal.dir/OpenAL32/alThunk.o.requires:
-.PHONY : CMakeFiles/openal.dir/OpenAL32/alThunk.o.requires
-
-CMakeFiles/openal.dir/OpenAL32/alThunk.o.provides: CMakeFiles/openal.dir/OpenAL32/alThunk.o.requires
-	$(MAKE) -f CMakeFiles/openal.dir/build.make CMakeFiles/openal.dir/OpenAL32/alThunk.o.provides.build
-.PHONY : CMakeFiles/openal.dir/OpenAL32/alThunk.o.provides
-
-CMakeFiles/openal.dir/OpenAL32/alThunk.o.provides.build: CMakeFiles/openal.dir/OpenAL32/alThunk.o
-.PHONY : CMakeFiles/openal.dir/OpenAL32/alThunk.o.provides.build
-
-CMakeFiles/openal.dir/Alc/ALc.o: CMakeFiles/openal.dir/flags.make
-CMakeFiles/openal.dir/Alc/ALc.o: Alc/ALc.c
-	$(CMAKE_COMMAND) -E cmake_progress_report /home/hagish/workspace/adt/love-native-android/jni/openal-soft-android/CMakeFiles $(CMAKE_PROGRESS_11)
-	@$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Building C object CMakeFiles/openal.dir/Alc/ALc.o"
-	/opt/android-ndk-r6/toolchains/arm-linux-androideabi-4.4.3/prebuilt/linux-x86/bin/arm-linux-androideabi-gcc  $(C_DEFINES) $(C_FLAGS) -DAL_ALEXT_PROTOTYPES -o CMakeFiles/openal.dir/Alc/ALc.o   -c /home/hagish/workspace/adt/love-native-android/jni/openal-soft-android/Alc/ALc.c
-
-CMakeFiles/openal.dir/Alc/ALc.i: cmake_force
-	@$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Preprocessing C source to CMakeFiles/openal.dir/Alc/ALc.i"
-	/opt/android-ndk-r6/toolchains/arm-linux-androideabi-4.4.3/prebuilt/linux-x86/bin/arm-linux-androideabi-gcc  $(C_DEFINES) $(C_FLAGS) -DAL_ALEXT_PROTOTYPES -E /home/hagish/workspace/adt/love-native-android/jni/openal-soft-android/Alc/ALc.c > CMakeFiles/openal.dir/Alc/ALc.i
-
-CMakeFiles/openal.dir/Alc/ALc.s: cmake_force
-	@$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Compiling C source to assembly CMakeFiles/openal.dir/Alc/ALc.s"
-	/opt/android-ndk-r6/toolchains/arm-linux-androideabi-4.4.3/prebuilt/linux-x86/bin/arm-linux-androideabi-gcc  $(C_DEFINES) $(C_FLAGS) -DAL_ALEXT_PROTOTYPES -S /home/hagish/workspace/adt/love-native-android/jni/openal-soft-android/Alc/ALc.c -o CMakeFiles/openal.dir/Alc/ALc.s
-
-CMakeFiles/openal.dir/Alc/ALc.o.requires:
-.PHONY : CMakeFiles/openal.dir/Alc/ALc.o.requires
-
-CMakeFiles/openal.dir/Alc/ALc.o.provides: CMakeFiles/openal.dir/Alc/ALc.o.requires
-	$(MAKE) -f CMakeFiles/openal.dir/build.make CMakeFiles/openal.dir/Alc/ALc.o.provides.build
-.PHONY : CMakeFiles/openal.dir/Alc/ALc.o.provides
-
-CMakeFiles/openal.dir/Alc/ALc.o.provides.build: CMakeFiles/openal.dir/Alc/ALc.o
-.PHONY : CMakeFiles/openal.dir/Alc/ALc.o.provides.build
-
-CMakeFiles/openal.dir/Alc/ALu.o: CMakeFiles/openal.dir/flags.make
-CMakeFiles/openal.dir/Alc/ALu.o: Alc/ALu.c
-	$(CMAKE_COMMAND) -E cmake_progress_report /home/hagish/workspace/adt/love-native-android/jni/openal-soft-android/CMakeFiles $(CMAKE_PROGRESS_12)
-	@$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Building C object CMakeFiles/openal.dir/Alc/ALu.o"
-	/opt/android-ndk-r6/toolchains/arm-linux-androideabi-4.4.3/prebuilt/linux-x86/bin/arm-linux-androideabi-gcc  $(C_DEFINES) $(C_FLAGS) -DAL_ALEXT_PROTOTYPES -o CMakeFiles/openal.dir/Alc/ALu.o   -c /home/hagish/workspace/adt/love-native-android/jni/openal-soft-android/Alc/ALu.c
-
-CMakeFiles/openal.dir/Alc/ALu.i: cmake_force
-	@$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Preprocessing C source to CMakeFiles/openal.dir/Alc/ALu.i"
-	/opt/android-ndk-r6/toolchains/arm-linux-androideabi-4.4.3/prebuilt/linux-x86/bin/arm-linux-androideabi-gcc  $(C_DEFINES) $(C_FLAGS) -DAL_ALEXT_PROTOTYPES -E /home/hagish/workspace/adt/love-native-android/jni/openal-soft-android/Alc/ALu.c > CMakeFiles/openal.dir/Alc/ALu.i
-
-CMakeFiles/openal.dir/Alc/ALu.s: cmake_force
-	@$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Compiling C source to assembly CMakeFiles/openal.dir/Alc/ALu.s"
-	/opt/android-ndk-r6/toolchains/arm-linux-androideabi-4.4.3/prebuilt/linux-x86/bin/arm-linux-androideabi-gcc  $(C_DEFINES) $(C_FLAGS) -DAL_ALEXT_PROTOTYPES -S /home/hagish/workspace/adt/love-native-android/jni/openal-soft-android/Alc/ALu.c -o CMakeFiles/openal.dir/Alc/ALu.s
-
-CMakeFiles/openal.dir/Alc/ALu.o.requires:
-.PHONY : CMakeFiles/openal.dir/Alc/ALu.o.requires
-
-CMakeFiles/openal.dir/Alc/ALu.o.provides: CMakeFiles/openal.dir/Alc/ALu.o.requires
-	$(MAKE) -f CMakeFiles/openal.dir/build.make CMakeFiles/openal.dir/Alc/ALu.o.provides.build
-.PHONY : CMakeFiles/openal.dir/Alc/ALu.o.provides
-
-CMakeFiles/openal.dir/Alc/ALu.o.provides.build: CMakeFiles/openal.dir/Alc/ALu.o
-.PHONY : CMakeFiles/openal.dir/Alc/ALu.o.provides.build
-
-CMakeFiles/openal.dir/Alc/alcConfig.o: CMakeFiles/openal.dir/flags.make
-CMakeFiles/openal.dir/Alc/alcConfig.o: Alc/alcConfig.c
-	$(CMAKE_COMMAND) -E cmake_progress_report /home/hagish/workspace/adt/love-native-android/jni/openal-soft-android/CMakeFiles $(CMAKE_PROGRESS_13)
-	@$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Building C object CMakeFiles/openal.dir/Alc/alcConfig.o"
-	/opt/android-ndk-r6/toolchains/arm-linux-androideabi-4.4.3/prebuilt/linux-x86/bin/arm-linux-androideabi-gcc  $(C_DEFINES) $(C_FLAGS) -DAL_ALEXT_PROTOTYPES -o CMakeFiles/openal.dir/Alc/alcConfig.o   -c /home/hagish/workspace/adt/love-native-android/jni/openal-soft-android/Alc/alcConfig.c
-
-CMakeFiles/openal.dir/Alc/alcConfig.i: cmake_force
-	@$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Preprocessing C source to CMakeFiles/openal.dir/Alc/alcConfig.i"
-	/opt/android-ndk-r6/toolchains/arm-linux-androideabi-4.4.3/prebuilt/linux-x86/bin/arm-linux-androideabi-gcc  $(C_DEFINES) $(C_FLAGS) -DAL_ALEXT_PROTOTYPES -E /home/hagish/workspace/adt/love-native-android/jni/openal-soft-android/Alc/alcConfig.c > CMakeFiles/openal.dir/Alc/alcConfig.i
-
-CMakeFiles/openal.dir/Alc/alcConfig.s: cmake_force
-	@$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Compiling C source to assembly CMakeFiles/openal.dir/Alc/alcConfig.s"
-	/opt/android-ndk-r6/toolchains/arm-linux-androideabi-4.4.3/prebuilt/linux-x86/bin/arm-linux-androideabi-gcc  $(C_DEFINES) $(C_FLAGS) -DAL_ALEXT_PROTOTYPES -S /home/hagish/workspace/adt/love-native-android/jni/openal-soft-android/Alc/alcConfig.c -o CMakeFiles/openal.dir/Alc/alcConfig.s
-
-CMakeFiles/openal.dir/Alc/alcConfig.o.requires:
-.PHONY : CMakeFiles/openal.dir/Alc/alcConfig.o.requires
-
-CMakeFiles/openal.dir/Alc/alcConfig.o.provides: CMakeFiles/openal.dir/Alc/alcConfig.o.requires
-	$(MAKE) -f CMakeFiles/openal.dir/build.make CMakeFiles/openal.dir/Alc/alcConfig.o.provides.build
-.PHONY : CMakeFiles/openal.dir/Alc/alcConfig.o.provides
-
-CMakeFiles/openal.dir/Alc/alcConfig.o.provides.build: CMakeFiles/openal.dir/Alc/alcConfig.o
-.PHONY : CMakeFiles/openal.dir/Alc/alcConfig.o.provides.build
-
-CMakeFiles/openal.dir/Alc/alcDedicated.o: CMakeFiles/openal.dir/flags.make
-CMakeFiles/openal.dir/Alc/alcDedicated.o: Alc/alcDedicated.c
-	$(CMAKE_COMMAND) -E cmake_progress_report /home/hagish/workspace/adt/love-native-android/jni/openal-soft-android/CMakeFiles $(CMAKE_PROGRESS_14)
-	@$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Building C object CMakeFiles/openal.dir/Alc/alcDedicated.o"
-	/opt/android-ndk-r6/toolchains/arm-linux-androideabi-4.4.3/prebuilt/linux-x86/bin/arm-linux-androideabi-gcc  $(C_DEFINES) $(C_FLAGS) -DAL_ALEXT_PROTOTYPES -o CMakeFiles/openal.dir/Alc/alcDedicated.o   -c /home/hagish/workspace/adt/love-native-android/jni/openal-soft-android/Alc/alcDedicated.c
-
-CMakeFiles/openal.dir/Alc/alcDedicated.i: cmake_force
-	@$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Preprocessing C source to CMakeFiles/openal.dir/Alc/alcDedicated.i"
-	/opt/android-ndk-r6/toolchains/arm-linux-androideabi-4.4.3/prebuilt/linux-x86/bin/arm-linux-androideabi-gcc  $(C_DEFINES) $(C_FLAGS) -DAL_ALEXT_PROTOTYPES -E /home/hagish/workspace/adt/love-native-android/jni/openal-soft-android/Alc/alcDedicated.c > CMakeFiles/openal.dir/Alc/alcDedicated.i
-
-CMakeFiles/openal.dir/Alc/alcDedicated.s: cmake_force
-	@$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Compiling C source to assembly CMakeFiles/openal.dir/Alc/alcDedicated.s"
-	/opt/android-ndk-r6/toolchains/arm-linux-androideabi-4.4.3/prebuilt/linux-x86/bin/arm-linux-androideabi-gcc  $(C_DEFINES) $(C_FLAGS) -DAL_ALEXT_PROTOTYPES -S /home/hagish/workspace/adt/love-native-android/jni/openal-soft-android/Alc/alcDedicated.c -o CMakeFiles/openal.dir/Alc/alcDedicated.s
-
-CMakeFiles/openal.dir/Alc/alcDedicated.o.requires:
-.PHONY : CMakeFiles/openal.dir/Alc/alcDedicated.o.requires
-
-CMakeFiles/openal.dir/Alc/alcDedicated.o.provides: CMakeFiles/openal.dir/Alc/alcDedicated.o.requires
-	$(MAKE) -f CMakeFiles/openal.dir/build.make CMakeFiles/openal.dir/Alc/alcDedicated.o.provides.build
-.PHONY : CMakeFiles/openal.dir/Alc/alcDedicated.o.provides
-
-CMakeFiles/openal.dir/Alc/alcDedicated.o.provides.build: CMakeFiles/openal.dir/Alc/alcDedicated.o
-.PHONY : CMakeFiles/openal.dir/Alc/alcDedicated.o.provides.build
-
-CMakeFiles/openal.dir/Alc/alcEcho.o: CMakeFiles/openal.dir/flags.make
-CMakeFiles/openal.dir/Alc/alcEcho.o: Alc/alcEcho.c
-	$(CMAKE_COMMAND) -E cmake_progress_report /home/hagish/workspace/adt/love-native-android/jni/openal-soft-android/CMakeFiles $(CMAKE_PROGRESS_15)
-	@$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Building C object CMakeFiles/openal.dir/Alc/alcEcho.o"
-	/opt/android-ndk-r6/toolchains/arm-linux-androideabi-4.4.3/prebuilt/linux-x86/bin/arm-linux-androideabi-gcc  $(C_DEFINES) $(C_FLAGS) -DAL_ALEXT_PROTOTYPES -o CMakeFiles/openal.dir/Alc/alcEcho.o   -c /home/hagish/workspace/adt/love-native-android/jni/openal-soft-android/Alc/alcEcho.c
-
-CMakeFiles/openal.dir/Alc/alcEcho.i: cmake_force
-	@$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Preprocessing C source to CMakeFiles/openal.dir/Alc/alcEcho.i"
-	/opt/android-ndk-r6/toolchains/arm-linux-androideabi-4.4.3/prebuilt/linux-x86/bin/arm-linux-androideabi-gcc  $(C_DEFINES) $(C_FLAGS) -DAL_ALEXT_PROTOTYPES -E /home/hagish/workspace/adt/love-native-android/jni/openal-soft-android/Alc/alcEcho.c > CMakeFiles/openal.dir/Alc/alcEcho.i
-
-CMakeFiles/openal.dir/Alc/alcEcho.s: cmake_force
-	@$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Compiling C source to assembly CMakeFiles/openal.dir/Alc/alcEcho.s"
-	/opt/android-ndk-r6/toolchains/arm-linux-androideabi-4.4.3/prebuilt/linux-x86/bin/arm-linux-androideabi-gcc  $(C_DEFINES) $(C_FLAGS) -DAL_ALEXT_PROTOTYPES -S /home/hagish/workspace/adt/love-native-android/jni/openal-soft-android/Alc/alcEcho.c -o CMakeFiles/openal.dir/Alc/alcEcho.s
-
-CMakeFiles/openal.dir/Alc/alcEcho.o.requires:
-.PHONY : CMakeFiles/openal.dir/Alc/alcEcho.o.requires
-
-CMakeFiles/openal.dir/Alc/alcEcho.o.provides: CMakeFiles/openal.dir/Alc/alcEcho.o.requires
-	$(MAKE) -f CMakeFiles/openal.dir/build.make CMakeFiles/openal.dir/Alc/alcEcho.o.provides.build
-.PHONY : CMakeFiles/openal.dir/Alc/alcEcho.o.provides
-
-CMakeFiles/openal.dir/Alc/alcEcho.o.provides.build: CMakeFiles/openal.dir/Alc/alcEcho.o
-.PHONY : CMakeFiles/openal.dir/Alc/alcEcho.o.provides.build
-
-CMakeFiles/openal.dir/Alc/alcModulator.o: CMakeFiles/openal.dir/flags.make
-CMakeFiles/openal.dir/Alc/alcModulator.o: Alc/alcModulator.c
-	$(CMAKE_COMMAND) -E cmake_progress_report /home/hagish/workspace/adt/love-native-android/jni/openal-soft-android/CMakeFiles $(CMAKE_PROGRESS_16)
-	@$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Building C object CMakeFiles/openal.dir/Alc/alcModulator.o"
-	/opt/android-ndk-r6/toolchains/arm-linux-androideabi-4.4.3/prebuilt/linux-x86/bin/arm-linux-androideabi-gcc  $(C_DEFINES) $(C_FLAGS) -DAL_ALEXT_PROTOTYPES -o CMakeFiles/openal.dir/Alc/alcModulator.o   -c /home/hagish/workspace/adt/love-native-android/jni/openal-soft-android/Alc/alcModulator.c
-
-CMakeFiles/openal.dir/Alc/alcModulator.i: cmake_force
-	@$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Preprocessing C source to CMakeFiles/openal.dir/Alc/alcModulator.i"
-	/opt/android-ndk-r6/toolchains/arm-linux-androideabi-4.4.3/prebuilt/linux-x86/bin/arm-linux-androideabi-gcc  $(C_DEFINES) $(C_FLAGS) -DAL_ALEXT_PROTOTYPES -E /home/hagish/workspace/adt/love-native-android/jni/openal-soft-android/Alc/alcModulator.c > CMakeFiles/openal.dir/Alc/alcModulator.i
-
-CMakeFiles/openal.dir/Alc/alcModulator.s: cmake_force
-	@$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Compiling C source to assembly CMakeFiles/openal.dir/Alc/alcModulator.s"
-	/opt/android-ndk-r6/toolchains/arm-linux-androideabi-4.4.3/prebuilt/linux-x86/bin/arm-linux-androideabi-gcc  $(C_DEFINES) $(C_FLAGS) -DAL_ALEXT_PROTOTYPES -S /home/hagish/workspace/adt/love-native-android/jni/openal-soft-android/Alc/alcModulator.c -o CMakeFiles/openal.dir/Alc/alcModulator.s
-
-CMakeFiles/openal.dir/Alc/alcModulator.o.requires:
-.PHONY : CMakeFiles/openal.dir/Alc/alcModulator.o.requires
-
-CMakeFiles/openal.dir/Alc/alcModulator.o.provides: CMakeFiles/openal.dir/Alc/alcModulator.o.requires
-	$(MAKE) -f CMakeFiles/openal.dir/build.make CMakeFiles/openal.dir/Alc/alcModulator.o.provides.build
-.PHONY : CMakeFiles/openal.dir/Alc/alcModulator.o.provides
-
-CMakeFiles/openal.dir/Alc/alcModulator.o.provides.build: CMakeFiles/openal.dir/Alc/alcModulator.o
-.PHONY : CMakeFiles/openal.dir/Alc/alcModulator.o.provides.build
-
-CMakeFiles/openal.dir/Alc/alcReverb.o: CMakeFiles/openal.dir/flags.make
-CMakeFiles/openal.dir/Alc/alcReverb.o: Alc/alcReverb.c
-	$(CMAKE_COMMAND) -E cmake_progress_report /home/hagish/workspace/adt/love-native-android/jni/openal-soft-android/CMakeFiles $(CMAKE_PROGRESS_17)
-	@$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Building C object CMakeFiles/openal.dir/Alc/alcReverb.o"
-	/opt/android-ndk-r6/toolchains/arm-linux-androideabi-4.4.3/prebuilt/linux-x86/bin/arm-linux-androideabi-gcc  $(C_DEFINES) $(C_FLAGS) -DAL_ALEXT_PROTOTYPES -o CMakeFiles/openal.dir/Alc/alcReverb.o   -c /home/hagish/workspace/adt/love-native-android/jni/openal-soft-android/Alc/alcReverb.c
-
-CMakeFiles/openal.dir/Alc/alcReverb.i: cmake_force
-	@$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Preprocessing C source to CMakeFiles/openal.dir/Alc/alcReverb.i"
-	/opt/android-ndk-r6/toolchains/arm-linux-androideabi-4.4.3/prebuilt/linux-x86/bin/arm-linux-androideabi-gcc  $(C_DEFINES) $(C_FLAGS) -DAL_ALEXT_PROTOTYPES -E /home/hagish/workspace/adt/love-native-android/jni/openal-soft-android/Alc/alcReverb.c > CMakeFiles/openal.dir/Alc/alcReverb.i
-
-CMakeFiles/openal.dir/Alc/alcReverb.s: cmake_force
-	@$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Compiling C source to assembly CMakeFiles/openal.dir/Alc/alcReverb.s"
-	/opt/android-ndk-r6/toolchains/arm-linux-androideabi-4.4.3/prebuilt/linux-x86/bin/arm-linux-androideabi-gcc  $(C_DEFINES) $(C_FLAGS) -DAL_ALEXT_PROTOTYPES -S /home/hagish/workspace/adt/love-native-android/jni/openal-soft-android/Alc/alcReverb.c -o CMakeFiles/openal.dir/Alc/alcReverb.s
-
-CMakeFiles/openal.dir/Alc/alcReverb.o.requires:
-.PHONY : CMakeFiles/openal.dir/Alc/alcReverb.o.requires
-
-CMakeFiles/openal.dir/Alc/alcReverb.o.provides: CMakeFiles/openal.dir/Alc/alcReverb.o.requires
-	$(MAKE) -f CMakeFiles/openal.dir/build.make CMakeFiles/openal.dir/Alc/alcReverb.o.provides.build
-.PHONY : CMakeFiles/openal.dir/Alc/alcReverb.o.provides
-
-CMakeFiles/openal.dir/Alc/alcReverb.o.provides.build: CMakeFiles/openal.dir/Alc/alcReverb.o
-.PHONY : CMakeFiles/openal.dir/Alc/alcReverb.o.provides.build
-
-CMakeFiles/openal.dir/Alc/alcRing.o: CMakeFiles/openal.dir/flags.make
-CMakeFiles/openal.dir/Alc/alcRing.o: Alc/alcRing.c
-	$(CMAKE_COMMAND) -E cmake_progress_report /home/hagish/workspace/adt/love-native-android/jni/openal-soft-android/CMakeFiles $(CMAKE_PROGRESS_18)
-	@$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Building C object CMakeFiles/openal.dir/Alc/alcRing.o"
-	/opt/android-ndk-r6/toolchains/arm-linux-androideabi-4.4.3/prebuilt/linux-x86/bin/arm-linux-androideabi-gcc  $(C_DEFINES) $(C_FLAGS) -DAL_ALEXT_PROTOTYPES -o CMakeFiles/openal.dir/Alc/alcRing.o   -c /home/hagish/workspace/adt/love-native-android/jni/openal-soft-android/Alc/alcRing.c
-
-CMakeFiles/openal.dir/Alc/alcRing.i: cmake_force
-	@$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Preprocessing C source to CMakeFiles/openal.dir/Alc/alcRing.i"
-	/opt/android-ndk-r6/toolchains/arm-linux-androideabi-4.4.3/prebuilt/linux-x86/bin/arm-linux-androideabi-gcc  $(C_DEFINES) $(C_FLAGS) -DAL_ALEXT_PROTOTYPES -E /home/hagish/workspace/adt/love-native-android/jni/openal-soft-android/Alc/alcRing.c > CMakeFiles/openal.dir/Alc/alcRing.i
-
-CMakeFiles/openal.dir/Alc/alcRing.s: cmake_force
-	@$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Compiling C source to assembly CMakeFiles/openal.dir/Alc/alcRing.s"
-	/opt/android-ndk-r6/toolchains/arm-linux-androideabi-4.4.3/prebuilt/linux-x86/bin/arm-linux-androideabi-gcc  $(C_DEFINES) $(C_FLAGS) -DAL_ALEXT_PROTOTYPES -S /home/hagish/workspace/adt/love-native-android/jni/openal-soft-android/Alc/alcRing.c -o CMakeFiles/openal.dir/Alc/alcRing.s
-
-CMakeFiles/openal.dir/Alc/alcRing.o.requires:
-.PHONY : CMakeFiles/openal.dir/Alc/alcRing.o.requires
-
-CMakeFiles/openal.dir/Alc/alcRing.o.provides: CMakeFiles/openal.dir/Alc/alcRing.o.requires
-	$(MAKE) -f CMakeFiles/openal.dir/build.make CMakeFiles/openal.dir/Alc/alcRing.o.provides.build
-.PHONY : CMakeFiles/openal.dir/Alc/alcRing.o.provides
-
-CMakeFiles/openal.dir/Alc/alcRing.o.provides.build: CMakeFiles/openal.dir/Alc/alcRing.o
-.PHONY : CMakeFiles/openal.dir/Alc/alcRing.o.provides.build
-
-CMakeFiles/openal.dir/Alc/alcThread.o: CMakeFiles/openal.dir/flags.make
-CMakeFiles/openal.dir/Alc/alcThread.o: Alc/alcThread.c
-	$(CMAKE_COMMAND) -E cmake_progress_report /home/hagish/workspace/adt/love-native-android/jni/openal-soft-android/CMakeFiles $(CMAKE_PROGRESS_19)
-	@$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Building C object CMakeFiles/openal.dir/Alc/alcThread.o"
-	/opt/android-ndk-r6/toolchains/arm-linux-androideabi-4.4.3/prebuilt/linux-x86/bin/arm-linux-androideabi-gcc  $(C_DEFINES) $(C_FLAGS) -DAL_ALEXT_PROTOTYPES -o CMakeFiles/openal.dir/Alc/alcThread.o   -c /home/hagish/workspace/adt/love-native-android/jni/openal-soft-android/Alc/alcThread.c
-
-CMakeFiles/openal.dir/Alc/alcThread.i: cmake_force
-	@$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Preprocessing C source to CMakeFiles/openal.dir/Alc/alcThread.i"
-	/opt/android-ndk-r6/toolchains/arm-linux-androideabi-4.4.3/prebuilt/linux-x86/bin/arm-linux-androideabi-gcc  $(C_DEFINES) $(C_FLAGS) -DAL_ALEXT_PROTOTYPES -E /home/hagish/workspace/adt/love-native-android/jni/openal-soft-android/Alc/alcThread.c > CMakeFiles/openal.dir/Alc/alcThread.i
-
-CMakeFiles/openal.dir/Alc/alcThread.s: cmake_force
-	@$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Compiling C source to assembly CMakeFiles/openal.dir/Alc/alcThread.s"
-	/opt/android-ndk-r6/toolchains/arm-linux-androideabi-4.4.3/prebuilt/linux-x86/bin/arm-linux-androideabi-gcc  $(C_DEFINES) $(C_FLAGS) -DAL_ALEXT_PROTOTYPES -S /home/hagish/workspace/adt/love-native-android/jni/openal-soft-android/Alc/alcThread.c -o CMakeFiles/openal.dir/Alc/alcThread.s
-
-CMakeFiles/openal.dir/Alc/alcThread.o.requires:
-.PHONY : CMakeFiles/openal.dir/Alc/alcThread.o.requires
-
-CMakeFiles/openal.dir/Alc/alcThread.o.provides: CMakeFiles/openal.dir/Alc/alcThread.o.requires
-	$(MAKE) -f CMakeFiles/openal.dir/build.make CMakeFiles/openal.dir/Alc/alcThread.o.provides.build
-.PHONY : CMakeFiles/openal.dir/Alc/alcThread.o.provides
-
-CMakeFiles/openal.dir/Alc/alcThread.o.provides.build: CMakeFiles/openal.dir/Alc/alcThread.o
-.PHONY : CMakeFiles/openal.dir/Alc/alcThread.o.provides.build
-
-CMakeFiles/openal.dir/Alc/bs2b.o: CMakeFiles/openal.dir/flags.make
-CMakeFiles/openal.dir/Alc/bs2b.o: Alc/bs2b.c
-	$(CMAKE_COMMAND) -E cmake_progress_report /home/hagish/workspace/adt/love-native-android/jni/openal-soft-android/CMakeFiles $(CMAKE_PROGRESS_20)
-	@$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Building C object CMakeFiles/openal.dir/Alc/bs2b.o"
-	/opt/android-ndk-r6/toolchains/arm-linux-androideabi-4.4.3/prebuilt/linux-x86/bin/arm-linux-androideabi-gcc  $(C_DEFINES) $(C_FLAGS) -DAL_ALEXT_PROTOTYPES -o CMakeFiles/openal.dir/Alc/bs2b.o   -c /home/hagish/workspace/adt/love-native-android/jni/openal-soft-android/Alc/bs2b.c
-
-CMakeFiles/openal.dir/Alc/bs2b.i: cmake_force
-	@$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Preprocessing C source to CMakeFiles/openal.dir/Alc/bs2b.i"
-	/opt/android-ndk-r6/toolchains/arm-linux-androideabi-4.4.3/prebuilt/linux-x86/bin/arm-linux-androideabi-gcc  $(C_DEFINES) $(C_FLAGS) -DAL_ALEXT_PROTOTYPES -E /home/hagish/workspace/adt/love-native-android/jni/openal-soft-android/Alc/bs2b.c > CMakeFiles/openal.dir/Alc/bs2b.i
-
-CMakeFiles/openal.dir/Alc/bs2b.s: cmake_force
-	@$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Compiling C source to assembly CMakeFiles/openal.dir/Alc/bs2b.s"
-	/opt/android-ndk-r6/toolchains/arm-linux-androideabi-4.4.3/prebuilt/linux-x86/bin/arm-linux-androideabi-gcc  $(C_DEFINES) $(C_FLAGS) -DAL_ALEXT_PROTOTYPES -S /home/hagish/workspace/adt/love-native-android/jni/openal-soft-android/Alc/bs2b.c -o CMakeFiles/openal.dir/Alc/bs2b.s
-
-CMakeFiles/openal.dir/Alc/bs2b.o.requires:
-.PHONY : CMakeFiles/openal.dir/Alc/bs2b.o.requires
-
-CMakeFiles/openal.dir/Alc/bs2b.o.provides: CMakeFiles/openal.dir/Alc/bs2b.o.requires
-	$(MAKE) -f CMakeFiles/openal.dir/build.make CMakeFiles/openal.dir/Alc/bs2b.o.provides.build
-.PHONY : CMakeFiles/openal.dir/Alc/bs2b.o.provides
-
-CMakeFiles/openal.dir/Alc/bs2b.o.provides.build: CMakeFiles/openal.dir/Alc/bs2b.o
-.PHONY : CMakeFiles/openal.dir/Alc/bs2b.o.provides.build
-
-CMakeFiles/openal.dir/Alc/helpers.o: CMakeFiles/openal.dir/flags.make
-CMakeFiles/openal.dir/Alc/helpers.o: Alc/helpers.c
-	$(CMAKE_COMMAND) -E cmake_progress_report /home/hagish/workspace/adt/love-native-android/jni/openal-soft-android/CMakeFiles $(CMAKE_PROGRESS_21)
-	@$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Building C object CMakeFiles/openal.dir/Alc/helpers.o"
-	/opt/android-ndk-r6/toolchains/arm-linux-androideabi-4.4.3/prebuilt/linux-x86/bin/arm-linux-androideabi-gcc  $(C_DEFINES) $(C_FLAGS) -DAL_ALEXT_PROTOTYPES -o CMakeFiles/openal.dir/Alc/helpers.o   -c /home/hagish/workspace/adt/love-native-android/jni/openal-soft-android/Alc/helpers.c
-
-CMakeFiles/openal.dir/Alc/helpers.i: cmake_force
-	@$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Preprocessing C source to CMakeFiles/openal.dir/Alc/helpers.i"
-	/opt/android-ndk-r6/toolchains/arm-linux-androideabi-4.4.3/prebuilt/linux-x86/bin/arm-linux-androideabi-gcc  $(C_DEFINES) $(C_FLAGS) -DAL_ALEXT_PROTOTYPES -E /home/hagish/workspace/adt/love-native-android/jni/openal-soft-android/Alc/helpers.c > CMakeFiles/openal.dir/Alc/helpers.i
-
-CMakeFiles/openal.dir/Alc/helpers.s: cmake_force
-	@$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Compiling C source to assembly CMakeFiles/openal.dir/Alc/helpers.s"
-	/opt/android-ndk-r6/toolchains/arm-linux-androideabi-4.4.3/prebuilt/linux-x86/bin/arm-linux-androideabi-gcc  $(C_DEFINES) $(C_FLAGS) -DAL_ALEXT_PROTOTYPES -S /home/hagish/workspace/adt/love-native-android/jni/openal-soft-android/Alc/helpers.c -o CMakeFiles/openal.dir/Alc/helpers.s
-
-CMakeFiles/openal.dir/Alc/helpers.o.requires:
-.PHONY : CMakeFiles/openal.dir/Alc/helpers.o.requires
-
-CMakeFiles/openal.dir/Alc/helpers.o.provides: CMakeFiles/openal.dir/Alc/helpers.o.requires
-	$(MAKE) -f CMakeFiles/openal.dir/build.make CMakeFiles/openal.dir/Alc/helpers.o.provides.build
-.PHONY : CMakeFiles/openal.dir/Alc/helpers.o.provides
-
-CMakeFiles/openal.dir/Alc/helpers.o.provides.build: CMakeFiles/openal.dir/Alc/helpers.o
-.PHONY : CMakeFiles/openal.dir/Alc/helpers.o.provides.build
-
-CMakeFiles/openal.dir/Alc/hrtf.o: CMakeFiles/openal.dir/flags.make
-CMakeFiles/openal.dir/Alc/hrtf.o: Alc/hrtf.c
-	$(CMAKE_COMMAND) -E cmake_progress_report /home/hagish/workspace/adt/love-native-android/jni/openal-soft-android/CMakeFiles $(CMAKE_PROGRESS_22)
-	@$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Building C object CMakeFiles/openal.dir/Alc/hrtf.o"
-	/opt/android-ndk-r6/toolchains/arm-linux-androideabi-4.4.3/prebuilt/linux-x86/bin/arm-linux-androideabi-gcc  $(C_DEFINES) $(C_FLAGS) -DAL_ALEXT_PROTOTYPES -o CMakeFiles/openal.dir/Alc/hrtf.o   -c /home/hagish/workspace/adt/love-native-android/jni/openal-soft-android/Alc/hrtf.c
-
-CMakeFiles/openal.dir/Alc/hrtf.i: cmake_force
-	@$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Preprocessing C source to CMakeFiles/openal.dir/Alc/hrtf.i"
-	/opt/android-ndk-r6/toolchains/arm-linux-androideabi-4.4.3/prebuilt/linux-x86/bin/arm-linux-androideabi-gcc  $(C_DEFINES) $(C_FLAGS) -DAL_ALEXT_PROTOTYPES -E /home/hagish/workspace/adt/love-native-android/jni/openal-soft-android/Alc/hrtf.c > CMakeFiles/openal.dir/Alc/hrtf.i
-
-CMakeFiles/openal.dir/Alc/hrtf.s: cmake_force
-	@$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Compiling C source to assembly CMakeFiles/openal.dir/Alc/hrtf.s"
-	/opt/android-ndk-r6/toolchains/arm-linux-androideabi-4.4.3/prebuilt/linux-x86/bin/arm-linux-androideabi-gcc  $(C_DEFINES) $(C_FLAGS) -DAL_ALEXT_PROTOTYPES -S /home/hagish/workspace/adt/love-native-android/jni/openal-soft-android/Alc/hrtf.c -o CMakeFiles/openal.dir/Alc/hrtf.s
-
-CMakeFiles/openal.dir/Alc/hrtf.o.requires:
-.PHONY : CMakeFiles/openal.dir/Alc/hrtf.o.requires
-
-CMakeFiles/openal.dir/Alc/hrtf.o.provides: CMakeFiles/openal.dir/Alc/hrtf.o.requires
-	$(MAKE) -f CMakeFiles/openal.dir/build.make CMakeFiles/openal.dir/Alc/hrtf.o.provides.build
-.PHONY : CMakeFiles/openal.dir/Alc/hrtf.o.provides
-
-CMakeFiles/openal.dir/Alc/hrtf.o.provides.build: CMakeFiles/openal.dir/Alc/hrtf.o
-.PHONY : CMakeFiles/openal.dir/Alc/hrtf.o.provides.build
-
-CMakeFiles/openal.dir/Alc/mixer.o: CMakeFiles/openal.dir/flags.make
-CMakeFiles/openal.dir/Alc/mixer.o: Alc/mixer.c
-	$(CMAKE_COMMAND) -E cmake_progress_report /home/hagish/workspace/adt/love-native-android/jni/openal-soft-android/CMakeFiles $(CMAKE_PROGRESS_23)
-	@$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Building C object CMakeFiles/openal.dir/Alc/mixer.o"
-	/opt/android-ndk-r6/toolchains/arm-linux-androideabi-4.4.3/prebuilt/linux-x86/bin/arm-linux-androideabi-gcc  $(C_DEFINES) $(C_FLAGS) -DAL_ALEXT_PROTOTYPES -o CMakeFiles/openal.dir/Alc/mixer.o   -c /home/hagish/workspace/adt/love-native-android/jni/openal-soft-android/Alc/mixer.c
-
-CMakeFiles/openal.dir/Alc/mixer.i: cmake_force
-	@$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Preprocessing C source to CMakeFiles/openal.dir/Alc/mixer.i"
-	/opt/android-ndk-r6/toolchains/arm-linux-androideabi-4.4.3/prebuilt/linux-x86/bin/arm-linux-androideabi-gcc  $(C_DEFINES) $(C_FLAGS) -DAL_ALEXT_PROTOTYPES -E /home/hagish/workspace/adt/love-native-android/jni/openal-soft-android/Alc/mixer.c > CMakeFiles/openal.dir/Alc/mixer.i
-
-CMakeFiles/openal.dir/Alc/mixer.s: cmake_force
-	@$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Compiling C source to assembly CMakeFiles/openal.dir/Alc/mixer.s"
-	/opt/android-ndk-r6/toolchains/arm-linux-androideabi-4.4.3/prebuilt/linux-x86/bin/arm-linux-androideabi-gcc  $(C_DEFINES) $(C_FLAGS) -DAL_ALEXT_PROTOTYPES -S /home/hagish/workspace/adt/love-native-android/jni/openal-soft-android/Alc/mixer.c -o CMakeFiles/openal.dir/Alc/mixer.s
-
-CMakeFiles/openal.dir/Alc/mixer.o.requires:
-.PHONY : CMakeFiles/openal.dir/Alc/mixer.o.requires
-
-CMakeFiles/openal.dir/Alc/mixer.o.provides: CMakeFiles/openal.dir/Alc/mixer.o.requires
-	$(MAKE) -f CMakeFiles/openal.dir/build.make CMakeFiles/openal.dir/Alc/mixer.o.provides.build
-.PHONY : CMakeFiles/openal.dir/Alc/mixer.o.provides
-
-CMakeFiles/openal.dir/Alc/mixer.o.provides.build: CMakeFiles/openal.dir/Alc/mixer.o
-.PHONY : CMakeFiles/openal.dir/Alc/mixer.o.provides.build
-
-CMakeFiles/openal.dir/Alc/panning.o: CMakeFiles/openal.dir/flags.make
-CMakeFiles/openal.dir/Alc/panning.o: Alc/panning.c
-	$(CMAKE_COMMAND) -E cmake_progress_report /home/hagish/workspace/adt/love-native-android/jni/openal-soft-android/CMakeFiles $(CMAKE_PROGRESS_24)
-	@$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Building C object CMakeFiles/openal.dir/Alc/panning.o"
-	/opt/android-ndk-r6/toolchains/arm-linux-androideabi-4.4.3/prebuilt/linux-x86/bin/arm-linux-androideabi-gcc  $(C_DEFINES) $(C_FLAGS) -DAL_ALEXT_PROTOTYPES -o CMakeFiles/openal.dir/Alc/panning.o   -c /home/hagish/workspace/adt/love-native-android/jni/openal-soft-android/Alc/panning.c
-
-CMakeFiles/openal.dir/Alc/panning.i: cmake_force
-	@$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Preprocessing C source to CMakeFiles/openal.dir/Alc/panning.i"
-	/opt/android-ndk-r6/toolchains/arm-linux-androideabi-4.4.3/prebuilt/linux-x86/bin/arm-linux-androideabi-gcc  $(C_DEFINES) $(C_FLAGS) -DAL_ALEXT_PROTOTYPES -E /home/hagish/workspace/adt/love-native-android/jni/openal-soft-android/Alc/panning.c > CMakeFiles/openal.dir/Alc/panning.i
-
-CMakeFiles/openal.dir/Alc/panning.s: cmake_force
-	@$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Compiling C source to assembly CMakeFiles/openal.dir/Alc/panning.s"
-	/opt/android-ndk-r6/toolchains/arm-linux-androideabi-4.4.3/prebuilt/linux-x86/bin/arm-linux-androideabi-gcc  $(C_DEFINES) $(C_FLAGS) -DAL_ALEXT_PROTOTYPES -S /home/hagish/workspace/adt/love-native-android/jni/openal-soft-android/Alc/panning.c -o CMakeFiles/openal.dir/Alc/panning.s
-
-CMakeFiles/openal.dir/Alc/panning.o.requires:
-.PHONY : CMakeFiles/openal.dir/Alc/panning.o.requires
-
-CMakeFiles/openal.dir/Alc/panning.o.provides: CMakeFiles/openal.dir/Alc/panning.o.requires
-	$(MAKE) -f CMakeFiles/openal.dir/build.make CMakeFiles/openal.dir/Alc/panning.o.provides.build
-.PHONY : CMakeFiles/openal.dir/Alc/panning.o.provides
-
-CMakeFiles/openal.dir/Alc/panning.o.provides.build: CMakeFiles/openal.dir/Alc/panning.o
-.PHONY : CMakeFiles/openal.dir/Alc/panning.o.provides.build
-
-CMakeFiles/openal.dir/Alc/backends/loopback.o: CMakeFiles/openal.dir/flags.make
-CMakeFiles/openal.dir/Alc/backends/loopback.o: Alc/backends/loopback.c
-	$(CMAKE_COMMAND) -E cmake_progress_report /home/hagish/workspace/adt/love-native-android/jni/openal-soft-android/CMakeFiles $(CMAKE_PROGRESS_25)
-	@$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Building C object CMakeFiles/openal.dir/Alc/backends/loopback.o"
-	/opt/android-ndk-r6/toolchains/arm-linux-androideabi-4.4.3/prebuilt/linux-x86/bin/arm-linux-androideabi-gcc  $(C_DEFINES) $(C_FLAGS) -DAL_ALEXT_PROTOTYPES -o CMakeFiles/openal.dir/Alc/backends/loopback.o   -c /home/hagish/workspace/adt/love-native-android/jni/openal-soft-android/Alc/backends/loopback.c
-
-CMakeFiles/openal.dir/Alc/backends/loopback.i: cmake_force
-	@$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Preprocessing C source to CMakeFiles/openal.dir/Alc/backends/loopback.i"
-	/opt/android-ndk-r6/toolchains/arm-linux-androideabi-4.4.3/prebuilt/linux-x86/bin/arm-linux-androideabi-gcc  $(C_DEFINES) $(C_FLAGS) -DAL_ALEXT_PROTOTYPES -E /home/hagish/workspace/adt/love-native-android/jni/openal-soft-android/Alc/backends/loopback.c > CMakeFiles/openal.dir/Alc/backends/loopback.i
-
-CMakeFiles/openal.dir/Alc/backends/loopback.s: cmake_force
-	@$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Compiling C source to assembly CMakeFiles/openal.dir/Alc/backends/loopback.s"
-	/opt/android-ndk-r6/toolchains/arm-linux-androideabi-4.4.3/prebuilt/linux-x86/bin/arm-linux-androideabi-gcc  $(C_DEFINES) $(C_FLAGS) -DAL_ALEXT_PROTOTYPES -S /home/hagish/workspace/adt/love-native-android/jni/openal-soft-android/Alc/backends/loopback.c -o CMakeFiles/openal.dir/Alc/backends/loopback.s
-
-CMakeFiles/openal.dir/Alc/backends/loopback.o.requires:
-.PHONY : CMakeFiles/openal.dir/Alc/backends/loopback.o.requires
-
-CMakeFiles/openal.dir/Alc/backends/loopback.o.provides: CMakeFiles/openal.dir/Alc/backends/loopback.o.requires
-	$(MAKE) -f CMakeFiles/openal.dir/build.make CMakeFiles/openal.dir/Alc/backends/loopback.o.provides.build
-.PHONY : CMakeFiles/openal.dir/Alc/backends/loopback.o.provides
-
-CMakeFiles/openal.dir/Alc/backends/loopback.o.provides.build: CMakeFiles/openal.dir/Alc/backends/loopback.o
-.PHONY : CMakeFiles/openal.dir/Alc/backends/loopback.o.provides.build
-
-CMakeFiles/openal.dir/Alc/backends/null.o: CMakeFiles/openal.dir/flags.make
-CMakeFiles/openal.dir/Alc/backends/null.o: Alc/backends/null.c
-	$(CMAKE_COMMAND) -E cmake_progress_report /home/hagish/workspace/adt/love-native-android/jni/openal-soft-android/CMakeFiles $(CMAKE_PROGRESS_26)
-	@$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Building C object CMakeFiles/openal.dir/Alc/backends/null.o"
-	/opt/android-ndk-r6/toolchains/arm-linux-androideabi-4.4.3/prebuilt/linux-x86/bin/arm-linux-androideabi-gcc  $(C_DEFINES) $(C_FLAGS) -DAL_ALEXT_PROTOTYPES -o CMakeFiles/openal.dir/Alc/backends/null.o   -c /home/hagish/workspace/adt/love-native-android/jni/openal-soft-android/Alc/backends/null.c
-
-CMakeFiles/openal.dir/Alc/backends/null.i: cmake_force
-	@$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Preprocessing C source to CMakeFiles/openal.dir/Alc/backends/null.i"
-	/opt/android-ndk-r6/toolchains/arm-linux-androideabi-4.4.3/prebuilt/linux-x86/bin/arm-linux-androideabi-gcc  $(C_DEFINES) $(C_FLAGS) -DAL_ALEXT_PROTOTYPES -E /home/hagish/workspace/adt/love-native-android/jni/openal-soft-android/Alc/backends/null.c > CMakeFiles/openal.dir/Alc/backends/null.i
-
-CMakeFiles/openal.dir/Alc/backends/null.s: cmake_force
-	@$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Compiling C source to assembly CMakeFiles/openal.dir/Alc/backends/null.s"
-	/opt/android-ndk-r6/toolchains/arm-linux-androideabi-4.4.3/prebuilt/linux-x86/bin/arm-linux-androideabi-gcc  $(C_DEFINES) $(C_FLAGS) -DAL_ALEXT_PROTOTYPES -S /home/hagish/workspace/adt/love-native-android/jni/openal-soft-android/Alc/backends/null.c -o CMakeFiles/openal.dir/Alc/backends/null.s
-
-CMakeFiles/openal.dir/Alc/backends/null.o.requires:
-.PHONY : CMakeFiles/openal.dir/Alc/backends/null.o.requires
-
-CMakeFiles/openal.dir/Alc/backends/null.o.provides: CMakeFiles/openal.dir/Alc/backends/null.o.requires
-	$(MAKE) -f CMakeFiles/openal.dir/build.make CMakeFiles/openal.dir/Alc/backends/null.o.provides.build
-.PHONY : CMakeFiles/openal.dir/Alc/backends/null.o.provides
-
-CMakeFiles/openal.dir/Alc/backends/null.o.provides.build: CMakeFiles/openal.dir/Alc/backends/null.o
-.PHONY : CMakeFiles/openal.dir/Alc/backends/null.o.provides.build
-
-CMakeFiles/openal.dir/Alc/backends/android.o: CMakeFiles/openal.dir/flags.make
-CMakeFiles/openal.dir/Alc/backends/android.o: Alc/backends/android.c
-	$(CMAKE_COMMAND) -E cmake_progress_report /home/hagish/workspace/adt/love-native-android/jni/openal-soft-android/CMakeFiles $(CMAKE_PROGRESS_27)
-	@$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Building C object CMakeFiles/openal.dir/Alc/backends/android.o"
-	/opt/android-ndk-r6/toolchains/arm-linux-androideabi-4.4.3/prebuilt/linux-x86/bin/arm-linux-androideabi-gcc  $(C_DEFINES) $(C_FLAGS) -DAL_ALEXT_PROTOTYPES -o CMakeFiles/openal.dir/Alc/backends/android.o   -c /home/hagish/workspace/adt/love-native-android/jni/openal-soft-android/Alc/backends/android.c
-
-CMakeFiles/openal.dir/Alc/backends/android.i: cmake_force
-	@$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Preprocessing C source to CMakeFiles/openal.dir/Alc/backends/android.i"
-	/opt/android-ndk-r6/toolchains/arm-linux-androideabi-4.4.3/prebuilt/linux-x86/bin/arm-linux-androideabi-gcc  $(C_DEFINES) $(C_FLAGS) -DAL_ALEXT_PROTOTYPES -E /home/hagish/workspace/adt/love-native-android/jni/openal-soft-android/Alc/backends/android.c > CMakeFiles/openal.dir/Alc/backends/android.i
-
-CMakeFiles/openal.dir/Alc/backends/android.s: cmake_force
-	@$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Compiling C source to assembly CMakeFiles/openal.dir/Alc/backends/android.s"
-	/opt/android-ndk-r6/toolchains/arm-linux-androideabi-4.4.3/prebuilt/linux-x86/bin/arm-linux-androideabi-gcc  $(C_DEFINES) $(C_FLAGS) -DAL_ALEXT_PROTOTYPES -S /home/hagish/workspace/adt/love-native-android/jni/openal-soft-android/Alc/backends/android.c -o CMakeFiles/openal.dir/Alc/backends/android.s
-
-CMakeFiles/openal.dir/Alc/backends/android.o.requires:
-.PHONY : CMakeFiles/openal.dir/Alc/backends/android.o.requires
-
-CMakeFiles/openal.dir/Alc/backends/android.o.provides: CMakeFiles/openal.dir/Alc/backends/android.o.requires
-	$(MAKE) -f CMakeFiles/openal.dir/build.make CMakeFiles/openal.dir/Alc/backends/android.o.provides.build
-.PHONY : CMakeFiles/openal.dir/Alc/backends/android.o.provides
-
-CMakeFiles/openal.dir/Alc/backends/android.o.provides.build: CMakeFiles/openal.dir/Alc/backends/android.o
-.PHONY : CMakeFiles/openal.dir/Alc/backends/android.o.provides.build
-
-CMakeFiles/openal.dir/Alc/backends/wave.o: CMakeFiles/openal.dir/flags.make
-CMakeFiles/openal.dir/Alc/backends/wave.o: Alc/backends/wave.c
-	$(CMAKE_COMMAND) -E cmake_progress_report /home/hagish/workspace/adt/love-native-android/jni/openal-soft-android/CMakeFiles $(CMAKE_PROGRESS_28)
-	@$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Building C object CMakeFiles/openal.dir/Alc/backends/wave.o"
-	/opt/android-ndk-r6/toolchains/arm-linux-androideabi-4.4.3/prebuilt/linux-x86/bin/arm-linux-androideabi-gcc  $(C_DEFINES) $(C_FLAGS) -DAL_ALEXT_PROTOTYPES -o CMakeFiles/openal.dir/Alc/backends/wave.o   -c /home/hagish/workspace/adt/love-native-android/jni/openal-soft-android/Alc/backends/wave.c
-
-CMakeFiles/openal.dir/Alc/backends/wave.i: cmake_force
-	@$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Preprocessing C source to CMakeFiles/openal.dir/Alc/backends/wave.i"
-	/opt/android-ndk-r6/toolchains/arm-linux-androideabi-4.4.3/prebuilt/linux-x86/bin/arm-linux-androideabi-gcc  $(C_DEFINES) $(C_FLAGS) -DAL_ALEXT_PROTOTYPES -E /home/hagish/workspace/adt/love-native-android/jni/openal-soft-android/Alc/backends/wave.c > CMakeFiles/openal.dir/Alc/backends/wave.i
-
-CMakeFiles/openal.dir/Alc/backends/wave.s: cmake_force
-	@$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Compiling C source to assembly CMakeFiles/openal.dir/Alc/backends/wave.s"
-	/opt/android-ndk-r6/toolchains/arm-linux-androideabi-4.4.3/prebuilt/linux-x86/bin/arm-linux-androideabi-gcc  $(C_DEFINES) $(C_FLAGS) -DAL_ALEXT_PROTOTYPES -S /home/hagish/workspace/adt/love-native-android/jni/openal-soft-android/Alc/backends/wave.c -o CMakeFiles/openal.dir/Alc/backends/wave.s
-
-CMakeFiles/openal.dir/Alc/backends/wave.o.requires:
-.PHONY : CMakeFiles/openal.dir/Alc/backends/wave.o.requires
-
-CMakeFiles/openal.dir/Alc/backends/wave.o.provides: CMakeFiles/openal.dir/Alc/backends/wave.o.requires
-	$(MAKE) -f CMakeFiles/openal.dir/build.make CMakeFiles/openal.dir/Alc/backends/wave.o.provides.build
-.PHONY : CMakeFiles/openal.dir/Alc/backends/wave.o.provides
-
-CMakeFiles/openal.dir/Alc/backends/wave.o.provides.build: CMakeFiles/openal.dir/Alc/backends/wave.o
-.PHONY : CMakeFiles/openal.dir/Alc/backends/wave.o.provides.build
-
-# Object files for target openal
-openal_OBJECTS = \
-"CMakeFiles/openal.dir/OpenAL32/alAuxEffectSlot.o" \
-"CMakeFiles/openal.dir/OpenAL32/alBuffer.o" \
-"CMakeFiles/openal.dir/OpenAL32/alEffect.o" \
-"CMakeFiles/openal.dir/OpenAL32/alError.o" \
-"CMakeFiles/openal.dir/OpenAL32/alExtension.o" \
-"CMakeFiles/openal.dir/OpenAL32/alFilter.o" \
-"CMakeFiles/openal.dir/OpenAL32/alListener.o" \
-"CMakeFiles/openal.dir/OpenAL32/alSource.o" \
-"CMakeFiles/openal.dir/OpenAL32/alState.o" \
-"CMakeFiles/openal.dir/OpenAL32/alThunk.o" \
-"CMakeFiles/openal.dir/Alc/ALc.o" \
-"CMakeFiles/openal.dir/Alc/ALu.o" \
-"CMakeFiles/openal.dir/Alc/alcConfig.o" \
-"CMakeFiles/openal.dir/Alc/alcDedicated.o" \
-"CMakeFiles/openal.dir/Alc/alcEcho.o" \
-"CMakeFiles/openal.dir/Alc/alcModulator.o" \
-"CMakeFiles/openal.dir/Alc/alcReverb.o" \
-"CMakeFiles/openal.dir/Alc/alcRing.o" \
-"CMakeFiles/openal.dir/Alc/alcThread.o" \
-"CMakeFiles/openal.dir/Alc/bs2b.o" \
-"CMakeFiles/openal.dir/Alc/helpers.o" \
-"CMakeFiles/openal.dir/Alc/hrtf.o" \
-"CMakeFiles/openal.dir/Alc/mixer.o" \
-"CMakeFiles/openal.dir/Alc/panning.o" \
-"CMakeFiles/openal.dir/Alc/backends/loopback.o" \
-"CMakeFiles/openal.dir/Alc/backends/null.o" \
-"CMakeFiles/openal.dir/Alc/backends/android.o" \
-"CMakeFiles/openal.dir/Alc/backends/wave.o"
-
-# External object files for target openal
-openal_EXTERNAL_OBJECTS =
-
-libopenal.so.1.13.0: CMakeFiles/openal.dir/OpenAL32/alAuxEffectSlot.o
-libopenal.so.1.13.0: CMakeFiles/openal.dir/OpenAL32/alBuffer.o
-libopenal.so.1.13.0: CMakeFiles/openal.dir/OpenAL32/alEffect.o
-libopenal.so.1.13.0: CMakeFiles/openal.dir/OpenAL32/alError.o
-libopenal.so.1.13.0: CMakeFiles/openal.dir/OpenAL32/alExtension.o
-libopenal.so.1.13.0: CMakeFiles/openal.dir/OpenAL32/alFilter.o
-libopenal.so.1.13.0: CMakeFiles/openal.dir/OpenAL32/alListener.o
-libopenal.so.1.13.0: CMakeFiles/openal.dir/OpenAL32/alSource.o
-libopenal.so.1.13.0: CMakeFiles/openal.dir/OpenAL32/alState.o
-libopenal.so.1.13.0: CMakeFiles/openal.dir/OpenAL32/alThunk.o
-libopenal.so.1.13.0: CMakeFiles/openal.dir/Alc/ALc.o
-libopenal.so.1.13.0: CMakeFiles/openal.dir/Alc/ALu.o
-libopenal.so.1.13.0: CMakeFiles/openal.dir/Alc/alcConfig.o
-libopenal.so.1.13.0: CMakeFiles/openal.dir/Alc/alcDedicated.o
-libopenal.so.1.13.0: CMakeFiles/openal.dir/Alc/alcEcho.o
-libopenal.so.1.13.0: CMakeFiles/openal.dir/Alc/alcModulator.o
-libopenal.so.1.13.0: CMakeFiles/openal.dir/Alc/alcReverb.o
-libopenal.so.1.13.0: CMakeFiles/openal.dir/Alc/alcRing.o
-libopenal.so.1.13.0: CMakeFiles/openal.dir/Alc/alcThread.o
-libopenal.so.1.13.0: CMakeFiles/openal.dir/Alc/bs2b.o
-libopenal.so.1.13.0: CMakeFiles/openal.dir/Alc/helpers.o
-libopenal.so.1.13.0: CMakeFiles/openal.dir/Alc/hrtf.o
-libopenal.so.1.13.0: CMakeFiles/openal.dir/Alc/mixer.o
-libopenal.so.1.13.0: CMakeFiles/openal.dir/Alc/panning.o
-libopenal.so.1.13.0: CMakeFiles/openal.dir/Alc/backends/loopback.o
-libopenal.so.1.13.0: CMakeFiles/openal.dir/Alc/backends/null.o
-libopenal.so.1.13.0: CMakeFiles/openal.dir/Alc/backends/android.o
-libopenal.so.1.13.0: CMakeFiles/openal.dir/Alc/backends/wave.o
-libopenal.so.1.13.0: CMakeFiles/openal.dir/build.make
-libopenal.so.1.13.0: CMakeFiles/openal.dir/link.txt
-	@$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --red --bold "Linking C shared library libopenal.so"
-	$(CMAKE_COMMAND) -E cmake_link_script CMakeFiles/openal.dir/link.txt --verbose=$(VERBOSE)
-	$(CMAKE_COMMAND) -E cmake_symlink_library libopenal.so.1.13.0 libopenal.so.1 libopenal.so
-
-libopenal.so.1: libopenal.so.1.13.0
-
-libopenal.so: libopenal.so.1.13.0
-
-# Rule to build all files generated by this target.
-CMakeFiles/openal.dir/build: libopenal.so
-.PHONY : CMakeFiles/openal.dir/build
-
-# Object files for target openal
-openal_OBJECTS = \
-"CMakeFiles/openal.dir/OpenAL32/alAuxEffectSlot.o" \
-"CMakeFiles/openal.dir/OpenAL32/alBuffer.o" \
-"CMakeFiles/openal.dir/OpenAL32/alEffect.o" \
-"CMakeFiles/openal.dir/OpenAL32/alError.o" \
-"CMakeFiles/openal.dir/OpenAL32/alExtension.o" \
-"CMakeFiles/openal.dir/OpenAL32/alFilter.o" \
-"CMakeFiles/openal.dir/OpenAL32/alListener.o" \
-"CMakeFiles/openal.dir/OpenAL32/alSource.o" \
-"CMakeFiles/openal.dir/OpenAL32/alState.o" \
-"CMakeFiles/openal.dir/OpenAL32/alThunk.o" \
-"CMakeFiles/openal.dir/Alc/ALc.o" \
-"CMakeFiles/openal.dir/Alc/ALu.o" \
-"CMakeFiles/openal.dir/Alc/alcConfig.o" \
-"CMakeFiles/openal.dir/Alc/alcDedicated.o" \
-"CMakeFiles/openal.dir/Alc/alcEcho.o" \
-"CMakeFiles/openal.dir/Alc/alcModulator.o" \
-"CMakeFiles/openal.dir/Alc/alcReverb.o" \
-"CMakeFiles/openal.dir/Alc/alcRing.o" \
-"CMakeFiles/openal.dir/Alc/alcThread.o" \
-"CMakeFiles/openal.dir/Alc/bs2b.o" \
-"CMakeFiles/openal.dir/Alc/helpers.o" \
-"CMakeFiles/openal.dir/Alc/hrtf.o" \
-"CMakeFiles/openal.dir/Alc/mixer.o" \
-"CMakeFiles/openal.dir/Alc/panning.o" \
-"CMakeFiles/openal.dir/Alc/backends/loopback.o" \
-"CMakeFiles/openal.dir/Alc/backends/null.o" \
-"CMakeFiles/openal.dir/Alc/backends/android.o" \
-"CMakeFiles/openal.dir/Alc/backends/wave.o"
-
-# External object files for target openal
-openal_EXTERNAL_OBJECTS =
-
-CMakeFiles/CMakeRelink.dir/libopenal.so.1.13.0: CMakeFiles/openal.dir/OpenAL32/alAuxEffectSlot.o
-CMakeFiles/CMakeRelink.dir/libopenal.so.1.13.0: CMakeFiles/openal.dir/OpenAL32/alBuffer.o
-CMakeFiles/CMakeRelink.dir/libopenal.so.1.13.0: CMakeFiles/openal.dir/OpenAL32/alEffect.o
-CMakeFiles/CMakeRelink.dir/libopenal.so.1.13.0: CMakeFiles/openal.dir/OpenAL32/alError.o
-CMakeFiles/CMakeRelink.dir/libopenal.so.1.13.0: CMakeFiles/openal.dir/OpenAL32/alExtension.o
-CMakeFiles/CMakeRelink.dir/libopenal.so.1.13.0: CMakeFiles/openal.dir/OpenAL32/alFilter.o
-CMakeFiles/CMakeRelink.dir/libopenal.so.1.13.0: CMakeFiles/openal.dir/OpenAL32/alListener.o
-CMakeFiles/CMakeRelink.dir/libopenal.so.1.13.0: CMakeFiles/openal.dir/OpenAL32/alSource.o
-CMakeFiles/CMakeRelink.dir/libopenal.so.1.13.0: CMakeFiles/openal.dir/OpenAL32/alState.o
-CMakeFiles/CMakeRelink.dir/libopenal.so.1.13.0: CMakeFiles/openal.dir/OpenAL32/alThunk.o
-CMakeFiles/CMakeRelink.dir/libopenal.so.1.13.0: CMakeFiles/openal.dir/Alc/ALc.o
-CMakeFiles/CMakeRelink.dir/libopenal.so.1.13.0: CMakeFiles/openal.dir/Alc/ALu.o
-CMakeFiles/CMakeRelink.dir/libopenal.so.1.13.0: CMakeFiles/openal.dir/Alc/alcConfig.o
-CMakeFiles/CMakeRelink.dir/libopenal.so.1.13.0: CMakeFiles/openal.dir/Alc/alcDedicated.o
-CMakeFiles/CMakeRelink.dir/libopenal.so.1.13.0: CMakeFiles/openal.dir/Alc/alcEcho.o
-CMakeFiles/CMakeRelink.dir/libopenal.so.1.13.0: CMakeFiles/openal.dir/Alc/alcModulator.o
-CMakeFiles/CMakeRelink.dir/libopenal.so.1.13.0: CMakeFiles/openal.dir/Alc/alcReverb.o
-CMakeFiles/CMakeRelink.dir/libopenal.so.1.13.0: CMakeFiles/openal.dir/Alc/alcRing.o
-CMakeFiles/CMakeRelink.dir/libopenal.so.1.13.0: CMakeFiles/openal.dir/Alc/alcThread.o
-CMakeFiles/CMakeRelink.dir/libopenal.so.1.13.0: CMakeFiles/openal.dir/Alc/bs2b.o
-CMakeFiles/CMakeRelink.dir/libopenal.so.1.13.0: CMakeFiles/openal.dir/Alc/helpers.o
-CMakeFiles/CMakeRelink.dir/libopenal.so.1.13.0: CMakeFiles/openal.dir/Alc/hrtf.o
-CMakeFiles/CMakeRelink.dir/libopenal.so.1.13.0: CMakeFiles/openal.dir/Alc/mixer.o
-CMakeFiles/CMakeRelink.dir/libopenal.so.1.13.0: CMakeFiles/openal.dir/Alc/panning.o
-CMakeFiles/CMakeRelink.dir/libopenal.so.1.13.0: CMakeFiles/openal.dir/Alc/backends/loopback.o
-CMakeFiles/CMakeRelink.dir/libopenal.so.1.13.0: CMakeFiles/openal.dir/Alc/backends/null.o
-CMakeFiles/CMakeRelink.dir/libopenal.so.1.13.0: CMakeFiles/openal.dir/Alc/backends/android.o
-CMakeFiles/CMakeRelink.dir/libopenal.so.1.13.0: CMakeFiles/openal.dir/Alc/backends/wave.o
-CMakeFiles/CMakeRelink.dir/libopenal.so.1.13.0: CMakeFiles/openal.dir/build.make
-CMakeFiles/CMakeRelink.dir/libopenal.so.1.13.0: CMakeFiles/openal.dir/relink.txt
-	@$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --red --bold "Linking C shared library CMakeFiles/CMakeRelink.dir/libopenal.so"
-	$(CMAKE_COMMAND) -E cmake_link_script CMakeFiles/openal.dir/relink.txt --verbose=$(VERBOSE)
-	$(CMAKE_COMMAND) -E cmake_symlink_library CMakeFiles/CMakeRelink.dir/libopenal.so.1.13.0 CMakeFiles/CMakeRelink.dir/libopenal.so.1 CMakeFiles/CMakeRelink.dir/libopenal.so
-
-CMakeFiles/CMakeRelink.dir/libopenal.so.1: CMakeFiles/CMakeRelink.dir/libopenal.so.1.13.0
-
-CMakeFiles/CMakeRelink.dir/libopenal.so: CMakeFiles/CMakeRelink.dir/libopenal.so.1.13.0
-
-# Rule to relink during preinstall.
-CMakeFiles/openal.dir/preinstall: CMakeFiles/CMakeRelink.dir/libopenal.so
-.PHONY : CMakeFiles/openal.dir/preinstall
-
-CMakeFiles/openal.dir/requires: CMakeFiles/openal.dir/OpenAL32/alAuxEffectSlot.o.requires
-CMakeFiles/openal.dir/requires: CMakeFiles/openal.dir/OpenAL32/alBuffer.o.requires
-CMakeFiles/openal.dir/requires: CMakeFiles/openal.dir/OpenAL32/alEffect.o.requires
-CMakeFiles/openal.dir/requires: CMakeFiles/openal.dir/OpenAL32/alError.o.requires
-CMakeFiles/openal.dir/requires: CMakeFiles/openal.dir/OpenAL32/alExtension.o.requires
-CMakeFiles/openal.dir/requires: CMakeFiles/openal.dir/OpenAL32/alFilter.o.requires
-CMakeFiles/openal.dir/requires: CMakeFiles/openal.dir/OpenAL32/alListener.o.requires
-CMakeFiles/openal.dir/requires: CMakeFiles/openal.dir/OpenAL32/alSource.o.requires
-CMakeFiles/openal.dir/requires: CMakeFiles/openal.dir/OpenAL32/alState.o.requires
-CMakeFiles/openal.dir/requires: CMakeFiles/openal.dir/OpenAL32/alThunk.o.requires
-CMakeFiles/openal.dir/requires: CMakeFiles/openal.dir/Alc/ALc.o.requires
-CMakeFiles/openal.dir/requires: CMakeFiles/openal.dir/Alc/ALu.o.requires
-CMakeFiles/openal.dir/requires: CMakeFiles/openal.dir/Alc/alcConfig.o.requires
-CMakeFiles/openal.dir/requires: CMakeFiles/openal.dir/Alc/alcDedicated.o.requires
-CMakeFiles/openal.dir/requires: CMakeFiles/openal.dir/Alc/alcEcho.o.requires
-CMakeFiles/openal.dir/requires: CMakeFiles/openal.dir/Alc/alcModulator.o.requires
-CMakeFiles/openal.dir/requires: CMakeFiles/openal.dir/Alc/alcReverb.o.requires
-CMakeFiles/openal.dir/requires: CMakeFiles/openal.dir/Alc/alcRing.o.requires
-CMakeFiles/openal.dir/requires: CMakeFiles/openal.dir/Alc/alcThread.o.requires
-CMakeFiles/openal.dir/requires: CMakeFiles/openal.dir/Alc/bs2b.o.requires
-CMakeFiles/openal.dir/requires: CMakeFiles/openal.dir/Alc/helpers.o.requires
-CMakeFiles/openal.dir/requires: CMakeFiles/openal.dir/Alc/hrtf.o.requires
-CMakeFiles/openal.dir/requires: CMakeFiles/openal.dir/Alc/mixer.o.requires
-CMakeFiles/openal.dir/requires: CMakeFiles/openal.dir/Alc/panning.o.requires
-CMakeFiles/openal.dir/requires: CMakeFiles/openal.dir/Alc/backends/loopback.o.requires
-CMakeFiles/openal.dir/requires: CMakeFiles/openal.dir/Alc/backends/null.o.requires
-CMakeFiles/openal.dir/requires: CMakeFiles/openal.dir/Alc/backends/android.o.requires
-CMakeFiles/openal.dir/requires: CMakeFiles/openal.dir/Alc/backends/wave.o.requires
-.PHONY : CMakeFiles/openal.dir/requires
-
-CMakeFiles/openal.dir/clean:
-	$(CMAKE_COMMAND) -P CMakeFiles/openal.dir/cmake_clean.cmake
-.PHONY : CMakeFiles/openal.dir/clean
-
-CMakeFiles/openal.dir/depend:
-	cd /home/hagish/workspace/adt/love-native-android/jni/openal-soft-android && $(CMAKE_COMMAND) -E cmake_depends "Unix Makefiles" /home/hagish/workspace/adt/love-native-android/jni/openal-soft-android /home/hagish/workspace/adt/love-native-android/jni/openal-soft-android /home/hagish/workspace/adt/love-native-android/jni/openal-soft-android /home/hagish/workspace/adt/love-native-android/jni/openal-soft-android /home/hagish/workspace/adt/love-native-android/jni/openal-soft-android/CMakeFiles/openal.dir/DependInfo.cmake --color=$(COLOR)
-.PHONY : CMakeFiles/openal.dir/depend
-

+ 0 - 43
jni/openal-soft-android/CMakeFiles/openal.dir/cmake_clean.cmake

@@ -1,43 +0,0 @@
-FILE(REMOVE_RECURSE
-  "CMakeFiles/openal.dir/OpenAL32/alAuxEffectSlot.o"
-  "CMakeFiles/openal.dir/OpenAL32/alBuffer.o"
-  "CMakeFiles/openal.dir/OpenAL32/alEffect.o"
-  "CMakeFiles/openal.dir/OpenAL32/alError.o"
-  "CMakeFiles/openal.dir/OpenAL32/alExtension.o"
-  "CMakeFiles/openal.dir/OpenAL32/alFilter.o"
-  "CMakeFiles/openal.dir/OpenAL32/alListener.o"
-  "CMakeFiles/openal.dir/OpenAL32/alSource.o"
-  "CMakeFiles/openal.dir/OpenAL32/alState.o"
-  "CMakeFiles/openal.dir/OpenAL32/alThunk.o"
-  "CMakeFiles/openal.dir/Alc/ALc.o"
-  "CMakeFiles/openal.dir/Alc/ALu.o"
-  "CMakeFiles/openal.dir/Alc/alcConfig.o"
-  "CMakeFiles/openal.dir/Alc/alcDedicated.o"
-  "CMakeFiles/openal.dir/Alc/alcEcho.o"
-  "CMakeFiles/openal.dir/Alc/alcModulator.o"
-  "CMakeFiles/openal.dir/Alc/alcReverb.o"
-  "CMakeFiles/openal.dir/Alc/alcRing.o"
-  "CMakeFiles/openal.dir/Alc/alcThread.o"
-  "CMakeFiles/openal.dir/Alc/bs2b.o"
-  "CMakeFiles/openal.dir/Alc/helpers.o"
-  "CMakeFiles/openal.dir/Alc/hrtf.o"
-  "CMakeFiles/openal.dir/Alc/mixer.o"
-  "CMakeFiles/openal.dir/Alc/panning.o"
-  "CMakeFiles/openal.dir/Alc/backends/loopback.o"
-  "CMakeFiles/openal.dir/Alc/backends/null.o"
-  "CMakeFiles/openal.dir/Alc/backends/android.o"
-  "CMakeFiles/openal.dir/Alc/backends/wave.o"
-  "libopenal.pdb"
-  "libopenal.so"
-  "libopenal.so.1.13.0"
-  "libopenal.so.1"
-  "CMakeFiles/CMakeRelink.dir/libopenal.pdb"
-  "CMakeFiles/CMakeRelink.dir/libopenal.so"
-  "CMakeFiles/CMakeRelink.dir/libopenal.so.1.13.0"
-  "CMakeFiles/CMakeRelink.dir/libopenal.so.1"
-)
-
-# Per-language clean rules from dependency scanning.
-FOREACH(lang C)
-  INCLUDE(CMakeFiles/openal.dir/cmake_clean_${lang}.cmake OPTIONAL)
-ENDFOREACH(lang)

+ 0 - 491
jni/openal-soft-android/CMakeFiles/openal.dir/depend.internal

@@ -1,491 +0,0 @@
-# CMAKE generated file: DO NOT EDIT!
-# Generated by "Unix Makefiles" Generator, CMake Version 2.8
-
-CMakeFiles/openal.dir/Alc/ALc.o
- /home/hagish/workspace/adt/love-native-android/jni/openal-soft-android/Alc/ALc.c
- /opt/android-ndk-r6/sources/cxx-stl/gnu-libstdc++/include/fenv.h
- /opt/android-ndk-r6/sources/cxx-stl/gnu-libstdc++/include/tr1_impl/cfenv
- /opt/android-ndk-r6/sources/cxx-stl/gnu-libstdc++/libs/armeabi/include/bits/c++config.h
- /opt/android-ndk-r6/sources/cxx-stl/gnu-libstdc++/libs/armeabi/include/bits/cpu_defines.h
- /opt/android-ndk-r6/sources/cxx-stl/gnu-libstdc++/libs/armeabi/include/bits/os_defines.h
- OpenAL32/Include/alAuxEffectSlot.h
- OpenAL32/Include/alBuffer.h
- OpenAL32/Include/alEffect.h
- OpenAL32/Include/alError.h
- OpenAL32/Include/alFilter.h
- OpenAL32/Include/alListener.h
- OpenAL32/Include/alMain.h
- OpenAL32/Include/alSource.h
- OpenAL32/Include/alThunk.h
- OpenAL32/Include/alu.h
- OpenAL32/Include/bs2b.h
- config.h
- include/AL/al.h
- include/AL/alc.h
- include/AL/alext.h
- include/AL/efx.h
-CMakeFiles/openal.dir/Alc/ALu.o
- /home/hagish/workspace/adt/love-native-android/jni/openal-soft-android/Alc/ALu.c
- /opt/android-ndk-r6/sources/cxx-stl/gnu-libstdc++/include/fenv.h
- /opt/android-ndk-r6/sources/cxx-stl/gnu-libstdc++/include/tr1_impl/cfenv
- /opt/android-ndk-r6/sources/cxx-stl/gnu-libstdc++/libs/armeabi/include/bits/c++config.h
- /opt/android-ndk-r6/sources/cxx-stl/gnu-libstdc++/libs/armeabi/include/bits/cpu_defines.h
- /opt/android-ndk-r6/sources/cxx-stl/gnu-libstdc++/libs/armeabi/include/bits/os_defines.h
- OpenAL32/Include/alAuxEffectSlot.h
- OpenAL32/Include/alBuffer.h
- OpenAL32/Include/alEffect.h
- OpenAL32/Include/alFilter.h
- OpenAL32/Include/alListener.h
- OpenAL32/Include/alMain.h
- OpenAL32/Include/alSource.h
- OpenAL32/Include/alu.h
- OpenAL32/Include/bs2b.h
- config.h
- include/AL/al.h
- include/AL/alc.h
- include/AL/alext.h
- include/AL/efx.h
-CMakeFiles/openal.dir/Alc/alcConfig.o
- /home/hagish/workspace/adt/love-native-android/jni/openal-soft-android/Alc/alcConfig.c
- /opt/android-ndk-r6/sources/cxx-stl/gnu-libstdc++/include/fenv.h
- /opt/android-ndk-r6/sources/cxx-stl/gnu-libstdc++/include/tr1_impl/cfenv
- /opt/android-ndk-r6/sources/cxx-stl/gnu-libstdc++/libs/armeabi/include/bits/c++config.h
- /opt/android-ndk-r6/sources/cxx-stl/gnu-libstdc++/libs/armeabi/include/bits/cpu_defines.h
- /opt/android-ndk-r6/sources/cxx-stl/gnu-libstdc++/libs/armeabi/include/bits/os_defines.h
- OpenAL32/Include/alListener.h
- OpenAL32/Include/alMain.h
- OpenAL32/Include/alu.h
- config.h
- include/AL/al.h
- include/AL/alc.h
- include/AL/alext.h
- include/AL/efx.h
-CMakeFiles/openal.dir/Alc/alcDedicated.o
- /home/hagish/workspace/adt/love-native-android/jni/openal-soft-android/Alc/alcDedicated.c
- /opt/android-ndk-r6/sources/cxx-stl/gnu-libstdc++/include/fenv.h
- /opt/android-ndk-r6/sources/cxx-stl/gnu-libstdc++/include/tr1_impl/cfenv
- /opt/android-ndk-r6/sources/cxx-stl/gnu-libstdc++/libs/armeabi/include/bits/c++config.h
- /opt/android-ndk-r6/sources/cxx-stl/gnu-libstdc++/libs/armeabi/include/bits/cpu_defines.h
- /opt/android-ndk-r6/sources/cxx-stl/gnu-libstdc++/libs/armeabi/include/bits/os_defines.h
- OpenAL32/Include/alAuxEffectSlot.h
- OpenAL32/Include/alEffect.h
- OpenAL32/Include/alError.h
- OpenAL32/Include/alFilter.h
- OpenAL32/Include/alListener.h
- OpenAL32/Include/alMain.h
- OpenAL32/Include/alu.h
- config.h
- include/AL/al.h
- include/AL/alc.h
- include/AL/alext.h
- include/AL/efx.h
-CMakeFiles/openal.dir/Alc/alcEcho.o
- /home/hagish/workspace/adt/love-native-android/jni/openal-soft-android/Alc/alcEcho.c
- /opt/android-ndk-r6/sources/cxx-stl/gnu-libstdc++/include/fenv.h
- /opt/android-ndk-r6/sources/cxx-stl/gnu-libstdc++/include/tr1_impl/cfenv
- /opt/android-ndk-r6/sources/cxx-stl/gnu-libstdc++/libs/armeabi/include/bits/c++config.h
- /opt/android-ndk-r6/sources/cxx-stl/gnu-libstdc++/libs/armeabi/include/bits/cpu_defines.h
- /opt/android-ndk-r6/sources/cxx-stl/gnu-libstdc++/libs/armeabi/include/bits/os_defines.h
- OpenAL32/Include/alAuxEffectSlot.h
- OpenAL32/Include/alEffect.h
- OpenAL32/Include/alError.h
- OpenAL32/Include/alFilter.h
- OpenAL32/Include/alListener.h
- OpenAL32/Include/alMain.h
- OpenAL32/Include/alu.h
- config.h
- include/AL/al.h
- include/AL/alc.h
- include/AL/alext.h
- include/AL/efx.h
-CMakeFiles/openal.dir/Alc/alcModulator.o
- /home/hagish/workspace/adt/love-native-android/jni/openal-soft-android/Alc/alcModulator.c
- /opt/android-ndk-r6/sources/cxx-stl/gnu-libstdc++/include/fenv.h
- /opt/android-ndk-r6/sources/cxx-stl/gnu-libstdc++/include/tr1_impl/cfenv
- /opt/android-ndk-r6/sources/cxx-stl/gnu-libstdc++/libs/armeabi/include/bits/c++config.h
- /opt/android-ndk-r6/sources/cxx-stl/gnu-libstdc++/libs/armeabi/include/bits/cpu_defines.h
- /opt/android-ndk-r6/sources/cxx-stl/gnu-libstdc++/libs/armeabi/include/bits/os_defines.h
- OpenAL32/Include/alAuxEffectSlot.h
- OpenAL32/Include/alEffect.h
- OpenAL32/Include/alError.h
- OpenAL32/Include/alFilter.h
- OpenAL32/Include/alListener.h
- OpenAL32/Include/alMain.h
- OpenAL32/Include/alu.h
- config.h
- include/AL/al.h
- include/AL/alc.h
- include/AL/alext.h
- include/AL/efx.h
-CMakeFiles/openal.dir/Alc/alcReverb.o
- /home/hagish/workspace/adt/love-native-android/jni/openal-soft-android/Alc/alcReverb.c
- /opt/android-ndk-r6/sources/cxx-stl/gnu-libstdc++/include/fenv.h
- /opt/android-ndk-r6/sources/cxx-stl/gnu-libstdc++/include/tr1_impl/cfenv
- /opt/android-ndk-r6/sources/cxx-stl/gnu-libstdc++/libs/armeabi/include/bits/c++config.h
- /opt/android-ndk-r6/sources/cxx-stl/gnu-libstdc++/libs/armeabi/include/bits/cpu_defines.h
- /opt/android-ndk-r6/sources/cxx-stl/gnu-libstdc++/libs/armeabi/include/bits/os_defines.h
- OpenAL32/Include/alAuxEffectSlot.h
- OpenAL32/Include/alEffect.h
- OpenAL32/Include/alError.h
- OpenAL32/Include/alFilter.h
- OpenAL32/Include/alListener.h
- OpenAL32/Include/alMain.h
- OpenAL32/Include/alu.h
- config.h
- include/AL/al.h
- include/AL/alc.h
- include/AL/alext.h
- include/AL/efx.h
-CMakeFiles/openal.dir/Alc/alcRing.o
- /home/hagish/workspace/adt/love-native-android/jni/openal-soft-android/Alc/alcRing.c
- /opt/android-ndk-r6/sources/cxx-stl/gnu-libstdc++/include/fenv.h
- /opt/android-ndk-r6/sources/cxx-stl/gnu-libstdc++/include/tr1_impl/cfenv
- /opt/android-ndk-r6/sources/cxx-stl/gnu-libstdc++/libs/armeabi/include/bits/c++config.h
- /opt/android-ndk-r6/sources/cxx-stl/gnu-libstdc++/libs/armeabi/include/bits/cpu_defines.h
- /opt/android-ndk-r6/sources/cxx-stl/gnu-libstdc++/libs/armeabi/include/bits/os_defines.h
- OpenAL32/Include/alListener.h
- OpenAL32/Include/alMain.h
- OpenAL32/Include/alu.h
- config.h
- include/AL/al.h
- include/AL/alc.h
- include/AL/alext.h
- include/AL/efx.h
-CMakeFiles/openal.dir/Alc/alcThread.o
- /home/hagish/workspace/adt/love-native-android/jni/openal-soft-android/Alc/alcThread.c
- /opt/android-ndk-r6/sources/cxx-stl/gnu-libstdc++/include/fenv.h
- /opt/android-ndk-r6/sources/cxx-stl/gnu-libstdc++/include/tr1_impl/cfenv
- /opt/android-ndk-r6/sources/cxx-stl/gnu-libstdc++/libs/armeabi/include/bits/c++config.h
- /opt/android-ndk-r6/sources/cxx-stl/gnu-libstdc++/libs/armeabi/include/bits/cpu_defines.h
- /opt/android-ndk-r6/sources/cxx-stl/gnu-libstdc++/libs/armeabi/include/bits/os_defines.h
- OpenAL32/Include/alListener.h
- OpenAL32/Include/alMain.h
- OpenAL32/Include/alThunk.h
- OpenAL32/Include/alu.h
- config.h
- include/AL/al.h
- include/AL/alc.h
- include/AL/alext.h
- include/AL/efx.h
-CMakeFiles/openal.dir/Alc/backends/android.o
- /home/hagish/workspace/adt/love-native-android/jni/openal-soft-android/Alc/backends/android.c
- /opt/android-ndk-r6/sources/cxx-stl/gnu-libstdc++/include/fenv.h
- /opt/android-ndk-r6/sources/cxx-stl/gnu-libstdc++/include/tr1_impl/cfenv
- /opt/android-ndk-r6/sources/cxx-stl/gnu-libstdc++/libs/armeabi/include/bits/c++config.h
- /opt/android-ndk-r6/sources/cxx-stl/gnu-libstdc++/libs/armeabi/include/bits/cpu_defines.h
- /opt/android-ndk-r6/sources/cxx-stl/gnu-libstdc++/libs/armeabi/include/bits/os_defines.h
- OpenAL32/Include/alListener.h
- OpenAL32/Include/alMain.h
- OpenAL32/Include/alu.h
- config.h
- include/AL/al.h
- include/AL/alc.h
- include/AL/alext.h
- include/AL/efx.h
-CMakeFiles/openal.dir/Alc/backends/loopback.o
- /home/hagish/workspace/adt/love-native-android/jni/openal-soft-android/Alc/backends/loopback.c
- /opt/android-ndk-r6/sources/cxx-stl/gnu-libstdc++/include/fenv.h
- /opt/android-ndk-r6/sources/cxx-stl/gnu-libstdc++/include/tr1_impl/cfenv
- /opt/android-ndk-r6/sources/cxx-stl/gnu-libstdc++/libs/armeabi/include/bits/c++config.h
- /opt/android-ndk-r6/sources/cxx-stl/gnu-libstdc++/libs/armeabi/include/bits/cpu_defines.h
- /opt/android-ndk-r6/sources/cxx-stl/gnu-libstdc++/libs/armeabi/include/bits/os_defines.h
- OpenAL32/Include/alListener.h
- OpenAL32/Include/alMain.h
- OpenAL32/Include/alu.h
- config.h
- include/AL/al.h
- include/AL/alc.h
- include/AL/alext.h
- include/AL/efx.h
-CMakeFiles/openal.dir/Alc/backends/null.o
- /home/hagish/workspace/adt/love-native-android/jni/openal-soft-android/Alc/backends/null.c
- /opt/android-ndk-r6/sources/cxx-stl/gnu-libstdc++/include/fenv.h
- /opt/android-ndk-r6/sources/cxx-stl/gnu-libstdc++/include/tr1_impl/cfenv
- /opt/android-ndk-r6/sources/cxx-stl/gnu-libstdc++/libs/armeabi/include/bits/c++config.h
- /opt/android-ndk-r6/sources/cxx-stl/gnu-libstdc++/libs/armeabi/include/bits/cpu_defines.h
- /opt/android-ndk-r6/sources/cxx-stl/gnu-libstdc++/libs/armeabi/include/bits/os_defines.h
- OpenAL32/Include/alListener.h
- OpenAL32/Include/alMain.h
- OpenAL32/Include/alu.h
- config.h
- include/AL/al.h
- include/AL/alc.h
- include/AL/alext.h
- include/AL/efx.h
-CMakeFiles/openal.dir/Alc/backends/wave.o
- /home/hagish/workspace/adt/love-native-android/jni/openal-soft-android/Alc/backends/wave.c
- /opt/android-ndk-r6/sources/cxx-stl/gnu-libstdc++/include/fenv.h
- /opt/android-ndk-r6/sources/cxx-stl/gnu-libstdc++/include/tr1_impl/cfenv
- /opt/android-ndk-r6/sources/cxx-stl/gnu-libstdc++/libs/armeabi/include/bits/c++config.h
- /opt/android-ndk-r6/sources/cxx-stl/gnu-libstdc++/libs/armeabi/include/bits/cpu_defines.h
- /opt/android-ndk-r6/sources/cxx-stl/gnu-libstdc++/libs/armeabi/include/bits/os_defines.h
- OpenAL32/Include/alListener.h
- OpenAL32/Include/alMain.h
- OpenAL32/Include/alu.h
- config.h
- include/AL/al.h
- include/AL/alc.h
- include/AL/alext.h
- include/AL/efx.h
-CMakeFiles/openal.dir/Alc/bs2b.o
- /home/hagish/workspace/adt/love-native-android/jni/openal-soft-android/Alc/bs2b.c
- OpenAL32/Include/bs2b.h
- config.h
-CMakeFiles/openal.dir/Alc/helpers.o
- /home/hagish/workspace/adt/love-native-android/jni/openal-soft-android/Alc/helpers.c
- /opt/android-ndk-r6/sources/cxx-stl/gnu-libstdc++/include/fenv.h
- /opt/android-ndk-r6/sources/cxx-stl/gnu-libstdc++/include/tr1_impl/cfenv
- /opt/android-ndk-r6/sources/cxx-stl/gnu-libstdc++/libs/armeabi/include/bits/c++config.h
- /opt/android-ndk-r6/sources/cxx-stl/gnu-libstdc++/libs/armeabi/include/bits/cpu_defines.h
- /opt/android-ndk-r6/sources/cxx-stl/gnu-libstdc++/libs/armeabi/include/bits/os_defines.h
- OpenAL32/Include/alListener.h
- OpenAL32/Include/alMain.h
- OpenAL32/Include/alu.h
- config.h
- include/AL/al.h
- include/AL/alc.h
- include/AL/alext.h
- include/AL/efx.h
-CMakeFiles/openal.dir/Alc/hrtf.o
- /home/hagish/workspace/adt/love-native-android/jni/openal-soft-android/Alc/hrtf.c
- /home/hagish/workspace/adt/love-native-android/jni/openal-soft-android/Alc/hrtf_tables.inc
- /opt/android-ndk-r6/sources/cxx-stl/gnu-libstdc++/include/fenv.h
- /opt/android-ndk-r6/sources/cxx-stl/gnu-libstdc++/include/tr1_impl/cfenv
- /opt/android-ndk-r6/sources/cxx-stl/gnu-libstdc++/libs/armeabi/include/bits/c++config.h
- /opt/android-ndk-r6/sources/cxx-stl/gnu-libstdc++/libs/armeabi/include/bits/cpu_defines.h
- /opt/android-ndk-r6/sources/cxx-stl/gnu-libstdc++/libs/armeabi/include/bits/os_defines.h
- OpenAL32/Include/alFilter.h
- OpenAL32/Include/alListener.h
- OpenAL32/Include/alMain.h
- OpenAL32/Include/alSource.h
- OpenAL32/Include/alu.h
- config.h
- include/AL/al.h
- include/AL/alc.h
- include/AL/alext.h
- include/AL/efx.h
-CMakeFiles/openal.dir/Alc/mixer.o
- /home/hagish/workspace/adt/love-native-android/jni/openal-soft-android/Alc/mixer.c
- /opt/android-ndk-r6/sources/cxx-stl/gnu-libstdc++/include/fenv.h
- /opt/android-ndk-r6/sources/cxx-stl/gnu-libstdc++/include/tr1_impl/cfenv
- /opt/android-ndk-r6/sources/cxx-stl/gnu-libstdc++/libs/armeabi/include/bits/c++config.h
- /opt/android-ndk-r6/sources/cxx-stl/gnu-libstdc++/libs/armeabi/include/bits/cpu_defines.h
- /opt/android-ndk-r6/sources/cxx-stl/gnu-libstdc++/libs/armeabi/include/bits/os_defines.h
- OpenAL32/Include/alAuxEffectSlot.h
- OpenAL32/Include/alBuffer.h
- OpenAL32/Include/alEffect.h
- OpenAL32/Include/alFilter.h
- OpenAL32/Include/alListener.h
- OpenAL32/Include/alMain.h
- OpenAL32/Include/alSource.h
- OpenAL32/Include/alu.h
- OpenAL32/Include/bs2b.h
- config.h
- include/AL/al.h
- include/AL/alc.h
- include/AL/alext.h
- include/AL/efx.h
-CMakeFiles/openal.dir/Alc/panning.o
- /home/hagish/workspace/adt/love-native-android/jni/openal-soft-android/Alc/panning.c
- /opt/android-ndk-r6/sources/cxx-stl/gnu-libstdc++/include/fenv.h
- /opt/android-ndk-r6/sources/cxx-stl/gnu-libstdc++/include/tr1_impl/cfenv
- /opt/android-ndk-r6/sources/cxx-stl/gnu-libstdc++/libs/armeabi/include/bits/c++config.h
- /opt/android-ndk-r6/sources/cxx-stl/gnu-libstdc++/libs/armeabi/include/bits/cpu_defines.h
- /opt/android-ndk-r6/sources/cxx-stl/gnu-libstdc++/libs/armeabi/include/bits/os_defines.h
- OpenAL32/Include/alListener.h
- OpenAL32/Include/alMain.h
- OpenAL32/Include/alu.h
- config.h
- include/AL/al.h
- include/AL/alc.h
- include/AL/alext.h
- include/AL/efx.h
-CMakeFiles/openal.dir/OpenAL32/alAuxEffectSlot.o
- /home/hagish/workspace/adt/love-native-android/jni/openal-soft-android/OpenAL32/alAuxEffectSlot.c
- /opt/android-ndk-r6/sources/cxx-stl/gnu-libstdc++/include/fenv.h
- /opt/android-ndk-r6/sources/cxx-stl/gnu-libstdc++/include/tr1_impl/cfenv
- /opt/android-ndk-r6/sources/cxx-stl/gnu-libstdc++/libs/armeabi/include/bits/c++config.h
- /opt/android-ndk-r6/sources/cxx-stl/gnu-libstdc++/libs/armeabi/include/bits/cpu_defines.h
- /opt/android-ndk-r6/sources/cxx-stl/gnu-libstdc++/libs/armeabi/include/bits/os_defines.h
- OpenAL32/Include/alAuxEffectSlot.h
- OpenAL32/Include/alEffect.h
- OpenAL32/Include/alError.h
- OpenAL32/Include/alFilter.h
- OpenAL32/Include/alListener.h
- OpenAL32/Include/alMain.h
- OpenAL32/Include/alSource.h
- OpenAL32/Include/alThunk.h
- OpenAL32/Include/alu.h
- config.h
- include/AL/al.h
- include/AL/alc.h
- include/AL/alext.h
- include/AL/efx.h
-CMakeFiles/openal.dir/OpenAL32/alBuffer.o
- /home/hagish/workspace/adt/love-native-android/jni/openal-soft-android/OpenAL32/alBuffer.c
- /opt/android-ndk-r6/sources/cxx-stl/gnu-libstdc++/include/fenv.h
- /opt/android-ndk-r6/sources/cxx-stl/gnu-libstdc++/include/tr1_impl/cfenv
- /opt/android-ndk-r6/sources/cxx-stl/gnu-libstdc++/libs/armeabi/include/bits/c++config.h
- /opt/android-ndk-r6/sources/cxx-stl/gnu-libstdc++/libs/armeabi/include/bits/cpu_defines.h
- /opt/android-ndk-r6/sources/cxx-stl/gnu-libstdc++/libs/armeabi/include/bits/os_defines.h
- OpenAL32/Include/alBuffer.h
- OpenAL32/Include/alError.h
- OpenAL32/Include/alListener.h
- OpenAL32/Include/alMain.h
- OpenAL32/Include/alThunk.h
- OpenAL32/Include/alu.h
- config.h
- include/AL/al.h
- include/AL/alc.h
- include/AL/alext.h
- include/AL/efx.h
-CMakeFiles/openal.dir/OpenAL32/alEffect.o
- /home/hagish/workspace/adt/love-native-android/jni/openal-soft-android/OpenAL32/alEffect.c
- /opt/android-ndk-r6/sources/cxx-stl/gnu-libstdc++/include/fenv.h
- /opt/android-ndk-r6/sources/cxx-stl/gnu-libstdc++/include/tr1_impl/cfenv
- /opt/android-ndk-r6/sources/cxx-stl/gnu-libstdc++/libs/armeabi/include/bits/c++config.h
- /opt/android-ndk-r6/sources/cxx-stl/gnu-libstdc++/libs/armeabi/include/bits/cpu_defines.h
- /opt/android-ndk-r6/sources/cxx-stl/gnu-libstdc++/libs/armeabi/include/bits/os_defines.h
- OpenAL32/Include/alEffect.h
- OpenAL32/Include/alError.h
- OpenAL32/Include/alListener.h
- OpenAL32/Include/alMain.h
- OpenAL32/Include/alThunk.h
- OpenAL32/Include/alu.h
- config.h
- include/AL/al.h
- include/AL/alc.h
- include/AL/alext.h
- include/AL/efx.h
-CMakeFiles/openal.dir/OpenAL32/alError.o
- /home/hagish/workspace/adt/love-native-android/jni/openal-soft-android/OpenAL32/alError.c
- /opt/android-ndk-r6/sources/cxx-stl/gnu-libstdc++/include/fenv.h
- /opt/android-ndk-r6/sources/cxx-stl/gnu-libstdc++/include/tr1_impl/cfenv
- /opt/android-ndk-r6/sources/cxx-stl/gnu-libstdc++/libs/armeabi/include/bits/c++config.h
- /opt/android-ndk-r6/sources/cxx-stl/gnu-libstdc++/libs/armeabi/include/bits/cpu_defines.h
- /opt/android-ndk-r6/sources/cxx-stl/gnu-libstdc++/libs/armeabi/include/bits/os_defines.h
- OpenAL32/Include/alError.h
- OpenAL32/Include/alListener.h
- OpenAL32/Include/alMain.h
- OpenAL32/Include/alu.h
- config.h
- include/AL/al.h
- include/AL/alc.h
- include/AL/alext.h
- include/AL/efx.h
-CMakeFiles/openal.dir/OpenAL32/alExtension.o
- /home/hagish/workspace/adt/love-native-android/jni/openal-soft-android/OpenAL32/alExtension.c
- /opt/android-ndk-r6/sources/cxx-stl/gnu-libstdc++/include/fenv.h
- /opt/android-ndk-r6/sources/cxx-stl/gnu-libstdc++/include/tr1_impl/cfenv
- /opt/android-ndk-r6/sources/cxx-stl/gnu-libstdc++/libs/armeabi/include/bits/c++config.h
- /opt/android-ndk-r6/sources/cxx-stl/gnu-libstdc++/libs/armeabi/include/bits/cpu_defines.h
- /opt/android-ndk-r6/sources/cxx-stl/gnu-libstdc++/libs/armeabi/include/bits/os_defines.h
- OpenAL32/Include/alAuxEffectSlot.h
- OpenAL32/Include/alBuffer.h
- OpenAL32/Include/alEffect.h
- OpenAL32/Include/alError.h
- OpenAL32/Include/alFilter.h
- OpenAL32/Include/alListener.h
- OpenAL32/Include/alMain.h
- OpenAL32/Include/alSource.h
- OpenAL32/Include/alu.h
- config.h
- include/AL/al.h
- include/AL/alc.h
- include/AL/alext.h
- include/AL/efx.h
-CMakeFiles/openal.dir/OpenAL32/alFilter.o
- /home/hagish/workspace/adt/love-native-android/jni/openal-soft-android/OpenAL32/alFilter.c
- /opt/android-ndk-r6/sources/cxx-stl/gnu-libstdc++/include/fenv.h
- /opt/android-ndk-r6/sources/cxx-stl/gnu-libstdc++/include/tr1_impl/cfenv
- /opt/android-ndk-r6/sources/cxx-stl/gnu-libstdc++/libs/armeabi/include/bits/c++config.h
- /opt/android-ndk-r6/sources/cxx-stl/gnu-libstdc++/libs/armeabi/include/bits/cpu_defines.h
- /opt/android-ndk-r6/sources/cxx-stl/gnu-libstdc++/libs/armeabi/include/bits/os_defines.h
- OpenAL32/Include/alError.h
- OpenAL32/Include/alFilter.h
- OpenAL32/Include/alListener.h
- OpenAL32/Include/alMain.h
- OpenAL32/Include/alThunk.h
- OpenAL32/Include/alu.h
- config.h
- include/AL/al.h
- include/AL/alc.h
- include/AL/alext.h
- include/AL/efx.h
-CMakeFiles/openal.dir/OpenAL32/alListener.o
- /home/hagish/workspace/adt/love-native-android/jni/openal-soft-android/OpenAL32/alListener.c
- /opt/android-ndk-r6/sources/cxx-stl/gnu-libstdc++/include/fenv.h
- /opt/android-ndk-r6/sources/cxx-stl/gnu-libstdc++/include/tr1_impl/cfenv
- /opt/android-ndk-r6/sources/cxx-stl/gnu-libstdc++/libs/armeabi/include/bits/c++config.h
- /opt/android-ndk-r6/sources/cxx-stl/gnu-libstdc++/libs/armeabi/include/bits/cpu_defines.h
- /opt/android-ndk-r6/sources/cxx-stl/gnu-libstdc++/libs/armeabi/include/bits/os_defines.h
- OpenAL32/Include/alError.h
- OpenAL32/Include/alFilter.h
- OpenAL32/Include/alListener.h
- OpenAL32/Include/alMain.h
- OpenAL32/Include/alSource.h
- OpenAL32/Include/alu.h
- config.h
- include/AL/al.h
- include/AL/alc.h
- include/AL/alext.h
- include/AL/efx.h
-CMakeFiles/openal.dir/OpenAL32/alSource.o
- /home/hagish/workspace/adt/love-native-android/jni/openal-soft-android/OpenAL32/alSource.c
- /opt/android-ndk-r6/sources/cxx-stl/gnu-libstdc++/include/fenv.h
- /opt/android-ndk-r6/sources/cxx-stl/gnu-libstdc++/include/tr1_impl/cfenv
- /opt/android-ndk-r6/sources/cxx-stl/gnu-libstdc++/libs/armeabi/include/bits/c++config.h
- /opt/android-ndk-r6/sources/cxx-stl/gnu-libstdc++/libs/armeabi/include/bits/cpu_defines.h
- /opt/android-ndk-r6/sources/cxx-stl/gnu-libstdc++/libs/armeabi/include/bits/os_defines.h
- OpenAL32/Include/alAuxEffectSlot.h
- OpenAL32/Include/alBuffer.h
- OpenAL32/Include/alEffect.h
- OpenAL32/Include/alError.h
- OpenAL32/Include/alFilter.h
- OpenAL32/Include/alListener.h
- OpenAL32/Include/alMain.h
- OpenAL32/Include/alSource.h
- OpenAL32/Include/alThunk.h
- OpenAL32/Include/alu.h
- config.h
- include/AL/al.h
- include/AL/alc.h
- include/AL/alext.h
- include/AL/efx.h
-CMakeFiles/openal.dir/OpenAL32/alState.o
- /home/hagish/workspace/adt/love-native-android/jni/openal-soft-android/OpenAL32/alState.c
- /opt/android-ndk-r6/sources/cxx-stl/gnu-libstdc++/include/fenv.h
- /opt/android-ndk-r6/sources/cxx-stl/gnu-libstdc++/include/tr1_impl/cfenv
- /opt/android-ndk-r6/sources/cxx-stl/gnu-libstdc++/libs/armeabi/include/bits/c++config.h
- /opt/android-ndk-r6/sources/cxx-stl/gnu-libstdc++/libs/armeabi/include/bits/cpu_defines.h
- /opt/android-ndk-r6/sources/cxx-stl/gnu-libstdc++/libs/armeabi/include/bits/os_defines.h
- OpenAL32/Include/alAuxEffectSlot.h
- OpenAL32/Include/alEffect.h
- OpenAL32/Include/alError.h
- OpenAL32/Include/alFilter.h
- OpenAL32/Include/alListener.h
- OpenAL32/Include/alMain.h
- OpenAL32/Include/alSource.h
- OpenAL32/Include/alState.h
- OpenAL32/Include/alu.h
- config.h
- include/AL/al.h
- include/AL/alc.h
- include/AL/alext.h
- include/AL/efx.h
-CMakeFiles/openal.dir/OpenAL32/alThunk.o
- /home/hagish/workspace/adt/love-native-android/jni/openal-soft-android/OpenAL32/alThunk.c
- /opt/android-ndk-r6/sources/cxx-stl/gnu-libstdc++/include/fenv.h
- /opt/android-ndk-r6/sources/cxx-stl/gnu-libstdc++/include/tr1_impl/cfenv
- /opt/android-ndk-r6/sources/cxx-stl/gnu-libstdc++/libs/armeabi/include/bits/c++config.h
- /opt/android-ndk-r6/sources/cxx-stl/gnu-libstdc++/libs/armeabi/include/bits/cpu_defines.h
- /opt/android-ndk-r6/sources/cxx-stl/gnu-libstdc++/libs/armeabi/include/bits/os_defines.h
- OpenAL32/Include/alListener.h
- OpenAL32/Include/alMain.h
- OpenAL32/Include/alThunk.h
- OpenAL32/Include/alu.h
- config.h
- include/AL/al.h
- include/AL/alc.h
- include/AL/alext.h
- include/AL/efx.h

+ 0 - 491
jni/openal-soft-android/CMakeFiles/openal.dir/depend.make

@@ -1,491 +0,0 @@
-# CMAKE generated file: DO NOT EDIT!
-# Generated by "Unix Makefiles" Generator, CMake Version 2.8
-
-CMakeFiles/openal.dir/Alc/ALc.o: Alc/ALc.c
-CMakeFiles/openal.dir/Alc/ALc.o: /opt/android-ndk-r6/sources/cxx-stl/gnu-libstdc++/include/fenv.h
-CMakeFiles/openal.dir/Alc/ALc.o: /opt/android-ndk-r6/sources/cxx-stl/gnu-libstdc++/include/tr1_impl/cfenv
-CMakeFiles/openal.dir/Alc/ALc.o: /opt/android-ndk-r6/sources/cxx-stl/gnu-libstdc++/libs/armeabi/include/bits/c++config.h
-CMakeFiles/openal.dir/Alc/ALc.o: /opt/android-ndk-r6/sources/cxx-stl/gnu-libstdc++/libs/armeabi/include/bits/cpu_defines.h
-CMakeFiles/openal.dir/Alc/ALc.o: /opt/android-ndk-r6/sources/cxx-stl/gnu-libstdc++/libs/armeabi/include/bits/os_defines.h
-CMakeFiles/openal.dir/Alc/ALc.o: OpenAL32/Include/alAuxEffectSlot.h
-CMakeFiles/openal.dir/Alc/ALc.o: OpenAL32/Include/alBuffer.h
-CMakeFiles/openal.dir/Alc/ALc.o: OpenAL32/Include/alEffect.h
-CMakeFiles/openal.dir/Alc/ALc.o: OpenAL32/Include/alError.h
-CMakeFiles/openal.dir/Alc/ALc.o: OpenAL32/Include/alFilter.h
-CMakeFiles/openal.dir/Alc/ALc.o: OpenAL32/Include/alListener.h
-CMakeFiles/openal.dir/Alc/ALc.o: OpenAL32/Include/alMain.h
-CMakeFiles/openal.dir/Alc/ALc.o: OpenAL32/Include/alSource.h
-CMakeFiles/openal.dir/Alc/ALc.o: OpenAL32/Include/alThunk.h
-CMakeFiles/openal.dir/Alc/ALc.o: OpenAL32/Include/alu.h
-CMakeFiles/openal.dir/Alc/ALc.o: OpenAL32/Include/bs2b.h
-CMakeFiles/openal.dir/Alc/ALc.o: config.h
-CMakeFiles/openal.dir/Alc/ALc.o: include/AL/al.h
-CMakeFiles/openal.dir/Alc/ALc.o: include/AL/alc.h
-CMakeFiles/openal.dir/Alc/ALc.o: include/AL/alext.h
-CMakeFiles/openal.dir/Alc/ALc.o: include/AL/efx.h
-
-CMakeFiles/openal.dir/Alc/ALu.o: Alc/ALu.c
-CMakeFiles/openal.dir/Alc/ALu.o: /opt/android-ndk-r6/sources/cxx-stl/gnu-libstdc++/include/fenv.h
-CMakeFiles/openal.dir/Alc/ALu.o: /opt/android-ndk-r6/sources/cxx-stl/gnu-libstdc++/include/tr1_impl/cfenv
-CMakeFiles/openal.dir/Alc/ALu.o: /opt/android-ndk-r6/sources/cxx-stl/gnu-libstdc++/libs/armeabi/include/bits/c++config.h
-CMakeFiles/openal.dir/Alc/ALu.o: /opt/android-ndk-r6/sources/cxx-stl/gnu-libstdc++/libs/armeabi/include/bits/cpu_defines.h
-CMakeFiles/openal.dir/Alc/ALu.o: /opt/android-ndk-r6/sources/cxx-stl/gnu-libstdc++/libs/armeabi/include/bits/os_defines.h
-CMakeFiles/openal.dir/Alc/ALu.o: OpenAL32/Include/alAuxEffectSlot.h
-CMakeFiles/openal.dir/Alc/ALu.o: OpenAL32/Include/alBuffer.h
-CMakeFiles/openal.dir/Alc/ALu.o: OpenAL32/Include/alEffect.h
-CMakeFiles/openal.dir/Alc/ALu.o: OpenAL32/Include/alFilter.h
-CMakeFiles/openal.dir/Alc/ALu.o: OpenAL32/Include/alListener.h
-CMakeFiles/openal.dir/Alc/ALu.o: OpenAL32/Include/alMain.h
-CMakeFiles/openal.dir/Alc/ALu.o: OpenAL32/Include/alSource.h
-CMakeFiles/openal.dir/Alc/ALu.o: OpenAL32/Include/alu.h
-CMakeFiles/openal.dir/Alc/ALu.o: OpenAL32/Include/bs2b.h
-CMakeFiles/openal.dir/Alc/ALu.o: config.h
-CMakeFiles/openal.dir/Alc/ALu.o: include/AL/al.h
-CMakeFiles/openal.dir/Alc/ALu.o: include/AL/alc.h
-CMakeFiles/openal.dir/Alc/ALu.o: include/AL/alext.h
-CMakeFiles/openal.dir/Alc/ALu.o: include/AL/efx.h
-
-CMakeFiles/openal.dir/Alc/alcConfig.o: Alc/alcConfig.c
-CMakeFiles/openal.dir/Alc/alcConfig.o: /opt/android-ndk-r6/sources/cxx-stl/gnu-libstdc++/include/fenv.h
-CMakeFiles/openal.dir/Alc/alcConfig.o: /opt/android-ndk-r6/sources/cxx-stl/gnu-libstdc++/include/tr1_impl/cfenv
-CMakeFiles/openal.dir/Alc/alcConfig.o: /opt/android-ndk-r6/sources/cxx-stl/gnu-libstdc++/libs/armeabi/include/bits/c++config.h
-CMakeFiles/openal.dir/Alc/alcConfig.o: /opt/android-ndk-r6/sources/cxx-stl/gnu-libstdc++/libs/armeabi/include/bits/cpu_defines.h
-CMakeFiles/openal.dir/Alc/alcConfig.o: /opt/android-ndk-r6/sources/cxx-stl/gnu-libstdc++/libs/armeabi/include/bits/os_defines.h
-CMakeFiles/openal.dir/Alc/alcConfig.o: OpenAL32/Include/alListener.h
-CMakeFiles/openal.dir/Alc/alcConfig.o: OpenAL32/Include/alMain.h
-CMakeFiles/openal.dir/Alc/alcConfig.o: OpenAL32/Include/alu.h
-CMakeFiles/openal.dir/Alc/alcConfig.o: config.h
-CMakeFiles/openal.dir/Alc/alcConfig.o: include/AL/al.h
-CMakeFiles/openal.dir/Alc/alcConfig.o: include/AL/alc.h
-CMakeFiles/openal.dir/Alc/alcConfig.o: include/AL/alext.h
-CMakeFiles/openal.dir/Alc/alcConfig.o: include/AL/efx.h
-
-CMakeFiles/openal.dir/Alc/alcDedicated.o: Alc/alcDedicated.c
-CMakeFiles/openal.dir/Alc/alcDedicated.o: /opt/android-ndk-r6/sources/cxx-stl/gnu-libstdc++/include/fenv.h
-CMakeFiles/openal.dir/Alc/alcDedicated.o: /opt/android-ndk-r6/sources/cxx-stl/gnu-libstdc++/include/tr1_impl/cfenv
-CMakeFiles/openal.dir/Alc/alcDedicated.o: /opt/android-ndk-r6/sources/cxx-stl/gnu-libstdc++/libs/armeabi/include/bits/c++config.h
-CMakeFiles/openal.dir/Alc/alcDedicated.o: /opt/android-ndk-r6/sources/cxx-stl/gnu-libstdc++/libs/armeabi/include/bits/cpu_defines.h
-CMakeFiles/openal.dir/Alc/alcDedicated.o: /opt/android-ndk-r6/sources/cxx-stl/gnu-libstdc++/libs/armeabi/include/bits/os_defines.h
-CMakeFiles/openal.dir/Alc/alcDedicated.o: OpenAL32/Include/alAuxEffectSlot.h
-CMakeFiles/openal.dir/Alc/alcDedicated.o: OpenAL32/Include/alEffect.h
-CMakeFiles/openal.dir/Alc/alcDedicated.o: OpenAL32/Include/alError.h
-CMakeFiles/openal.dir/Alc/alcDedicated.o: OpenAL32/Include/alFilter.h
-CMakeFiles/openal.dir/Alc/alcDedicated.o: OpenAL32/Include/alListener.h
-CMakeFiles/openal.dir/Alc/alcDedicated.o: OpenAL32/Include/alMain.h
-CMakeFiles/openal.dir/Alc/alcDedicated.o: OpenAL32/Include/alu.h
-CMakeFiles/openal.dir/Alc/alcDedicated.o: config.h
-CMakeFiles/openal.dir/Alc/alcDedicated.o: include/AL/al.h
-CMakeFiles/openal.dir/Alc/alcDedicated.o: include/AL/alc.h
-CMakeFiles/openal.dir/Alc/alcDedicated.o: include/AL/alext.h
-CMakeFiles/openal.dir/Alc/alcDedicated.o: include/AL/efx.h
-
-CMakeFiles/openal.dir/Alc/alcEcho.o: Alc/alcEcho.c
-CMakeFiles/openal.dir/Alc/alcEcho.o: /opt/android-ndk-r6/sources/cxx-stl/gnu-libstdc++/include/fenv.h
-CMakeFiles/openal.dir/Alc/alcEcho.o: /opt/android-ndk-r6/sources/cxx-stl/gnu-libstdc++/include/tr1_impl/cfenv
-CMakeFiles/openal.dir/Alc/alcEcho.o: /opt/android-ndk-r6/sources/cxx-stl/gnu-libstdc++/libs/armeabi/include/bits/c++config.h
-CMakeFiles/openal.dir/Alc/alcEcho.o: /opt/android-ndk-r6/sources/cxx-stl/gnu-libstdc++/libs/armeabi/include/bits/cpu_defines.h
-CMakeFiles/openal.dir/Alc/alcEcho.o: /opt/android-ndk-r6/sources/cxx-stl/gnu-libstdc++/libs/armeabi/include/bits/os_defines.h
-CMakeFiles/openal.dir/Alc/alcEcho.o: OpenAL32/Include/alAuxEffectSlot.h
-CMakeFiles/openal.dir/Alc/alcEcho.o: OpenAL32/Include/alEffect.h
-CMakeFiles/openal.dir/Alc/alcEcho.o: OpenAL32/Include/alError.h
-CMakeFiles/openal.dir/Alc/alcEcho.o: OpenAL32/Include/alFilter.h
-CMakeFiles/openal.dir/Alc/alcEcho.o: OpenAL32/Include/alListener.h
-CMakeFiles/openal.dir/Alc/alcEcho.o: OpenAL32/Include/alMain.h
-CMakeFiles/openal.dir/Alc/alcEcho.o: OpenAL32/Include/alu.h
-CMakeFiles/openal.dir/Alc/alcEcho.o: config.h
-CMakeFiles/openal.dir/Alc/alcEcho.o: include/AL/al.h
-CMakeFiles/openal.dir/Alc/alcEcho.o: include/AL/alc.h
-CMakeFiles/openal.dir/Alc/alcEcho.o: include/AL/alext.h
-CMakeFiles/openal.dir/Alc/alcEcho.o: include/AL/efx.h
-
-CMakeFiles/openal.dir/Alc/alcModulator.o: Alc/alcModulator.c
-CMakeFiles/openal.dir/Alc/alcModulator.o: /opt/android-ndk-r6/sources/cxx-stl/gnu-libstdc++/include/fenv.h
-CMakeFiles/openal.dir/Alc/alcModulator.o: /opt/android-ndk-r6/sources/cxx-stl/gnu-libstdc++/include/tr1_impl/cfenv
-CMakeFiles/openal.dir/Alc/alcModulator.o: /opt/android-ndk-r6/sources/cxx-stl/gnu-libstdc++/libs/armeabi/include/bits/c++config.h
-CMakeFiles/openal.dir/Alc/alcModulator.o: /opt/android-ndk-r6/sources/cxx-stl/gnu-libstdc++/libs/armeabi/include/bits/cpu_defines.h
-CMakeFiles/openal.dir/Alc/alcModulator.o: /opt/android-ndk-r6/sources/cxx-stl/gnu-libstdc++/libs/armeabi/include/bits/os_defines.h
-CMakeFiles/openal.dir/Alc/alcModulator.o: OpenAL32/Include/alAuxEffectSlot.h
-CMakeFiles/openal.dir/Alc/alcModulator.o: OpenAL32/Include/alEffect.h
-CMakeFiles/openal.dir/Alc/alcModulator.o: OpenAL32/Include/alError.h
-CMakeFiles/openal.dir/Alc/alcModulator.o: OpenAL32/Include/alFilter.h
-CMakeFiles/openal.dir/Alc/alcModulator.o: OpenAL32/Include/alListener.h
-CMakeFiles/openal.dir/Alc/alcModulator.o: OpenAL32/Include/alMain.h
-CMakeFiles/openal.dir/Alc/alcModulator.o: OpenAL32/Include/alu.h
-CMakeFiles/openal.dir/Alc/alcModulator.o: config.h
-CMakeFiles/openal.dir/Alc/alcModulator.o: include/AL/al.h
-CMakeFiles/openal.dir/Alc/alcModulator.o: include/AL/alc.h
-CMakeFiles/openal.dir/Alc/alcModulator.o: include/AL/alext.h
-CMakeFiles/openal.dir/Alc/alcModulator.o: include/AL/efx.h
-
-CMakeFiles/openal.dir/Alc/alcReverb.o: Alc/alcReverb.c
-CMakeFiles/openal.dir/Alc/alcReverb.o: /opt/android-ndk-r6/sources/cxx-stl/gnu-libstdc++/include/fenv.h
-CMakeFiles/openal.dir/Alc/alcReverb.o: /opt/android-ndk-r6/sources/cxx-stl/gnu-libstdc++/include/tr1_impl/cfenv
-CMakeFiles/openal.dir/Alc/alcReverb.o: /opt/android-ndk-r6/sources/cxx-stl/gnu-libstdc++/libs/armeabi/include/bits/c++config.h
-CMakeFiles/openal.dir/Alc/alcReverb.o: /opt/android-ndk-r6/sources/cxx-stl/gnu-libstdc++/libs/armeabi/include/bits/cpu_defines.h
-CMakeFiles/openal.dir/Alc/alcReverb.o: /opt/android-ndk-r6/sources/cxx-stl/gnu-libstdc++/libs/armeabi/include/bits/os_defines.h
-CMakeFiles/openal.dir/Alc/alcReverb.o: OpenAL32/Include/alAuxEffectSlot.h
-CMakeFiles/openal.dir/Alc/alcReverb.o: OpenAL32/Include/alEffect.h
-CMakeFiles/openal.dir/Alc/alcReverb.o: OpenAL32/Include/alError.h
-CMakeFiles/openal.dir/Alc/alcReverb.o: OpenAL32/Include/alFilter.h
-CMakeFiles/openal.dir/Alc/alcReverb.o: OpenAL32/Include/alListener.h
-CMakeFiles/openal.dir/Alc/alcReverb.o: OpenAL32/Include/alMain.h
-CMakeFiles/openal.dir/Alc/alcReverb.o: OpenAL32/Include/alu.h
-CMakeFiles/openal.dir/Alc/alcReverb.o: config.h
-CMakeFiles/openal.dir/Alc/alcReverb.o: include/AL/al.h
-CMakeFiles/openal.dir/Alc/alcReverb.o: include/AL/alc.h
-CMakeFiles/openal.dir/Alc/alcReverb.o: include/AL/alext.h
-CMakeFiles/openal.dir/Alc/alcReverb.o: include/AL/efx.h
-
-CMakeFiles/openal.dir/Alc/alcRing.o: Alc/alcRing.c
-CMakeFiles/openal.dir/Alc/alcRing.o: /opt/android-ndk-r6/sources/cxx-stl/gnu-libstdc++/include/fenv.h
-CMakeFiles/openal.dir/Alc/alcRing.o: /opt/android-ndk-r6/sources/cxx-stl/gnu-libstdc++/include/tr1_impl/cfenv
-CMakeFiles/openal.dir/Alc/alcRing.o: /opt/android-ndk-r6/sources/cxx-stl/gnu-libstdc++/libs/armeabi/include/bits/c++config.h
-CMakeFiles/openal.dir/Alc/alcRing.o: /opt/android-ndk-r6/sources/cxx-stl/gnu-libstdc++/libs/armeabi/include/bits/cpu_defines.h
-CMakeFiles/openal.dir/Alc/alcRing.o: /opt/android-ndk-r6/sources/cxx-stl/gnu-libstdc++/libs/armeabi/include/bits/os_defines.h
-CMakeFiles/openal.dir/Alc/alcRing.o: OpenAL32/Include/alListener.h
-CMakeFiles/openal.dir/Alc/alcRing.o: OpenAL32/Include/alMain.h
-CMakeFiles/openal.dir/Alc/alcRing.o: OpenAL32/Include/alu.h
-CMakeFiles/openal.dir/Alc/alcRing.o: config.h
-CMakeFiles/openal.dir/Alc/alcRing.o: include/AL/al.h
-CMakeFiles/openal.dir/Alc/alcRing.o: include/AL/alc.h
-CMakeFiles/openal.dir/Alc/alcRing.o: include/AL/alext.h
-CMakeFiles/openal.dir/Alc/alcRing.o: include/AL/efx.h
-
-CMakeFiles/openal.dir/Alc/alcThread.o: Alc/alcThread.c
-CMakeFiles/openal.dir/Alc/alcThread.o: /opt/android-ndk-r6/sources/cxx-stl/gnu-libstdc++/include/fenv.h
-CMakeFiles/openal.dir/Alc/alcThread.o: /opt/android-ndk-r6/sources/cxx-stl/gnu-libstdc++/include/tr1_impl/cfenv
-CMakeFiles/openal.dir/Alc/alcThread.o: /opt/android-ndk-r6/sources/cxx-stl/gnu-libstdc++/libs/armeabi/include/bits/c++config.h
-CMakeFiles/openal.dir/Alc/alcThread.o: /opt/android-ndk-r6/sources/cxx-stl/gnu-libstdc++/libs/armeabi/include/bits/cpu_defines.h
-CMakeFiles/openal.dir/Alc/alcThread.o: /opt/android-ndk-r6/sources/cxx-stl/gnu-libstdc++/libs/armeabi/include/bits/os_defines.h
-CMakeFiles/openal.dir/Alc/alcThread.o: OpenAL32/Include/alListener.h
-CMakeFiles/openal.dir/Alc/alcThread.o: OpenAL32/Include/alMain.h
-CMakeFiles/openal.dir/Alc/alcThread.o: OpenAL32/Include/alThunk.h
-CMakeFiles/openal.dir/Alc/alcThread.o: OpenAL32/Include/alu.h
-CMakeFiles/openal.dir/Alc/alcThread.o: config.h
-CMakeFiles/openal.dir/Alc/alcThread.o: include/AL/al.h
-CMakeFiles/openal.dir/Alc/alcThread.o: include/AL/alc.h
-CMakeFiles/openal.dir/Alc/alcThread.o: include/AL/alext.h
-CMakeFiles/openal.dir/Alc/alcThread.o: include/AL/efx.h
-
-CMakeFiles/openal.dir/Alc/backends/android.o: Alc/backends/android.c
-CMakeFiles/openal.dir/Alc/backends/android.o: /opt/android-ndk-r6/sources/cxx-stl/gnu-libstdc++/include/fenv.h
-CMakeFiles/openal.dir/Alc/backends/android.o: /opt/android-ndk-r6/sources/cxx-stl/gnu-libstdc++/include/tr1_impl/cfenv
-CMakeFiles/openal.dir/Alc/backends/android.o: /opt/android-ndk-r6/sources/cxx-stl/gnu-libstdc++/libs/armeabi/include/bits/c++config.h
-CMakeFiles/openal.dir/Alc/backends/android.o: /opt/android-ndk-r6/sources/cxx-stl/gnu-libstdc++/libs/armeabi/include/bits/cpu_defines.h
-CMakeFiles/openal.dir/Alc/backends/android.o: /opt/android-ndk-r6/sources/cxx-stl/gnu-libstdc++/libs/armeabi/include/bits/os_defines.h
-CMakeFiles/openal.dir/Alc/backends/android.o: OpenAL32/Include/alListener.h
-CMakeFiles/openal.dir/Alc/backends/android.o: OpenAL32/Include/alMain.h
-CMakeFiles/openal.dir/Alc/backends/android.o: OpenAL32/Include/alu.h
-CMakeFiles/openal.dir/Alc/backends/android.o: config.h
-CMakeFiles/openal.dir/Alc/backends/android.o: include/AL/al.h
-CMakeFiles/openal.dir/Alc/backends/android.o: include/AL/alc.h
-CMakeFiles/openal.dir/Alc/backends/android.o: include/AL/alext.h
-CMakeFiles/openal.dir/Alc/backends/android.o: include/AL/efx.h
-
-CMakeFiles/openal.dir/Alc/backends/loopback.o: Alc/backends/loopback.c
-CMakeFiles/openal.dir/Alc/backends/loopback.o: /opt/android-ndk-r6/sources/cxx-stl/gnu-libstdc++/include/fenv.h
-CMakeFiles/openal.dir/Alc/backends/loopback.o: /opt/android-ndk-r6/sources/cxx-stl/gnu-libstdc++/include/tr1_impl/cfenv
-CMakeFiles/openal.dir/Alc/backends/loopback.o: /opt/android-ndk-r6/sources/cxx-stl/gnu-libstdc++/libs/armeabi/include/bits/c++config.h
-CMakeFiles/openal.dir/Alc/backends/loopback.o: /opt/android-ndk-r6/sources/cxx-stl/gnu-libstdc++/libs/armeabi/include/bits/cpu_defines.h
-CMakeFiles/openal.dir/Alc/backends/loopback.o: /opt/android-ndk-r6/sources/cxx-stl/gnu-libstdc++/libs/armeabi/include/bits/os_defines.h
-CMakeFiles/openal.dir/Alc/backends/loopback.o: OpenAL32/Include/alListener.h
-CMakeFiles/openal.dir/Alc/backends/loopback.o: OpenAL32/Include/alMain.h
-CMakeFiles/openal.dir/Alc/backends/loopback.o: OpenAL32/Include/alu.h
-CMakeFiles/openal.dir/Alc/backends/loopback.o: config.h
-CMakeFiles/openal.dir/Alc/backends/loopback.o: include/AL/al.h
-CMakeFiles/openal.dir/Alc/backends/loopback.o: include/AL/alc.h
-CMakeFiles/openal.dir/Alc/backends/loopback.o: include/AL/alext.h
-CMakeFiles/openal.dir/Alc/backends/loopback.o: include/AL/efx.h
-
-CMakeFiles/openal.dir/Alc/backends/null.o: Alc/backends/null.c
-CMakeFiles/openal.dir/Alc/backends/null.o: /opt/android-ndk-r6/sources/cxx-stl/gnu-libstdc++/include/fenv.h
-CMakeFiles/openal.dir/Alc/backends/null.o: /opt/android-ndk-r6/sources/cxx-stl/gnu-libstdc++/include/tr1_impl/cfenv
-CMakeFiles/openal.dir/Alc/backends/null.o: /opt/android-ndk-r6/sources/cxx-stl/gnu-libstdc++/libs/armeabi/include/bits/c++config.h
-CMakeFiles/openal.dir/Alc/backends/null.o: /opt/android-ndk-r6/sources/cxx-stl/gnu-libstdc++/libs/armeabi/include/bits/cpu_defines.h
-CMakeFiles/openal.dir/Alc/backends/null.o: /opt/android-ndk-r6/sources/cxx-stl/gnu-libstdc++/libs/armeabi/include/bits/os_defines.h
-CMakeFiles/openal.dir/Alc/backends/null.o: OpenAL32/Include/alListener.h
-CMakeFiles/openal.dir/Alc/backends/null.o: OpenAL32/Include/alMain.h
-CMakeFiles/openal.dir/Alc/backends/null.o: OpenAL32/Include/alu.h
-CMakeFiles/openal.dir/Alc/backends/null.o: config.h
-CMakeFiles/openal.dir/Alc/backends/null.o: include/AL/al.h
-CMakeFiles/openal.dir/Alc/backends/null.o: include/AL/alc.h
-CMakeFiles/openal.dir/Alc/backends/null.o: include/AL/alext.h
-CMakeFiles/openal.dir/Alc/backends/null.o: include/AL/efx.h
-
-CMakeFiles/openal.dir/Alc/backends/wave.o: Alc/backends/wave.c
-CMakeFiles/openal.dir/Alc/backends/wave.o: /opt/android-ndk-r6/sources/cxx-stl/gnu-libstdc++/include/fenv.h
-CMakeFiles/openal.dir/Alc/backends/wave.o: /opt/android-ndk-r6/sources/cxx-stl/gnu-libstdc++/include/tr1_impl/cfenv
-CMakeFiles/openal.dir/Alc/backends/wave.o: /opt/android-ndk-r6/sources/cxx-stl/gnu-libstdc++/libs/armeabi/include/bits/c++config.h
-CMakeFiles/openal.dir/Alc/backends/wave.o: /opt/android-ndk-r6/sources/cxx-stl/gnu-libstdc++/libs/armeabi/include/bits/cpu_defines.h
-CMakeFiles/openal.dir/Alc/backends/wave.o: /opt/android-ndk-r6/sources/cxx-stl/gnu-libstdc++/libs/armeabi/include/bits/os_defines.h
-CMakeFiles/openal.dir/Alc/backends/wave.o: OpenAL32/Include/alListener.h
-CMakeFiles/openal.dir/Alc/backends/wave.o: OpenAL32/Include/alMain.h
-CMakeFiles/openal.dir/Alc/backends/wave.o: OpenAL32/Include/alu.h
-CMakeFiles/openal.dir/Alc/backends/wave.o: config.h
-CMakeFiles/openal.dir/Alc/backends/wave.o: include/AL/al.h
-CMakeFiles/openal.dir/Alc/backends/wave.o: include/AL/alc.h
-CMakeFiles/openal.dir/Alc/backends/wave.o: include/AL/alext.h
-CMakeFiles/openal.dir/Alc/backends/wave.o: include/AL/efx.h
-
-CMakeFiles/openal.dir/Alc/bs2b.o: Alc/bs2b.c
-CMakeFiles/openal.dir/Alc/bs2b.o: OpenAL32/Include/bs2b.h
-CMakeFiles/openal.dir/Alc/bs2b.o: config.h
-
-CMakeFiles/openal.dir/Alc/helpers.o: Alc/helpers.c
-CMakeFiles/openal.dir/Alc/helpers.o: /opt/android-ndk-r6/sources/cxx-stl/gnu-libstdc++/include/fenv.h
-CMakeFiles/openal.dir/Alc/helpers.o: /opt/android-ndk-r6/sources/cxx-stl/gnu-libstdc++/include/tr1_impl/cfenv
-CMakeFiles/openal.dir/Alc/helpers.o: /opt/android-ndk-r6/sources/cxx-stl/gnu-libstdc++/libs/armeabi/include/bits/c++config.h
-CMakeFiles/openal.dir/Alc/helpers.o: /opt/android-ndk-r6/sources/cxx-stl/gnu-libstdc++/libs/armeabi/include/bits/cpu_defines.h
-CMakeFiles/openal.dir/Alc/helpers.o: /opt/android-ndk-r6/sources/cxx-stl/gnu-libstdc++/libs/armeabi/include/bits/os_defines.h
-CMakeFiles/openal.dir/Alc/helpers.o: OpenAL32/Include/alListener.h
-CMakeFiles/openal.dir/Alc/helpers.o: OpenAL32/Include/alMain.h
-CMakeFiles/openal.dir/Alc/helpers.o: OpenAL32/Include/alu.h
-CMakeFiles/openal.dir/Alc/helpers.o: config.h
-CMakeFiles/openal.dir/Alc/helpers.o: include/AL/al.h
-CMakeFiles/openal.dir/Alc/helpers.o: include/AL/alc.h
-CMakeFiles/openal.dir/Alc/helpers.o: include/AL/alext.h
-CMakeFiles/openal.dir/Alc/helpers.o: include/AL/efx.h
-
-CMakeFiles/openal.dir/Alc/hrtf.o: Alc/hrtf.c
-CMakeFiles/openal.dir/Alc/hrtf.o: Alc/hrtf_tables.inc
-CMakeFiles/openal.dir/Alc/hrtf.o: /opt/android-ndk-r6/sources/cxx-stl/gnu-libstdc++/include/fenv.h
-CMakeFiles/openal.dir/Alc/hrtf.o: /opt/android-ndk-r6/sources/cxx-stl/gnu-libstdc++/include/tr1_impl/cfenv
-CMakeFiles/openal.dir/Alc/hrtf.o: /opt/android-ndk-r6/sources/cxx-stl/gnu-libstdc++/libs/armeabi/include/bits/c++config.h
-CMakeFiles/openal.dir/Alc/hrtf.o: /opt/android-ndk-r6/sources/cxx-stl/gnu-libstdc++/libs/armeabi/include/bits/cpu_defines.h
-CMakeFiles/openal.dir/Alc/hrtf.o: /opt/android-ndk-r6/sources/cxx-stl/gnu-libstdc++/libs/armeabi/include/bits/os_defines.h
-CMakeFiles/openal.dir/Alc/hrtf.o: OpenAL32/Include/alFilter.h
-CMakeFiles/openal.dir/Alc/hrtf.o: OpenAL32/Include/alListener.h
-CMakeFiles/openal.dir/Alc/hrtf.o: OpenAL32/Include/alMain.h
-CMakeFiles/openal.dir/Alc/hrtf.o: OpenAL32/Include/alSource.h
-CMakeFiles/openal.dir/Alc/hrtf.o: OpenAL32/Include/alu.h
-CMakeFiles/openal.dir/Alc/hrtf.o: config.h
-CMakeFiles/openal.dir/Alc/hrtf.o: include/AL/al.h
-CMakeFiles/openal.dir/Alc/hrtf.o: include/AL/alc.h
-CMakeFiles/openal.dir/Alc/hrtf.o: include/AL/alext.h
-CMakeFiles/openal.dir/Alc/hrtf.o: include/AL/efx.h
-
-CMakeFiles/openal.dir/Alc/mixer.o: Alc/mixer.c
-CMakeFiles/openal.dir/Alc/mixer.o: /opt/android-ndk-r6/sources/cxx-stl/gnu-libstdc++/include/fenv.h
-CMakeFiles/openal.dir/Alc/mixer.o: /opt/android-ndk-r6/sources/cxx-stl/gnu-libstdc++/include/tr1_impl/cfenv
-CMakeFiles/openal.dir/Alc/mixer.o: /opt/android-ndk-r6/sources/cxx-stl/gnu-libstdc++/libs/armeabi/include/bits/c++config.h
-CMakeFiles/openal.dir/Alc/mixer.o: /opt/android-ndk-r6/sources/cxx-stl/gnu-libstdc++/libs/armeabi/include/bits/cpu_defines.h
-CMakeFiles/openal.dir/Alc/mixer.o: /opt/android-ndk-r6/sources/cxx-stl/gnu-libstdc++/libs/armeabi/include/bits/os_defines.h
-CMakeFiles/openal.dir/Alc/mixer.o: OpenAL32/Include/alAuxEffectSlot.h
-CMakeFiles/openal.dir/Alc/mixer.o: OpenAL32/Include/alBuffer.h
-CMakeFiles/openal.dir/Alc/mixer.o: OpenAL32/Include/alEffect.h
-CMakeFiles/openal.dir/Alc/mixer.o: OpenAL32/Include/alFilter.h
-CMakeFiles/openal.dir/Alc/mixer.o: OpenAL32/Include/alListener.h
-CMakeFiles/openal.dir/Alc/mixer.o: OpenAL32/Include/alMain.h
-CMakeFiles/openal.dir/Alc/mixer.o: OpenAL32/Include/alSource.h
-CMakeFiles/openal.dir/Alc/mixer.o: OpenAL32/Include/alu.h
-CMakeFiles/openal.dir/Alc/mixer.o: OpenAL32/Include/bs2b.h
-CMakeFiles/openal.dir/Alc/mixer.o: config.h
-CMakeFiles/openal.dir/Alc/mixer.o: include/AL/al.h
-CMakeFiles/openal.dir/Alc/mixer.o: include/AL/alc.h
-CMakeFiles/openal.dir/Alc/mixer.o: include/AL/alext.h
-CMakeFiles/openal.dir/Alc/mixer.o: include/AL/efx.h
-
-CMakeFiles/openal.dir/Alc/panning.o: Alc/panning.c
-CMakeFiles/openal.dir/Alc/panning.o: /opt/android-ndk-r6/sources/cxx-stl/gnu-libstdc++/include/fenv.h
-CMakeFiles/openal.dir/Alc/panning.o: /opt/android-ndk-r6/sources/cxx-stl/gnu-libstdc++/include/tr1_impl/cfenv
-CMakeFiles/openal.dir/Alc/panning.o: /opt/android-ndk-r6/sources/cxx-stl/gnu-libstdc++/libs/armeabi/include/bits/c++config.h
-CMakeFiles/openal.dir/Alc/panning.o: /opt/android-ndk-r6/sources/cxx-stl/gnu-libstdc++/libs/armeabi/include/bits/cpu_defines.h
-CMakeFiles/openal.dir/Alc/panning.o: /opt/android-ndk-r6/sources/cxx-stl/gnu-libstdc++/libs/armeabi/include/bits/os_defines.h
-CMakeFiles/openal.dir/Alc/panning.o: OpenAL32/Include/alListener.h
-CMakeFiles/openal.dir/Alc/panning.o: OpenAL32/Include/alMain.h
-CMakeFiles/openal.dir/Alc/panning.o: OpenAL32/Include/alu.h
-CMakeFiles/openal.dir/Alc/panning.o: config.h
-CMakeFiles/openal.dir/Alc/panning.o: include/AL/al.h
-CMakeFiles/openal.dir/Alc/panning.o: include/AL/alc.h
-CMakeFiles/openal.dir/Alc/panning.o: include/AL/alext.h
-CMakeFiles/openal.dir/Alc/panning.o: include/AL/efx.h
-
-CMakeFiles/openal.dir/OpenAL32/alAuxEffectSlot.o: OpenAL32/alAuxEffectSlot.c
-CMakeFiles/openal.dir/OpenAL32/alAuxEffectSlot.o: /opt/android-ndk-r6/sources/cxx-stl/gnu-libstdc++/include/fenv.h
-CMakeFiles/openal.dir/OpenAL32/alAuxEffectSlot.o: /opt/android-ndk-r6/sources/cxx-stl/gnu-libstdc++/include/tr1_impl/cfenv
-CMakeFiles/openal.dir/OpenAL32/alAuxEffectSlot.o: /opt/android-ndk-r6/sources/cxx-stl/gnu-libstdc++/libs/armeabi/include/bits/c++config.h
-CMakeFiles/openal.dir/OpenAL32/alAuxEffectSlot.o: /opt/android-ndk-r6/sources/cxx-stl/gnu-libstdc++/libs/armeabi/include/bits/cpu_defines.h
-CMakeFiles/openal.dir/OpenAL32/alAuxEffectSlot.o: /opt/android-ndk-r6/sources/cxx-stl/gnu-libstdc++/libs/armeabi/include/bits/os_defines.h
-CMakeFiles/openal.dir/OpenAL32/alAuxEffectSlot.o: OpenAL32/Include/alAuxEffectSlot.h
-CMakeFiles/openal.dir/OpenAL32/alAuxEffectSlot.o: OpenAL32/Include/alEffect.h
-CMakeFiles/openal.dir/OpenAL32/alAuxEffectSlot.o: OpenAL32/Include/alError.h
-CMakeFiles/openal.dir/OpenAL32/alAuxEffectSlot.o: OpenAL32/Include/alFilter.h
-CMakeFiles/openal.dir/OpenAL32/alAuxEffectSlot.o: OpenAL32/Include/alListener.h
-CMakeFiles/openal.dir/OpenAL32/alAuxEffectSlot.o: OpenAL32/Include/alMain.h
-CMakeFiles/openal.dir/OpenAL32/alAuxEffectSlot.o: OpenAL32/Include/alSource.h
-CMakeFiles/openal.dir/OpenAL32/alAuxEffectSlot.o: OpenAL32/Include/alThunk.h
-CMakeFiles/openal.dir/OpenAL32/alAuxEffectSlot.o: OpenAL32/Include/alu.h
-CMakeFiles/openal.dir/OpenAL32/alAuxEffectSlot.o: config.h
-CMakeFiles/openal.dir/OpenAL32/alAuxEffectSlot.o: include/AL/al.h
-CMakeFiles/openal.dir/OpenAL32/alAuxEffectSlot.o: include/AL/alc.h
-CMakeFiles/openal.dir/OpenAL32/alAuxEffectSlot.o: include/AL/alext.h
-CMakeFiles/openal.dir/OpenAL32/alAuxEffectSlot.o: include/AL/efx.h
-
-CMakeFiles/openal.dir/OpenAL32/alBuffer.o: OpenAL32/alBuffer.c
-CMakeFiles/openal.dir/OpenAL32/alBuffer.o: /opt/android-ndk-r6/sources/cxx-stl/gnu-libstdc++/include/fenv.h
-CMakeFiles/openal.dir/OpenAL32/alBuffer.o: /opt/android-ndk-r6/sources/cxx-stl/gnu-libstdc++/include/tr1_impl/cfenv
-CMakeFiles/openal.dir/OpenAL32/alBuffer.o: /opt/android-ndk-r6/sources/cxx-stl/gnu-libstdc++/libs/armeabi/include/bits/c++config.h
-CMakeFiles/openal.dir/OpenAL32/alBuffer.o: /opt/android-ndk-r6/sources/cxx-stl/gnu-libstdc++/libs/armeabi/include/bits/cpu_defines.h
-CMakeFiles/openal.dir/OpenAL32/alBuffer.o: /opt/android-ndk-r6/sources/cxx-stl/gnu-libstdc++/libs/armeabi/include/bits/os_defines.h
-CMakeFiles/openal.dir/OpenAL32/alBuffer.o: OpenAL32/Include/alBuffer.h
-CMakeFiles/openal.dir/OpenAL32/alBuffer.o: OpenAL32/Include/alError.h
-CMakeFiles/openal.dir/OpenAL32/alBuffer.o: OpenAL32/Include/alListener.h
-CMakeFiles/openal.dir/OpenAL32/alBuffer.o: OpenAL32/Include/alMain.h
-CMakeFiles/openal.dir/OpenAL32/alBuffer.o: OpenAL32/Include/alThunk.h
-CMakeFiles/openal.dir/OpenAL32/alBuffer.o: OpenAL32/Include/alu.h
-CMakeFiles/openal.dir/OpenAL32/alBuffer.o: config.h
-CMakeFiles/openal.dir/OpenAL32/alBuffer.o: include/AL/al.h
-CMakeFiles/openal.dir/OpenAL32/alBuffer.o: include/AL/alc.h
-CMakeFiles/openal.dir/OpenAL32/alBuffer.o: include/AL/alext.h
-CMakeFiles/openal.dir/OpenAL32/alBuffer.o: include/AL/efx.h
-
-CMakeFiles/openal.dir/OpenAL32/alEffect.o: OpenAL32/alEffect.c
-CMakeFiles/openal.dir/OpenAL32/alEffect.o: /opt/android-ndk-r6/sources/cxx-stl/gnu-libstdc++/include/fenv.h
-CMakeFiles/openal.dir/OpenAL32/alEffect.o: /opt/android-ndk-r6/sources/cxx-stl/gnu-libstdc++/include/tr1_impl/cfenv
-CMakeFiles/openal.dir/OpenAL32/alEffect.o: /opt/android-ndk-r6/sources/cxx-stl/gnu-libstdc++/libs/armeabi/include/bits/c++config.h
-CMakeFiles/openal.dir/OpenAL32/alEffect.o: /opt/android-ndk-r6/sources/cxx-stl/gnu-libstdc++/libs/armeabi/include/bits/cpu_defines.h
-CMakeFiles/openal.dir/OpenAL32/alEffect.o: /opt/android-ndk-r6/sources/cxx-stl/gnu-libstdc++/libs/armeabi/include/bits/os_defines.h
-CMakeFiles/openal.dir/OpenAL32/alEffect.o: OpenAL32/Include/alEffect.h
-CMakeFiles/openal.dir/OpenAL32/alEffect.o: OpenAL32/Include/alError.h
-CMakeFiles/openal.dir/OpenAL32/alEffect.o: OpenAL32/Include/alListener.h
-CMakeFiles/openal.dir/OpenAL32/alEffect.o: OpenAL32/Include/alMain.h
-CMakeFiles/openal.dir/OpenAL32/alEffect.o: OpenAL32/Include/alThunk.h
-CMakeFiles/openal.dir/OpenAL32/alEffect.o: OpenAL32/Include/alu.h
-CMakeFiles/openal.dir/OpenAL32/alEffect.o: config.h
-CMakeFiles/openal.dir/OpenAL32/alEffect.o: include/AL/al.h
-CMakeFiles/openal.dir/OpenAL32/alEffect.o: include/AL/alc.h
-CMakeFiles/openal.dir/OpenAL32/alEffect.o: include/AL/alext.h
-CMakeFiles/openal.dir/OpenAL32/alEffect.o: include/AL/efx.h
-
-CMakeFiles/openal.dir/OpenAL32/alError.o: OpenAL32/alError.c
-CMakeFiles/openal.dir/OpenAL32/alError.o: /opt/android-ndk-r6/sources/cxx-stl/gnu-libstdc++/include/fenv.h
-CMakeFiles/openal.dir/OpenAL32/alError.o: /opt/android-ndk-r6/sources/cxx-stl/gnu-libstdc++/include/tr1_impl/cfenv
-CMakeFiles/openal.dir/OpenAL32/alError.o: /opt/android-ndk-r6/sources/cxx-stl/gnu-libstdc++/libs/armeabi/include/bits/c++config.h
-CMakeFiles/openal.dir/OpenAL32/alError.o: /opt/android-ndk-r6/sources/cxx-stl/gnu-libstdc++/libs/armeabi/include/bits/cpu_defines.h
-CMakeFiles/openal.dir/OpenAL32/alError.o: /opt/android-ndk-r6/sources/cxx-stl/gnu-libstdc++/libs/armeabi/include/bits/os_defines.h
-CMakeFiles/openal.dir/OpenAL32/alError.o: OpenAL32/Include/alError.h
-CMakeFiles/openal.dir/OpenAL32/alError.o: OpenAL32/Include/alListener.h
-CMakeFiles/openal.dir/OpenAL32/alError.o: OpenAL32/Include/alMain.h
-CMakeFiles/openal.dir/OpenAL32/alError.o: OpenAL32/Include/alu.h
-CMakeFiles/openal.dir/OpenAL32/alError.o: config.h
-CMakeFiles/openal.dir/OpenAL32/alError.o: include/AL/al.h
-CMakeFiles/openal.dir/OpenAL32/alError.o: include/AL/alc.h
-CMakeFiles/openal.dir/OpenAL32/alError.o: include/AL/alext.h
-CMakeFiles/openal.dir/OpenAL32/alError.o: include/AL/efx.h
-
-CMakeFiles/openal.dir/OpenAL32/alExtension.o: OpenAL32/alExtension.c
-CMakeFiles/openal.dir/OpenAL32/alExtension.o: /opt/android-ndk-r6/sources/cxx-stl/gnu-libstdc++/include/fenv.h
-CMakeFiles/openal.dir/OpenAL32/alExtension.o: /opt/android-ndk-r6/sources/cxx-stl/gnu-libstdc++/include/tr1_impl/cfenv
-CMakeFiles/openal.dir/OpenAL32/alExtension.o: /opt/android-ndk-r6/sources/cxx-stl/gnu-libstdc++/libs/armeabi/include/bits/c++config.h
-CMakeFiles/openal.dir/OpenAL32/alExtension.o: /opt/android-ndk-r6/sources/cxx-stl/gnu-libstdc++/libs/armeabi/include/bits/cpu_defines.h
-CMakeFiles/openal.dir/OpenAL32/alExtension.o: /opt/android-ndk-r6/sources/cxx-stl/gnu-libstdc++/libs/armeabi/include/bits/os_defines.h
-CMakeFiles/openal.dir/OpenAL32/alExtension.o: OpenAL32/Include/alAuxEffectSlot.h
-CMakeFiles/openal.dir/OpenAL32/alExtension.o: OpenAL32/Include/alBuffer.h
-CMakeFiles/openal.dir/OpenAL32/alExtension.o: OpenAL32/Include/alEffect.h
-CMakeFiles/openal.dir/OpenAL32/alExtension.o: OpenAL32/Include/alError.h
-CMakeFiles/openal.dir/OpenAL32/alExtension.o: OpenAL32/Include/alFilter.h
-CMakeFiles/openal.dir/OpenAL32/alExtension.o: OpenAL32/Include/alListener.h
-CMakeFiles/openal.dir/OpenAL32/alExtension.o: OpenAL32/Include/alMain.h
-CMakeFiles/openal.dir/OpenAL32/alExtension.o: OpenAL32/Include/alSource.h
-CMakeFiles/openal.dir/OpenAL32/alExtension.o: OpenAL32/Include/alu.h
-CMakeFiles/openal.dir/OpenAL32/alExtension.o: config.h
-CMakeFiles/openal.dir/OpenAL32/alExtension.o: include/AL/al.h
-CMakeFiles/openal.dir/OpenAL32/alExtension.o: include/AL/alc.h
-CMakeFiles/openal.dir/OpenAL32/alExtension.o: include/AL/alext.h
-CMakeFiles/openal.dir/OpenAL32/alExtension.o: include/AL/efx.h
-
-CMakeFiles/openal.dir/OpenAL32/alFilter.o: OpenAL32/alFilter.c
-CMakeFiles/openal.dir/OpenAL32/alFilter.o: /opt/android-ndk-r6/sources/cxx-stl/gnu-libstdc++/include/fenv.h
-CMakeFiles/openal.dir/OpenAL32/alFilter.o: /opt/android-ndk-r6/sources/cxx-stl/gnu-libstdc++/include/tr1_impl/cfenv
-CMakeFiles/openal.dir/OpenAL32/alFilter.o: /opt/android-ndk-r6/sources/cxx-stl/gnu-libstdc++/libs/armeabi/include/bits/c++config.h
-CMakeFiles/openal.dir/OpenAL32/alFilter.o: /opt/android-ndk-r6/sources/cxx-stl/gnu-libstdc++/libs/armeabi/include/bits/cpu_defines.h
-CMakeFiles/openal.dir/OpenAL32/alFilter.o: /opt/android-ndk-r6/sources/cxx-stl/gnu-libstdc++/libs/armeabi/include/bits/os_defines.h
-CMakeFiles/openal.dir/OpenAL32/alFilter.o: OpenAL32/Include/alError.h
-CMakeFiles/openal.dir/OpenAL32/alFilter.o: OpenAL32/Include/alFilter.h
-CMakeFiles/openal.dir/OpenAL32/alFilter.o: OpenAL32/Include/alListener.h
-CMakeFiles/openal.dir/OpenAL32/alFilter.o: OpenAL32/Include/alMain.h
-CMakeFiles/openal.dir/OpenAL32/alFilter.o: OpenAL32/Include/alThunk.h
-CMakeFiles/openal.dir/OpenAL32/alFilter.o: OpenAL32/Include/alu.h
-CMakeFiles/openal.dir/OpenAL32/alFilter.o: config.h
-CMakeFiles/openal.dir/OpenAL32/alFilter.o: include/AL/al.h
-CMakeFiles/openal.dir/OpenAL32/alFilter.o: include/AL/alc.h
-CMakeFiles/openal.dir/OpenAL32/alFilter.o: include/AL/alext.h
-CMakeFiles/openal.dir/OpenAL32/alFilter.o: include/AL/efx.h
-
-CMakeFiles/openal.dir/OpenAL32/alListener.o: OpenAL32/alListener.c
-CMakeFiles/openal.dir/OpenAL32/alListener.o: /opt/android-ndk-r6/sources/cxx-stl/gnu-libstdc++/include/fenv.h
-CMakeFiles/openal.dir/OpenAL32/alListener.o: /opt/android-ndk-r6/sources/cxx-stl/gnu-libstdc++/include/tr1_impl/cfenv
-CMakeFiles/openal.dir/OpenAL32/alListener.o: /opt/android-ndk-r6/sources/cxx-stl/gnu-libstdc++/libs/armeabi/include/bits/c++config.h
-CMakeFiles/openal.dir/OpenAL32/alListener.o: /opt/android-ndk-r6/sources/cxx-stl/gnu-libstdc++/libs/armeabi/include/bits/cpu_defines.h
-CMakeFiles/openal.dir/OpenAL32/alListener.o: /opt/android-ndk-r6/sources/cxx-stl/gnu-libstdc++/libs/armeabi/include/bits/os_defines.h
-CMakeFiles/openal.dir/OpenAL32/alListener.o: OpenAL32/Include/alError.h
-CMakeFiles/openal.dir/OpenAL32/alListener.o: OpenAL32/Include/alFilter.h
-CMakeFiles/openal.dir/OpenAL32/alListener.o: OpenAL32/Include/alListener.h
-CMakeFiles/openal.dir/OpenAL32/alListener.o: OpenAL32/Include/alMain.h
-CMakeFiles/openal.dir/OpenAL32/alListener.o: OpenAL32/Include/alSource.h
-CMakeFiles/openal.dir/OpenAL32/alListener.o: OpenAL32/Include/alu.h
-CMakeFiles/openal.dir/OpenAL32/alListener.o: config.h
-CMakeFiles/openal.dir/OpenAL32/alListener.o: include/AL/al.h
-CMakeFiles/openal.dir/OpenAL32/alListener.o: include/AL/alc.h
-CMakeFiles/openal.dir/OpenAL32/alListener.o: include/AL/alext.h
-CMakeFiles/openal.dir/OpenAL32/alListener.o: include/AL/efx.h
-
-CMakeFiles/openal.dir/OpenAL32/alSource.o: OpenAL32/alSource.c
-CMakeFiles/openal.dir/OpenAL32/alSource.o: /opt/android-ndk-r6/sources/cxx-stl/gnu-libstdc++/include/fenv.h
-CMakeFiles/openal.dir/OpenAL32/alSource.o: /opt/android-ndk-r6/sources/cxx-stl/gnu-libstdc++/include/tr1_impl/cfenv
-CMakeFiles/openal.dir/OpenAL32/alSource.o: /opt/android-ndk-r6/sources/cxx-stl/gnu-libstdc++/libs/armeabi/include/bits/c++config.h
-CMakeFiles/openal.dir/OpenAL32/alSource.o: /opt/android-ndk-r6/sources/cxx-stl/gnu-libstdc++/libs/armeabi/include/bits/cpu_defines.h
-CMakeFiles/openal.dir/OpenAL32/alSource.o: /opt/android-ndk-r6/sources/cxx-stl/gnu-libstdc++/libs/armeabi/include/bits/os_defines.h
-CMakeFiles/openal.dir/OpenAL32/alSource.o: OpenAL32/Include/alAuxEffectSlot.h
-CMakeFiles/openal.dir/OpenAL32/alSource.o: OpenAL32/Include/alBuffer.h
-CMakeFiles/openal.dir/OpenAL32/alSource.o: OpenAL32/Include/alEffect.h
-CMakeFiles/openal.dir/OpenAL32/alSource.o: OpenAL32/Include/alError.h
-CMakeFiles/openal.dir/OpenAL32/alSource.o: OpenAL32/Include/alFilter.h
-CMakeFiles/openal.dir/OpenAL32/alSource.o: OpenAL32/Include/alListener.h
-CMakeFiles/openal.dir/OpenAL32/alSource.o: OpenAL32/Include/alMain.h
-CMakeFiles/openal.dir/OpenAL32/alSource.o: OpenAL32/Include/alSource.h
-CMakeFiles/openal.dir/OpenAL32/alSource.o: OpenAL32/Include/alThunk.h
-CMakeFiles/openal.dir/OpenAL32/alSource.o: OpenAL32/Include/alu.h
-CMakeFiles/openal.dir/OpenAL32/alSource.o: config.h
-CMakeFiles/openal.dir/OpenAL32/alSource.o: include/AL/al.h
-CMakeFiles/openal.dir/OpenAL32/alSource.o: include/AL/alc.h
-CMakeFiles/openal.dir/OpenAL32/alSource.o: include/AL/alext.h
-CMakeFiles/openal.dir/OpenAL32/alSource.o: include/AL/efx.h
-
-CMakeFiles/openal.dir/OpenAL32/alState.o: OpenAL32/alState.c
-CMakeFiles/openal.dir/OpenAL32/alState.o: /opt/android-ndk-r6/sources/cxx-stl/gnu-libstdc++/include/fenv.h
-CMakeFiles/openal.dir/OpenAL32/alState.o: /opt/android-ndk-r6/sources/cxx-stl/gnu-libstdc++/include/tr1_impl/cfenv
-CMakeFiles/openal.dir/OpenAL32/alState.o: /opt/android-ndk-r6/sources/cxx-stl/gnu-libstdc++/libs/armeabi/include/bits/c++config.h
-CMakeFiles/openal.dir/OpenAL32/alState.o: /opt/android-ndk-r6/sources/cxx-stl/gnu-libstdc++/libs/armeabi/include/bits/cpu_defines.h
-CMakeFiles/openal.dir/OpenAL32/alState.o: /opt/android-ndk-r6/sources/cxx-stl/gnu-libstdc++/libs/armeabi/include/bits/os_defines.h
-CMakeFiles/openal.dir/OpenAL32/alState.o: OpenAL32/Include/alAuxEffectSlot.h
-CMakeFiles/openal.dir/OpenAL32/alState.o: OpenAL32/Include/alEffect.h
-CMakeFiles/openal.dir/OpenAL32/alState.o: OpenAL32/Include/alError.h
-CMakeFiles/openal.dir/OpenAL32/alState.o: OpenAL32/Include/alFilter.h
-CMakeFiles/openal.dir/OpenAL32/alState.o: OpenAL32/Include/alListener.h
-CMakeFiles/openal.dir/OpenAL32/alState.o: OpenAL32/Include/alMain.h
-CMakeFiles/openal.dir/OpenAL32/alState.o: OpenAL32/Include/alSource.h
-CMakeFiles/openal.dir/OpenAL32/alState.o: OpenAL32/Include/alState.h
-CMakeFiles/openal.dir/OpenAL32/alState.o: OpenAL32/Include/alu.h
-CMakeFiles/openal.dir/OpenAL32/alState.o: config.h
-CMakeFiles/openal.dir/OpenAL32/alState.o: include/AL/al.h
-CMakeFiles/openal.dir/OpenAL32/alState.o: include/AL/alc.h
-CMakeFiles/openal.dir/OpenAL32/alState.o: include/AL/alext.h
-CMakeFiles/openal.dir/OpenAL32/alState.o: include/AL/efx.h
-
-CMakeFiles/openal.dir/OpenAL32/alThunk.o: OpenAL32/alThunk.c
-CMakeFiles/openal.dir/OpenAL32/alThunk.o: /opt/android-ndk-r6/sources/cxx-stl/gnu-libstdc++/include/fenv.h
-CMakeFiles/openal.dir/OpenAL32/alThunk.o: /opt/android-ndk-r6/sources/cxx-stl/gnu-libstdc++/include/tr1_impl/cfenv
-CMakeFiles/openal.dir/OpenAL32/alThunk.o: /opt/android-ndk-r6/sources/cxx-stl/gnu-libstdc++/libs/armeabi/include/bits/c++config.h
-CMakeFiles/openal.dir/OpenAL32/alThunk.o: /opt/android-ndk-r6/sources/cxx-stl/gnu-libstdc++/libs/armeabi/include/bits/cpu_defines.h
-CMakeFiles/openal.dir/OpenAL32/alThunk.o: /opt/android-ndk-r6/sources/cxx-stl/gnu-libstdc++/libs/armeabi/include/bits/os_defines.h
-CMakeFiles/openal.dir/OpenAL32/alThunk.o: OpenAL32/Include/alListener.h
-CMakeFiles/openal.dir/OpenAL32/alThunk.o: OpenAL32/Include/alMain.h
-CMakeFiles/openal.dir/OpenAL32/alThunk.o: OpenAL32/Include/alThunk.h
-CMakeFiles/openal.dir/OpenAL32/alThunk.o: OpenAL32/Include/alu.h
-CMakeFiles/openal.dir/OpenAL32/alThunk.o: config.h
-CMakeFiles/openal.dir/OpenAL32/alThunk.o: include/AL/al.h
-CMakeFiles/openal.dir/OpenAL32/alThunk.o: include/AL/alc.h
-CMakeFiles/openal.dir/OpenAL32/alThunk.o: include/AL/alext.h
-CMakeFiles/openal.dir/OpenAL32/alThunk.o: include/AL/efx.h
-

+ 0 - 10
jni/openal-soft-android/CMakeFiles/openal.dir/flags.make

@@ -1,10 +0,0 @@
-# CMAKE generated file: DO NOT EDIT!
-# Generated by "Unix Makefiles" Generator, CMake Version 2.8
-
-# compile C with /opt/android-ndk-r6/toolchains/arm-linux-androideabi-4.4.3/prebuilt/linux-x86/bin/arm-linux-androideabi-gcc
-C_FLAGS = --sysroot=/opt/android-ndk-r6/platforms/android-5/arch-arm -fPIC -DANDROID -Wno-psabi -fsigned-char -mthumb -g -O2 -D_DEBUG -fPIC -I/opt/android-ndk-r6/sources/cxx-stl/gnu-libstdc++/include -I/opt/android-ndk-r6/sources/cxx-stl/gnu-libstdc++/libs/armeabi/include -I/home/hagish/workspace/adt/love-native-android/jni/openal-soft-android/OpenAL32/Include -I/home/hagish/workspace/adt/love-native-android/jni/openal-soft-android/include -I/home/hagish/workspace/adt/love-native-android/jni/openal-soft-android   -Winline -Wall -Wextra -fvisibility=internal
-
-C_DEFINES = -DAL_BUILD_LIBRARY -D_GNU_SOURCE=1
-
-# TARGET_FLAGS = -DAL_ALEXT_PROTOTYPES
-

+ 0 - 1
jni/openal-soft-android/CMakeFiles/openal.dir/link.txt

@@ -1 +0,0 @@
-/opt/android-ndk-r6/toolchains/arm-linux-androideabi-4.4.3/prebuilt/linux-x86/bin/arm-linux-androideabi-gcc  -fPIC --sysroot=/opt/android-ndk-r6/platforms/android-5/arch-arm -fPIC -DANDROID -Wno-psabi -fsigned-char -mthumb -g -O2 -D_DEBUG -Wl,--fix-cortex-a8 -L"/opt/android-ndk-r6/sources/cxx-stl/gnu-libstdc++/libs/armeabi" -L"/usr/local/libs/armeabi" -lstdc++ -lsupc++ -shared -Wl,-soname,libopenal.so.1 -o libopenal.so.1.13.0 CMakeFiles/openal.dir/OpenAL32/alAuxEffectSlot.o CMakeFiles/openal.dir/OpenAL32/alBuffer.o CMakeFiles/openal.dir/OpenAL32/alEffect.o CMakeFiles/openal.dir/OpenAL32/alError.o CMakeFiles/openal.dir/OpenAL32/alExtension.o CMakeFiles/openal.dir/OpenAL32/alFilter.o CMakeFiles/openal.dir/OpenAL32/alListener.o CMakeFiles/openal.dir/OpenAL32/alSource.o CMakeFiles/openal.dir/OpenAL32/alState.o CMakeFiles/openal.dir/OpenAL32/alThunk.o CMakeFiles/openal.dir/Alc/ALc.o CMakeFiles/openal.dir/Alc/ALu.o CMakeFiles/openal.dir/Alc/alcConfig.o CMakeFiles/openal.dir/Alc/alcDedicated.o CMakeFiles/openal.dir/Alc/alcEcho.o CMakeFiles/openal.dir/Alc/alcModulator.o CMakeFiles/openal.dir/Alc/alcReverb.o CMakeFiles/openal.dir/Alc/alcRing.o CMakeFiles/openal.dir/Alc/alcThread.o CMakeFiles/openal.dir/Alc/bs2b.o CMakeFiles/openal.dir/Alc/helpers.o CMakeFiles/openal.dir/Alc/hrtf.o CMakeFiles/openal.dir/Alc/mixer.o CMakeFiles/openal.dir/Alc/panning.o CMakeFiles/openal.dir/Alc/backends/loopback.o CMakeFiles/openal.dir/Alc/backends/null.o CMakeFiles/openal.dir/Alc/backends/android.o CMakeFiles/openal.dir/Alc/backends/wave.o -L/opt/android-ndk-r6/platforms/android-5/arch-arm/usr/lib -ldl -lm -Wl,-rpath,/opt/android-ndk-r6/platforms/android-5/arch-arm/usr/lib 

+ 0 - 29
jni/openal-soft-android/CMakeFiles/openal.dir/progress.make

@@ -1,29 +0,0 @@
-CMAKE_PROGRESS_1 = 1
-CMAKE_PROGRESS_2 = 2
-CMAKE_PROGRESS_3 = 3
-CMAKE_PROGRESS_4 = 4
-CMAKE_PROGRESS_5 = 5
-CMAKE_PROGRESS_6 = 6
-CMAKE_PROGRESS_7 = 7
-CMAKE_PROGRESS_8 = 8
-CMAKE_PROGRESS_9 = 9
-CMAKE_PROGRESS_10 = 10
-CMAKE_PROGRESS_11 = 11
-CMAKE_PROGRESS_12 = 12
-CMAKE_PROGRESS_13 = 13
-CMAKE_PROGRESS_14 = 14
-CMAKE_PROGRESS_15 = 15
-CMAKE_PROGRESS_16 = 16
-CMAKE_PROGRESS_17 = 17
-CMAKE_PROGRESS_18 = 18
-CMAKE_PROGRESS_19 = 19
-CMAKE_PROGRESS_20 = 20
-CMAKE_PROGRESS_21 = 21
-CMAKE_PROGRESS_22 = 22
-CMAKE_PROGRESS_23 = 23
-CMAKE_PROGRESS_24 = 24
-CMAKE_PROGRESS_25 = 25
-CMAKE_PROGRESS_26 = 26
-CMAKE_PROGRESS_27 = 27
-CMAKE_PROGRESS_28 = 28
-

+ 0 - 1
jni/openal-soft-android/CMakeFiles/openal.dir/relink.txt

@@ -1 +0,0 @@
-/opt/android-ndk-r6/toolchains/arm-linux-androideabi-4.4.3/prebuilt/linux-x86/bin/arm-linux-androideabi-gcc  -fPIC --sysroot=/opt/android-ndk-r6/platforms/android-5/arch-arm -fPIC -DANDROID -Wno-psabi -fsigned-char -mthumb -g -O2 -D_DEBUG -Wl,--fix-cortex-a8 -L"/opt/android-ndk-r6/sources/cxx-stl/gnu-libstdc++/libs/armeabi" -L"/usr/local/libs/armeabi" -lstdc++ -lsupc++ -shared -Wl,-soname,libopenal.so.1 -o CMakeFiles/CMakeRelink.dir/libopenal.so.1.13.0 CMakeFiles/openal.dir/OpenAL32/alAuxEffectSlot.o CMakeFiles/openal.dir/OpenAL32/alBuffer.o CMakeFiles/openal.dir/OpenAL32/alEffect.o CMakeFiles/openal.dir/OpenAL32/alError.o CMakeFiles/openal.dir/OpenAL32/alExtension.o CMakeFiles/openal.dir/OpenAL32/alFilter.o CMakeFiles/openal.dir/OpenAL32/alListener.o CMakeFiles/openal.dir/OpenAL32/alSource.o CMakeFiles/openal.dir/OpenAL32/alState.o CMakeFiles/openal.dir/OpenAL32/alThunk.o CMakeFiles/openal.dir/Alc/ALc.o CMakeFiles/openal.dir/Alc/ALu.o CMakeFiles/openal.dir/Alc/alcConfig.o CMakeFiles/openal.dir/Alc/alcDedicated.o CMakeFiles/openal.dir/Alc/alcEcho.o CMakeFiles/openal.dir/Alc/alcModulator.o CMakeFiles/openal.dir/Alc/alcReverb.o CMakeFiles/openal.dir/Alc/alcRing.o CMakeFiles/openal.dir/Alc/alcThread.o CMakeFiles/openal.dir/Alc/bs2b.o CMakeFiles/openal.dir/Alc/helpers.o CMakeFiles/openal.dir/Alc/hrtf.o CMakeFiles/openal.dir/Alc/mixer.o CMakeFiles/openal.dir/Alc/panning.o CMakeFiles/openal.dir/Alc/backends/loopback.o CMakeFiles/openal.dir/Alc/backends/null.o CMakeFiles/openal.dir/Alc/backends/android.o CMakeFiles/openal.dir/Alc/backends/wave.o -L/opt/android-ndk-r6/platforms/android-5/arch-arm/usr/lib -ldl -lm 

+ 0 - 1
jni/openal-soft-android/CMakeFiles/progress.marks

@@ -1 +0,0 @@
-29

+ 404 - 168
jni/openal-soft-android/CMakeLists.txt

@@ -1,12 +1,15 @@
 # CMake build file list for OpenAL
 
-CMAKE_MINIMUM_REQUIRED(VERSION 2.4)
+CMAKE_MINIMUM_REQUIRED(VERSION 2.6)
+
+PROJECT(OpenAL)
 
 IF(COMMAND CMAKE_POLICY)
   CMAKE_POLICY(SET CMP0003 NEW)
+  CMAKE_POLICY(SET CMP0005 NEW)
 ENDIF(COMMAND CMAKE_POLICY)
 
-SET(CMAKE_MODULE_PATH "${CMAKE_SOURCE_DIR}/cmake")
+SET(CMAKE_MODULE_PATH "${OpenAL_SOURCE_DIR}/cmake")
 
 INCLUDE(CheckFunctionExists)
 INCLUDE(CheckLibraryExists)
@@ -19,79 +22,161 @@ INCLUDE(CheckCSourceCompiles)
 INCLUDE(CheckTypeSize)
 
 
-PROJECT(OpenAL C)
+SET(CMAKE_ALLOW_LOOSE_LOOP_CONSTRUCTS TRUE)
 
 
-SET(CMAKE_ALLOW_LOOSE_LOOP_CONSTRUCTS TRUE)
+OPTION(ALSOFT_CPUEXT_SSE  "Check for SSE/SSE2 support" ON)
+OPTION(ALSOFT_CPUEXT_NEON "Check for ARM Neon support" ON)
+
+OPTION(ALSOFT_REQUIRE_SSE  "Require SSE/SSE2 support" OFF)
+OPTION(ALSOFT_REQUIRE_NEON "Require ARM Neon support" OFF)
+
+IF(WIN32)
+    # This option is mainly for static linking OpenAL Soft into another project
+    # that already defines the IDs. It is up to that project to ensure all
+    # required IDs are defined.
+    OPTION(ALSOFT_NO_UID_DEFS "Do not define GUIDs, IIDs, CLSIDs, or PropertyKeys" OFF)
+ENDIF()
+
+
+OPTION(ALSOFT_BACKEND_ALSA    "Check for ALSA backend"                ON)
+OPTION(ALSOFT_BACKEND_OSS     "Check for OSS backend"                 ON)
+OPTION(ALSOFT_BACKEND_SOLARIS "Check for Solaris backend"             ON)
+OPTION(ALSOFT_BACKEND_SNDIO   "Check for SndIO backend"               ON)
+OPTION(ALSOFT_BACKEND_QSA     "Check for QSA backend"                 ON)
+OPTION(ALSOFT_BACKEND_MMDEVAPI "Check for MMDevApi backend"           ON)
+OPTION(ALSOFT_BACKEND_DSOUND   "Check for DirectSound backend"        ON)
+OPTION(ALSOFT_BACKEND_WINMM    "Check for Windows Multimedia backend" ON)
+OPTION(ALSOFT_BACKEND_PORTAUDIO  "Check for PortAudio backend"        ON)
+OPTION(ALSOFT_BACKEND_PULSEAUDIO "Check for PulseAudio backend"       ON)
+OPTION(ALSOFT_BACKEND_COREAUDIO  "Check for CoreAudio backend"        ON)
+OPTION(ALSOFT_BACKEND_OPENSL     "Check for OpenSL backend"           ON)
+OPTION(ALSOFT_BACKEND_WAVE "Enable Wave Writer backend"               ON)
 
+OPTION(ALSOFT_MIDI_FLUIDSYNTH "Check for FluidSynth MIDI"             ON)
 
-OPTION(ALSA    "Check for ALSA backend"                ON)
-OPTION(OSS     "Check for OSS backend"                 ON)
-OPTION(SOLARIS "Check for Solaris backend"             ON)
-OPTION(SNDIO   "Check for SndIO backend"               ON)
-OPTION(MMDEVAPI "Check for MMDevApi"                   ON)
-OPTION(DSOUND  "Check for DirectSound backend"         ON)
-OPTION(WINMM   "Check for Windows Multimedia backend"  ON)
-OPTION(PORTAUDIO  "Check for PortAudio backend"        ON)
-OPTION(PULSEAUDIO "Check for PulseAudio backend"       ON)
-OPTION(COREAUDIO  "Check for CoreAudio backend"        ON)
-OPTION(OPENSL     "Check for OpenSL backend"           ON)
-OPTION(ANDROID    "Check for Android backend"          ON)
-OPTION(ANDROID_LOW_LATENCY "Enable Android low-latency backend" OFF)
-OPTION(WAVE    "Enable Wave Writer backend"            ON)
+OPTION(ALSOFT_REQUIRE_ALSA       "Require ALSA backend"               OFF)
+OPTION(ALSOFT_REQUIRE_OSS        "Require OSS backend"                OFF)
+OPTION(ALSOFT_REQUIRE_SOLARIS    "Require Solaris backend"            OFF)
+OPTION(ALSOFT_REQUIRE_SNDIO      "Require SndIO backend"              OFF)
+OPTION(ALSOFT_REQUIRE_QSA        "Require QSA backend"                OFF)
+OPTION(ALSOFT_REQUIRE_MMDEVAPI   "Require MMDevApi"                   OFF)
+OPTION(ALSOFT_REQUIRE_DSOUND     "Require DirectSound backend"        OFF)
+OPTION(ALSOFT_REQUIRE_WINMM      "Require Windows Multimedia backend" OFF)
+OPTION(ALSOFT_REQUIRE_PORTAUDIO  "Require PortAudio backend"          OFF)
+OPTION(ALSOFT_REQUIRE_PULSEAUDIO "Require PulseAudio backend"         OFF)
+OPTION(ALSOFT_REQUIRE_COREAUDIO  "Require CoreAudio backend"          OFF)
+OPTION(ALSOFT_REQUIRE_OPENSL     "Require OpenSL backend"             OFF)
 
-OPTION(REQUIRE_ALSA       "Require ALSA backend"               OFF)
-OPTION(REQUIRE_OSS        "Require OSS backend"                OFF)
-OPTION(REQUIRE_SOLARIS    "Require Solaris backend"            OFF)
-OPTION(REQUIRE_SNDIO      "Require SndIO backend"              OFF)
-OPTION(REQUIRE_MMDEVAPI   "Require MMDevApi"                   OFF)
-OPTION(REQUIRE_DSOUND     "Require DirectSound backend"        OFF)
-OPTION(REQUIRE_WINMM      "Require Windows Multimedia backend" OFF)
-OPTION(REQUIRE_PORTAUDIO  "Require PortAudio backend"          OFF)
-OPTION(REQUIRE_PULSEAUDIO "Require PulseAudio backend"         OFF)
-OPTION(REQUIRE_COREAUDIO  "Require CoreAudio backend"          OFF)
-OPTION(REQUIRE_OPENSL     "Require OpenSL backend"             OFF)
-OPTION(REQUIRE_ANDROID    "Require Android backend"            OFF)
+OPTION(ALSOFT_REQUIRE_FLUIDSYNTH "Require FluidSynth MIDI"            OFF)
 
-OPTION(DLOPEN  "Check for the dlopen API for loading optional libs"  ON)
+OPTION(ALSOFT_DLOPEN  "Check for the dlopen API for loading optional libs"  ON)
 
-OPTION(WERROR  "Treat compile warnings as errors"      OFF)
+OPTION(ALSOFT_WERROR  "Treat compile warnings as errors"      OFF)
 
-OPTION(UTILS  "Build and install utility programs"  ON)
+OPTION(ALSOFT_UTILS          "Build and install utility programs"         ON)
+OPTION(ALSOFT_NO_CONFIG_UTIL "Disable building the alsoft-config utility" OFF)
 
-OPTION(ALSOFT_CONFIG "Install alsoft.conf configuration file" OFF)
+OPTION(ALSOFT_EXAMPLES  "Build and install example programs"  ON)
+
+OPTION(ALSOFT_CONFIG "Install alsoft.conf sample configuration file" ON)
 
 
 IF(WIN32)
     SET(LIBNAME OpenAL32)
-    ADD_DEFINITIONS("-D_WIN32 -D_WIN32_WINNT=0x0500")
+    ADD_DEFINITIONS("-D_WIN32 -D_WIN32_WINNT=0x0501")
 ELSE()
     SET(LIBNAME openal)
 ENDIF()
 
+# QNX's gcc do not uses /usr/include and /usr/lib pathes by default
+IF ("${CMAKE_C_PLATFORM_ID}" STREQUAL "QNX")
+    ADD_DEFINITIONS("-I/usr/include")
+    SET(EXTRA_LIBS ${EXTRA_LIBS} -L/usr/lib)
+ENDIF()
+
 IF(NOT LIBTYPE)
     SET(LIBTYPE SHARED)
 ENDIF()
 
 SET(LIB_MAJOR_VERSION "1")
-SET(LIB_MINOR_VERSION "13")
-SET(LIB_VERSION "${LIB_MAJOR_VERSION}.${LIB_MINOR_VERSION}")
+SET(LIB_MINOR_VERSION "15")
+SET(LIB_REVISION "1")
+SET(LIB_VERSION "${LIB_MAJOR_VERSION}.${LIB_MINOR_VERSION}.${LIB_REVISION}")
 
 SET(EXPORT_DECL "")
+SET(ALIGN_DECL "")
 
 
 CHECK_TYPE_SIZE("long" SIZEOF_LONG)
 CHECK_TYPE_SIZE("long long" SIZEOF_LONG_LONG)
 
 
-CHECK_C_SOURCE_COMPILES("int *restrict foo;
-                         int main() {return 0;}" HAVE_RESTRICT)
-CHECK_C_SOURCE_COMPILES("int *__restrict foo;
-                         int main() {return 0;}" HAVE___RESTRICT)
+CHECK_C_COMPILER_FLAG(-std=c99 HAVE_STD_C99)
+IF(HAVE_STD_C99)
+    SET(CMAKE_C_FLAGS "-std=c99 ${CMAKE_C_FLAGS}")
+ENDIF()
 
+# MSVC may need workarounds for C99 restrict and inline
+IF(MSVC)
+    # TODO: Once we truly require C99, these restrict and inline checks should go
+    # away.
+    CHECK_C_SOURCE_COMPILES("int *restrict foo;
+                             int main() {return 0;}" HAVE_RESTRICT)
+    IF(NOT HAVE_RESTRICT)
+        # Slightly convoluted way to do this, because MSVC may barf if restrict is
+        # defined to __restrict.
+        CHECK_C_SOURCE_COMPILES("#define restrict __restrict
+                                 #include <stdlib.h>
+                                 int *restrict foo;
+                                 int main() {return 0;}" HAVE___RESTRICT)
+        IF(HAVE___RESTRICT)
+            ADD_DEFINITIONS(-Drestrict=__restrict)
+            SET(CMAKE_REQUIRED_FLAGS "${CMAKE_REQUIRED_FLAGS} -Drestrict=__restrict")
+        ELSE()
+            ADD_DEFINITIONS("-Drestrict=")
+            SET(CMAKE_REQUIRED_FLAGS "${CMAKE_REQUIRED_FLAGS} -Drestrict=")
+        ENDIF()
+    ENDIF()
+
+    CHECK_C_SOURCE_COMPILES("inline void foo(void) { }
+                             int main() {return 0;}" HAVE_INLINE)
+    IF(NOT HAVE_INLINE)
+        CHECK_C_SOURCE_COMPILES("__inline void foo(void) { }
+                                 int main() {return 0;}" HAVE___INLINE)
+        IF(NOT HAVE___INLINE)
+            MESSAGE(FATAL_ERROR "No inline keyword found, please report!")
+        ENDIF()
+
+        ADD_DEFINITIONS(-Dinline=__inline)
+        SET(CMAKE_REQUIRED_FLAGS "${CMAKE_REQUIRED_FLAGS} -Dinline=__inline")
+    ENDIF()
+ENDIF()
+
+# Make sure we have C99-style inline semantics with GCC (4.3 or newer).
+IF(CMAKE_COMPILER_IS_GNUCC)
+    SET(OLD_REQUIRED_FLAGS "${CMAKE_REQUIRED_FLAGS}")
+    # Force no inlining for the next test.
+    SET(CMAKE_REQUIRED_FLAGS "${OLD_REQUIRED_FLAGS} -fno-inline")
+
+    CHECK_C_SOURCE_COMPILES("extern inline int foo() { return 0; }
+                             int main() {return foo();}" INLINE_IS_C99)
+    IF(NOT INLINE_IS_C99)
+        MESSAGE(FATAL_ERROR "Your compiler does not seem to have C99 inline semantics!
+                             Please update your compiler for better C99 compliance.")
+    ENDIF()
+
+    SET(CMAKE_REQUIRED_FLAGS "${OLD_REQUIRED_FLAGS}")
+ENDIF()
 
 # Add definitions, compiler switches, etc.
-INCLUDE_DIRECTORIES(OpenAL32/Include include "${OpenAL_BINARY_DIR}")
+INCLUDE_DIRECTORIES("${OpenAL_SOURCE_DIR}/include" "${OpenAL_BINARY_DIR}")
+IF(CMAKE_VERSION VERSION_LESS "2.8.8")
+    INCLUDE_DIRECTORIES("${OpenAL_SOURCE_DIR}/OpenAL32/Include" "${OpenAL_SOURCE_DIR}/Alc")
+    IF(WIN32 AND ALSOFT_NO_UID_DEFS)
+        ADD_DEFINITIONS("-DAL_NO_UID_DEFS")
+    ENDIF()
+ENDIF()
 
 IF(NOT CMAKE_BUILD_TYPE)
     SET(CMAKE_BUILD_TYPE RelWithDebInfo CACHE STRING
@@ -112,6 +197,7 @@ IF(MSVC)
     SET(CMAKE_C_FLAGS_DEBUG "${CMAKE_C_FLAGS_DEBUG} -D_DEBUG")
     ADD_DEFINITIONS(-D_CRT_SECURE_NO_WARNINGS)
     ADD_DEFINITIONS(-D_CRT_NONSTDC_NO_DEPRECATE)
+    ADD_DEFINITIONS("/wd4098")
 
     IF(NOT DXSDK_DIR)
         STRING(REGEX REPLACE "\\\\" "/" DXSDK_DIR "$ENV{DXSDK_DIR}")
@@ -142,7 +228,7 @@ ELSE()
         ADD_DEFINITIONS(-Wextra)
     ENDIF()
 
-    IF(WERROR)
+    IF(ALSOFT_WERROR)
         ADD_DEFINITIONS(-Werror)
     ENDIF()
 
@@ -166,21 +252,10 @@ ENDIF()
 # Set visibility/export options if available
 IF(WIN32)
     SET(EXPORT_DECL "__declspec(dllexport)")
-
-    OPTION(WINE "Enable use of Wine headers when compiling" OFF)
-    IF(WINE)
-        FIND_PATH(WINE_INCLUDE_DIR library.h
-                  PATHS
-                  /usr/include/wine
-                  /usr/local/include/wine
-                  CMAKE_FIND_ROOT_PATH_BOTH)
-        IF(WINE_INCLUDE_DIR)
-            MESSAGE(STATUS "Found Wine header files - ${WINE_INCLUDE_DIR}" )
-            INCLUDE_DIRECTORIES("${WINE_INCLUDE_DIR}/windows")
-            SET(CMAKE_REQUIRED_INCLUDES ${CMAKE_REQUIRED_INCLUDES} "${WINE_INCLUDE_DIR}/windows")
-        ELSE()
-            MESSAGE(STATUS "Could not find Wine header files" )
-        ENDIF()
+    IF(NOT MINGW)
+        SET(ALIGN_DECL "__declspec(align(x))")
+    ELSE()
+        SET(ALIGN_DECL "__declspec(aligned(x))")
     ENDIF()
 ELSE()
     SET(OLD_REQUIRED_FLAGS "${CMAKE_REQUIRED_FLAGS}")
@@ -211,21 +286,43 @@ ELSE()
         ENDIF()
     ENDIF()
 
+    CHECK_C_SOURCE_COMPILES("int foo __attribute__((aligned(16)));
+                             int main() {return 0;}" HAVE_ATTRIBUTE_ALIGNED)
+    IF(HAVE_ATTRIBUTE_ALIGNED)
+        SET(ALIGN_DECL "__attribute__((aligned(x)))")
+    ENDIF()
+
     SET(CMAKE_REQUIRED_FLAGS "${OLD_REQUIRED_FLAGS}")
 ENDIF()
 
+SET(SSE_SWITCH "")
+IF(MSVC)
+    CHECK_C_COMPILER_FLAG(/arch:SSE HAVE_ARCHSSE_SWITCH)
+    IF(HAVE_ARCHSSE_SWITCH)
+        SET(SSE_SWITCH "/arch:SSE")
+    ENDIF()
+ENDIF()
+IF(NOT SSE_SWITCH)
+    CHECK_C_COMPILER_FLAG(-msse HAVE_MSSE_SWITCH)
+    IF(HAVE_MSSE_SWITCH)
+        SET(SSE_SWITCH "-msse")
+    ENDIF()
+ENDIF()
+
 CHECK_C_SOURCE_COMPILES("int foo(const char *str, ...) __attribute__((format(printf, 1, 2)));
                          int main() {return 0;}" HAVE_GCC_FORMAT)
 
+CHECK_INCLUDE_FILE(malloc.h HAVE_MALLOC_H)
+CHECK_INCLUDE_FILE(strings.h HAVE_STRINGS_H)
+CHECK_INCLUDE_FILE(cpuid.h HAVE_CPUID_H)
+CHECK_INCLUDE_FILE(sys/sysconf.h HAVE_SYS_SYSCONF_H)
 CHECK_INCLUDE_FILE(fenv.h HAVE_FENV_H)
-CHECK_INCLUDE_FILE(fpu_control.h HAVE_FPU_CONTROL_H)
 CHECK_INCLUDE_FILE(float.h HAVE_FLOAT_H)
 CHECK_INCLUDE_FILE(ieeefp.h HAVE_IEEEFP_H)
 CHECK_INCLUDE_FILE(guiddef.h HAVE_GUIDDEF_H)
 IF(NOT HAVE_GUIDDEF_H)
     CHECK_INCLUDE_FILE(initguid.h HAVE_INITGUID_H)
 ENDIF()
-CHECK_INCLUDE_FILE(arm_neon.h HAVE_ARM_NEON_H)
 
 # Some systems need libm for some of the following math functions to work
 CHECK_LIBRARY_EXISTS(m pow "" HAVE_LIBM)
@@ -235,25 +332,17 @@ IF(HAVE_LIBM)
 ENDIF()
 
 
-CHECK_SYMBOL_EXISTS(powf   math.h HAVE_POWF)
-CHECK_SYMBOL_EXISTS(sqrtf  math.h HAVE_SQRTF)
-CHECK_SYMBOL_EXISTS(cosf   math.h HAVE_COSF)
-CHECK_SYMBOL_EXISTS(sinf   math.h HAVE_SINF)
-CHECK_SYMBOL_EXISTS(acosf  math.h HAVE_ACOSF)
-CHECK_SYMBOL_EXISTS(asinf  math.h HAVE_ASINF)
-CHECK_SYMBOL_EXISTS(atanf  math.h HAVE_ATANF)
-CHECK_SYMBOL_EXISTS(atan2f math.h HAVE_ATAN2F)
-CHECK_SYMBOL_EXISTS(fabsf  math.h HAVE_FABSF)
-CHECK_SYMBOL_EXISTS(log10f math.h HAVE_LOG10F)
-CHECK_SYMBOL_EXISTS(floorf math.h HAVE_FLOORF)
+CHECK_SYMBOL_EXISTS(aligned_alloc    stdlib.h HAVE_ALIGNED_ALLOC)
+CHECK_SYMBOL_EXISTS(posix_memalign   stdlib.h HAVE_POSIX_MEMALIGN)
+CHECK_SYMBOL_EXISTS(_aligned_malloc  malloc.h HAVE__ALIGNED_MALLOC)
+CHECK_SYMBOL_EXISTS(lrintf math.h HAVE_LRINTF)
 
-IF(HAVE_FENV_H)
-    CHECK_SYMBOL_EXISTS(fesetround fenv.h HAVE_FESETROUND)
+IF(HAVE_FLOAT_H)
+    CHECK_SYMBOL_EXISTS(_controlfp float.h HAVE__CONTROLFP)
+    CHECK_SYMBOL_EXISTS(__control87_2 float.h HAVE___CONTROL87_2)
 ENDIF()
 
 CHECK_FUNCTION_EXISTS(strtof HAVE_STRTOF)
-CHECK_FUNCTION_EXISTS(_controlfp HAVE__CONTROLFP)
-
 CHECK_FUNCTION_EXISTS(stat HAVE_STAT)
 CHECK_FUNCTION_EXISTS(strcasecmp HAVE_STRCASECMP)
 IF(NOT HAVE_STRCASECMP)
@@ -285,16 +374,6 @@ IF(NOT HAVE_SNPRINTF)
     ADD_DEFINITIONS(-Dsnprintf=_snprintf)
 ENDIF()
 
-CHECK_FUNCTION_EXISTS(vsnprintf HAVE_VSNPRINTF)
-IF(NOT HAVE_VSNPRINTF)
-    CHECK_FUNCTION_EXISTS(_vsnprintf HAVE__VSNPRINTF)
-    IF(NOT HAVE__VSNPRINTF)
-        MESSAGE(FATAL_ERROR "No vsnprintf function found, please report!")
-    ENDIF()
-
-    ADD_DEFINITIONS(-Dvsnprintf=_vsnprintf)
-ENDIF()
-
 CHECK_SYMBOL_EXISTS(isfinite math.h HAVE_ISFINITE)
 IF(NOT HAVE_ISFINITE)
     CHECK_FUNCTION_EXISTS(finite HAVE_FINITE)
@@ -321,7 +400,7 @@ ENDIF()
 
 
 # Check for the dlopen API (for dynamicly loading backend libs)
-IF(DLOPEN)
+IF(ALSOFT_DLOPEN)
     CHECK_INCLUDE_FILE(dlfcn.h HAVE_DLFCN_H)
     IF(HAVE_DLFCN_H)
         CHECK_LIBRARY_EXISTS(dl dlopen "" HAVE_LIBDL)
@@ -332,8 +411,12 @@ IF(DLOPEN)
 ENDIF()
 
 # Check if we have Windows headers
-CHECK_INCLUDE_FILE(windows.h HAVE_WINDOWS_H -D_WIN32_WINNT=0x0500)
+CHECK_INCLUDE_FILE(windows.h HAVE_WINDOWS_H -D_WIN32_WINNT=0x0501)
 IF(NOT HAVE_WINDOWS_H)
+    # These are needed on some systems for extra features
+    ADD_DEFINITIONS(-D_GNU_SOURCE=1 -D_POSIX_C_SOURCE=200809L -D_XOPEN_SOURCE=700)
+    SET(CMAKE_REQUIRED_FLAGS "${CMAKE_REQUIRED_FLAGS} -D_GNU_SOURCE=1 -D_POSIX_C_SOURCE=200809L -D_XOPEN_SOURCE=700")
+
     CHECK_FUNCTION_EXISTS(gettimeofday HAVE_GETTIMEOFDAY)
     IF(NOT HAVE_GETTIMEOFDAY)
         MESSAGE(FATAL_ERROR "No timing function found!")
@@ -344,12 +427,6 @@ IF(NOT HAVE_WINDOWS_H)
         MESSAGE(FATAL_ERROR "No sleep function found!")
     ENDIF()
 
-    CHECK_C_COMPILER_FLAG(-pthread HAVE_PTHREAD)
-    IF(HAVE_PTHREAD)
-        ADD_DEFINITIONS(-pthread)
-        SET(EXTRA_LIBS ${EXTRA_LIBS} -pthread)
-    ENDIF()
-
     # We need pthreads outside of Windows
     CHECK_INCLUDE_FILE(pthread.h HAVE_PTHREAD_H)
     IF(NOT HAVE_PTHREAD_H)
@@ -358,15 +435,24 @@ IF(NOT HAVE_WINDOWS_H)
     # Some systems need pthread_np.h to get recursive mutexes
     CHECK_INCLUDE_FILES("pthread.h;pthread_np.h" HAVE_PTHREAD_NP_H)
 
-    # _GNU_SOURCE is needed on some systems for extra attributes, and
-    # _REENTRANT is needed for libc thread-safety
-    ADD_DEFINITIONS(-D_GNU_SOURCE=1)
+    CHECK_C_COMPILER_FLAG(-pthread HAVE_PTHREAD)
+    IF(HAVE_PTHREAD)
+        ADD_DEFINITIONS(-pthread)
+        SET(CMAKE_REQUIRED_FLAGS "${CMAKE_REQUIRED_FLAGS} -pthread")
+        SET(EXTRA_LIBS ${EXTRA_LIBS} -pthread)
+    ENDIF()
+
     CHECK_LIBRARY_EXISTS(pthread pthread_create "" HAVE_LIBPTHREAD)
     IF(HAVE_LIBPTHREAD)
         SET(EXTRA_LIBS pthread ${EXTRA_LIBS})
     ENDIF()
 
-    CHECK_LIBRARY_EXISTS(pthread pthread_setschedparam "" HAVE_PTHREAD_SETSCHEDPARAM)
+    CHECK_SYMBOL_EXISTS(pthread_setschedparam pthread.h HAVE_PTHREAD_SETSCHEDPARAM)
+
+    CHECK_SYMBOL_EXISTS(pthread_setname_np pthread.h HAVE_PTHREAD_SETNAME_NP)
+    IF(NOT HAVE_PTHREAD_SETNAME_NP)
+        CHECK_SYMBOL_EXISTS(pthread_set_name_np pthread.h HAVE_PTHREAD_SET_NAME_NP)
+    ENDIF()
 
     CHECK_LIBRARY_EXISTS(rt clock_gettime "" HAVE_LIBRT)
     IF(HAVE_LIBRT)
@@ -378,8 +464,8 @@ ENDIF()
 CHECK_INCLUDE_FILE(stdint.h HAVE_STDINT_H)
 IF(NOT HAVE_STDINT_H)
     IF(HAVE_WINDOWS_H)
-        CHECK_C_SOURCE_COMPILES("\#define _WIN32_WINNT 0x0500
-                                 \#include <windows.h>
+        CHECK_C_SOURCE_COMPILES("#define _WIN32_WINNT 0x0501
+                                 #include <windows.h>
                                  __int64 foo;
                                  int main() {return 0;}" HAVE___INT64)
     ENDIF()
@@ -406,7 +492,11 @@ SET(OPENAL_OBJS  OpenAL32/alAuxEffectSlot.c
                  OpenAL32/alError.c
                  OpenAL32/alExtension.c
                  OpenAL32/alFilter.c
+                 OpenAL32/alFontsound.c
                  OpenAL32/alListener.c
+                 OpenAL32/alMidi.c
+                 OpenAL32/alPreset.c
+                 OpenAL32/alSoundfont.c
                  OpenAL32/alSource.c
                  OpenAL32/alState.c
                  OpenAL32/alThunk.c
@@ -414,17 +504,90 @@ SET(OPENAL_OBJS  OpenAL32/alAuxEffectSlot.c
 SET(ALC_OBJS  Alc/ALc.c
               Alc/ALu.c
               Alc/alcConfig.c
-              Alc/alcDedicated.c
-              Alc/alcEcho.c
-              Alc/alcModulator.c
-              Alc/alcReverb.c
               Alc/alcRing.c
-              Alc/alcThread.c
               Alc/bs2b.c
+              Alc/effects/autowah.c
+              Alc/effects/chorus.c
+              Alc/effects/compressor.c
+              Alc/effects/dedicated.c
+              Alc/effects/distortion.c
+              Alc/effects/echo.c
+              Alc/effects/equalizer.c
+              Alc/effects/flanger.c
+              Alc/effects/modulator.c
+              Alc/effects/null.c
+              Alc/effects/reverb.c
               Alc/helpers.c
               Alc/hrtf.c
-              Alc/mixer.c
               Alc/panning.c
+              Alc/threads.c
+              Alc/mixer.c
+              Alc/mixer_c.c
+)
+
+
+SET(CPU_EXTS "Default")
+SET(HAVE_SSE  0)
+SET(HAVE_NEON 0)
+
+# Check for SSE support
+IF(ALSOFT_CPUEXT_SSE AND ALIGN_DECL)
+    CHECK_INCLUDE_FILE(xmmintrin.h HAVE_XMMINTRIN_H "${SSE_SWITCH}")
+    IF(HAVE_XMMINTRIN_H)
+        SET(HAVE_SSE 1)
+        SET(ALC_OBJS  ${ALC_OBJS} Alc/mixer_sse.c)
+        IF(SSE_SWITCH)
+            SET_SOURCE_FILES_PROPERTIES(Alc/mixer_sse.c PROPERTIES
+                                        COMPILE_FLAGS "${SSE_SWITCH}")
+        ENDIF()
+        SET(CPU_EXTS "${CPU_EXTS}, SSE")
+    ENDIF()
+ENDIF()
+IF(ALSOFT_REQUIRE_SSE AND NOT HAVE_SSE)
+    MESSAGE(FATAL_ERROR "Failed to enabled required SSE CPU extensions")
+ENDIF()
+
+# Check for ARM Neon support
+IF(ALSOFT_CPUEXT_NEON)
+    CHECK_INCLUDE_FILE(arm_neon.h HAVE_ARM_NEON_H)
+    IF(HAVE_ARM_NEON_H)
+        SET(HAVE_NEON 1)
+        SET(ALC_OBJS  ${ALC_OBJS} Alc/mixer_neon.c)
+        SET(CPU_EXTS "${CPU_EXTS}, Neon")
+    ENDIF()
+ENDIF()
+IF(ALSOFT_REQUIRE_NEON AND NOT HAVE_NEON)
+    MESSAGE(FATAL_ERROR "Failed to enabled required ARM Neon CPU extensions")
+ENDIF()
+
+
+SET(ALC_OBJS  ${ALC_OBJS}
+              Alc/midi/base.c
+              Alc/midi/sf2load.c
+              Alc/midi/dummy.c
+              Alc/midi/fluidsynth.c
+)
+
+SET(HAVE_FLUIDSYNTH  0)
+
+# Check for FluidSynth support
+IF(ALSOFT_MIDI_FLUIDSYNTH)
+    FIND_PACKAGE(FluidSynth)
+    IF(FLUIDSYNTH_FOUND)
+        SET(HAVE_FLUIDSYNTH 1)
+        IF(CMAKE_VERSION VERSION_LESS "2.8.8")
+            INCLUDE_DIRECTORIES(${FLUIDSYNTH_INCLUDE_DIR})
+        ENDIF()
+        SET(EXTRA_LIBS ${FLUIDSYNTH_LIBRARIES} ${EXTRA_LIBS})
+    ENDIF()
+ENDIF()
+IF(ALSOFT_REQUIRE_FLUIDSYNTH AND NOT HAVE_FLUIDSYNTH)
+    MESSAGE(FATAL_ERROR "Failed to enabled required FluidSynth support")
+ENDIF()
+
+
+SET(ALC_OBJS  ${ALC_OBJS}
+              Alc/backends/base.c
               # Default backends, always available
               Alc/backends/loopback.c
               Alc/backends/null.c
@@ -435,17 +598,18 @@ SET(HAVE_ALSA       0)
 SET(HAVE_OSS        0)
 SET(HAVE_SOLARIS    0)
 SET(HAVE_SNDIO      0)
+SET(HAVE_QSA        0)
 SET(HAVE_DSOUND     0)
+SET(HAVE_MMDEVAPI   0)
 SET(HAVE_WINMM      0)
 SET(HAVE_PORTAUDIO  0)
 SET(HAVE_PULSEAUDIO 0)
 SET(HAVE_COREAUDIO  0)
 SET(HAVE_OPENSL     0)
-SET(HAVE_ANDROID    0)
 SET(HAVE_WAVE       0)
 
 # Check ALSA backend
-IF(ALSA)
+IF(ALSOFT_BACKEND_ALSA)
     CHECK_INCLUDE_FILE(alsa/asoundlib.h HAVE_ALSA_ASOUNDLIB_H)
     IF(HAVE_ALSA_ASOUNDLIB_H)
         CHECK_SHARED_FUNCTION_EXISTS(snd_pcm_open "alsa/asoundlib.h" asound "" HAVE_LIBASOUND)
@@ -461,12 +625,12 @@ IF(ALSA)
         ENDIF()
     ENDIF()
 ENDIF()
-IF(REQUIRE_ALSA AND NOT HAVE_ALSA)
+IF(ALSOFT_REQUIRE_ALSA AND NOT HAVE_ALSA)
     MESSAGE(FATAL_ERROR "Failed to enabled required ALSA backend")
 ENDIF()
 
 # Check OSS backend
-IF(OSS)
+IF(ALSOFT_BACKEND_OSS)
     CHECK_INCLUDE_FILE(sys/soundcard.h HAVE_SYS_SOUNDCARD_H)
     IF(HAVE_SYS_SOUNDCARD_H)
         SET(HAVE_OSS 1)
@@ -474,12 +638,12 @@ IF(OSS)
         SET(BACKENDS  "${BACKENDS} OSS,")
     ENDIF()
 ENDIF()
-IF(REQUIRE_OSS AND NOT HAVE_OSS)
+IF(ALSOFT_REQUIRE_OSS AND NOT HAVE_OSS)
     MESSAGE(FATAL_ERROR "Failed to enabled required OSS backend")
 ENDIF()
 
 # Check Solaris backend
-IF(SOLARIS)
+IF(ALSOFT_BACKEND_SOLARIS)
     CHECK_INCLUDE_FILE(sys/audioio.h HAVE_SYS_AUDIOIO_H)
     IF(HAVE_SYS_AUDIOIO_H)
         SET(HAVE_SOLARIS 1)
@@ -487,34 +651,47 @@ IF(SOLARIS)
         SET(BACKENDS  "${BACKENDS} Solaris,")
     ENDIF()
 ENDIF()
-IF(REQUIRE_SOLARIS AND NOT HAVE_SOLARIS)
+IF(ALSOFT_REQUIRE_SOLARIS AND NOT HAVE_SOLARIS)
     MESSAGE(FATAL_ERROR "Failed to enabled required Solaris backend")
 ENDIF()
 
 # Check SndIO backend
-IF(SNDIO)
+IF(ALSOFT_BACKEND_SNDIO)
     CHECK_INCLUDE_FILE(sndio.h HAVE_SNDIO_H)
     IF(HAVE_SNDIO_H)
         CHECK_SHARED_FUNCTION_EXISTS(sio_open "sndio.h" sndio "" HAVE_LIBSNDIO)
-        IF(HAVE_LIBSNDIO OR HAVE_DLFCN_H OR WIN32)
+        IF(HAVE_LIBSNDIO)
             SET(HAVE_SNDIO 1)
             SET(ALC_OBJS  ${ALC_OBJS} Alc/backends/sndio.c)
-            IF(HAVE_DLFCN_H OR WIN32)
-                SET(BACKENDS  "${BACKENDS} SndIO,")
-            ELSE()
-                SET(BACKENDS  "${BACKENDS} SndIO \(linked\),")
-                SET(EXTRA_LIBS sndio ${EXTRA_LIBS})
-            ENDIF()
+            SET(BACKENDS  "${BACKENDS} SndIO \(linked\),")
+            SET(EXTRA_LIBS sndio ${EXTRA_LIBS})
         ENDIF()
     ENDIF()
 ENDIF()
-IF(REQUIRE_SNDIO AND NOT HAVE_SNDIO)
+IF(ALSOFT_REQUIRE_SNDIO AND NOT HAVE_SNDIO)
     MESSAGE(FATAL_ERROR "Failed to enabled required SndIO backend")
 ENDIF()
 
+# Check QSA backend
+IF (ALSOFT_BACKEND_QSA AND "${CMAKE_C_PLATFORM_ID}" STREQUAL "QNX")
+    CHECK_INCLUDE_FILE(sys/asoundlib.h HAVE_SYS_ASOUNDLIB_H)
+    IF(HAVE_SYS_ASOUNDLIB_H)
+        CHECK_SHARED_FUNCTION_EXISTS(snd_pcm_open "sys/asoundlib.h" asound "" HAVE_LIBASOUND)
+        IF(HAVE_LIBASOUND)
+            SET(HAVE_QSA 1)
+            SET(ALC_OBJS  ${ALC_OBJS} Alc/backends/qsa.c)
+            SET(EXTRA_LIBS asound ${EXTRA_LIBS})
+            SET(BACKENDS  "${BACKENDS} QSA \(linked\),")
+        ENDIF()
+    ENDIF()
+ENDIF()
+IF(ALSOFT_REQUIRE_QSA AND NOT HAVE_QSA)
+    MESSAGE(FATAL_ERROR "Failed to enabled required QSA backend")
+ENDIF()
+
 # Check for MMDevApi backend
 IF(HAVE_WINDOWS_H)
-    IF(MMDEVAPI)
+    IF(ALSOFT_BACKEND_MMDEVAPI)
         CHECK_INCLUDE_FILE(mmdeviceapi.h HAVE_MMDEVICEAPI_H)
         IF(HAVE_MMDEVICEAPI_H)
             SET(HAVE_MMDEVAPI 1)
@@ -524,12 +701,12 @@ IF(HAVE_WINDOWS_H)
         ENDIF()
     ENDIF()
 ENDIF()
-IF(REQUIRE_MMDEVAPI AND NOT HAVE_MMDEVAPI)
+IF(ALSOFT_REQUIRE_MMDEVAPI AND NOT HAVE_MMDEVAPI)
     MESSAGE(FATAL_ERROR "Failed to enabled required MMDevApi backend")
 ENDIF()
 
 # Check DSound/MMSystem backend
-IF(DSOUND)
+IF(ALSOFT_BACKEND_DSOUND)
     CHECK_INCLUDE_FILE(dsound.h HAVE_DSOUND_H)
     IF(HAVE_DSOUND_H)
         CHECK_SHARED_FUNCTION_EXISTS(DirectSoundCreate "dsound.h" dsound "" HAVE_LIBDSOUND)
@@ -546,13 +723,13 @@ IF(DSOUND)
         ENDIF()
     ENDIF()
 ENDIF()
-IF(REQUIRE_DSOUND AND NOT HAVE_DSOUND)
+IF(ALSOFT_REQUIRE_DSOUND AND NOT HAVE_DSOUND)
     MESSAGE(FATAL_ERROR "Failed to enabled required DSound backend")
 ENDIF()
 
 IF(HAVE_WINDOWS_H)
-    IF(WINMM)
-        CHECK_INCLUDE_FILES("windows.h;mmsystem.h" HAVE_MMSYSTEM_H -D_WIN32_WINNT=0x0500)
+    IF(ALSOFT_BACKEND_WINMM)
+        CHECK_INCLUDE_FILES("windows.h;mmsystem.h" HAVE_MMSYSTEM_H -D_WIN32_WINNT=0x0501)
         IF(HAVE_MMSYSTEM_H AND HAVE_LIBWINMM)
             SET(HAVE_WINMM 1)
             SET(ALC_OBJS  ${ALC_OBJS} Alc/backends/winmm.c)
@@ -560,12 +737,12 @@ IF(HAVE_WINDOWS_H)
         ENDIF()
     ENDIF()
 ENDIF()
-IF(REQUIRE_WINMM AND NOT HAVE_WINMM)
+IF(ALSOFT_REQUIRE_WINMM AND NOT HAVE_WINMM)
     MESSAGE(FATAL_ERROR "Failed to enabled required WinMM backend")
 ENDIF()
 
 # Check PortAudio backend
-IF(PORTAUDIO)
+IF(ALSOFT_BACKEND_PORTAUDIO)
     CHECK_INCLUDE_FILE(portaudio.h HAVE_PORTAUDIO_H)
     IF(HAVE_PORTAUDIO_H)
         CHECK_SHARED_FUNCTION_EXISTS(Pa_Initialize "portaudio.h" portaudio "" HAVE_LIBPORTAUDIO)
@@ -581,12 +758,12 @@ IF(PORTAUDIO)
         ENDIF()
     ENDIF()
 ENDIF()
-IF(REQUIRE_PORTAUDIO AND NOT HAVE_PORTAUDIO)
+IF(ALSOFT_REQUIRE_PORTAUDIO AND NOT HAVE_PORTAUDIO)
     MESSAGE(FATAL_ERROR "Failed to enabled required PortAudio backend")
 ENDIF()
 
 # Check PulseAudio backend
-IF(PULSEAUDIO)
+IF(ALSOFT_BACKEND_PULSEAUDIO)
     CHECK_INCLUDE_FILE(pulse/pulseaudio.h HAVE_PULSE_PULSEAUDIO_H)
     IF(HAVE_PULSE_PULSEAUDIO_H)
         CHECK_SHARED_FUNCTION_EXISTS(pa_context_new "pulse/pulseaudio.h" pulse "" HAVE_LIBPULSE)
@@ -602,12 +779,12 @@ IF(PULSEAUDIO)
         ENDIF()
     ENDIF()
 ENDIF()
-IF(REQUIRE_PULSEAUDIO AND NOT HAVE_PULSEAUDIO)
+IF(ALSOFT_REQUIRE_PULSEAUDIO AND NOT HAVE_PULSEAUDIO)
     MESSAGE(FATAL_ERROR "Failed to enabled required PulseAudio backend")
 ENDIF()
 
 # Check CoreAudio backend
-IF(COREAUDIO)
+IF(ALSOFT_BACKEND_COREAUDIO)
     CHECK_INCLUDE_FILE(/System/Library/Frameworks/CoreAudio.framework/Headers/CoreAudio.h HAVE_COREAUDIO_FRAMEWORK)
     IF(HAVE_COREAUDIO_FRAMEWORK)
         SET(HAVE_COREAUDIO 1)
@@ -616,54 +793,43 @@ IF(COREAUDIO)
         SET(EXTRA_LIBS /System/Library/Frameworks/CoreAudio.framework ${EXTRA_LIBS})
         SET(EXTRA_LIBS /System/Library/Frameworks/AudioUnit.framework ${EXTRA_LIBS})
         SET(EXTRA_LIBS /System/Library/Frameworks/ApplicationServices.framework ${EXTRA_LIBS})
+
+        # Some versions of OSX may need the AudioToolbox framework. Add it if
+        # it's found.
+        FIND_LIBRARY(AUDIOTOOLBOX_LIBRARY
+                     NAMES AudioToolbox
+                     PATHS ~/Library/Frameworks
+                           /Library/Frameworks
+                           /System/Library/Frameworks
+                    )
+        IF(AUDIOTOOLBOX_LIBRARY)
+            SET(EXTRA_LIBS ${AUDIOTOOLBOX_LIBRARY} ${EXTRA_LIBS})
+        ENDIF()
     ENDIF()
 ENDIF()
-IF(REQUIRE_COREAUDIO AND NOT HAVE_COREAUDIO)
+IF(ALSOFT_REQUIRE_COREAUDIO AND NOT HAVE_COREAUDIO)
     MESSAGE(FATAL_ERROR "Failed to enabled required CoreAudio backend")
 ENDIF()
 
 # Check for OpenSL (Android) backend
-IF(OPENSL)
+IF(ALSOFT_BACKEND_OPENSL)
     CHECK_INCLUDE_FILES("SLES/OpenSLES.h;SLES/OpenSLES_Android.h" HAVE_SLES_OPENSLES_ANDROID_H)
     IF(HAVE_SLES_OPENSLES_ANDROID_H)
         CHECK_SHARED_FUNCTION_EXISTS(slCreateEngine "SLES/OpenSLES.h" OpenSLES "" HAVE_LIBOPENSLES)
         IF(HAVE_LIBOPENSLES)
             SET(HAVE_OPENSL 1)
-            CHECK_SYMBOL_EXISTS(SL_BYTEORDER_NATIVE "SLES/OpenSLES.h" HAVE_OPENSLES_1_1)
-            IF (HAVE_OPENSLES_1_1)
-                SET(HAVE_OPENSL_1_1 1)
-            ENDIF()
             SET(ALC_OBJS  ${ALC_OBJS} Alc/backends/opensl.c)
             SET(BACKENDS  "${BACKENDS} OpenSL,")
             SET(EXTRA_LIBS OpenSLES ${EXTRA_LIBS})
         ENDIF()
     ENDIF()
 ENDIF()
-IF(REQUIRE_OPENSL AND NOT HAVE_OPENSL)
+IF(ALSOFT_REQUIRE_OPENSL AND NOT HAVE_OPENSL)
     MESSAGE(FATAL_ERROR "Failed to enabled required OpenSL backend")
 ENDIF()
 
-# Check for Android backend
-IF(ANDROID)
-    CHECK_INCLUDE_FILE(android/api-level.h HAVE_ANDROID_API_LEVEL_H)
-    IF(HAVE_ANDROID_API_LEVEL_H)
-        CHECK_SYMBOL_EXISTS(__ANDROID_API__ "android/api-level.h" HAVE_ANDROID_INTERNAL)
-        IF(HAVE_ANDROID_INTERNAL)
-            SET(HAVE_ANDROID 1)
-            SET(ALC_OBJS  ${ALC_OBJS} Alc/backends/android.c)
-            SET(BACKENDS  "${BACKENDS} Android,")
-            IF(ANDROID_LOW_LATENCY)
-                SET(HAVE_ANDROID_LOW_LATENCY 1)
-            ENDIF()
-        ENDIF()
-    ENDIF()
-ENDIF()
-IF(REQUIRE_ANDROID AND NOT HAVE_ANDROID)
-    MESSAGE(FATAL_ERROR "Failed to enabled required Android backend")
-ENDIF()
-
 # Optionally enable the Wave Writer backend
-IF(WAVE)
+IF(ALSOFT_BACKEND_WAVE)
     SET(HAVE_WAVE 1)
     SET(ALC_OBJS  ${ALC_OBJS} Alc/backends/wave.c)
     SET(BACKENDS  "${BACKENDS} WaveFile,")
@@ -672,6 +838,19 @@ ENDIF()
 # This is always available
 SET(BACKENDS  "${BACKENDS} Null")
 
+IF(ALSOFT_UTILS AND NOT ALSOFT_NO_CONFIG_UTIL)
+    add_subdirectory(utils/alsoft-config)
+ENDIF()
+IF(ALSOFT_EXAMPLES)
+    FIND_PACKAGE(SDL)
+    IF(SDL_FOUND)
+        FIND_PACKAGE(SDL_sound)
+        IF(SDL_SOUND_FOUND AND CMAKE_VERSION VERSION_LESS "2.8.8")
+            INCLUDE_DIRECTORIES(${SDL_INCLUDE_DIR} ${SDL_SOUND_INCLUDE_DIR})
+        ENDIF()
+    ENDIF()
+ENDIF()
+
 IF(LIBTYPE STREQUAL "STATIC")
     ADD_DEFINITIONS(-DAL_LIBTYPE_STATIC)
     SET(PKG_CONFIG_CFLAGS -DAL_LIBTYPE_STATIC ${PKG_CONFIG_CFLAGS})
@@ -696,9 +875,15 @@ CONFIGURE_FILE(
 
 # Build a library
 ADD_LIBRARY(${LIBNAME} ${LIBTYPE} ${OPENAL_OBJS} ${ALC_OBJS})
-SET_TARGET_PROPERTIES(${LIBNAME} PROPERTIES DEFINE_SYMBOL AL_BUILD_LIBRARY
-                                            COMPILE_FLAGS -DAL_ALEXT_PROTOTYPES
-                                            VERSION ${LIB_VERSION}.0
+SET_PROPERTY(TARGET ${LIBNAME} APPEND PROPERTY COMPILE_DEFINITIONS AL_BUILD_LIBRARY AL_ALEXT_PROTOTYPES)
+IF(WIN32 AND ALSOFT_NO_UID_DEFS)
+    SET_PROPERTY(TARGET ${LIBNAME} APPEND PROPERTY COMPILE_DEFINITIONS AL_NO_UID_DEFS)
+ENDIF()
+SET_PROPERTY(TARGET ${LIBNAME} APPEND PROPERTY INCLUDE_DIRECTORIES "${OpenAL_SOURCE_DIR}/OpenAL32/Include" "${OpenAL_SOURCE_DIR}/Alc")
+IF(FLUIDSYNTH_FOUND)
+    SET_PROPERTY(TARGET ${LIBNAME} APPEND PROPERTY INCLUDE_DIRECTORIES ${FLUIDSYNTH_INCLUDE_DIR})
+ENDIF()
+SET_TARGET_PROPERTIES(${LIBNAME} PROPERTIES VERSION ${LIB_VERSION}
                                             SOVERSION ${LIB_MAJOR_VERSION})
 IF(WIN32 AND NOT LIBTYPE STREQUAL "STATIC")
     SET_TARGET_PROPERTIES(${LIBNAME} PROPERTIES PREFIX "")
@@ -717,6 +902,7 @@ INSTALL(FILES include/AL/al.h
               include/AL/alext.h
               include/AL/efx.h
               include/AL/efx-creative.h
+              include/AL/efx-presets.h
         DESTINATION include/AL
 )
 INSTALL(FILES "${OpenAL_BINARY_DIR}/openal.pc"
@@ -727,6 +913,13 @@ MESSAGE(STATUS "")
 MESSAGE(STATUS "Building OpenAL with support for the following backends:")
 MESSAGE(STATUS "    ${BACKENDS}")
 MESSAGE(STATUS "")
+MESSAGE(STATUS "Building with support for CPU extensions:")
+MESSAGE(STATUS "    ${CPU_EXTS}")
+MESSAGE(STATUS "")
+IF(HAVE_FLUIDSYNTH)
+    MESSAGE(STATUS "FluidSynth support for ALC_SOFT_midi_interface enabled")
+    MESSAGE(STATUS "")
+ENDIF()
 
 IF(WIN32)
     IF(NOT HAVE_DSOUND)
@@ -739,21 +932,64 @@ ENDIF()
 # Install alsoft.conf configuration file
 IF(ALSOFT_CONFIG)
     INSTALL(FILES alsoftrc.sample
-            DESTINATION /etc/openal
-            RENAME alsoft.conf
+            DESTINATION share/openal
     )
-    MESSAGE(STATUS "Installing sample alsoft.conf")
+    MESSAGE(STATUS "Installing sample configuration")
     MESSAGE(STATUS "")
 ENDIF()
 
-IF(UTILS)
+IF(ALSOFT_UTILS)
     ADD_EXECUTABLE(openal-info utils/openal-info.c)
     TARGET_LINK_LIBRARIES(openal-info ${LIBNAME})
-    INSTALL(TARGETS openal-info
+
+    ADD_EXECUTABLE(makehrtf utils/makehrtf.c)
+    IF(HAVE_LIBM)
+        TARGET_LINK_LIBRARIES(makehrtf m)
+    ENDIF()
+
+    INSTALL(TARGETS openal-info makehrtf
             RUNTIME DESTINATION bin
             LIBRARY DESTINATION "lib${LIB_SUFFIX}"
             ARCHIVE DESTINATION "lib${LIB_SUFFIX}"
     )
+
     MESSAGE(STATUS "Building utility programs")
+    IF(TARGET alsoft-config)
+        MESSAGE(STATUS "Building configuration program")
+    ENDIF()
     MESSAGE(STATUS "")
 ENDIF()
+
+IF(ALSOFT_EXAMPLES)
+    IF(SDL_FOUND AND SDL_SOUND_FOUND)
+        ADD_LIBRARY(ex-common STATIC examples/common/alhelpers.c
+                                     examples/common/sdl_sound.c)
+        SET_PROPERTY(TARGET ex-common APPEND PROPERTY INCLUDE_DIRECTORIES ${SDL_SOUND_INCLUDE_DIR})
+
+        ADD_EXECUTABLE(alstream examples/alstream.c)
+        TARGET_LINK_LIBRARIES(alstream ex-common ${SDL_SOUND_LIBRARIES} ${LIBNAME})
+        SET_PROPERTY(TARGET alstream APPEND PROPERTY INCLUDE_DIRECTORIES ${SDL_SOUND_INCLUDE_DIR})
+
+        ADD_EXECUTABLE(alreverb examples/alreverb.c)
+        TARGET_LINK_LIBRARIES(alreverb ex-common ${SDL_SOUND_LIBRARIES} ${LIBNAME})
+        SET_PROPERTY(TARGET alreverb APPEND PROPERTY INCLUDE_DIRECTORIES ${SDL_SOUND_INCLUDE_DIR})
+
+        ADD_EXECUTABLE(allatency examples/allatency.c)
+        TARGET_LINK_LIBRARIES(allatency ex-common ${SDL_SOUND_LIBRARIES} ${LIBNAME})
+        SET_PROPERTY(TARGET allatency APPEND PROPERTY INCLUDE_DIRECTORIES ${SDL_SOUND_INCLUDE_DIR})
+
+        ADD_EXECUTABLE(alloopback examples/alloopback.c)
+        TARGET_LINK_LIBRARIES(alloopback ex-common ${SDL_SOUND_LIBRARIES} ${SDL_LIBRARY} ${LIBNAME})
+        SET_PROPERTY(TARGET alloopback APPEND PROPERTY INCLUDE_DIRECTORIES ${SDL_INCLUDE_DIR}
+                                                                           ${SDL_SOUND_INCLUDE_DIR})
+
+        INSTALL(TARGETS alstream alreverb allatency alloopback
+                RUNTIME DESTINATION bin
+                LIBRARY DESTINATION "lib${LIB_SUFFIX}"
+                ARCHIVE DESTINATION "lib${LIB_SUFFIX}"
+        )
+
+        MESSAGE(STATUS "Building example programs")
+        MESSAGE(STATUS "")
+    ENDIF()
+ENDIF()

+ 0 - 727
jni/openal-soft-android/Makefile

@@ -1,727 +0,0 @@
-# CMAKE generated file: DO NOT EDIT!
-# Generated by "Unix Makefiles" Generator, CMake Version 2.8
-
-# Default target executed when no arguments are given to make.
-default_target: all
-.PHONY : default_target
-
-#=============================================================================
-# Special targets provided by cmake.
-
-# Disable implicit rules so canoncical targets will work.
-.SUFFIXES:
-
-# Remove some rules from gmake that .SUFFIXES does not remove.
-SUFFIXES =
-
-.SUFFIXES: .hpux_make_needs_suffix_list
-
-# Suppress display of executed commands.
-$(VERBOSE).SILENT:
-
-# A target that is always out of date.
-cmake_force:
-.PHONY : cmake_force
-
-#=============================================================================
-# Set environment variables for the build.
-
-# The shell in which to execute make rules.
-SHELL = /bin/sh
-
-# The CMake executable.
-CMAKE_COMMAND = /usr/bin/cmake
-
-# The command to remove a file.
-RM = /usr/bin/cmake -E remove -f
-
-# The program to use to edit the cache.
-CMAKE_EDIT_COMMAND = /usr/bin/cmake-gui
-
-# The top-level source directory on which CMake was run.
-CMAKE_SOURCE_DIR = /home/hagish/workspace/adt/love-native-android/jni/openal-soft-android
-
-# The top-level build directory on which CMake was run.
-CMAKE_BINARY_DIR = /home/hagish/workspace/adt/love-native-android/jni/openal-soft-android
-
-#=============================================================================
-# Targets provided globally by CMake.
-
-# Special rule for the target edit_cache
-edit_cache:
-	@$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --cyan "Running CMake cache editor..."
-	/usr/bin/cmake-gui -H$(CMAKE_SOURCE_DIR) -B$(CMAKE_BINARY_DIR)
-.PHONY : edit_cache
-
-# Special rule for the target edit_cache
-edit_cache/fast: edit_cache
-.PHONY : edit_cache/fast
-
-# Special rule for the target install
-install: preinstall
-	@$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --cyan "Install the project..."
-	/usr/bin/cmake -P cmake_install.cmake
-.PHONY : install
-
-# Special rule for the target install
-install/fast: preinstall/fast
-	@$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --cyan "Install the project..."
-	/usr/bin/cmake -P cmake_install.cmake
-.PHONY : install/fast
-
-# Special rule for the target install/local
-install/local: preinstall
-	@$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --cyan "Installing only the local directory..."
-	/usr/bin/cmake -DCMAKE_INSTALL_LOCAL_ONLY=1 -P cmake_install.cmake
-.PHONY : install/local
-
-# Special rule for the target install/local
-install/local/fast: install/local
-.PHONY : install/local/fast
-
-# Special rule for the target install/strip
-install/strip: preinstall
-	@$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --cyan "Installing the project stripped..."
-	/usr/bin/cmake -DCMAKE_INSTALL_DO_STRIP=1 -P cmake_install.cmake
-.PHONY : install/strip
-
-# Special rule for the target install/strip
-install/strip/fast: install/strip
-.PHONY : install/strip/fast
-
-# Special rule for the target list_install_components
-list_install_components:
-	@$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --cyan "Available install components are: \"Unspecified\""
-.PHONY : list_install_components
-
-# Special rule for the target list_install_components
-list_install_components/fast: list_install_components
-.PHONY : list_install_components/fast
-
-# Special rule for the target rebuild_cache
-rebuild_cache:
-	@$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --cyan "Running CMake to regenerate build system..."
-	/usr/bin/cmake -H$(CMAKE_SOURCE_DIR) -B$(CMAKE_BINARY_DIR)
-.PHONY : rebuild_cache
-
-# Special rule for the target rebuild_cache
-rebuild_cache/fast: rebuild_cache
-.PHONY : rebuild_cache/fast
-
-# The main all target
-all: cmake_check_build_system
-	$(CMAKE_COMMAND) -E cmake_progress_start /home/hagish/workspace/adt/love-native-android/jni/openal-soft-android/CMakeFiles /home/hagish/workspace/adt/love-native-android/jni/openal-soft-android/CMakeFiles/progress.marks
-	$(MAKE) -f CMakeFiles/Makefile2 all
-	$(CMAKE_COMMAND) -E cmake_progress_start /home/hagish/workspace/adt/love-native-android/jni/openal-soft-android/CMakeFiles 0
-.PHONY : all
-
-# The main clean target
-clean:
-	$(MAKE) -f CMakeFiles/Makefile2 clean
-.PHONY : clean
-
-# The main clean target
-clean/fast: clean
-.PHONY : clean/fast
-
-# Prepare targets for installation.
-preinstall: all
-	$(MAKE) -f CMakeFiles/Makefile2 preinstall
-.PHONY : preinstall
-
-# Prepare targets for installation.
-preinstall/fast:
-	$(MAKE) -f CMakeFiles/Makefile2 preinstall
-.PHONY : preinstall/fast
-
-# clear depends
-depend:
-	$(CMAKE_COMMAND) -H$(CMAKE_SOURCE_DIR) -B$(CMAKE_BINARY_DIR) --check-build-system CMakeFiles/Makefile.cmake 1
-.PHONY : depend
-
-#=============================================================================
-# Target rules for targets named openal
-
-# Build rule for target.
-openal: cmake_check_build_system
-	$(MAKE) -f CMakeFiles/Makefile2 openal
-.PHONY : openal
-
-# fast build rule for target.
-openal/fast:
-	$(MAKE) -f CMakeFiles/openal.dir/build.make CMakeFiles/openal.dir/build
-.PHONY : openal/fast
-
-# Manual pre-install relink rule for target.
-openal/preinstall:
-	$(MAKE) -f CMakeFiles/openal.dir/build.make CMakeFiles/openal.dir/preinstall
-.PHONY : openal/preinstall
-
-#=============================================================================
-# Target rules for targets named openal-info
-
-# Build rule for target.
-openal-info: cmake_check_build_system
-	$(MAKE) -f CMakeFiles/Makefile2 openal-info
-.PHONY : openal-info
-
-# fast build rule for target.
-openal-info/fast:
-	$(MAKE) -f CMakeFiles/openal-info.dir/build.make CMakeFiles/openal-info.dir/build
-.PHONY : openal-info/fast
-
-# Manual pre-install relink rule for target.
-openal-info/preinstall:
-	$(MAKE) -f CMakeFiles/openal-info.dir/build.make CMakeFiles/openal-info.dir/preinstall
-.PHONY : openal-info/preinstall
-
-# target to build an object file
-Alc/ALc.o:
-	$(MAKE) -f CMakeFiles/openal.dir/build.make CMakeFiles/openal.dir/Alc/ALc.o
-.PHONY : Alc/ALc.o
-
-# target to preprocess a source file
-Alc/ALc.i:
-	$(MAKE) -f CMakeFiles/openal.dir/build.make CMakeFiles/openal.dir/Alc/ALc.i
-.PHONY : Alc/ALc.i
-
-# target to generate assembly for a file
-Alc/ALc.s:
-	$(MAKE) -f CMakeFiles/openal.dir/build.make CMakeFiles/openal.dir/Alc/ALc.s
-.PHONY : Alc/ALc.s
-
-# target to build an object file
-Alc/ALu.o:
-	$(MAKE) -f CMakeFiles/openal.dir/build.make CMakeFiles/openal.dir/Alc/ALu.o
-.PHONY : Alc/ALu.o
-
-# target to preprocess a source file
-Alc/ALu.i:
-	$(MAKE) -f CMakeFiles/openal.dir/build.make CMakeFiles/openal.dir/Alc/ALu.i
-.PHONY : Alc/ALu.i
-
-# target to generate assembly for a file
-Alc/ALu.s:
-	$(MAKE) -f CMakeFiles/openal.dir/build.make CMakeFiles/openal.dir/Alc/ALu.s
-.PHONY : Alc/ALu.s
-
-# target to build an object file
-Alc/alcConfig.o:
-	$(MAKE) -f CMakeFiles/openal.dir/build.make CMakeFiles/openal.dir/Alc/alcConfig.o
-.PHONY : Alc/alcConfig.o
-
-# target to preprocess a source file
-Alc/alcConfig.i:
-	$(MAKE) -f CMakeFiles/openal.dir/build.make CMakeFiles/openal.dir/Alc/alcConfig.i
-.PHONY : Alc/alcConfig.i
-
-# target to generate assembly for a file
-Alc/alcConfig.s:
-	$(MAKE) -f CMakeFiles/openal.dir/build.make CMakeFiles/openal.dir/Alc/alcConfig.s
-.PHONY : Alc/alcConfig.s
-
-# target to build an object file
-Alc/alcDedicated.o:
-	$(MAKE) -f CMakeFiles/openal.dir/build.make CMakeFiles/openal.dir/Alc/alcDedicated.o
-.PHONY : Alc/alcDedicated.o
-
-# target to preprocess a source file
-Alc/alcDedicated.i:
-	$(MAKE) -f CMakeFiles/openal.dir/build.make CMakeFiles/openal.dir/Alc/alcDedicated.i
-.PHONY : Alc/alcDedicated.i
-
-# target to generate assembly for a file
-Alc/alcDedicated.s:
-	$(MAKE) -f CMakeFiles/openal.dir/build.make CMakeFiles/openal.dir/Alc/alcDedicated.s
-.PHONY : Alc/alcDedicated.s
-
-# target to build an object file
-Alc/alcEcho.o:
-	$(MAKE) -f CMakeFiles/openal.dir/build.make CMakeFiles/openal.dir/Alc/alcEcho.o
-.PHONY : Alc/alcEcho.o
-
-# target to preprocess a source file
-Alc/alcEcho.i:
-	$(MAKE) -f CMakeFiles/openal.dir/build.make CMakeFiles/openal.dir/Alc/alcEcho.i
-.PHONY : Alc/alcEcho.i
-
-# target to generate assembly for a file
-Alc/alcEcho.s:
-	$(MAKE) -f CMakeFiles/openal.dir/build.make CMakeFiles/openal.dir/Alc/alcEcho.s
-.PHONY : Alc/alcEcho.s
-
-# target to build an object file
-Alc/alcModulator.o:
-	$(MAKE) -f CMakeFiles/openal.dir/build.make CMakeFiles/openal.dir/Alc/alcModulator.o
-.PHONY : Alc/alcModulator.o
-
-# target to preprocess a source file
-Alc/alcModulator.i:
-	$(MAKE) -f CMakeFiles/openal.dir/build.make CMakeFiles/openal.dir/Alc/alcModulator.i
-.PHONY : Alc/alcModulator.i
-
-# target to generate assembly for a file
-Alc/alcModulator.s:
-	$(MAKE) -f CMakeFiles/openal.dir/build.make CMakeFiles/openal.dir/Alc/alcModulator.s
-.PHONY : Alc/alcModulator.s
-
-# target to build an object file
-Alc/alcReverb.o:
-	$(MAKE) -f CMakeFiles/openal.dir/build.make CMakeFiles/openal.dir/Alc/alcReverb.o
-.PHONY : Alc/alcReverb.o
-
-# target to preprocess a source file
-Alc/alcReverb.i:
-	$(MAKE) -f CMakeFiles/openal.dir/build.make CMakeFiles/openal.dir/Alc/alcReverb.i
-.PHONY : Alc/alcReverb.i
-
-# target to generate assembly for a file
-Alc/alcReverb.s:
-	$(MAKE) -f CMakeFiles/openal.dir/build.make CMakeFiles/openal.dir/Alc/alcReverb.s
-.PHONY : Alc/alcReverb.s
-
-# target to build an object file
-Alc/alcRing.o:
-	$(MAKE) -f CMakeFiles/openal.dir/build.make CMakeFiles/openal.dir/Alc/alcRing.o
-.PHONY : Alc/alcRing.o
-
-# target to preprocess a source file
-Alc/alcRing.i:
-	$(MAKE) -f CMakeFiles/openal.dir/build.make CMakeFiles/openal.dir/Alc/alcRing.i
-.PHONY : Alc/alcRing.i
-
-# target to generate assembly for a file
-Alc/alcRing.s:
-	$(MAKE) -f CMakeFiles/openal.dir/build.make CMakeFiles/openal.dir/Alc/alcRing.s
-.PHONY : Alc/alcRing.s
-
-# target to build an object file
-Alc/alcThread.o:
-	$(MAKE) -f CMakeFiles/openal.dir/build.make CMakeFiles/openal.dir/Alc/alcThread.o
-.PHONY : Alc/alcThread.o
-
-# target to preprocess a source file
-Alc/alcThread.i:
-	$(MAKE) -f CMakeFiles/openal.dir/build.make CMakeFiles/openal.dir/Alc/alcThread.i
-.PHONY : Alc/alcThread.i
-
-# target to generate assembly for a file
-Alc/alcThread.s:
-	$(MAKE) -f CMakeFiles/openal.dir/build.make CMakeFiles/openal.dir/Alc/alcThread.s
-.PHONY : Alc/alcThread.s
-
-# target to build an object file
-Alc/backends/android.o:
-	$(MAKE) -f CMakeFiles/openal.dir/build.make CMakeFiles/openal.dir/Alc/backends/android.o
-.PHONY : Alc/backends/android.o
-
-# target to preprocess a source file
-Alc/backends/android.i:
-	$(MAKE) -f CMakeFiles/openal.dir/build.make CMakeFiles/openal.dir/Alc/backends/android.i
-.PHONY : Alc/backends/android.i
-
-# target to generate assembly for a file
-Alc/backends/android.s:
-	$(MAKE) -f CMakeFiles/openal.dir/build.make CMakeFiles/openal.dir/Alc/backends/android.s
-.PHONY : Alc/backends/android.s
-
-# target to build an object file
-Alc/backends/loopback.o:
-	$(MAKE) -f CMakeFiles/openal.dir/build.make CMakeFiles/openal.dir/Alc/backends/loopback.o
-.PHONY : Alc/backends/loopback.o
-
-# target to preprocess a source file
-Alc/backends/loopback.i:
-	$(MAKE) -f CMakeFiles/openal.dir/build.make CMakeFiles/openal.dir/Alc/backends/loopback.i
-.PHONY : Alc/backends/loopback.i
-
-# target to generate assembly for a file
-Alc/backends/loopback.s:
-	$(MAKE) -f CMakeFiles/openal.dir/build.make CMakeFiles/openal.dir/Alc/backends/loopback.s
-.PHONY : Alc/backends/loopback.s
-
-# target to build an object file
-Alc/backends/null.o:
-	$(MAKE) -f CMakeFiles/openal.dir/build.make CMakeFiles/openal.dir/Alc/backends/null.o
-.PHONY : Alc/backends/null.o
-
-# target to preprocess a source file
-Alc/backends/null.i:
-	$(MAKE) -f CMakeFiles/openal.dir/build.make CMakeFiles/openal.dir/Alc/backends/null.i
-.PHONY : Alc/backends/null.i
-
-# target to generate assembly for a file
-Alc/backends/null.s:
-	$(MAKE) -f CMakeFiles/openal.dir/build.make CMakeFiles/openal.dir/Alc/backends/null.s
-.PHONY : Alc/backends/null.s
-
-# target to build an object file
-Alc/backends/wave.o:
-	$(MAKE) -f CMakeFiles/openal.dir/build.make CMakeFiles/openal.dir/Alc/backends/wave.o
-.PHONY : Alc/backends/wave.o
-
-# target to preprocess a source file
-Alc/backends/wave.i:
-	$(MAKE) -f CMakeFiles/openal.dir/build.make CMakeFiles/openal.dir/Alc/backends/wave.i
-.PHONY : Alc/backends/wave.i
-
-# target to generate assembly for a file
-Alc/backends/wave.s:
-	$(MAKE) -f CMakeFiles/openal.dir/build.make CMakeFiles/openal.dir/Alc/backends/wave.s
-.PHONY : Alc/backends/wave.s
-
-# target to build an object file
-Alc/bs2b.o:
-	$(MAKE) -f CMakeFiles/openal.dir/build.make CMakeFiles/openal.dir/Alc/bs2b.o
-.PHONY : Alc/bs2b.o
-
-# target to preprocess a source file
-Alc/bs2b.i:
-	$(MAKE) -f CMakeFiles/openal.dir/build.make CMakeFiles/openal.dir/Alc/bs2b.i
-.PHONY : Alc/bs2b.i
-
-# target to generate assembly for a file
-Alc/bs2b.s:
-	$(MAKE) -f CMakeFiles/openal.dir/build.make CMakeFiles/openal.dir/Alc/bs2b.s
-.PHONY : Alc/bs2b.s
-
-# target to build an object file
-Alc/helpers.o:
-	$(MAKE) -f CMakeFiles/openal.dir/build.make CMakeFiles/openal.dir/Alc/helpers.o
-.PHONY : Alc/helpers.o
-
-# target to preprocess a source file
-Alc/helpers.i:
-	$(MAKE) -f CMakeFiles/openal.dir/build.make CMakeFiles/openal.dir/Alc/helpers.i
-.PHONY : Alc/helpers.i
-
-# target to generate assembly for a file
-Alc/helpers.s:
-	$(MAKE) -f CMakeFiles/openal.dir/build.make CMakeFiles/openal.dir/Alc/helpers.s
-.PHONY : Alc/helpers.s
-
-# target to build an object file
-Alc/hrtf.o:
-	$(MAKE) -f CMakeFiles/openal.dir/build.make CMakeFiles/openal.dir/Alc/hrtf.o
-.PHONY : Alc/hrtf.o
-
-# target to preprocess a source file
-Alc/hrtf.i:
-	$(MAKE) -f CMakeFiles/openal.dir/build.make CMakeFiles/openal.dir/Alc/hrtf.i
-.PHONY : Alc/hrtf.i
-
-# target to generate assembly for a file
-Alc/hrtf.s:
-	$(MAKE) -f CMakeFiles/openal.dir/build.make CMakeFiles/openal.dir/Alc/hrtf.s
-.PHONY : Alc/hrtf.s
-
-# target to build an object file
-Alc/mixer.o:
-	$(MAKE) -f CMakeFiles/openal.dir/build.make CMakeFiles/openal.dir/Alc/mixer.o
-.PHONY : Alc/mixer.o
-
-# target to preprocess a source file
-Alc/mixer.i:
-	$(MAKE) -f CMakeFiles/openal.dir/build.make CMakeFiles/openal.dir/Alc/mixer.i
-.PHONY : Alc/mixer.i
-
-# target to generate assembly for a file
-Alc/mixer.s:
-	$(MAKE) -f CMakeFiles/openal.dir/build.make CMakeFiles/openal.dir/Alc/mixer.s
-.PHONY : Alc/mixer.s
-
-# target to build an object file
-Alc/panning.o:
-	$(MAKE) -f CMakeFiles/openal.dir/build.make CMakeFiles/openal.dir/Alc/panning.o
-.PHONY : Alc/panning.o
-
-# target to preprocess a source file
-Alc/panning.i:
-	$(MAKE) -f CMakeFiles/openal.dir/build.make CMakeFiles/openal.dir/Alc/panning.i
-.PHONY : Alc/panning.i
-
-# target to generate assembly for a file
-Alc/panning.s:
-	$(MAKE) -f CMakeFiles/openal.dir/build.make CMakeFiles/openal.dir/Alc/panning.s
-.PHONY : Alc/panning.s
-
-# target to build an object file
-OpenAL32/alAuxEffectSlot.o:
-	$(MAKE) -f CMakeFiles/openal.dir/build.make CMakeFiles/openal.dir/OpenAL32/alAuxEffectSlot.o
-.PHONY : OpenAL32/alAuxEffectSlot.o
-
-# target to preprocess a source file
-OpenAL32/alAuxEffectSlot.i:
-	$(MAKE) -f CMakeFiles/openal.dir/build.make CMakeFiles/openal.dir/OpenAL32/alAuxEffectSlot.i
-.PHONY : OpenAL32/alAuxEffectSlot.i
-
-# target to generate assembly for a file
-OpenAL32/alAuxEffectSlot.s:
-	$(MAKE) -f CMakeFiles/openal.dir/build.make CMakeFiles/openal.dir/OpenAL32/alAuxEffectSlot.s
-.PHONY : OpenAL32/alAuxEffectSlot.s
-
-# target to build an object file
-OpenAL32/alBuffer.o:
-	$(MAKE) -f CMakeFiles/openal.dir/build.make CMakeFiles/openal.dir/OpenAL32/alBuffer.o
-.PHONY : OpenAL32/alBuffer.o
-
-# target to preprocess a source file
-OpenAL32/alBuffer.i:
-	$(MAKE) -f CMakeFiles/openal.dir/build.make CMakeFiles/openal.dir/OpenAL32/alBuffer.i
-.PHONY : OpenAL32/alBuffer.i
-
-# target to generate assembly for a file
-OpenAL32/alBuffer.s:
-	$(MAKE) -f CMakeFiles/openal.dir/build.make CMakeFiles/openal.dir/OpenAL32/alBuffer.s
-.PHONY : OpenAL32/alBuffer.s
-
-# target to build an object file
-OpenAL32/alEffect.o:
-	$(MAKE) -f CMakeFiles/openal.dir/build.make CMakeFiles/openal.dir/OpenAL32/alEffect.o
-.PHONY : OpenAL32/alEffect.o
-
-# target to preprocess a source file
-OpenAL32/alEffect.i:
-	$(MAKE) -f CMakeFiles/openal.dir/build.make CMakeFiles/openal.dir/OpenAL32/alEffect.i
-.PHONY : OpenAL32/alEffect.i
-
-# target to generate assembly for a file
-OpenAL32/alEffect.s:
-	$(MAKE) -f CMakeFiles/openal.dir/build.make CMakeFiles/openal.dir/OpenAL32/alEffect.s
-.PHONY : OpenAL32/alEffect.s
-
-# target to build an object file
-OpenAL32/alError.o:
-	$(MAKE) -f CMakeFiles/openal.dir/build.make CMakeFiles/openal.dir/OpenAL32/alError.o
-.PHONY : OpenAL32/alError.o
-
-# target to preprocess a source file
-OpenAL32/alError.i:
-	$(MAKE) -f CMakeFiles/openal.dir/build.make CMakeFiles/openal.dir/OpenAL32/alError.i
-.PHONY : OpenAL32/alError.i
-
-# target to generate assembly for a file
-OpenAL32/alError.s:
-	$(MAKE) -f CMakeFiles/openal.dir/build.make CMakeFiles/openal.dir/OpenAL32/alError.s
-.PHONY : OpenAL32/alError.s
-
-# target to build an object file
-OpenAL32/alExtension.o:
-	$(MAKE) -f CMakeFiles/openal.dir/build.make CMakeFiles/openal.dir/OpenAL32/alExtension.o
-.PHONY : OpenAL32/alExtension.o
-
-# target to preprocess a source file
-OpenAL32/alExtension.i:
-	$(MAKE) -f CMakeFiles/openal.dir/build.make CMakeFiles/openal.dir/OpenAL32/alExtension.i
-.PHONY : OpenAL32/alExtension.i
-
-# target to generate assembly for a file
-OpenAL32/alExtension.s:
-	$(MAKE) -f CMakeFiles/openal.dir/build.make CMakeFiles/openal.dir/OpenAL32/alExtension.s
-.PHONY : OpenAL32/alExtension.s
-
-# target to build an object file
-OpenAL32/alFilter.o:
-	$(MAKE) -f CMakeFiles/openal.dir/build.make CMakeFiles/openal.dir/OpenAL32/alFilter.o
-.PHONY : OpenAL32/alFilter.o
-
-# target to preprocess a source file
-OpenAL32/alFilter.i:
-	$(MAKE) -f CMakeFiles/openal.dir/build.make CMakeFiles/openal.dir/OpenAL32/alFilter.i
-.PHONY : OpenAL32/alFilter.i
-
-# target to generate assembly for a file
-OpenAL32/alFilter.s:
-	$(MAKE) -f CMakeFiles/openal.dir/build.make CMakeFiles/openal.dir/OpenAL32/alFilter.s
-.PHONY : OpenAL32/alFilter.s
-
-# target to build an object file
-OpenAL32/alListener.o:
-	$(MAKE) -f CMakeFiles/openal.dir/build.make CMakeFiles/openal.dir/OpenAL32/alListener.o
-.PHONY : OpenAL32/alListener.o
-
-# target to preprocess a source file
-OpenAL32/alListener.i:
-	$(MAKE) -f CMakeFiles/openal.dir/build.make CMakeFiles/openal.dir/OpenAL32/alListener.i
-.PHONY : OpenAL32/alListener.i
-
-# target to generate assembly for a file
-OpenAL32/alListener.s:
-	$(MAKE) -f CMakeFiles/openal.dir/build.make CMakeFiles/openal.dir/OpenAL32/alListener.s
-.PHONY : OpenAL32/alListener.s
-
-# target to build an object file
-OpenAL32/alSource.o:
-	$(MAKE) -f CMakeFiles/openal.dir/build.make CMakeFiles/openal.dir/OpenAL32/alSource.o
-.PHONY : OpenAL32/alSource.o
-
-# target to preprocess a source file
-OpenAL32/alSource.i:
-	$(MAKE) -f CMakeFiles/openal.dir/build.make CMakeFiles/openal.dir/OpenAL32/alSource.i
-.PHONY : OpenAL32/alSource.i
-
-# target to generate assembly for a file
-OpenAL32/alSource.s:
-	$(MAKE) -f CMakeFiles/openal.dir/build.make CMakeFiles/openal.dir/OpenAL32/alSource.s
-.PHONY : OpenAL32/alSource.s
-
-# target to build an object file
-OpenAL32/alState.o:
-	$(MAKE) -f CMakeFiles/openal.dir/build.make CMakeFiles/openal.dir/OpenAL32/alState.o
-.PHONY : OpenAL32/alState.o
-
-# target to preprocess a source file
-OpenAL32/alState.i:
-	$(MAKE) -f CMakeFiles/openal.dir/build.make CMakeFiles/openal.dir/OpenAL32/alState.i
-.PHONY : OpenAL32/alState.i
-
-# target to generate assembly for a file
-OpenAL32/alState.s:
-	$(MAKE) -f CMakeFiles/openal.dir/build.make CMakeFiles/openal.dir/OpenAL32/alState.s
-.PHONY : OpenAL32/alState.s
-
-# target to build an object file
-OpenAL32/alThunk.o:
-	$(MAKE) -f CMakeFiles/openal.dir/build.make CMakeFiles/openal.dir/OpenAL32/alThunk.o
-.PHONY : OpenAL32/alThunk.o
-
-# target to preprocess a source file
-OpenAL32/alThunk.i:
-	$(MAKE) -f CMakeFiles/openal.dir/build.make CMakeFiles/openal.dir/OpenAL32/alThunk.i
-.PHONY : OpenAL32/alThunk.i
-
-# target to generate assembly for a file
-OpenAL32/alThunk.s:
-	$(MAKE) -f CMakeFiles/openal.dir/build.make CMakeFiles/openal.dir/OpenAL32/alThunk.s
-.PHONY : OpenAL32/alThunk.s
-
-# target to build an object file
-utils/openal-info.o:
-	$(MAKE) -f CMakeFiles/openal-info.dir/build.make CMakeFiles/openal-info.dir/utils/openal-info.o
-.PHONY : utils/openal-info.o
-
-# target to preprocess a source file
-utils/openal-info.i:
-	$(MAKE) -f CMakeFiles/openal-info.dir/build.make CMakeFiles/openal-info.dir/utils/openal-info.i
-.PHONY : utils/openal-info.i
-
-# target to generate assembly for a file
-utils/openal-info.s:
-	$(MAKE) -f CMakeFiles/openal-info.dir/build.make CMakeFiles/openal-info.dir/utils/openal-info.s
-.PHONY : utils/openal-info.s
-
-# Help Target
-help:
-	@echo "The following are some of the valid targets for this Makefile:"
-	@echo "... all (the default if no target is provided)"
-	@echo "... clean"
-	@echo "... depend"
-	@echo "... edit_cache"
-	@echo "... install"
-	@echo "... install/local"
-	@echo "... install/strip"
-	@echo "... list_install_components"
-	@echo "... openal"
-	@echo "... openal-info"
-	@echo "... rebuild_cache"
-	@echo "... Alc/ALc.o"
-	@echo "... Alc/ALc.i"
-	@echo "... Alc/ALc.s"
-	@echo "... Alc/ALu.o"
-	@echo "... Alc/ALu.i"
-	@echo "... Alc/ALu.s"
-	@echo "... Alc/alcConfig.o"
-	@echo "... Alc/alcConfig.i"
-	@echo "... Alc/alcConfig.s"
-	@echo "... Alc/alcDedicated.o"
-	@echo "... Alc/alcDedicated.i"
-	@echo "... Alc/alcDedicated.s"
-	@echo "... Alc/alcEcho.o"
-	@echo "... Alc/alcEcho.i"
-	@echo "... Alc/alcEcho.s"
-	@echo "... Alc/alcModulator.o"
-	@echo "... Alc/alcModulator.i"
-	@echo "... Alc/alcModulator.s"
-	@echo "... Alc/alcReverb.o"
-	@echo "... Alc/alcReverb.i"
-	@echo "... Alc/alcReverb.s"
-	@echo "... Alc/alcRing.o"
-	@echo "... Alc/alcRing.i"
-	@echo "... Alc/alcRing.s"
-	@echo "... Alc/alcThread.o"
-	@echo "... Alc/alcThread.i"
-	@echo "... Alc/alcThread.s"
-	@echo "... Alc/backends/android.o"
-	@echo "... Alc/backends/android.i"
-	@echo "... Alc/backends/android.s"
-	@echo "... Alc/backends/loopback.o"
-	@echo "... Alc/backends/loopback.i"
-	@echo "... Alc/backends/loopback.s"
-	@echo "... Alc/backends/null.o"
-	@echo "... Alc/backends/null.i"
-	@echo "... Alc/backends/null.s"
-	@echo "... Alc/backends/wave.o"
-	@echo "... Alc/backends/wave.i"
-	@echo "... Alc/backends/wave.s"
-	@echo "... Alc/bs2b.o"
-	@echo "... Alc/bs2b.i"
-	@echo "... Alc/bs2b.s"
-	@echo "... Alc/helpers.o"
-	@echo "... Alc/helpers.i"
-	@echo "... Alc/helpers.s"
-	@echo "... Alc/hrtf.o"
-	@echo "... Alc/hrtf.i"
-	@echo "... Alc/hrtf.s"
-	@echo "... Alc/mixer.o"
-	@echo "... Alc/mixer.i"
-	@echo "... Alc/mixer.s"
-	@echo "... Alc/panning.o"
-	@echo "... Alc/panning.i"
-	@echo "... Alc/panning.s"
-	@echo "... OpenAL32/alAuxEffectSlot.o"
-	@echo "... OpenAL32/alAuxEffectSlot.i"
-	@echo "... OpenAL32/alAuxEffectSlot.s"
-	@echo "... OpenAL32/alBuffer.o"
-	@echo "... OpenAL32/alBuffer.i"
-	@echo "... OpenAL32/alBuffer.s"
-	@echo "... OpenAL32/alEffect.o"
-	@echo "... OpenAL32/alEffect.i"
-	@echo "... OpenAL32/alEffect.s"
-	@echo "... OpenAL32/alError.o"
-	@echo "... OpenAL32/alError.i"
-	@echo "... OpenAL32/alError.s"
-	@echo "... OpenAL32/alExtension.o"
-	@echo "... OpenAL32/alExtension.i"
-	@echo "... OpenAL32/alExtension.s"
-	@echo "... OpenAL32/alFilter.o"
-	@echo "... OpenAL32/alFilter.i"
-	@echo "... OpenAL32/alFilter.s"
-	@echo "... OpenAL32/alListener.o"
-	@echo "... OpenAL32/alListener.i"
-	@echo "... OpenAL32/alListener.s"
-	@echo "... OpenAL32/alSource.o"
-	@echo "... OpenAL32/alSource.i"
-	@echo "... OpenAL32/alSource.s"
-	@echo "... OpenAL32/alState.o"
-	@echo "... OpenAL32/alState.i"
-	@echo "... OpenAL32/alState.s"
-	@echo "... OpenAL32/alThunk.o"
-	@echo "... OpenAL32/alThunk.i"
-	@echo "... OpenAL32/alThunk.s"
-	@echo "... utils/openal-info.o"
-	@echo "... utils/openal-info.i"
-	@echo "... utils/openal-info.s"
-.PHONY : help
-
-
-
-#=============================================================================
-# Special targets to cleanup operation of make.
-
-# Special rule to run CMake to check the build system integrity.
-# No rule that depends on this can have commands that come from listfiles
-# because they might be regenerated.
-cmake_check_build_system:
-	$(CMAKE_COMMAND) -H$(CMAKE_SOURCE_DIR) -B$(CMAKE_BINARY_DIR) --check-build-system CMakeFiles/Makefile.cmake 0
-.PHONY : cmake_check_build_system
-

この差分においてかなりの量のファイルが変更されているため、一部のファイルを表示していません