Files
game-driver/internal/middleware/bgm.go
mapleafgo 1f527dce98
All checks were successful
ci/woodpecker/tag/woodpecker Pipeline was successful
refactor(middleware): 调整中间件执行顺序和代码格式化
- 调整中间件执行顺序:将 TimeoutOver 移至 SoundStart 之前,确保超时检查在音频播放前生效
- 简化 BGM 停止逻辑:移除 select 语句中的多余花括号
- 修正导入顺序:将 sync 标准库导入置于第三方库之前

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-08 16:39:36 +08:00

61 lines
1.1 KiB
Go

package middleware
import (
"game-driver/internal/schema"
"game-driver/leaf"
"game-driver/pkg/audio"
"game-driver/pkg/utils"
"sync"
"github.com/gopxl/beep/v2/speaker"
"go.uber.org/zap"
)
// PlayBgm 播放背景音乐
func PlayBgm() leaf.HandlerFunc {
return func(c *leaf.Context) {
pm := leaf.Value[*schema.PlayModal](c, PayloadJSONKey)
bgm, err := utils.LinkAudio(pm.BGM)
if err != nil {
zap.S().Errorln("背景音乐数据解析异常:", err)
}
if bgm != nil {
zap.S().Infoln("背景音乐解析成功")
// 等待组
var wait sync.WaitGroup
defer wait.Wait()
// 结束信号通道
a := make(chan struct{})
// 发送结束信号
defer close(a)
wait.Add(1)
go func() {
defer wait.Done()
zap.S().Infoln("开始播放背景音乐")
defer zap.S().Infoln("结束背景音乐播放")
ctrl, closer, e := audio.PlayBgmMP3(bgm)
defer closer()
if e != nil {
zap.S().Errorln("播放背景音乐异常:", e)
return
}
<-a
speaker.Lock()
ctrl.Streamer = nil
speaker.Unlock()
}()
} else {
zap.S().Infoln("未解析到背景音乐")
}
c.Next()
}
}