-
Notifications
You must be signed in to change notification settings - Fork 1
/
audiostream.go
119 lines (89 loc) · 2.46 KB
/
audiostream.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
package web
import (
"io"
"log"
"net/http"
"github.com/thijzert/speeldoos/lib/wavreader"
"github.com/thijzert/speeldoos/lib/wavreader/chunker"
)
var MP3StreamHandler mp3StreamHandler
var WAVStreamHandler wavStreamHandler
type mp3StreamHandler struct{}
func (mp3StreamHandler) handleMP3Stream(s State, r audioStreamRequest) (State, audioStreamResponse, error) {
var rv audioStreamResponse
cs, err := s.MP3Stream.NewStream()
if err != nil {
return s, rv, err
}
rv.Type = typeMP3
rv.Format = s.MP3Stream.Format()
rv.Stream = cs
return s, rv, nil
}
func (mp3StreamHandler) DecodeRequest(r *http.Request) (Request, error) {
return audioStreamRequest{}, nil
}
func (h mp3StreamHandler) HandleRequest(s State, r Request) (State, Response, error) {
req, ok := r.(audioStreamRequest)
if !ok {
return withError(s, errWrongRequestType{})
}
return h.handleMP3Stream(s, req)
}
type audioStreamType int
const (
typeWAV audioStreamType = iota
typeMP3
)
type audioStreamRequest struct {
}
func (audioStreamRequest) FlaggedAsRequest() {}
type audioStreamResponse struct {
Type audioStreamType
Format wavreader.StreamFormat
Stream chunker.ChunkStream
}
func (audioStreamResponse) FlaggedAsResponse() {}
func (a audioStreamResponse) ServeHTTP(w http.ResponseWriter, r *http.Request) {
var tgt io.Writer = w
w.Header().Set("Cache-Control", "no-cache")
w.Header().Set("Pragma", "no-cache")
w.Header().Set("Expires", "Fri, 1 Apr 2005, 13:00:00 GMT")
if a.Type == typeMP3 {
w.Header().Set("Content-Type", "audio/mpeg")
} else if a.Type == typeWAV {
w.Header().Set("Content-Type", "audio/wav")
ww := wavreader.NewWriter(w, a.Format)
ww.Init(0)
tgt = ww
} else {
w.Header().Set("Content-Type", "application/octet-steam")
}
_, err := io.Copy(tgt, a.Stream)
if err != nil {
log.Print(err)
return
}
}
type wavStreamHandler struct{}
func (wavStreamHandler) handleWAVStream(s State, r audioStreamRequest) (State, audioStreamResponse, error) {
var rv audioStreamResponse
cs, err := s.RawStream.NewStream()
if err != nil {
return s, rv, err
}
rv.Type = typeWAV
rv.Format = s.RawStream.Format()
rv.Stream = cs
return s, rv, nil
}
func (wavStreamHandler) DecodeRequest(r *http.Request) (Request, error) {
return audioStreamRequest{}, nil
}
func (h wavStreamHandler) HandleRequest(s State, r Request) (State, Response, error) {
req, ok := r.(audioStreamRequest)
if !ok {
return withError(s, errWrongRequestType{})
}
return h.handleWAVStream(s, req)
}