-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathSongQueue.go
More file actions
60 lines (50 loc) · 1.25 KB
/
SongQueue.go
File metadata and controls
60 lines (50 loc) · 1.25 KB
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
package main
import "github.com/faiface/beep"
type Queue struct {
streamers []beep.Streamer
}
func (q *Queue) Add(streamers ...beep.Streamer) {
q.streamers = append(q.streamers, streamers...)
}
func (q *Queue) Stream(samples [][2]float64) (n int, ok bool) {
// We use the filled variable to track how many samples we've
// successfully filled already. We loop until all samples are filled.
filled := 0
for filled < len(samples) {
// There are no streamers in the queue, so we stream silence.
if len(q.streamers) == 0 {
for i := range samples[filled:] {
samples[i][0] = 0
samples[i][1] = 0
}
break
}
// We stream from the first streamer in the queue.
n, ok := q.streamers[0].Stream(samples[filled:])
// If it's drained, we pop it from the queue, thus continuing with
// the next streamer.
if !ok {
q.streamers = q.streamers[1:]
}
// We update the number of filled samples.
filled += n
}
return len(samples), true
}
func (q *Queue) Clear() {
q.streamers = nil
}
func (q *Queue) Pop() {
q.PopNumber(1)
}
func (q *Queue) PopNumber(number int) {
if len(q.streamers) > number {
q.streamers = q.streamers[number:]
}
}
func (q *Queue) Len() int {
return len(q.streamers)
}
func (q *Queue) Err() error {
return nil
}