用 Golang 开发 Android 应用(五)—— Audio(openAL)使用

用 Golang 开发 Android 应用 -- Audio/openAL 使用

      • 计划按以下的内容更新
      • Audio(openAL) 使用
        • Record 代码说明
        • 由 main_windows.go 展开说
        • 重要提醒

计划按以下的内容更新

  • 基本环境配置
  • 简单 UI
  • Storage 使用
  • Sensor 使用
  • Audio(openAL) 使用
  • Camera 使用
  • OpenCV 使用

Audio(openAL) 使用

  Audio 是很重要的部分,但我之前漏掉它了,所以最初的计划里没有相关内容,发现这个漏网之鱼后,我"上下求(sou)索""七拼八湊"终于搞定用于 Demo 的相关代码。这里稍微提一下过程,可以作为借鉴。首先当然是各种搜索,看是否有现成可用的 Go Audio 模块,直接搜没什么结果。后面想到 3D 引擎都需要 Audio 模块,那就搜索用 Go 实现的 3D 引擎,结果还真搜到几个有 Audio 模块。那接下来自然是学习、理解、拷贝、编码…
  总之在 Android (4.4 以上)平台都实现了 OpenSLES (Open Sound Library for Embedded Systems),但是直接用它太复杂了,所以我这里基于 openAL 来作Audio 演示。之所以把 audio 模块源码放到这个应用的vender的原因也就很明显了 ———— 它只是用来 Demo 的。

  按惯例网上一搜一大把的东西这里就不说了,那我们把演示程序的代码中有“意思”的部分来说明一下。这个 Demo 是个简单的录音程序。
用 Golang 开发 Android 应用(五)—— Audio(openAL)使用_第1张图片

Record 代码说明

	// 需手动 Load libopenal.so
	libs := app.FindMatchLibrary("libopenal*.so")
	if len(libs) > 0 {
		al.InitPath(libs[0])
	}

这一段的目的其实很简单,就是保证 dlopen("libopenal.so",...)(C代码) 能成功。这个例子中 libopenal.so 是放到 apk 的 lib/%ABI%/ 下,在 Android 7.0 上直接这样执行 dlopen("libopenal.so",...) 能成功。但在 Android 4.4 上却会失败。为了解决这个问题,需要传入 libopenal.so 的完整路径 dlopen("/data/???/libopenal.so",...),显然 app.FindMatchLibrary 这个函数就是用于查找完整路径的,它会优先找 apk 中的 lib 安装在手机中的位置。
因此上面的代码就是找到 libopenal.so 的路径,并传给 al 的初始化函数,这样就能兼容 Android 各个版本。

	// SAMPLERATE 和 SAMPLESIZE 分别是 44100、2048 这两个值等比缩小,
	// 调用 CaptureOpen 就能成功
	const DENOMINATOR = 1
	const SAMPLERATE = 44100 / DENOMINATOR
	const SAMPLESIZE = 2048 / DENOMINATOR
	...
	d := alc.CaptureOpen("", SAMPLERATE, FORMAT, SAMPLESIZE)	

上面这段代码的意思并不是只有这两组数等比缩小才能成功,而是通过反复尝试,这样成功的可能性大一些。同时也要提醒一下,可能在 PC 上运行(对的,OpenAL 也可在 PC 上运行)没问题的代码,在手机上不一定能成功,如果是 CaptureOpen 失败,就尝试修改这两个值。

由 main_windows.go 展开说

这个版本的 Record 和之前的列子有一个明显的不同,就是多了一个 main_windows.go 文件,它是用来编译 PC 版的 Record 。理论上它同样支持在 linux 下运行,但因为我没有验证,所以就限定为 windows 了。这下大家之前对if runtime.GOOS == "android"的疑问,现在终于解惑了^_^ 。
其实重点是这里给出了一个用 PC 来“简单模拟” Android 的方法,我们可以先在 PC 上调试好界面,甚至是逻辑。只要模拟发各种 event ,大多数逻辑部分都可以先在 PC 上跑通过,没有问题了再在手机上验证、调试这样一定是事半功倍的。

重要提醒

最后要提醒的是要确认电脑上有audio input设备,否则可能跑不起来,包括 Android 仿真也是。
然后如果 PC 版还跑不起来,先确认 OpenAL32.dll(windwos)或libopenal.so(linux) 有没有?没有的话先安装 openal。
再确认一下是不是有 libGLESv2.dll(.so) 和 libEGL.dll(.so) ? 没有?下载一个Visual Studio Code,它里面有这两个文件。

开始提到的用于参考的 3D Engine :

  • g3n - https://github.com/g3n/engine
  • vu https://github.com/gazed/vu
  • azul3d https://azul3d.org

你可能感兴趣的:(Golang,Android)