diff --git a/audio.go b/audio.go index a2b28a20..c6a396d3 100644 --- a/audio.go +++ b/audio.go @@ -18,16 +18,13 @@ 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" - - qaudio "github.com/qiniu/audio" + "github.com/hajimehoshi/ebiten/v2/audio/mp3" + "github.com/hajimehoshi/ebiten/v2/audio/vorbis" + "github.com/hajimehoshi/ebiten/v2/audio/wav" ) // ------------------------------------------------------------------------------------- @@ -111,6 +108,17 @@ 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() { @@ -188,6 +196,12 @@ 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 { @@ -195,20 +209,41 @@ func (p *soundMgr) play(media Sound, wait, loop bool) (err error) { } audioContext := p.audioContext - d, _, err := qaudio.Decode(newReadSeeker(source)) - if err != nil { - source.Close() - return + sp := &soundPlayer{media: media, loop: loop} + parts := strings.Split(media.Path, ".") + l := len(parts) + ext := "" + if l >= 1 { + ext = parts[l-1] } - d = convert.ToStereo16(d) - d = convert.Resample(d, audioContext.SampleRate()) + 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) + } - sp := &soundPlayer{media: media, loop: loop} - sp.Player, err = audioContext.NewPlayer(&readCloser{d, source}) if err != nil { source.Close() - return + return err } var done chan bool diff --git a/go.mod b/go.mod index 96f43eb9..6b826ea3 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.7.8 + github.com/hajimehoshi/ebiten/v2 v2.8.0-alpha.3 github.com/pkg/errors v0.9.1 github.com/qiniu/audio v0.2.1 github.com/qiniu/x v1.13.10 @@ -18,14 +18,16 @@ 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.2.0 // indirect - github.com/ebitengine/purego v0.7.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/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.20.0 // indirect + golang.org/x/sys v0.22.0 // indirect golang.org/x/text v0.16.0 // indirect ) diff --git a/go.sum b/go.sum index e564053d..75430553 100644 --- a/go.sum +++ b/go.sum @@ -10,16 +10,22 @@ 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.8 h1:QrlvF2byCzMuDsbxFReJkOCbM3O2z1H/NKQaGcA8PKk= -github.com/hajimehoshi/ebiten/v2 v2.7.8/go.mod h1:Ulbq5xDmdx47P24EJ+Mb31Zps7vQq+guieG9mghQUaA= +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/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= @@ -27,6 +33,10 @@ 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= @@ -63,6 +73,8 @@ 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 18df033c..0639584a 100644 --- a/tutorial/02-Dragon/assets/sounds/chomp/index.json +++ b/tutorial/02-Dragon/assets/sounds/chomp/index.json @@ -1,5 +1,5 @@ { - "path": "1.wav", + "path": "ragtime.ogg", "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 new file mode 100644 index 00000000..0eb2a97d Binary files /dev/null and b/tutorial/02-Dragon/assets/sounds/chomp/jab.wav differ diff --git a/tutorial/02-Dragon/assets/sounds/chomp/jab8.wav b/tutorial/02-Dragon/assets/sounds/chomp/jab8.wav new file mode 100644 index 00000000..9e1c062b Binary files /dev/null and b/tutorial/02-Dragon/assets/sounds/chomp/jab8.wav differ diff --git a/tutorial/02-Dragon/assets/sounds/chomp/jump.ogg b/tutorial/02-Dragon/assets/sounds/chomp/jump.ogg new file mode 100644 index 00000000..beb117e8 Binary files /dev/null and b/tutorial/02-Dragon/assets/sounds/chomp/jump.ogg differ diff --git a/tutorial/02-Dragon/assets/sounds/chomp/ragtime.mp3 b/tutorial/02-Dragon/assets/sounds/chomp/ragtime.mp3 new file mode 100644 index 00000000..229069ea Binary files /dev/null and b/tutorial/02-Dragon/assets/sounds/chomp/ragtime.mp3 differ diff --git a/tutorial/02-Dragon/assets/sounds/chomp/ragtime.ogg b/tutorial/02-Dragon/assets/sounds/chomp/ragtime.ogg new file mode 100644 index 00000000..20d68b12 Binary files /dev/null and b/tutorial/02-Dragon/assets/sounds/chomp/ragtime.ogg differ diff --git a/tutorial/02-Dragon/assets/sounds/chomp/water.ogg b/tutorial/02-Dragon/assets/sounds/chomp/water.ogg new file mode 100644 index 00000000..695f84b4 Binary files /dev/null and b/tutorial/02-Dragon/assets/sounds/chomp/water.ogg differ