76 lines
1.1 KiB
Go
76 lines
1.1 KiB
Go
package audio
|
|
|
|
import (
|
|
"fmt"
|
|
"os"
|
|
"os/signal"
|
|
"time"
|
|
"../icecast"
|
|
)
|
|
|
|
type Next func() (string, error)
|
|
|
|
func Start(next_cb Next) {
|
|
|
|
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)
|
|
|
|
for fname, exit := next_cb(); exit == nil; fname, exit = next_cb() {
|
|
|
|
r, e := os.Open(fname)
|
|
chk(e)
|
|
defer r.Close()
|
|
|
|
now := time.Now()
|
|
|
|
for {
|
|
|
|
n, err := r.Read(audio)
|
|
if n == 0 {
|
|
break
|
|
}
|
|
chk(err)
|
|
|
|
pre := time.Now()
|
|
|
|
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)
|
|
|
|
}
|
|
|
|
fmt.Println(time.Duration(time.Now().Sub(now)))
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
func chk(err error) {
|
|
if err != nil {
|
|
panic(err)
|
|
}
|
|
}
|