github.com/graybobo/golang.org-package-offline-cache@v0.0.0-20200626051047-6608995c132f/x/mobile/exp/audio/al/al_android.go (about)

     1  // Copyright 2015 The Go Authors. All rights reserved.
     2  // Use of this source code is governed by a BSD-style
     3  // license that can be found in the LICENSE file.
     4  
     5  package al
     6  
     7  /*
     8  #include <stdlib.h>
     9  #include <string.h>
    10  #include <dlfcn.h>
    11  #include <jni.h>
    12  #include <limits.h>
    13  #include <AL/al.h>
    14  #include <AL/alc.h>
    15  
    16  void al_init(uintptr_t java_vm, uintptr_t jni_env, uintptr_t context, void** handle) {
    17    JavaVM* vm = (JavaVM*)java_vm;
    18    JNIEnv* env = (JNIEnv*)jni_env;
    19  
    20    jclass android_content_Context = (*env)->FindClass(env, "android/content/Context");
    21    jmethodID get_package_name = (*env)->GetMethodID(env, android_content_Context, "getPackageName", "()Ljava/lang/String;");
    22    jstring package_name = (*env)->CallObjectMethod(env, context, get_package_name);
    23    const char *cpackage_name = (*env)->GetStringUTFChars(env, package_name, 0);
    24  
    25    char lib_path[PATH_MAX] = "/data/data/";
    26    strlcat(lib_path, cpackage_name, sizeof(lib_path));
    27    strlcat(lib_path, "/lib/libopenal.so", sizeof(lib_path));
    28    *handle = dlopen(lib_path, RTLD_LAZY);
    29    (*env)->ReleaseStringUTFChars(env, package_name, cpackage_name);
    30  }
    31  
    32  void call_alEnable(LPALENABLE fn, ALenum capability) {
    33    fn(capability);
    34  }
    35  
    36  void call_alDisable(LPALDISABLE fn, ALenum capability) {
    37    fn(capability);
    38  }
    39  
    40  ALboolean call_alIsEnabled(LPALISENABLED fn, ALenum capability) {
    41    return fn(capability);
    42  }
    43  
    44  ALint call_alGetInteger(LPALGETINTEGER fn, ALenum p) {
    45    return fn(p);
    46  }
    47  
    48  ALfloat call_alGetFloat(LPALGETFLOAT fn, ALenum p) {
    49    return fn(p);
    50  }
    51  
    52  const char* call_alGetString(LPALGETSTRING fn, ALenum p) {
    53    return fn(p);
    54  }
    55  
    56  void call_alDistanceModel(LPALDISTANCEMODEL fn, ALenum v) {
    57    fn(v);
    58  }
    59  
    60  void call_alDopplerFactor(LPALDOPPLERFACTOR fn, ALfloat v) {
    61    fn(v);
    62  }
    63  
    64  void call_alDopplerVelocity(LPALDOPPLERVELOCITY fn, ALfloat v) {
    65    fn(v);
    66  }
    67  
    68  void call_alSpeedOfSound(LPALSPEEDOFSOUND fn, ALfloat v) {
    69    fn(v);
    70  }
    71  
    72  ALint call_alGetError(LPALGETERROR fn) {
    73    return fn();
    74  }
    75  
    76  void call_alGenSources(LPALGENSOURCES fn, ALsizei n, ALuint* s) {
    77    fn(n, s);
    78  }
    79  
    80  void call_alSourcePlayv(LPALSOURCEPLAYV fn, ALsizei n, const ALuint* s) {
    81    fn(n, s);
    82  }
    83  
    84  void call_alSourcePausev(LPALSOURCEPAUSEV fn, ALsizei n, const ALuint* s) {
    85    fn(n, s);
    86  }
    87  
    88  void call_alSourceStopv(LPALSOURCESTOPV fn, ALsizei n, const ALuint* s) {
    89    fn(n, s);
    90  }
    91  
    92  void call_alSourceRewindv(LPALSOURCEREWINDV fn, ALsizei n, const ALuint* s) {
    93    fn(n, s);
    94  }
    95  
    96  void call_alDeleteSources(LPALDELETESOURCES fn, ALsizei n, const ALuint* s) {
    97    fn(n, s);
    98  }
    99  
   100  void call_alGetSourcei(LPALGETSOURCEI fn, ALuint s, ALenum k, ALint* v) {
   101    fn(s, k, v);
   102  }
   103  
   104  void call_alGetSourcef(LPALGETSOURCEF fn, ALuint s, ALenum k, ALfloat* v) {
   105    fn(s, k, v);
   106  }
   107  
   108  void call_alGetSourcefv(LPALGETSOURCEFV fn, ALuint s, ALenum k, ALfloat* v) {
   109    fn(s, k, v);
   110  }
   111  
   112  void call_alSourcei(LPALSOURCEI fn, ALuint s, ALenum k, ALint v) {
   113    fn(s, k, v);
   114  }
   115  
   116  void call_alSourcef(LPALSOURCEF fn, ALuint s, ALenum k, ALfloat v) {
   117    fn(s, k, v);
   118  }
   119  
   120  void call_alSourcefv(LPALSOURCEFV fn, ALuint s, ALenum k, const ALfloat* v) {
   121    fn(s, k, v);
   122  }
   123  
   124  void call_alSourceQueueBuffers(LPALSOURCEQUEUEBUFFERS fn, ALuint s, ALsizei n, const ALuint* b) {
   125    fn(s, n, b);
   126  }
   127  
   128  void call_alSourceUnqueueBuffers(LPALSOURCEUNQUEUEBUFFERS fn, ALuint s, ALsizei n, ALuint* b) {
   129    fn(s, n, b);
   130  }
   131  
   132  void call_alGetListenerf(LPALGETLISTENERF fn, ALenum k, ALfloat* v) {
   133    fn(k, v);
   134  }
   135  
   136  void call_alGetListenerfv(LPALLISTENERFV fn, ALenum k, ALfloat* v) {
   137    fn(k, v);
   138  }
   139  
   140  void call_alListenerf(LPALLISTENERF fn, ALenum k, ALfloat v) {
   141    fn(k, v);
   142  }
   143  
   144  void call_alListenerfv(LPALLISTENERFV fn, ALenum k, const ALfloat* v) {
   145    fn(k, v);
   146  }
   147  
   148  void call_alGenBuffers(LPALGENBUFFERS fn, ALsizei n, ALuint* v) {
   149    fn(n, v);
   150  }
   151  
   152  void call_alDeleteBuffers(LPALDELETEBUFFERS fn, ALsizei n, ALuint* v) {
   153    fn(n, v);
   154  }
   155  
   156  void call_alGetBufferi(LPALGETBUFFERI fn, ALuint b, ALenum k, ALint* v) {
   157    fn(b, k, v);
   158  }
   159  
   160  void call_alBufferData(LPALBUFFERDATA fn, ALuint b, ALenum format, const ALvoid* data, ALsizei size, ALsizei freq) {
   161    fn(b, format, data, size, freq);
   162  }
   163  
   164  ALboolean call_alIsBuffer(LPALISBUFFER fn, ALuint b) {
   165    return fn(b);
   166  }
   167  */
   168  import "C"
   169  import (
   170  	"errors"
   171  	"log"
   172  	"unsafe"
   173  
   174  	"golang.org/x/mobile/internal/mobileinit"
   175  )
   176  
   177  var (
   178  	alHandle                   unsafe.Pointer
   179  	alEnableFunc               C.LPALENABLE
   180  	alDisableFunc              C.LPALDISABLE
   181  	alIsEnabledFunc            C.LPALISENABLED
   182  	alGetIntegerFunc           C.LPALGETINTEGER
   183  	alGetFloatFunc             C.LPALGETFLOAT
   184  	alGetStringFunc            C.LPALGETSTRING
   185  	alDistanceModelFunc        C.LPALDISTANCEMODEL
   186  	alDopplerFactorFunc        C.LPALDOPPLERFACTOR
   187  	alDopplerVelocityFunc      C.LPALDOPPLERVELOCITY
   188  	alSpeedOfSoundFunc         C.LPALSPEEDOFSOUND
   189  	alGetErrorFunc             C.LPALGETERROR
   190  	alGenSourcesFunc           C.LPALGENSOURCES
   191  	alSourcePlayvFunc          C.LPALSOURCEPLAYV
   192  	alSourcePausevFunc         C.LPALSOURCEPAUSEV
   193  	alSourceStopvFunc          C.LPALSOURCESTOPV
   194  	alSourceRewindvFunc        C.LPALSOURCEREWINDV
   195  	alDeleteSourcesFunc        C.LPALDELETESOURCES
   196  	alGetSourceiFunc           C.LPALGETSOURCEI
   197  	alGetSourcefFunc           C.LPALGETSOURCEF
   198  	alGetSourcefvFunc          C.LPALGETSOURCEFV
   199  	alSourceiFunc              C.LPALSOURCEI
   200  	alSourcefFunc              C.LPALSOURCEF
   201  	alSourcefvFunc             C.LPALSOURCEFV
   202  	alSourceQueueBuffersFunc   C.LPALSOURCEQUEUEBUFFERS
   203  	alSourceUnqueueBuffersFunc C.LPALSOURCEUNQUEUEBUFFERS
   204  	alGetListenerfFunc         C.LPALGETLISTENERF
   205  	alGetListenerfvFunc        C.LPALGETLISTENERFV
   206  	alListenerfFunc            C.LPALLISTENERF
   207  	alListenerfvFunc           C.LPALLISTENERFV
   208  	alGenBuffersFunc           C.LPALGENBUFFERS
   209  	alDeleteBuffersFunc        C.LPALDELETEBUFFERS
   210  	alGetBufferiFunc           C.LPALGETBUFFERI
   211  	alBufferDataFunc           C.LPALBUFFERDATA
   212  	alIsBufferFunc             C.LPALISBUFFER
   213  
   214  	alcGetErrorFunc           C.LPALCGETERROR
   215  	alcOpenDeviceFunc         C.LPALCOPENDEVICE
   216  	alcCloseDeviceFunc        C.LPALCCLOSEDEVICE
   217  	alcCreateContextFunc      C.LPALCCREATECONTEXT
   218  	alcMakeContextCurrentFunc C.LPALCMAKECONTEXTCURRENT
   219  	alcDestroyContextFunc     C.LPALCDESTROYCONTEXT
   220  )
   221  
   222  func initAL() {
   223  	err := mobileinit.RunOnJVM(func(vm, env, ctx uintptr) error {
   224  		C.al_init(C.uintptr_t(vm), C.uintptr_t(env), C.uintptr_t(ctx), &alHandle)
   225  		if alHandle == nil {
   226  			return errors.New("al: cannot load libopenal.so")
   227  		}
   228  		return nil
   229  	})
   230  	if err != nil {
   231  		log.Fatalf("al: %v", err)
   232  	}
   233  
   234  	alEnableFunc = C.LPALENABLE(fn("alEnable"))
   235  	alDisableFunc = C.LPALDISABLE(fn("alDisable"))
   236  	alIsEnabledFunc = C.LPALISENABLED(fn("alIsEnabled"))
   237  	alGetIntegerFunc = C.LPALGETINTEGER(fn("alGetInteger"))
   238  	alGetFloatFunc = C.LPALGETFLOAT(fn("alGetFloat"))
   239  	alGetStringFunc = C.LPALGETSTRING(fn("alGetString"))
   240  	alDistanceModelFunc = C.LPALDISTANCEMODEL(fn("alDistanceModel"))
   241  	alDopplerFactorFunc = C.LPALDOPPLERFACTOR(fn("alDopplerFactor"))
   242  	alDopplerVelocityFunc = C.LPALDOPPLERVELOCITY(fn("alDopplerVelocity"))
   243  	alSpeedOfSoundFunc = C.LPALSPEEDOFSOUND(fn("alSpeedOfSound"))
   244  	alGetErrorFunc = C.LPALGETERROR(fn("alGetError"))
   245  	alGenSourcesFunc = C.LPALGENSOURCES(fn("alGenSources"))
   246  	alSourcePlayvFunc = C.LPALSOURCEPLAYV(fn("alSourcePlayv"))
   247  	alSourcePausevFunc = C.LPALSOURCEPAUSEV(fn("alSourcePausev"))
   248  	alSourceStopvFunc = C.LPALSOURCESTOPV(fn("alSourceStopv"))
   249  	alSourceRewindvFunc = C.LPALSOURCEREWINDV(fn("alSourceRewindv"))
   250  	alDeleteSourcesFunc = C.LPALDELETESOURCES(fn("alDeleteSources"))
   251  	alGetSourceiFunc = C.LPALGETSOURCEI(fn("alGetSourcei"))
   252  	alGetSourcefFunc = C.LPALGETSOURCEF(fn("alGetSourcef"))
   253  	alGetSourcefvFunc = C.LPALGETSOURCEFV(fn("alGetSourcefv"))
   254  	alSourceiFunc = C.LPALSOURCEI(fn("alSourcei"))
   255  	alSourcefFunc = C.LPALSOURCEF(fn("alSourcef"))
   256  	alSourcefvFunc = C.LPALSOURCEFV(fn("alSourcefv"))
   257  	alSourceQueueBuffersFunc = C.LPALSOURCEQUEUEBUFFERS(fn("alSourceQueueBuffers"))
   258  	alSourceUnqueueBuffersFunc = C.LPALSOURCEUNQUEUEBUFFERS(fn("alSourceUnqueueBuffers"))
   259  	alGetListenerfFunc = C.LPALGETLISTENERF(fn("alGetListenerf"))
   260  	alGetListenerfvFunc = C.LPALGETLISTENERFV(fn("alGetListenerfv"))
   261  	alListenerfFunc = C.LPALLISTENERF(fn("alListenerf"))
   262  	alListenerfvFunc = C.LPALLISTENERFV(fn("alListenerfv"))
   263  	alGenBuffersFunc = C.LPALGENBUFFERS(fn("alGenBuffers"))
   264  	alDeleteBuffersFunc = C.LPALDELETEBUFFERS(fn("alDeleteBuffers"))
   265  	alGetBufferiFunc = C.LPALGETBUFFERI(fn("alGetBufferi"))
   266  	alBufferDataFunc = C.LPALBUFFERDATA(fn("alBufferData"))
   267  	alIsBufferFunc = C.LPALISBUFFER(fn("alIsBuffer"))
   268  
   269  	alcGetErrorFunc = C.LPALCGETERROR(fn("alcGetError"))
   270  	alcOpenDeviceFunc = C.LPALCOPENDEVICE(fn("alcOpenDevice"))
   271  	alcCloseDeviceFunc = C.LPALCCLOSEDEVICE(fn("alcCloseDevice"))
   272  	alcCreateContextFunc = C.LPALCCREATECONTEXT(fn("alcCreateContext"))
   273  	alcMakeContextCurrentFunc = C.LPALCMAKECONTEXTCURRENT(fn("alcMakeContextCurrent"))
   274  	alcDestroyContextFunc = C.LPALCDESTROYCONTEXT(fn("alcDestroyContext"))
   275  }
   276  
   277  func fn(fname string) unsafe.Pointer {
   278  	name := C.CString(fname)
   279  	defer C.free(unsafe.Pointer(name))
   280  
   281  	p := C.dlsym(alHandle, name)
   282  	if uintptr(p) == 0 {
   283  		log.Fatalf("al: couldn't dlsym %q", fname)
   284  	}
   285  	return p
   286  }
   287  
   288  func alEnable(capability int32) {
   289  	C.call_alEnable(alEnableFunc, C.ALenum(capability))
   290  }
   291  
   292  func alDisable(capability int32) {
   293  	C.call_alDisable(alDisableFunc, C.ALenum(capability))
   294  }
   295  
   296  func alIsEnabled(capability int32) bool {
   297  	return C.call_alIsEnabled(alIsEnabledFunc, C.ALenum(capability)) == C.AL_TRUE
   298  }
   299  
   300  func alGetInteger(k int) int32 {
   301  	return int32(C.call_alGetInteger(alGetIntegerFunc, C.ALenum(k)))
   302  }
   303  
   304  func alGetFloat(k int) float32 {
   305  	return float32(C.call_alGetFloat(alGetFloatFunc, C.ALenum(k)))
   306  }
   307  
   308  func alGetString(v int) string {
   309  	value := C.call_alGetString(alGetStringFunc, C.ALenum(v))
   310  	return C.GoString(value)
   311  }
   312  
   313  func alDistanceModel(v int32) {
   314  	C.call_alDistanceModel(alDistanceModelFunc, C.ALenum(v))
   315  }
   316  
   317  func alDopplerFactor(v float32) {
   318  	C.call_alDopplerFactor(alDopplerFactorFunc, C.ALfloat(v))
   319  }
   320  
   321  func alDopplerVelocity(v float32) {
   322  	C.call_alDopplerVelocity(alDopplerVelocityFunc, C.ALfloat(v))
   323  }
   324  
   325  func alSpeedOfSound(v float32) {
   326  	C.call_alSpeedOfSound(alSpeedOfSoundFunc, C.ALfloat(v))
   327  }
   328  
   329  func alGetError() int32 {
   330  	return int32(C.call_alGetError(alGetErrorFunc))
   331  }
   332  
   333  func alGenSources(n int) []Source {
   334  	s := make([]Source, n)
   335  	C.call_alGenSources(alGenSourcesFunc, C.ALsizei(n), (*C.ALuint)(unsafe.Pointer(&s[0])))
   336  	return s
   337  }
   338  
   339  func alSourcePlayv(s []Source) {
   340  	C.call_alSourcePlayv(alSourcePlayvFunc, C.ALsizei(len(s)), (*C.ALuint)(unsafe.Pointer(&s[0])))
   341  }
   342  
   343  func alSourcePausev(s []Source) {
   344  	C.call_alSourcePausev(alSourcePausevFunc, C.ALsizei(len(s)), (*C.ALuint)(unsafe.Pointer(&s[0])))
   345  }
   346  
   347  func alSourceStopv(s []Source) {
   348  	C.call_alSourceStopv(alSourceStopvFunc, C.ALsizei(len(s)), (*C.ALuint)(unsafe.Pointer(&s[0])))
   349  }
   350  
   351  func alSourceRewindv(s []Source) {
   352  	C.call_alSourceRewindv(alSourceRewindvFunc, C.ALsizei(len(s)), (*C.ALuint)(unsafe.Pointer(&s[0])))
   353  }
   354  
   355  func alDeleteSources(s []Source) {
   356  	C.call_alDeleteSources(alDeleteSourcesFunc, C.ALsizei(len(s)), (*C.ALuint)(unsafe.Pointer(&s[0])))
   357  }
   358  
   359  func alGetSourcei(s Source, k int) int32 {
   360  	var v C.ALint
   361  	C.call_alGetSourcei(alGetSourceiFunc, C.ALuint(s), C.ALenum(k), &v)
   362  	return int32(v)
   363  }
   364  
   365  func alGetSourcef(s Source, k int) float32 {
   366  	var v C.ALfloat
   367  	C.call_alGetSourcef(alGetSourcefFunc, C.ALuint(s), C.ALenum(k), &v)
   368  	return float32(v)
   369  }
   370  
   371  func alGetSourcefv(s Source, k int, v []float32) {
   372  	C.call_alGetSourcefv(alGetSourcefvFunc, C.ALuint(s), C.ALenum(k), (*C.ALfloat)(unsafe.Pointer(&v[0])))
   373  }
   374  
   375  func alSourcei(s Source, k int, v int32) {
   376  	C.call_alSourcei(alSourcefFunc, C.ALuint(s), C.ALenum(k), C.ALint(v))
   377  }
   378  
   379  func alSourcef(s Source, k int, v float32) {
   380  	C.call_alSourcef(alSourcefFunc, C.ALuint(s), C.ALenum(k), C.ALfloat(v))
   381  }
   382  
   383  func alSourcefv(s Source, k int, v []float32) {
   384  	C.call_alSourcefv(alSourcefvFunc, C.ALuint(s), C.ALenum(k), (*C.ALfloat)(unsafe.Pointer(&v[0])))
   385  }
   386  
   387  func alSourceQueueBuffers(s Source, b []Buffer) {
   388  	C.call_alSourceQueueBuffers(alSourceQueueBuffersFunc, C.ALuint(s), C.ALsizei(len(b)), (*C.ALuint)(unsafe.Pointer(&b[0])))
   389  }
   390  
   391  func alSourceUnqueueBuffers(s Source, b []Buffer) {
   392  	C.call_alSourceUnqueueBuffers(alSourceUnqueueBuffersFunc, C.ALuint(s), C.ALsizei(len(b)), (*C.ALuint)(unsafe.Pointer(&b[0])))
   393  }
   394  
   395  func alGetListenerf(k int) float32 {
   396  	var v C.ALfloat
   397  	C.call_alGetListenerf(alListenerfFunc, C.ALenum(k), &v)
   398  	return float32(v)
   399  }
   400  
   401  func alGetListenerfv(k int, v []float32) {
   402  	C.call_alGetListenerfv(alGetListenerfvFunc, C.ALenum(k), (*C.ALfloat)(unsafe.Pointer(&v[0])))
   403  }
   404  
   405  func alListenerf(k int, v float32) {
   406  	C.call_alListenerf(alListenerfFunc, C.ALenum(k), C.ALfloat(v))
   407  }
   408  
   409  func alListenerfv(k int, v []float32) {
   410  	C.call_alListenerfv(alListenerfvFunc, C.ALenum(k), (*C.ALfloat)(unsafe.Pointer(&v[0])))
   411  }
   412  
   413  func alGenBuffers(n int) []Buffer {
   414  	s := make([]Buffer, n)
   415  	C.call_alGenBuffers(alGenBuffersFunc, C.ALsizei(n), (*C.ALuint)(unsafe.Pointer(&s[0])))
   416  	return s
   417  }
   418  
   419  func alDeleteBuffers(b []Buffer) {
   420  	C.call_alDeleteBuffers(alDeleteBuffersFunc, C.ALsizei(len(b)), (*C.ALuint)(unsafe.Pointer(&b[0])))
   421  }
   422  
   423  func alGetBufferi(b Buffer, k int) int32 {
   424  	var v C.ALint
   425  	C.call_alGetBufferi(alGetBufferiFunc, C.ALuint(b), C.ALenum(k), &v)
   426  	return int32(v)
   427  }
   428  
   429  func alBufferData(b Buffer, format uint32, data []byte, freq int32) {
   430  	C.call_alBufferData(alBufferDataFunc, C.ALuint(b), C.ALenum(format), unsafe.Pointer(&data[0]), C.ALsizei(len(data)), C.ALsizei(freq))
   431  }
   432  
   433  func alIsBuffer(b Buffer) bool {
   434  	return C.call_alIsBuffer(alIsBufferFunc, C.ALuint(b)) == C.AL_TRUE
   435  }