public void Play() { BasePlayer.Play(); playing = true; provideThread = new Thread(() => { try { WebClient wc = new WebClient(); wc.Headers[HttpRequestHeader.UserAgent] = Globals.USER_AGENT; using (var stream = wc.OpenRead(url)) { var readFullyStream = new ReadFullyStream(stream); int packetCounter = 0; while (playing) { byte[][] packets = ogg.GetAudioPackets(readFullyStream); packetCounter++; //Skip first 5 pages (control frames, etc) if (packetCounter <= 5) { continue; } for (int i = 0; i < packets.Length; i++) { var streamBytes = packets[i]; try { int frameSize = OpusPacketInfo.GetNumSamplesPerFrame(streamBytes, 0, Globals.SAMPLE_RATE); //Get frame size from opus packet short[] rawBuffer = new short[frameSize * 2]; //2 channels var buffer = decoder.Decode(streamBytes, 0, streamBytes.Length, rawBuffer, 0, frameSize, false); BasePlayer.QueueBuffer(rawBuffer); if (visualiser != null) { visualiser.AddSamples(rawBuffer); } } catch (Concentus.OpusException) { //Skip this frame } } } } } catch (Exception) { } }); provideThread.Start(); }
public void Play() { audioPlayer.Play(); playing = true; provideThread = new Thread(() => { try { HttpWebRequest req = WebRequest.CreateHttp(url); req.UserAgent = Globals.USER_AGENT; using (var stream = req.GetResponse().GetResponseStream()) { var readFullyStream = new ReadFullyStream(stream); while (playing) { byte[][] packets = ogg.GetAudioPackets(readFullyStream); for (int i = 0; i < packets.Length; i++) { var streamBytes = packets[i]; try { int frameSize = OpusPacketInfo.GetNumSamplesPerFrame(streamBytes, 0, Globals.SAMPLE_RATE); //Get frame size from opus packet short[] rawBuffer = new short[frameSize * 2]; //2 channels var buffer = decoder.Decode(streamBytes, 0, streamBytes.Length, rawBuffer, 0, frameSize, false); audioPlayer.QueueBuffer(rawBuffer); if (visualiser != null) { visualiser.AddSamples(rawBuffer); } } catch (Concentus.OpusException) { //Skip this frame //Note: the first 2 frames will hit this exception (I'm pretty sure they're not audio data frames) } } } } } catch (Exception) { } }); provideThread.Start(); }