diff --git a/api_test.go b/api_test.go index 287e581..f19e839 100644 --- a/api_test.go +++ b/api_test.go @@ -17,7 +17,7 @@ func TestAPI(t *testing.T) { if err != nil { t.Fatal(err) } - err = SaveOggToWav(u, "test.wav") + err = SaveOggToFile(u, "test.wav") if err != nil { t.Fatal(err) } diff --git a/ogg.go b/ogg.go index c48f4fa..cc10cf3 100644 --- a/ogg.go +++ b/ogg.go @@ -1,6 +1,7 @@ package ahsai import ( + "io" "net/http" "os" "time" @@ -11,7 +12,25 @@ import ( "github.com/faiface/beep/wav" ) -func SaveOggToWav(u, path string) error { +func cutstream(s beep.StreamSeekCloser) { + tmp := make([][2]float64, 1024) + c := 0 + for c < 6 { + _, _ = s.Stream(tmp) + sum := (tmp[0][0] + tmp[0][1]) / 2 + for j := 1; j < 1024; j++ { + sum += (tmp[j][0] + tmp[j][1]) / 2 + sum /= 2 + } + if sum < 1e-32 && sum > -1e-32 { + c++ + } else { + c = 0 + } + } +} + +func SaveOggToFile(u, path string) error { resp, err := http.Get(u) if err != nil { return err @@ -27,17 +46,22 @@ func SaveOggToWav(u, path string) error { return err } defer f.Close() - tmp := make([][2]float64, 1024) - _, _ = s.Stream(tmp) - sum := (tmp[0][0] + tmp[0][1]) / 2 - for sum > 1e-32 || sum < -1e-32 { - _, _ = s.Stream(tmp) - sum = (tmp[0][0] + tmp[0][1]) / 2 - for j := 1; j < 1024; j++ { - sum += (tmp[j][0] + tmp[j][1]) / 2 - sum /= 2 - } + cutstream(s) + return wav.Encode(f, s, format) +} + +func SaveOggToWriteSeeker(u string, f io.WriteSeeker) error { + resp, err := http.Get(u) + if err != nil { + return err } + s, format, err := vorbis.Decode(resp.Body) + if err != nil { + resp.Body.Close() + return err + } + defer s.Close() + cutstream(s) return wav.Encode(f, s, format) } @@ -52,17 +76,7 @@ func PlayOgg(u string) error { return err } defer s.Close() - tmp := make([][2]float64, 1024) - _, _ = s.Stream(tmp) - sum := (tmp[0][0] + tmp[0][1]) / 2 - for sum > 1e-32 || sum < -1e-32 { - _, _ = s.Stream(tmp) - sum = (tmp[0][0] + tmp[0][1]) / 2 - for j := 1; j < 1024; j++ { - sum += (tmp[j][0] + tmp[j][1]) / 2 - sum /= 2 - } - } + cutstream(s) err = speaker.Init(format.SampleRate, format.SampleRate.N(time.Second/32)) if err != nil { return err diff --git a/test.wav b/test.wav index 5cb6d8d..e7c8ca8 100644 Binary files a/test.wav and b/test.wav differ