golang调用sdl2,播放pcm音频,报错signal arrived during external code execution。
golang调用sdl2,播放pcm音频,报错signal arrived during external code execution。
win10 x64下测试成功,其他操作系统下不保证成功。
采用的是syscall方式,不是cgo方式。
见地址
在go1.16.15编译后然后执行,会报如下错。换成go1.18就不报错了。
Exception 0xc0000005 0x0 0xc000442000 0x7ff96da8db50
PC=0x7ff96da8db50
signal arrived during external code execution
syscall.Syscall6(0x7ff96daa7440, 0x4, 0x20d6354a0a0, 0xc000442000, 0x1000, 0x10, 0x0, 0x0, 0x0, 0x0, …)
D:/Program Files/Go/go1.16.15/src/runtime/syscall_windows.go:347 +0xf2
syscall.(*Proc).Call(0xc000599b40, 0xc0001207c0, 0x4, 0x4, 0x20, 0xa6ffa0, 0x20d6354a001, 0xc0001207c0)
D:/Program Files/Go/go1.16.15/src/syscall/dll_windows.go:188 +0x385
syscall.(*LazyProc).Call(0xc00007fc50, 0xc0001207c0, 0x4, 0x4, 0x3, 0x3, 0x20d6354a0a0, 0x0)
D:/Program Files/Go/go1.16.15/src/syscall/dll_windows.go:339 +0x78
github.com/moonfdd/sdl2-go/sdl.SDL_MixAudio(0x20d6354a0a0, 0xc000442000, 0x1000001000)
D:/mysetup/gopath/src/sdl2-go/sdl/SDL_audio.go:1185 +0xf1
main.fill_audio_pcm(0xc00010ff48, 0x20d6354a0a0, 0x1000, 0x0)
D:/mysetup/gopath/src/sdl2-go/examples/a06-sdl-pcm/main1.go:33 +0x125
goroutine 1 [chan receive]:
main.main()
D:/mysetup/gopath/src/sdl2-go/examples/a06-sdl-pcm/main1.go:66 +0x288
rax 0x20d6354a0a0
rbx 0xc0000086e0
rcx 0x20d6354a0a0
rdi 0xecaa4c3000
rsi 0xc0000439c0
rbp 0xc000043960
rsp 0xecabbffb50
r8 0x8010
r9 0x20d6354b0a0
r10 0x10
r11 0x4
r12 0xa7b800
r13 0x0
r14 0x0
r15 0x2030001
rip 0x7ff96da8db50
rflags 0x10206
cs 0x33
fs 0x53
gs 0x2b
golang代码如下:
package main
import (
"fmt"
"github.com/moonfdd/sdl2-go/sdl"
"github.com/moonfdd/sdl2-go/sdlcommon"
"io/ioutil"
"sync"
"syscall"
"unsafe"
)
var o sync.Once
//音频设备回调函数
func fill_audio_pcm(udata sdlcommon.FVoidP, stream *sdlcommon.FUint8T, len1 sdlcommon.FInt) uintptr {
info := (*Info)(unsafe.Pointer(udata))
if info.isStop {
return 0
}
if info.Start >= info.Len {
info.isStop = true
o.Do(func() {
ch <- struct{}{}
})
return 0
}
sdl.SDL_memset(uintptr(unsafe.Pointer(stream)), 0, uint64(len1))
if len1 > int32(info.Len-info.Start) {
fmt.Println("不足len", len1, info.Len-info.Start)
len1 = int32(info.Len - info.Start)
}
sdl.SDL_MixAudio(stream, &info.Data[info.Start], uint32(len1), sdl.SDL_MIX_MAXVOLUME/8)
info.Start += int(len1)
return 0
}
var ch = make(chan struct{}, 1)
func main() {
sdlcommon.SetSDL2Path("SDL2.dll")
var spec sdl.SDL_AudioSpec
sdl.SDL_Init(sdl.SDL_INIT_AUDIO)
spec.Freq = 44100
spec.Format = sdl.AUDIO_S16SYS // 采样点格式
spec.Channels = 2 // 2通道
spec.Silence = 0
spec.Userdata = uintptr(0)
spec.Samples = 1024 // 23.2ms -> 46.4ms 每次读取的采样数量,多久产生一次回调和 samples
spec.Callback = syscall.NewCallback(fill_audio_pcm) // 回调函数
fileData, err := ioutil.ReadFile("44100_16bit_2ch.pcm")
if err != nil {
fmt.Println("读取文件失败", err)
return
}
info := new(Info)
info.Data = fileData
info.Len = len(fileData)
spec.Userdata = uintptr(unsafe.Pointer(info))
if sdl.SDL_OpenAudio(&spec, nil) != 0 {
fmt.Println("打开音频设备失败")
return
}
sdl.SDL_PauseAudio(0)
<-ch
fmt.Println("关闭")
sdl.SDL_CloseAudio()
sdl.SDL_Quit()
}
type Info struct {
Data []byte
Len int
Start int
isStop bool
}
执行结果如下:

golang调用sdl2,播放pcm音频,报错signal arrived during external code execution。的更多相关文章
- 最简单的视音频播放示例9:SDL2播放PCM
本文记录SDL播放音频的技术.在这里使用的版本是SDL2.实际上SDL本身并不提供视音频播放的功能,它只是封装了视音频播放的底层API.在Windows平台下,SDL封装了Direct3D这类的API ...
- 使用AudioTrack播放PCM音频数据(android)
众所周知,Android的MediaPlayer包含了Audio和video的播放功能,在Android的界面上,Music和Video两个应用程序都是调用MediaPlayer实现的.MediaPl ...
- 使用WindowsAPI实现播放PCM音频的方法
这篇文章主要介绍了使用WindowsAPI实现播放PCM音频的方法,很实用的一个功能,需要的朋友可以参考下 本文介绍了使用WindowsAPI实现播放PCM音频的方法,同前面一篇使用WindowsAP ...
- java调用本地方法的时候报错 could not find the main class:xx.program will exit
如图所示,当在java调用本地方法的时候报错 我的解决办法是把dll文件放到System.out.println(System.getProperty("java.library.path& ...
- ajax 调用 .net core WebAPI,报错 400 (Bad Request) Unexpected character encountered while parsing value
此文由博主前两天的提问及 dudu 的回答整理,地址:https://q.cnblogs.com/list/myquestion 情况说明 基于 .net core 写了一个 Web API,用 po ...
- 真机调试报错error ==Error Domain=NSURLErrorDomain Code=-1009 "似乎已断开与互联网的连接。"
真机调试报错error ==Error Domain=NSURLErrorDomain Code=-1009 "似乎已断开与互联网的连接." 请注意,错误代码是-1009,网上关于 ...
- 执行opatch apply 报错 OPatch failed with error code 73
.执行opatch apply 报错 OPatch failed [oracle@ora_11g 14275605]$ /opt/oracle/product/db_1/OPatch/opatch a ...
- MRP进程起不来, 报错:ORA-00600: internal error code, arguments: [2619], [227424], [], [], [], [], [], [], [], [], [], []
问题背景:客户数据库服务架构为一主一备,某日备库操作系统意外重启,重启后Oracle MRP进程起不来,报错:ORA-00600: internal error code, arguments: [2 ...
- 编译器报错: error LNK2001: unresolved external symbol "struct _ServiceDescriptorTable * KeServiceDescript
转自VC错误:http://www.vcerror.com/?p=10 问题描述: 编译器报错: error LNK2001: unresolved external symbol "str ...
- 填坑——audio不能正常播放,控制台报错 Uncaught (in promise) DOMException
原文:https://blog.csdn.net/Mariosss/article/details/87861167 用chrome调试页面时,发现audio控件有时不能正常播放音频,控制台报错 Un ...
随机推荐
- docker方式部署的gitlab跨版本迁移升级
之前代码服务器用的 beginor/gitlab-ce:11.3.0-ce.0 的版本,而当前时间已经到12.4.1了. gitlab 官方已经开始支持多语言, 而且也提供了 docker 镜像, b ...
- enobj.cn站有更新
1:整体样式 2:可以折叠app列表 3:手机端样式 4: Blog链接到博客园
- .net core 使用 Nlog 配置文件
nlog.config文件 安装nuget包: NLog.Web.AspNetCore 配置开始 <?xml version="1.0" encoding="utf ...
- vim指令大全
Linux vi种 wq .wq!.x.q.q!区别 上面的命令只是在vi编辑命令中使用 wq:表示保存退出 wq!:表示强制保存退出 x:表示保存退出 wq和wq!的区别如下: 有些文件设置了只 ...
- JMeter压测脚本实例:单接口
新建测试计划 添加线程组 添加HTTP请求 配置该请求相关参数 1.请求头部信息 ①HTTP请求同级线程组下添加HTTP信息头部管理器 ②填充该请求所需的头部信息 2.请求体 选中之前增加的HTTP请 ...
- 11.7 消除闪烁(1)(harib08g)
ps:看书比较急,有错误的地方欢迎指正,不细致的地方我会持续的修改 11.7 消除闪烁(1)(harib08g) 11.6 高速计数器(harib08f)存在闪烁的问题,产生原因:刷新时会从低到高进行 ...
- Springboot 结合 Netty 实战聊天系统
音视频技术为什么需要微服务 微服务,英文名:microservice,百度百科上将其定义为:SOA 架构的一种变体.微服务(或微服务架构)是一种将应用程序构造为一组低耦合的服务. 微服务有着一些鲜明的 ...
- 在surging 微服务引擎下如何搭建webservice和身份验证
一.前言 现实生产中,有一些比较老的系统对外提供的接口都是WebService,尤其是比较老的系统都是围绕ESB进行搭建,而对外提供就需要WebService ,为了更好完善其解决方案,故集成了web ...
- C#中的语句
寄语 接下来几篇文章,将带领大家一起简单回顾下C#中常规的语法,也是平常我们在编码过程中都使用的. 今天来介绍下C#中的语句. 一般科班出身的程序猿们大家第一个学习语言基本都是C语言,C语言里面在刚开 ...
- Shell---控制流程
操作系统: RHEL7.x 或CentOS 7.x 最小化安装 配置好固定的IP,能访问互联网 配置好yum源(yum repolist 可以查看yum源) 本地光盘 挂载光盘,开机自动挂载 vim ...