refactor(voice): split nested expressions when seeking
This commit is contained in:
parent
9c1a39ca76
commit
8c87531e75
1 changed files with 10 additions and 3 deletions
|
|
@ -103,7 +103,8 @@ func (p *Player) seek(position time.Duration) error {
|
||||||
var first, last int64
|
var first, last int64
|
||||||
for offset := 0; offset+oggHeaderSize <= len(p.audio); {
|
for offset := 0; offset+oggHeaderSize <= len(p.audio); {
|
||||||
page := p.audio[offset:]
|
page := p.audio[offset:]
|
||||||
segments := page[oggHeaderSize:][:min(int(page[oggSegmentsOffset]), len(page)-oggHeaderSize)]
|
count := min(int(page[oggSegmentsOffset]), len(page)-oggHeaderSize)
|
||||||
|
segments := page[oggHeaderSize:][:count]
|
||||||
size := oggHeaderSize + len(segments)
|
size := oggHeaderSize + len(segments)
|
||||||
for _, segment := range segments {
|
for _, segment := range segments {
|
||||||
size += int(segment)
|
size += int(segment)
|
||||||
|
|
@ -125,13 +126,19 @@ func (p *Player) seek(position time.Duration) error {
|
||||||
offset += size
|
offset += size
|
||||||
}
|
}
|
||||||
|
|
||||||
decoder, err := oggopus.NewDecoder(io.MultiReader(bytes.NewReader(p.audio[:min(headers, len(p.audio))]), bytes.NewReader(p.audio[min(start, len(p.audio)):])))
|
// The decoder needs the headers, and then the pages from start on.
|
||||||
|
end := len(p.audio)
|
||||||
|
header := bytes.NewReader(p.audio[:min(headers, end)])
|
||||||
|
rest := bytes.NewReader(p.audio[min(start, end):])
|
||||||
|
decoder, err := oggopus.NewDecoder(io.MultiReader(header, rest))
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// The samples between first and position are decoded and dropped, at 2 bytes each per channel.
|
||||||
|
skip := (sample - first) * int64(decoder.Info().Channels) * 2
|
||||||
// Nothing is left to play if position is past the end.
|
// Nothing is left to play if position is past the end.
|
||||||
if _, err := io.CopyN(io.Discard, decoder, (sample-first)*int64(decoder.Info().Channels)*2); err != nil && !errors.Is(err, io.EOF) {
|
if _, err := io.CopyN(io.Discard, decoder, skip); err != nil && !errors.Is(err, io.EOF) {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
p.decoder, p.samples = decoder, sample
|
p.decoder, p.samples = decoder, sample
|
||||||
|
|
|
||||||
Loading…
Add table
Reference in a new issue