76 lines
1.1 KiB
Go
Raw Permalink Normal View History

2019-01-02 16:11:22 +01:00
package audio
import (
"fmt"
"os"
"os/signal"
"time"
"../icecast"
)
2019-01-03 14:21:24 +01:00
type Next func() (string, error)
2019-01-02 16:11:22 +01:00
2019-01-03 14:21:24 +01:00
func Start(next_cb Next) {
2019-01-02 16:11:22 +01:00
sig := make(chan os.Signal, 1)
signal.Notify(sig, os.Interrupt, os.Kill)
samplerate := 44100
bytes_per_sample := 1
channels := 1
bytes_per_sec := int(samplerate) * channels * bytes_per_sample
_, er := icecast.Connect()
chk(er)
audio := make([]byte, 2 * 1024)
dt := time.Second * time.Duration(len(audio)) / time.Duration(bytes_per_sec)
2019-01-03 14:21:24 +01:00
for fname, exit := next_cb(); exit == nil; fname, exit = next_cb() {
2019-01-02 16:11:22 +01:00
2019-01-03 14:21:24 +01:00
r, e := os.Open(fname)
chk(e)
defer r.Close()
2019-01-02 16:11:22 +01:00
2019-01-03 14:21:24 +01:00
now := time.Now()
for {
n, err := r.Read(audio)
if n == 0 {
break
}
chk(err)
pre := time.Now()
2019-01-02 16:11:22 +01:00
2019-01-03 14:21:24 +01:00
icecast.Send(audio)
post := time.Now()
lag := time.Duration((post.Sub(pre)))
select {
case <-sig:
return
default:
}
dt = (time.Second * time.Duration(n) / time.Duration(bytes_per_sec)) - lag
time.Sleep(dt)
2019-01-02 16:11:22 +01:00
}
2019-01-03 14:21:24 +01:00
fmt.Println(time.Duration(time.Now().Sub(now)))
2019-01-02 16:11:22 +01:00
2019-01-03 14:21:24 +01:00
}
2019-01-02 16:11:22 +01:00
}
func chk(err error) {
if err != nil {
panic(err)
}
}