diff --git a/audio.go b/audio.go index c6a396d3..a2b28a20 100644 --- a/audio.go +++ b/audio.go @@ -18,13 +18,16 @@ package spx import ( "io" - "strings" "sync" + "github.com/qiniu/audio/convert" + _ "github.com/qiniu/audio/mp3" // support mp3 + _ "github.com/qiniu/audio/wav" // support wav/pcm + _ "github.com/qiniu/audio/wav/adpcm" // support wav/adpcm + "github.com/hajimehoshi/ebiten/v2/audio" - "github.com/hajimehoshi/ebiten/v2/audio/mp3" - "github.com/hajimehoshi/ebiten/v2/audio/vorbis" - "github.com/hajimehoshi/ebiten/v2/audio/wav" + + qaudio "github.com/qiniu/audio" ) // ------------------------------------------------------------------------------------- @@ -108,17 +111,6 @@ func (p *soundMgr) init(g *Game) { p.players = make(map[*soundPlayer]chan bool) p.g = g p.audios = make(map[string]Sound) - - // media formats supported - formats = make([]format, 4) - formats[0].name = "mp3" - formats[0].magic = "ID3" - formats[1].name = "mp3" - formats[1].magic = "\xff\xfb" - formats[2].name = "ogg" - formats[2].magic = "OggS" - formats[3].name = "wav" - formats[3].magic = "RIFF????WAVE" } func (p *soundMgr) update() { @@ -196,12 +188,6 @@ func (p *soundMgr) playContinue(media Sound, wait, loop bool) (err error) { return } -type format struct { - name, magic string -} - -var formats []format - func (p *soundMgr) play(media Sound, wait, loop bool) (err error) { source, err := p.g.fs.Open(media.Path) if err != nil { @@ -209,41 +195,20 @@ func (p *soundMgr) play(media Sound, wait, loop bool) (err error) { } audioContext := p.audioContext - sp := &soundPlayer{media: media, loop: loop} - parts := strings.Split(media.Path, ".") - l := len(parts) - ext := "" - if l >= 1 { - ext = parts[l-1] + d, _, err := qaudio.Decode(newReadSeeker(source)) + if err != nil { + source.Close() + return } - switch ext { - case "mp3": - var ms *mp3.Stream - ms, err = mp3.DecodeF32(source) - if err != nil { - return err - } - sp.Player, err = audioContext.NewPlayerF32(ms) - case "ogg": - var vs *vorbis.Stream - vs, err = vorbis.DecodeF32(source) - if err != nil { - return err - } - sp.Player, err = audioContext.NewPlayerF32(vs) - case "wav": - var ws *wav.Stream - ws, err = wav.DecodeF32(source) - if err != nil { - return err - } - sp.Player, err = audioContext.NewPlayerF32(ws) - } + d = convert.ToStereo16(d) + d = convert.Resample(d, audioContext.SampleRate()) + sp := &soundPlayer{media: media, loop: loop} + sp.Player, err = audioContext.NewPlayer(&readCloser{d, source}) if err != nil { source.Close() - return err + return } var done chan bool diff --git a/go.mod b/go.mod index 6b826ea3..96f43eb9 100644 --- a/go.mod +++ b/go.mod @@ -5,7 +5,7 @@ go 1.18 require ( github.com/ajstarks/svgo v0.0.0-20210927141636-6d70534b1098 github.com/goplus/canvas v0.1.0 - github.com/hajimehoshi/ebiten/v2 v2.8.0-alpha.3 + github.com/hajimehoshi/ebiten/v2 v2.7.8 github.com/pkg/errors v0.9.1 github.com/qiniu/audio v0.2.1 github.com/qiniu/x v1.13.10 @@ -18,16 +18,14 @@ require ( require ( github.com/ebitengine/gomobile v0.0.0-20240518074828-e86332849895 // indirect github.com/ebitengine/hideconsole v1.0.0 // indirect - github.com/ebitengine/oto/v3 v3.3.0-alpha.3 // indirect - github.com/ebitengine/purego v0.8.0-alpha.3 // indirect + github.com/ebitengine/oto/v3 v3.2.0 // indirect + github.com/ebitengine/purego v0.7.0 // indirect github.com/esimov/stackblur-go v1.0.1-0.20190121110005-00e727e3c7a9 // indirect github.com/golang/freetype v0.0.0-20170609003504-e2365dfdc4a0 // indirect github.com/hajimehoshi/go-mp3 v0.3.4 // indirect github.com/jezek/xgb v1.1.1 // indirect - github.com/jfreymuth/oggvorbis v1.0.5 // indirect - github.com/jfreymuth/vorbis v1.0.2 // indirect golang.org/x/sync v0.7.0 // indirect - golang.org/x/sys v0.22.0 // indirect + golang.org/x/sys v0.20.0 // indirect golang.org/x/text v0.16.0 // indirect ) diff --git a/go.sum b/go.sum index 75430553..e564053d 100644 --- a/go.sum +++ b/go.sum @@ -10,22 +10,16 @@ github.com/ebitengine/hideconsole v1.0.0 h1:5J4U0kXF+pv/DhiXt5/lTz0eO5ogJ1iXb8Yj github.com/ebitengine/hideconsole v1.0.0/go.mod h1:hTTBTvVYWKBuxPr7peweneWdkUwEuHuB3C1R/ielR1A= github.com/ebitengine/oto/v3 v3.2.0 h1:FuggTJTSI3/3hEYwZEIN0CZVXYT29ZOdCu+z/f4QjTw= github.com/ebitengine/oto/v3 v3.2.0/go.mod h1:dOKXShvy1EQbIXhXPFcKLargdnFqH0RjptecvyAxhyw= -github.com/ebitengine/oto/v3 v3.3.0-alpha.3 h1:L8Odh8gVr4F+0CzSfqOfw/nEnXXWkB+UhGOKUYrP+Nk= -github.com/ebitengine/oto/v3 v3.3.0-alpha.3/go.mod h1:yYvXK7mgNwsFawY5RsvGI6yhMHtD+0MfaPkDTl9/uv8= github.com/ebitengine/purego v0.7.0 h1:HPZpl61edMGCEW6XK2nsR6+7AnJ3unUxpTZBkkIXnMc= github.com/ebitengine/purego v0.7.0/go.mod h1:ah1In8AOtksoNK6yk5z1HTJeUkC1Ez4Wk2idgGslMwQ= -github.com/ebitengine/purego v0.8.0-alpha.3 h1:qoFlpGuVwJ6J85kuj6Qpyp0DBgxsNYfSY9efidSNFgA= -github.com/ebitengine/purego v0.8.0-alpha.3/go.mod h1:b94LtM1jUWDZPKDyENVhB0WsLdLWFApjbNw5AyxmKyI= 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/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/goplus/canvas v0.1.0 h1:Vx3f2+U8UANvWf5/01YsQYKNbZDm1GZCjhlEBFrQkeU= github.com/goplus/canvas v0.1.0/go.mod h1:Rhcvo5qkpD9WuXFnvnXtrBSY97l6h7sXQuofrmiLNdM= -github.com/hajimehoshi/ebiten/v2 v2.7.7 h1:FyiuIOZqKU4aefYVws/lBDhTZu2WY2m/eWI3PtXZaHs= -github.com/hajimehoshi/ebiten/v2 v2.7.7/go.mod h1:Ulbq5xDmdx47P24EJ+Mb31Zps7vQq+guieG9mghQUaA= -github.com/hajimehoshi/ebiten/v2 v2.8.0-alpha.3 h1:cKpQdzW3I+iLID68l25GaxzPZHSZVRdE9/Pz4SOPBR8= -github.com/hajimehoshi/ebiten/v2 v2.8.0-alpha.3/go.mod h1:iKp1U/H0J0rv9X4ztGSTXCyN6z/DKKrUL+D9sjg7SbI= +github.com/hajimehoshi/ebiten/v2 v2.7.8 h1:QrlvF2byCzMuDsbxFReJkOCbM3O2z1H/NKQaGcA8PKk= +github.com/hajimehoshi/ebiten/v2 v2.7.8/go.mod h1:Ulbq5xDmdx47P24EJ+Mb31Zps7vQq+guieG9mghQUaA= github.com/hajimehoshi/go-mp3 v0.3.2/go.mod h1:qMJj/CSDxx6CGHiZeCgbiq2DSUkbK0UbtXShQcnfyMM= github.com/hajimehoshi/go-mp3 v0.3.4 h1:NUP7pBYH8OguP4diaTZ9wJbUbk3tC0KlfzsEpWmYj68= github.com/hajimehoshi/go-mp3 v0.3.4/go.mod h1:fRtZraRFcWb0pu7ok0LqyFhCUrPeMsGRSVop0eemFmo= @@ -33,10 +27,6 @@ github.com/hajimehoshi/oto v1.0.1/go.mod h1:wovJ8WWMfFKvP587mhHgot/MBr4DnNy9m6Ee github.com/hajimehoshi/oto/v2 v2.3.1/go.mod h1:seWLbgHH7AyUMYKfKYT9pg7PhUu9/SisyJvNTT+ASQo= github.com/jezek/xgb v1.1.1 h1:bE/r8ZZtSv7l9gk6nU0mYx51aXrvnyb44892TwSaqS4= github.com/jezek/xgb v1.1.1/go.mod h1:nrhwO0FX/enq75I7Y7G8iN1ubpSGZEiA3v9e9GyRFlk= -github.com/jfreymuth/oggvorbis v1.0.5 h1:u+Ck+R0eLSRhgq8WTmffYnrVtSztJcYrl588DM4e3kQ= -github.com/jfreymuth/oggvorbis v1.0.5/go.mod h1:1U4pqWmghcoVsCJJ4fRBKv9peUJMBHixthRlBeD6uII= -github.com/jfreymuth/vorbis v1.0.2 h1:m1xH6+ZI4thH927pgKD8JOH4eaGRm18rEE9/0WKjvNE= -github.com/jfreymuth/vorbis v1.0.2/go.mod h1:DoftRo4AznKnShRl1GxiTFCseHr4zR9BN3TWXyuzrqQ= github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4= github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= @@ -73,8 +63,6 @@ golang.org/x/sys v0.0.0-20211019181941-9d821ace8654/go.mod h1:oPkhp1MJrh7nUepCBc golang.org/x/sys v0.0.0-20220712014510-0a85c31ab51e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.20.0 h1:Od9JTbYCk261bKm4M/mw7AklTlFYIa0bIp9BgSm1S8Y= golang.org/x/sys v0.20.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= -golang.org/x/sys v0.22.0 h1:RI27ohtqKCnwULzJLqkv897zojh5/DwS/ENaMzUOaWI= -golang.org/x/sys v0.22.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= diff --git a/tutorial/02-Dragon/assets/sounds/chomp/index.json b/tutorial/02-Dragon/assets/sounds/chomp/index.json index 0639584a..18df033c 100644 --- a/tutorial/02-Dragon/assets/sounds/chomp/index.json +++ b/tutorial/02-Dragon/assets/sounds/chomp/index.json @@ -1,5 +1,5 @@ { - "path": "ragtime.ogg", + "path": "1.wav", "rate": 11025, "sampleCount": 2912 } \ No newline at end of file diff --git a/tutorial/02-Dragon/assets/sounds/chomp/jab.wav b/tutorial/02-Dragon/assets/sounds/chomp/jab.wav deleted file mode 100644 index 0eb2a97d..00000000 Binary files a/tutorial/02-Dragon/assets/sounds/chomp/jab.wav and /dev/null differ diff --git a/tutorial/02-Dragon/assets/sounds/chomp/jab8.wav b/tutorial/02-Dragon/assets/sounds/chomp/jab8.wav deleted file mode 100644 index 9e1c062b..00000000 Binary files a/tutorial/02-Dragon/assets/sounds/chomp/jab8.wav and /dev/null differ diff --git a/tutorial/02-Dragon/assets/sounds/chomp/jump.ogg b/tutorial/02-Dragon/assets/sounds/chomp/jump.ogg deleted file mode 100644 index beb117e8..00000000 Binary files a/tutorial/02-Dragon/assets/sounds/chomp/jump.ogg and /dev/null differ diff --git a/tutorial/02-Dragon/assets/sounds/chomp/ragtime.mp3 b/tutorial/02-Dragon/assets/sounds/chomp/ragtime.mp3 deleted file mode 100644 index 229069ea..00000000 Binary files a/tutorial/02-Dragon/assets/sounds/chomp/ragtime.mp3 and /dev/null differ diff --git a/tutorial/02-Dragon/assets/sounds/chomp/ragtime.ogg b/tutorial/02-Dragon/assets/sounds/chomp/ragtime.ogg deleted file mode 100644 index 20d68b12..00000000 Binary files a/tutorial/02-Dragon/assets/sounds/chomp/ragtime.ogg and /dev/null differ diff --git a/tutorial/02-Dragon/assets/sounds/chomp/water.ogg b/tutorial/02-Dragon/assets/sounds/chomp/water.ogg deleted file mode 100644 index 695f84b4..00000000 Binary files a/tutorial/02-Dragon/assets/sounds/chomp/water.ogg and /dev/null differ