Skip to content

Commit

Permalink
Merge pull request #204 from goplus/main
Browse files Browse the repository at this point in the history
v1.0.0-rc6
  • Loading branch information
xushiwei authored May 30, 2022
2 parents 88a40c6 + ce3a7f7 commit 16eff2f
Show file tree
Hide file tree
Showing 10 changed files with 225 additions and 37 deletions.
11 changes: 11 additions & 0 deletions .github/dependabot.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
# To get started with Dependabot version updates, you'll need to specify which
# package ecosystems to update and where the package manifests are located.
# Please see the documentation for all configuration options:
# https://docs.github.com/github/administering-a-repository/configuration-options-for-dependency-updates

version: 2
updates:
- package-ecosystem: "gomod" # See documentation for possible values
directory: "/" # Location of package manifests
schedule:
interval: "daily"
4 changes: 2 additions & 2 deletions .github/workflows/go.yml
Original file line number Diff line number Diff line change
Expand Up @@ -11,10 +11,10 @@ jobs:
build:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v2
- uses: actions/checkout@v3

- name: Set up Go
uses: actions/setup-go@v2
uses: actions/setup-go@v3
with:
go-version: 1.16

Expand Down
151 changes: 138 additions & 13 deletions audio.go
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,7 @@ type readSeekCloser struct {
}

type readCloser struct {
io.Reader
io.ReadSeeker
io.Closer
}

Expand All @@ -38,9 +38,41 @@ func newReadSeeker(source io.ReadCloser) io.ReadSeeker {

// -------------------------------------------------------------------------------------

type playerState byte

const (
playerPlay playerState = iota
playerClosed
playerPaused
)

type PlayAction int

const (
PlayRewind PlayAction = iota
PlayContinue
PlayPause
PlayResume
PlayStop
)

type PlayOptions struct {
Action PlayAction
Wait bool
Loop bool
}

type soundPlayer struct {
*audio.Player
media Sound
state playerState
loop bool
}

type soundMgr struct {
g *Game
audioContext *audio.Context
players map[*audio.Player]chan bool
players map[*soundPlayer]chan bool
playersM sync.Mutex
}

Expand All @@ -49,26 +81,32 @@ const (
defaultRatio = 100.0
)

func (p *soundMgr) addPlayer(sp *audio.Player, done chan bool) {
func (p *soundMgr) addPlayer(sp *soundPlayer, done chan bool) {
p.playersM.Lock()
defer p.playersM.Unlock()

p.players[sp] = done
}

func (p *soundMgr) init() {
func (p *soundMgr) init(g *Game) {
audioContext := audio.NewContext(defaultSampleRate)
p.audioContext = audioContext
p.players = make(map[*audio.Player]chan bool)
p.players = make(map[*soundPlayer]chan bool)
p.g = g
}

func (p *soundMgr) update() {
p.playersM.Lock()
defer p.playersM.Unlock()

var closed []*audio.Player
var closed []*soundPlayer
for sp, done := range p.players {
if !sp.IsPlaying() {
if !sp.IsPlaying() && sp.state != playerPaused {
if sp.loop {
sp.Rewind()
sp.Play()
continue
}
sp.Close()
if done != nil {
done <- true
Expand All @@ -85,20 +123,59 @@ func (p *soundMgr) stopAll() {
p.playersM.Lock()
defer p.playersM.Unlock()

closed := make([]*audio.Player, 0, len(p.players))
closed := make([]*soundPlayer, 0, len(p.players))
for sp, done := range p.players {
sp.Close()
if done != nil {
done <- true
}
sp.state = playerClosed
closed = append(closed, sp)
}
for _, sp := range closed {
delete(p.players, sp)
}
}

func (p *soundMgr) play(source io.ReadCloser, wait ...bool) (err error) {
func (p *soundMgr) playAction(media Sound, opts *PlayOptions) (err error) {
switch opts.Action {
case PlayRewind:
err = p.play(media, opts.Wait, opts.Loop)
case PlayContinue:
err = p.playContinue(media, opts.Wait, opts.Loop)
case PlayStop:
p.stop(media)
case PlayResume:
p.resume(media)
case PlayPause:
p.pause(media)
}
return
}

func (p *soundMgr) playContinue(media Sound, wait, loop bool) (err error) {
p.playersM.Lock()
found := false
for sp := range p.players {
if sp.media.Path == media.Path {
sp.loop = loop
found = true
}
}
p.playersM.Unlock()

if !found {
err = p.play(media, wait, loop)
}
return
}

func (p *soundMgr) play(media Sound, wait, loop bool) (err error) {
source, err := p.g.fs.Open(media.Path)
if err != nil {
panic(err)
}

audioContext := p.audioContext
d, _, err := qaudio.Decode(newReadSeeker(source))
if err != nil {
Expand All @@ -108,25 +185,73 @@ func (p *soundMgr) play(source io.ReadCloser, wait ...bool) (err error) {

d = convert.ToStereo16(d)
d = convert.Resample(d, audioContext.SampleRate())
sp, err := audioContext.NewPlayer(&readCloser{d, source})

sp := &soundPlayer{media: media, loop: loop}
sp.Player, err = audioContext.NewPlayer(&readCloser{d, source})
if err != nil {
source.Close()
return
}

var waitDone = (wait != nil)
var done chan bool
if waitDone {
if wait {
done = make(chan bool, 1)
}
p.addPlayer(sp, done)
sp.Play()
if waitDone {
if wait {
waitForChan(done)
}
return
}

func (p *soundMgr) stop(media Sound) {
p.playersM.Lock()
defer p.playersM.Unlock()

closed := make([]*soundPlayer, 0, len(p.players))
for sp, done := range p.players {
if sp.media.Path == media.Path {
sp.Close()
if done != nil {
done <- true
}
sp.state = playerClosed
closed = append(closed, sp)
}
}
for _, sp := range closed {
delete(p.players, sp)
}
}

func (p *soundMgr) pause(media Sound) {
p.playersM.Lock()
defer p.playersM.Unlock()

for sp := range p.players {
if sp.media.Path == media.Path {
sp.Pause()
sp.state = playerPaused

}

}
}

func (p *soundMgr) resume(media Sound) {
p.playersM.Lock()
defer p.playersM.Unlock()
for sp := range p.players {
if sp.media.Path == media.Path {
sp.Play()
sp.state = playerPlay

}

}
}

func (p *soundMgr) volume() float64 {
for sp := range p.players {
return sp.Volume() * defaultRatio
Expand Down
23 changes: 15 additions & 8 deletions game.go
Original file line number Diff line number Diff line change
Expand Up @@ -414,7 +414,7 @@ func (p *Game) startLoad(resource interface{}, cfg *Config) (err error) {
}
p.initGame()
p.input.init(p, keyDuration)
p.sounds.init()
p.sounds.init(p)
p.shapes = make(map[string]Spriter)
p.events = make(chan event, 16)
p.fs = fs
Expand Down Expand Up @@ -1344,15 +1344,22 @@ func (p *Game) loadSound(name string) (media Sound, err error) {
// Play func:
// Play(sound)
// Play(video) -- maybe
func (p *Game) Play__0(media Sound, wait ...bool) {
// Play(media, wait) -- sync
// Play(media, opts)
func (p *Game) Play__0(media Sound) {
p.Play__2(media, &PlayOptions{})
}

func (p *Game) Play__1(media Sound, wait bool) {
p.Play__2(media, &PlayOptions{Wait: wait})
}

func (p *Game) Play__2(media Sound, action *PlayOptions) {
if debugInstr {
log.Println("Play", media.Path, wait)
log.Println("Play", media.Path)
}
f, err := p.fs.Open(media.Path)
if err != nil {
panic(err)
}
err = p.sounds.play(f, wait...)

err := p.sounds.playAction(media, action)
if err != nil {
panic(err)
}
Expand Down
2 changes: 1 addition & 1 deletion go.mod
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@ require (
github.com/ajstarks/svgo v0.0.0-20210927141636-6d70534b1098
github.com/golang/freetype v0.0.0-20170609003504-e2365dfdc4a0
github.com/goplus/canvas v0.1.0
github.com/goplus/gop v1.1.0-alpha2
github.com/goplus/gop v1.1.0-rc2
github.com/hajimehoshi/ebiten/v2 v2.2.0
github.com/pkg/errors v0.9.1
github.com/qiniu/audio v0.2.1
Expand Down
19 changes: 16 additions & 3 deletions go.sum
Original file line number Diff line number Diff line change
Expand Up @@ -4,17 +4,23 @@ github.com/ajstarks/deck v0.0.0-20200831202436-30c9fc6549a9/go.mod h1:JynElWSGnm
github.com/ajstarks/deck/generate v0.0.0-20210309230005-c3f852c02e19/go.mod h1:T13YZdzov6OU0A1+RfKZiZN9ca6VeKdBdyDV+BY97Tk=
github.com/ajstarks/svgo v0.0.0-20210927141636-6d70534b1098 h1:iiPTCsr/y6MEke5leED5Bi/0zlznD44tlHQvTgLOJcE=
github.com/ajstarks/svgo v0.0.0-20210927141636-6d70534b1098/go.mod h1:1KcenG0jGWcpt8ov532z81sp/kMMUG485J2InIOyADM=
github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
github.com/esimov/stackblur-go v1.0.1-0.20190121110005-00e727e3c7a9 h1:TJdKpA5v3Xu24Vv0yQy1MyRJgpt7vk9AT58fGPfiZcs=
github.com/esimov/stackblur-go v1.0.1-0.20190121110005-00e727e3c7a9/go.mod h1:a3zzeKuJKUpCcReHmEsuPaEnq42D2b/bHoCI8UjIuMY=
github.com/go-gl/glfw/v3.3/glfw v0.0.0-20210727001814-0db043d8d5be h1:vEIVIuBApEBQTEJt19GfhoU+zFSV+sNTa9E9FdnRYfk=
github.com/go-gl/glfw/v3.3/glfw v0.0.0-20210727001814-0db043d8d5be/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8=
github.com/golang/freetype v0.0.0-20170609003504-e2365dfdc4a0 h1:DACJavvAHhabrF08vX0COfcOBJRhZ8lUbR+ZWIs0Y5g=
github.com/golang/freetype v0.0.0-20170609003504-e2365dfdc4a0/go.mod h1:E/TSTwGwJL78qG/PmXZO1EjYhfJinVAhrmmHX6Z8B9k=
github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg=
github.com/goplus/c2go v0.7.2/go.mod h1:Gd/r7JdrxXDoFKXyP6tsKTM0+j50CGxT0QDJ/5k8hYU=
github.com/goplus/canvas v0.1.0 h1:Vx3f2+U8UANvWf5/01YsQYKNbZDm1GZCjhlEBFrQkeU=
github.com/goplus/canvas v0.1.0/go.mod h1:Rhcvo5qkpD9WuXFnvnXtrBSY97l6h7sXQuofrmiLNdM=
github.com/goplus/gop v1.1.0-alpha2 h1:s3wMFJpprmFBmVRqUIoggQ2wJ3Kb3gX+7J0f8f2Oh8Q=
github.com/goplus/gop v1.1.0-alpha2/go.mod h1:FTu64eb9ZYCwnTfSze6asR8kbxXPs6mbI+kRmUikKf0=
github.com/goplus/gox v1.9.4/go.mod h1:PznHkzl2HARBf7+s2reqcwKm1Z1a6Wae6EntQEh0iJI=
github.com/goplus/gop v1.1.0-rc2 h1:a7qKX5NiJHvmwUU2Rm3+9ujgBkmOlmH4UcyjWsRoh98=
github.com/goplus/gop v1.1.0-rc2/go.mod h1:SDRkIwrlplH1dZjEubh1vubA8aJvPtMrkEgFz+MjJsA=
github.com/goplus/gox v1.11.7/go.mod h1:gu7fuQF8RmWPZUjd+tEJGuV3m/vOEv0bHrct0x/KatM=
github.com/goplus/libc v0.3.6/go.mod h1:nyKm7Iir6iI6hQT5WWUG6Jomx2zt/XRAGLLKtLrlICI=
github.com/goplus/mod v0.9.7/go.mod h1:NHU13OjeNV3ez1f+R9FLJIlIun0KNSuZb0jnmP3N3o8=
github.com/hajimehoshi/bitmapfont/v2 v2.1.3/go.mod h1:2BnYrkTQGThpr/CY6LorYtt/zEPNzvE/ND69CRTaHMs=
github.com/hajimehoshi/ebiten/v2 v2.2.0 h1:2mP9HrLLqiH9X3MajElYZEjVZU/CGh22iFkjatxhT4w=
github.com/hajimehoshi/ebiten/v2 v2.2.0/go.mod h1:olKl/qqhMBBAm2oI7Zy292nCtE+nitlmYKNF3UpbFn0=
Expand All @@ -30,10 +36,15 @@ github.com/jezek/xgb v0.0.0-20210312150743-0e0f116e1240 h1:dy+DS31tGEGCsZzB45HmJ
github.com/jezek/xgb v0.0.0-20210312150743-0e0f116e1240/go.mod h1:3P4UH/k22rXyHIJD2w4h2XMqPX4Of/eySEZq9L6wqc4=
github.com/jfreymuth/oggvorbis v1.0.3/go.mod h1:1U4pqWmghcoVsCJJ4fRBKv9peUJMBHixthRlBeD6uII=
github.com/jfreymuth/vorbis v1.0.2/go.mod h1:DoftRo4AznKnShRl1GxiTFCseHr4zR9BN3TWXyuzrqQ=
github.com/json-iterator/go v1.1.12/go.mod h1:e30LSqwooZae/UwlEbR2852Gd8hjQvJoHmT4TnhNGBo=
github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck=
github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q=
github.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk=
github.com/petermattis/goid v0.0.0-20220331194723-8ee3e6ded87a/go.mod h1:pxMtw7cyUw6B2bRH0ZBANSPg+AoSud1I1iyJHI69jH4=
github.com/pkg/browser v0.0.0-20180916011732-0a3d74bf9ce4/go.mod h1:4OwLy04Bl9Ef3GJJCoec+30X3LQs/0/m4HFRt/2LUSA=
github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4=
github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
github.com/qiniu/audio v0.2.1 h1:lAc3dWfr7uAfn7mfee2u0/fl/QSQA9oTOqdBtxyFZAM=
github.com/qiniu/audio v0.2.1/go.mod h1:APMJRPaS4toviejZnDzzZ8wVyr12jqZhd3xfKr/qYnE=
github.com/qiniu/oksvg v0.2.0-no-charset h1:KKQg81v52pd5VyaxrF891igoOO50epKfFWkryYgntnE=
Expand All @@ -43,6 +54,8 @@ github.com/qiniu/x v1.11.5/go.mod h1:03Ni9tj+N2h2aKnAz+6N0Xfl8FwMEDRC2PAlxekASDs
github.com/srwiley/rasterx v0.0.0-20200120212402-85cb7272f5e9/go.mod h1:mvWM0+15UqyrFKqdRjY6LuAVJR0HOVhJlEgZ5JWtSWU=
github.com/srwiley/rasterx v0.0.0-20210519020934-456a8d69b780 h1:oDMiXaTMyBEuZMU53atpxqYsSB3U1CHkeAu2zr6wTeY=
github.com/srwiley/rasterx v0.0.0-20210519020934-456a8d69b780/go.mod h1:mvWM0+15UqyrFKqdRjY6LuAVJR0HOVhJlEgZ5JWtSWU=
github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI=
github.com/yuin/goldmark v1.4.1/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k=
golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=
golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
Expand Down
Loading

0 comments on commit 16eff2f

Please sign in to comment.