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 }