package middleware import ( "game-driver/internal/schema" "game-driver/leaf" "game-driver/pkg/audio" "game-driver/pkg/logger" "game-driver/pkg/utils" "github.com/gopxl/beep/v2/speaker" "sync" ) func PlayBgm() leaf.HandlerFunc { return func(c *leaf.Context) { pm := leaf.Value[*schema.PlayModal](c, PayloadJSONKey) bgm := utils.LinkAudio(pm.BGM) if bgm != nil { // 等待组 var wait sync.WaitGroup defer wait.Wait() // 结束信号通道 a := make(chan struct{}) // 发送结束信号 defer close(a) go func() { // 等待结束 wait.Add(1) defer wait.Done() ctrl, closer := audio.PlayBgmMP3(bgm) defer closer() if ctrl == nil { logger.Infoln("播放背景音乐失败") return } select { case <-a: { speaker.Lock() ctrl.Streamer = nil speaker.Unlock() return } } }() } c.Next() } }