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) } }