2021SC@SDUSC
一、前言
1.说明
audio 说明文档地址
audio package - github.com/hajimehoshi/ebiten/v2/audio - pkg.go.dev
本文中所有截图和代码均来自说明文档或 ebiten 源文件
笔者负责 audio 音频相关的代码分析
2.梗概
audio.go 中的 player
二、player
1.audio.go 中相关方法
Player 是一个音频播放器,只有一个流。即使对 Player 对象的所有引用都消失了,在 player 完成 playing 之前,对象也不会被 GCed。这意味着如果一个播放器播放无限流,除非调用Close,否则永远不会对对象进行 GCed。
NewPlayer 使用给定流创建一个新播放器。
src 的格式必须是不带报头的线性 PCM(16位小端,2声道立体声)。
采样率必须与音频上下文的采样率相同。
NewPlayerFromBytes 使用给定的字节创建一个新播放器。
NewPlayerFromBytes 与 NewPlayer 不同,不必关心 src 是否已被其他播放器使用。src 可以由多个播放器共享。
src的格式应与 NewPlayer 中的格式相同。
结束播放
Close 关闭流。
调用Close时,播放器拥有的流不会关闭,即便这个流实现了 io.Closer。
当播放器已经关闭时,重复调用 Close 返回错误。
Play 播放流
返回播放状态
Rewind 将当前位置倒带到起始位置。
传递给 NewPlayer 的资源必须是 io.Seeker。
Seek 根据给定偏移量查找位置。
传递给 NewPlayer 的资源必须是 io.Seeker。
暂停播放
Current 返回当前位置的时间。
只要播放器继续播放,当前的返回值就会单调增加,即使音频流循环,返回到了开始位置。
Volume 返回此播放器的当前音量。范围0-1
SetVolume 设置此播放器的音量。
2.player.go 中的方法
首先几个数据结构,说明了 player 中保存的各种字段类型。
除了 newPlayerFactory 方法,其他的方法就是上述 audio 中方法的具体实现。
另外比较有意思的时这个方法
懒惰的初始化底层播放器,以启用在“init”函数中调用 NewContext。
访问底层播放器功能需要环境已经初始化,
但如果Ebiten用于共享库,则调用init函数的时。