为了账号安全,请及时绑定邮箱和手机立即绑定

Go、OpenAL、DirectSound 和 Heisenbug

Go、OpenAL、DirectSound 和 Heisenbug

Go
尚方宝剑之说 2021-08-10 15:30:57
我已经花了一周时间试图解决我的项目中的一个神秘问题,但我已经没有想法了。我写了一个 Go 包,旨在播放包含 OpenAL 的声音......非常基本的东西。我让它在我的 Xubuntu 14.04(32 位)上运行,所以我启动到 Windows(7,也是 32 位)以移植它......这就是问题开始的地方。每当我尝试使用我的音频包时,程序都会因 c0000005 而崩溃。我尝试通过 gdb 运行它并惊讶地发现它没有问题,甚至可以播放我的测试声音。时间过去了,不知道该怎么做,我下载了 OpenAL Soft 源代码并开始添加 printfs - 并发现它崩溃的确切行:http://repo.or.cz/w/openal-soft.git/blob/HEAD:/Alc/backends/dsound.c#l361对于那些懒得点击链接的人(或者如果链接停止工作),这是对 DirectSoundCreate 的调用。再次运行调试器,我在调用前后看到了我的打印,并且在它们之间创建了 4 个新线程。这些是 Go 文件中的相关内容:package audio/*#cgo CFLAGS: -I"../libraries/include"#cgo windows,386 LDFLAGS: ../libraries/lib/windows/x86/OpenAL32.dll#cgo windows,amd64 LDFLAGS: ../libraries/lib/windows/x64/OpenAL32.dll#cgo linux LDFLAGS: -lopenal#include "audio.h"*/import "C"import (    "errors")var context *C.ALCcontextfunc Init() error {    context = C.initAudio() // it crashes on this line    if context == nil {        return errors.New("could not initialize audio")    }    SetActiveListener(NewListener())    return nil}这是实际进行 OpenAL 调用的 C 文件:#include "audio.h"#include <string.h>#include <stdio.h>ALCcontext* initAudio() {    ALCdevice* device = alcOpenDevice(NULL); // crashes here    if (device == NULL) {        return NULL;    }    ALCcontext* context = alcCreateContext(device, NULL);    if (!alcMakeContextCurrent(context)) {        return NULL;    }    return context;}最后但并非最不重要的一点是,如果我在纯 C 中做完全相同的事情(实际上只是将 main 添加到我发布并调用的文件中initAudio),它就可以工作。我的问题很明显:#@!$ 发生了什么?
查看完整描述

2 回答

?
桃花长相依

TA贡献1860条经验 获得超8个赞

我刚知道Go 1.3.1出来了,所以我尝试更新......问题消失了。(啊!)

我想这是一个编译器错误。无论如何,感谢所有试图提供帮助的人,我真的很感激。


查看完整回答
反对 回复 2021-08-10
  • 2 回答
  • 0 关注
  • 241 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信