faiface / beep

A little package that brings sound to any Go application. Suitable for playback and audio-processing.
MIT License
2.08k stars 151 forks source link

Cannot Play Two Sounds In Parallel #173

Open zarkones opened 4 months ago

zarkones commented 4 months ago

Hello. The following code would crash the process with this stack trace: stacktrace.txt

I might be missing something obvious, however, just not to me. :)

The code: package main

import ( "bytes" "fmt" "time" "ui/assets"

"github.com/faiface/beep/speaker"
"github.com/faiface/beep/wav"

)

func play() { streamer, format, err := wav.Decode(bytes.NewReader(assets.ButtonClick)) if err != nil { fmt.Println("failed to wav decide sfx:", err) return }

if err := speaker.Init(format.SampleRate, format.SampleRate.N(time.Second/10)); err != nil {
    fmt.Println("failed to speaker.Init sfx:", err)
    return
}

speaker.Play(streamer)

}

func main() { play() play()

time.Sleep(time.Second * 3)

}

dusk125 commented 4 months ago

This project is maintained at https://github.com/gopxl/beep, please direct all future inquiries there.

This is an incorrect usage of beep; in order to play multiple streams of audio at the same time, only one instance of play is called. You can use the Mix function https://github.com/faiface/beep/blob/master/compositors.go#L100 to create a Streamer that mixes the inputs together into a single stream

MarkKremer commented 3 months ago

You can only initialize the speaker once, but it should be possible to call play multiple times. Speaker has a built-in mixer.