待机功能基本实现
This commit is contained in:
31
pkg/audio/bgm.go
Normal file
31
pkg/audio/bgm.go
Normal 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
66
pkg/audio/link_audio.go
Normal 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
|
||||
}
|
||||
@@ -37,7 +37,9 @@ func New(portName string, reader func(msg string)) (*Device, error) {
|
||||
for {
|
||||
r := bufio.NewReader(port)
|
||||
line, _, _ := r.ReadLine()
|
||||
reader(string(line))
|
||||
if reader != nil {
|
||||
reader(string(line))
|
||||
}
|
||||
}
|
||||
}()
|
||||
return &Device{port: port}, nil
|
||||
|
||||
@@ -26,6 +26,8 @@ type result struct {
|
||||
Error error
|
||||
}
|
||||
|
||||
var DefaultTTS = &AliTTS{}
|
||||
|
||||
// onTaskFailed 识别过程中的错误处理回调参数
|
||||
func (tts *AliTTS) onTaskFailed(text string, param interface{}) {
|
||||
p, _ := param.(*result)
|
||||
|
||||
1
pkg/video/paly.go
Normal file
1
pkg/video/paly.go
Normal file
@@ -0,0 +1 @@
|
||||
package video
|
||||
Reference in New Issue
Block a user