Skip to content

Commit 08cfbc0

Browse files
committed
Fixed ogg streaming
1 parent 17c75f5 commit 08cfbc0

File tree

5 files changed

+29
-12
lines changed

5 files changed

+29
-12
lines changed

main/src/main/java/com/sedmelluq/discord/lavaplayer/container/ogg/OggAudioTrack.java

Lines changed: 20 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,18 @@
11
package com.sedmelluq.discord.lavaplayer.container.ogg;
22

3+
import com.sedmelluq.discord.lavaplayer.tools.FriendlyException;
34
import com.sedmelluq.discord.lavaplayer.tools.io.SeekableInputStream;
45
import com.sedmelluq.discord.lavaplayer.track.AudioTrackInfo;
56
import com.sedmelluq.discord.lavaplayer.track.BaseAudioTrack;
7+
import com.sedmelluq.discord.lavaplayer.track.playback.AudioProcessingContext;
68
import com.sedmelluq.discord.lavaplayer.track.playback.LocalAudioTrackExecutor;
79
import org.slf4j.Logger;
810
import org.slf4j.LoggerFactory;
911

1012
import java.io.IOException;
1113

14+
import static com.sedmelluq.discord.lavaplayer.tools.FriendlyException.Severity.SUSPICIOUS;
15+
1216
/**
1317
* Audio track which handles an OGG stream.
1418
*/
@@ -32,15 +36,27 @@ public void process(final LocalAudioTrackExecutor localExecutor) throws IOExcept
3236
OggPacketInputStream packetInputStream = new OggPacketInputStream(inputStream, false);
3337
OggTrackBlueprint blueprint = OggTrackLoader.loadTrackBlueprint(packetInputStream);
3438

39+
log.debug("Starting to play an OGG track {}", getIdentifier());
40+
3541
if (blueprint == null) {
3642
throw new IOException("Stream terminated before the first packet.");
3743
}
3844

3945
OggTrackHandler handler = blueprint.loadTrackHandler(packetInputStream);
46+
localExecutor.executeProcessingLoop(() -> {
47+
try {
48+
processTrackLoop(packetInputStream, localExecutor.getProcessingContext(), handler, blueprint);
49+
} catch (IOException e) {
50+
throw new FriendlyException("Stream broke when playing OGG track.", SUSPICIOUS, e);
51+
}
52+
}, handler::seekToTimecode, true);
53+
}
4054

41-
log.debug("Starting to play an OGG track {}", getIdentifier());
42-
43-
handler.initialise(localExecutor.getProcessingContext(), 0, 0);
44-
localExecutor.executeProcessingLoop(handler::provideFrames, handler::seekToTimecode, true);
55+
private void processTrackLoop(OggPacketInputStream packetInputStream, AudioProcessingContext context, OggTrackHandler handler, OggTrackBlueprint blueprint) throws IOException, InterruptedException {
56+
while (blueprint != null) {
57+
handler.initialise(context, 0, 0);
58+
handler.provideFrames();
59+
blueprint = OggTrackLoader.loadTrackBlueprint(packetInputStream);
60+
}
4561
}
4662
}

main/src/main/java/com/sedmelluq/discord/lavaplayer/container/ogg/OggContainerProbe.java

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -41,7 +41,7 @@ public MediaContainerDetectionResult probe(AudioReference reference, SeekableInp
4141

4242
log.debug("Track {} is an OGG file.", reference.identifier);
4343

44-
AudioTrackInfoBuilder infoBuilder = AudioTrackInfoBuilder.create(reference, stream).setIsStream(true);
44+
AudioTrackInfoBuilder infoBuilder = AudioTrackInfoBuilder.create(reference, stream);
4545

4646
try {
4747
collectStreamInformation(stream, infoBuilder);
@@ -62,7 +62,6 @@ private void collectStreamInformation(SeekableInputStream stream, AudioTrackInfo
6262
OggMetadata metadata = OggTrackLoader.loadMetadata(packetInputStream);
6363

6464
if (metadata != null) {
65-
if (metadata.getLength() != null) infoBuilder.setIsStream(false);
6665
infoBuilder.apply(metadata);
6766
}
6867
}

main/src/main/java/com/sedmelluq/discord/lavaplayer/container/ogg/OggPacketInputStream.java

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -308,9 +308,7 @@ public long seek(long timecode) throws IOException {
308308
}
309309
}
310310

311-
if (mid > 0) {
312-
mid--;
313-
} else {
311+
if (mid == 0) {
314312
mid++;
315313
}
316314

main/src/main/java/com/sedmelluq/discord/lavaplayer/container/ogg/vorbis/OggVorbisCodecHandler.java

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,14 +3,17 @@
33
import com.sedmelluq.discord.lavaplayer.container.ogg.OggCodecHandler;
44
import com.sedmelluq.discord.lavaplayer.container.ogg.OggMetadata;
55
import com.sedmelluq.discord.lavaplayer.container.ogg.OggPacketInputStream;
6+
import com.sedmelluq.discord.lavaplayer.container.ogg.OggSeekPoint;
67
import com.sedmelluq.discord.lavaplayer.container.ogg.OggStreamSizeInfo;
78
import com.sedmelluq.discord.lavaplayer.container.ogg.OggTrackBlueprint;
89
import com.sedmelluq.discord.lavaplayer.container.ogg.OggTrackHandler;
10+
import com.sedmelluq.discord.lavaplayer.tools.Units;
911
import com.sedmelluq.discord.lavaplayer.tools.io.DirectBufferStreamBroker;
1012

1113
import java.io.IOException;
1214
import java.nio.ByteBuffer;
1315
import java.util.Arrays;
16+
import java.util.List;
1417

1518
public class OggVorbisCodecHandler implements OggCodecHandler {
1619
private static final int VORBIS_IDENTIFIER = ByteBuffer.wrap(new byte[] { 0x01, 'v', 'o', 'r' }).getInt();
@@ -37,7 +40,8 @@ public OggTrackBlueprint loadBlueprint(OggPacketInputStream stream, DirectBuffer
3740
loadCommentsHeader(stream, broker, true);
3841
ByteBuffer infoBuffer = ByteBuffer.wrap(infoPacket);
3942
int sampleRate = Integer.reverseBytes(infoBuffer.getInt(12));
40-
stream.setSeekPoints(stream.createSeekTable(sampleRate));
43+
List<OggSeekPoint> seekPointList = stream.createSeekTable(sampleRate);
44+
if (seekPointList != null) stream.setSeekPoints(seekPointList);
4145
return new Blueprint(sampleRate, infoPacket, broker);
4246
}
4347

@@ -60,7 +64,7 @@ public OggMetadata loadMetadata(OggPacketInputStream stream, DirectBufferStreamB
6064

6165
return new OggMetadata(
6266
VorbisCommentParser.parse(commentsPacket, broker.isTruncated()),
63-
sizeInfo.getDuration()
67+
sizeInfo != null ? sizeInfo.getDuration() : Units.DURATION_MS_UNKNOWN
6468
);
6569
}
6670

main/src/main/java/com/sedmelluq/discord/lavaplayer/format/StandardAudioDataFormats.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@ public class StandardAudioDataFormats {
2121
*/
2222
public static final AudioDataFormat COMMON_PCM_S16_BE = new Pcm16AudioDataFormat(2, 44100, 960, true);
2323
/**
24-
* Signed 16-bit big-endian PCM format matching with the most common sample rate.
24+
* Signed 16-bit little-endian PCM format matching with the most common sample rate.
2525
*/
2626
public static final AudioDataFormat COMMON_PCM_S16_LE = new Pcm16AudioDataFormat(2, 44100, 960, false);
2727
}

0 commit comments

Comments
 (0)