待机功能基本实现

This commit is contained in:
2024-11-06 15:44:35 +08:00
parent 8e2bf7f59b
commit ab0678aa3b
14 changed files with 317 additions and 151 deletions

31
pkg/audio/bgm.go Normal file
View File

@@ -0,0 +1,31 @@
package audio
import (
"github.com/gopxl/beep/v2"
"github.com/gopxl/beep/v2/mp3"
"github.com/gopxl/beep/v2/speaker"
"io"
"log"
)
func PlayBgmMP3(r io.ReadCloser, opts ...beep.LoopOption) (*beep.Ctrl, func() error) {
streamer, format, err := mp3.Decode(r)
if err != nil {
return nil, func() error { return nil }
}
loop2, err := beep.Loop2(streamer, opts...)
if err != nil {
log.Println("循环播放异常: ", err)
return nil, streamer.Close
}
s := beep.Resample(4, format.SampleRate, DefaultSampleRate, loop2)
ctrl := &beep.Ctrl{Streamer: s}
speaker.Play(beep.Seq(ctrl, beep.Callback(func() {
streamer.Close()
})))
return ctrl, streamer.Close
}

66
pkg/audio/link_audio.go Normal file
View File

@@ -0,0 +1,66 @@
package audio
import (
"bytes"
"io"
"log"
"net/http"
"net/url"
"os"
"strings"
)
type reader struct {
bytes.Reader
io.Closer
}
func (a *reader) Seek(offset int64, whence int) (int64, error) {
return a.Reader.Seek(offset, whence)
}
func toSeeker(src io.ReadCloser) io.ReadCloser {
buf := &bytes.Buffer{}
_, _ = io.Copy(buf, src)
return &reader{
Reader: *bytes.NewReader(buf.Bytes()),
Closer: src,
}
}
func open(u string) io.ReadCloser {
p, _ := strings.CutPrefix(u, "file://")
f, e := os.Open(p)
if e != nil {
log.Printf("音频文件 [%v] 打开错误: %v\n", u, e)
return nil
}
return f
}
func get(u string) io.ReadCloser {
resp, e := http.Get(u)
if e != nil {
log.Printf("音频文件 [%v] 下载失败: %v\n", u, e)
return nil
}
return resp.Body
}
func LinkAudio(link string) (bgm io.ReadCloser) {
u, err := url.Parse(link)
if err != nil {
log.Println("音频 URL 解析错误: ", err)
} else {
if u.Scheme == "file" {
bgm = open(u.String())
} else if u.Scheme == "http" || u.Scheme == "https" {
bgm = get(u.String())
} else {
log.Printf("不支持的音频文件协议: %v\n", u.String())
return
}
bgm = toSeeker(bgm)
}
return
}