public void Play(Model.Song song) { if (song == null) { return; } if (audioFileReader != null) { audioFileReader.Dispose(); audioFileReader = null; } var t = Mp3Frame.LoadFromStream(null); NAudio.Wave.AcmMp3FrameDecompressor dec = new AcmMp3FrameDecompressor(new Mp3WaveFormat(t.SampleRate, 2, t.FrameLength, t.BitRate)); audioFileReader = new AudioFileReader(song.mp3Url); if (waveOutDevice != null) { waveOutDevice.Stop(); waveOutDevice.Dispose(); waveOutDevice = null; } waveOutDevice = new WaveOut(); waveOutDevice.Init(audioFileReader); waveOutDevice.Play(); }
private void _buffer(Stream input) { Console.WriteLine("[Initial buffering] Meta interval: {0}", this.StationInformation.ContainsKey("icy-metaint") ? long.Parse(this.StationInformation["icy-metaint"]) : -1); // Auto-fix the stream and auto-parse metadata stream = new FixedBufferedStream( input, this.StationInformation.ContainsKey("icy-metaint") ? long.Parse(this.StationInformation["icy-metaint"]) : -1 ); // Read first frame this.Status = StreamStatus.Buffering; switch (Codec) { case StreamCodec.MP3: // Make a decoder which can decode that (and sequentially following) frames // The decoder will decode to 16-bit samples frame = Mp3Frame.LoadFromStream(stream); _decoderMp3 = new AcmMp3FrameDecompressor(new Mp3WaveFormat(frame.SampleRate, frame.ChannelMode == ChannelMode.Mono ? 1 : 2, frame.FrameLength, frame.BitRate)); Console.WriteLine("[Initial buffering] MP3 decoder will encode to {0}-encoded wave format.", _decoderMp3.OutputFormat.Encoding); break; default: throw new NotSupportedException(); } }
public static void playMusic(UdpClient privatePort, IPEndPoint privateEP) { string mediaFolder = System.IO.Path.Combine(System.Windows.Forms.Application.StartupPath, "MusicLibrary"); byte[] data; int count1 = 0; var buffer1 = new byte[16384 * 4]; var nameOfTheSong = privatePort.Receive(ref privateEP); var startPoint = privatePort.Receive(ref privateEP); Song sendingSong = null; try { sendingSong = allSongs.Songs.Where(x => x.ToString() == Encoding.ASCII.GetString(nameOfTheSong)).Single(); } catch { var msg = Encoding.ASCII.GetBytes("Error occurred: Couldn't find this song in our library"); privatePort.Send(msg, msg.Length, privateEP); } privatePort.Send(Encoding.ASCII.GetBytes("granted"), 7, privateEP); if (sendingSong != null) { int startTime = Int32.Parse(Encoding.ASCII.GetString(startPoint)); Mp3FileReader reader = new Mp3FileReader(mediaFolder + "\\" + sendingSong.Directory); var b = Encoding.ASCII.GetBytes(reader.TotalTime.ToString()); privatePort.Send(b, b.Length, privateEP); reader.CurrentTime = TimeSpan.FromSeconds(startTime); Mp3Frame mp3Frame = reader.ReadNextFrame(); IMp3FrameDecompressor decomp = null; WaveFormat waveFormat = new Mp3WaveFormat(mp3Frame.SampleRate, mp3Frame.ChannelMode == ChannelMode.Mono ? 1 : 2, mp3Frame.FrameLength, mp3Frame.BitRate); decomp = new AcmMp3FrameDecompressor(waveFormat); int total = 0; while (mp3Frame != null) { data = mp3Frame.RawData; privatePort.Send(data, data.Length, privateEP); if (Encoding.ASCII.GetString(privatePort.Receive(ref privateEP)) != "more") { break; } total += data.Length; if (count1 % 500 == 0) { Console.WriteLine(" Sending Song: " + sendingSong.ToString()); Console.WriteLine("Total packet sent: " + total); } count1 = count1 + 1; mp3Frame = reader.ReadNextFrame(); } privatePort.Send(Encoding.ASCII.GetBytes("done"), 4, privateEP); Console.WriteLine("Total packet sent: " + total); Console.WriteLine("------Stop Sending------"); } }
private IMp3FrameDecompressor CreateFrameDeCompressor() { if (_reader == null) { throw new ArgumentNullException(nameof(_reader)); } Id3v2Tag.ReadTag(_reader); // read tag data in from begin of stream _dataStartPosition = _reader.Position; var firstFrame = Mp3Frame.LoadFromStream(_reader); if (firstFrame == null) { throw new InvalidDataException("Invalid MP3 file - no MP3 Frames Detected"); } double bitRate = firstFrame.BitRate; var xingHeader = XingHeader.LoadXingHeader(firstFrame); // If the header exists, we can skip over it when decoding the rest of the file if (xingHeader != null) { _dataStartPosition = _reader.Position; } // workaround for a longstanding issue with some files failing to load // because they report a spurious sample rate change var secondFrame = Mp3Frame.LoadFromStream(_reader); if (secondFrame != null && (secondFrame.SampleRate != firstFrame.SampleRate || secondFrame.ChannelMode != firstFrame.ChannelMode)) { // assume that the first frame was some kind of VBR/LAME header that we failed to recognise properly _dataStartPosition = secondFrame.FileOffset; // forget about the first frame, the second one is the first one we really care about firstFrame = secondFrame; } // create a temporary MP3 format before we know the real bitrate Mp3WaveFormat = new Mp3WaveFormat(firstFrame.SampleRate, firstFrame.ChannelMode == ChannelMode.Mono ? 1 : 2, firstFrame.FrameLength, (int)bitRate); var decompressor = new AcmMp3FrameDecompressor(Mp3WaveFormat); _decompressBuffer = new byte[16384 * 4]; // needs to be big enough to hold a decompressed frame MaxPosition = _reader.Length - _dataStartPosition; Duration = TimeSpan.FromSeconds((double)MaxPosition / Mp3WaveFormat.AverageBytesPerSecond); return(decompressor); }
private void StreamMP3(object state) { this.fullyDownloaded = false; string url = (string)state; webRequest = (HttpWebRequest)WebRequest.Create(url); HttpWebResponse resp = null; try { resp = (HttpWebResponse)webRequest.GetResponse(); } catch (WebException e) { if (e.Status != WebExceptionStatus.RequestCanceled) { ShowError(e.Message); } return; } byte[] buffer = new byte[16384 * 4]; // needs to be big enough to hold a decompressed frame IMp3FrameDecompressor decompressor = null; try { using (var responseStream = resp.GetResponseStream()) { var readFullyStream = new ReadFullyStream(responseStream); do { if (bufferedWaveProvider != null && bufferedWaveProvider.BufferLength - bufferedWaveProvider.BufferedBytes < bufferedWaveProvider.WaveFormat.AverageBytesPerSecond / 4) { Debug.WriteLine("Buffer getting full, taking a break"); Thread.Sleep(500); } else { Mp3Frame frame = null; try { frame = Mp3Frame.LoadFromStream(readFullyStream); } catch (EndOfStreamException) { this.fullyDownloaded = true; // reached the end of the MP3 file / stream break; } catch (WebException) { // probably we have aborted download from the GUI thread break; } if (decompressor == null) { // don't think these details matter too much - just help ACM select the right codec // however, the buffered provider doesn't know what sample rate it is working at // until we have a frame WaveFormat waveFormat = new Mp3WaveFormat(frame.SampleRate, frame.ChannelMode == ChannelMode.Mono ? 1 : 2, frame.FrameLength, frame.BitRate); decompressor = new AcmMp3FrameDecompressor(waveFormat); this.bufferedWaveProvider = new BufferedWaveProvider(decompressor.OutputFormat); this.bufferedWaveProvider.BufferDuration = TimeSpan.FromSeconds(20); // allow us to get well ahead of ourselves //this.bufferedWaveProvider.BufferedDuration = 250; } int decompressed = decompressor.DecompressFrame(frame, buffer, 0); //Debug.WriteLine(String.Format("Decompressed a frame {0}", decompressed)); bufferedWaveProvider.AddSamples(buffer, 0, decompressed); } } while (playbackState != StreamingPlaybackState.Stopped); Debug.WriteLine("Exiting"); // was doing this in a finally block, but for some reason // we are hanging on response stream .Dispose so never get there decompressor.Dispose(); } } finally { if (decompressor != null) { decompressor.Dispose(); } } }
private void StreamMp3(object state) { _isBuffering(true); ThrottledStream responseStream = (ThrottledStream)state; byte[] buffer = new byte[16384 * 4]; // needs to be big enough to hold a decompressed frame IMp3FrameDecompressor decompressor = null; try { using (responseStream) { _playbackState = StreamingPlaybackState.Buffering; using (var readFullyStream = new ReadFullyStream(responseStream)) { do { if (_bufferedWaveProvider != null && _bufferedWaveProvider.BufferLength - _bufferedWaveProvider.BufferedBytes < _bufferedWaveProvider.WaveFormat.AverageBytesPerSecond / 4) { Thread.Sleep(500); } Mp3Frame frame; try { frame = Mp3Frame.LoadFromStream(readFullyStream); if (frame == null) { _fullyDownloaded = true; break; } } catch (EndOfStreamException e) { _log.Log(e.Message, Category.Warn, Priority.Medium); _fullyDownloaded = true; // reached the end of the MP3 file / stream break; } catch (WebException e) { _log.Log(e.Message, Category.Warn, Priority.Medium); _fullyDownloaded = true; // probably we have aborted download from the GUI thread break; } catch (Exception e) { _log.Log(e.Message, Category.Exception, Priority.High); _fullyDownloaded = true; break; } if (decompressor == null) { WaveFormat waveFormat = new Mp3WaveFormat(44100, frame.ChannelMode == ChannelMode.Mono ? 1 : 2, frame.FrameLength, frame.BitRate); decompressor = new AcmMp3FrameDecompressor(waveFormat); _bufferedWaveProvider = new BufferedWaveProvider(decompressor.OutputFormat); if (_track.TotalDuration != TimeSpan.Zero) { _bufferedWaveProvider.BufferDuration = _track.TotalDuration; } else { _bufferedWaveProvider.BufferDuration = TimeSpan.FromSeconds(25); } responseStream.MaximumBytesPerSecond = _bufferedWaveProvider.WaveFormat.AverageBytesPerSecond / 4; } if (_bufferedWaveProvider != null) { try { int decompressed = decompressor.DecompressFrame(frame, buffer, 0); _bufferedWaveProvider.AddSamples(buffer, 0, decompressed); } catch (Exception e) { _fullyDownloaded = true; _log.Log("Grooveshark: Error decompressing frame: " + e.Message, Category.Exception, Priority.Medium); break; } } } while (_playbackState != StreamingPlaybackState.Stopped); // was doing this in a finally block, but for some reason // we are hanging on response stream .Dispose so never get there if (decompressor != null) { decompressor.Dispose(); decompressor = null; } } } } finally { if (decompressor != null) { decompressor.Dispose(); decompressor = null; } } _log.Log("Grooveshark: Buffer thread exiting", Category.Info, Priority.Medium); }
private void StreamMP3() { _abort = new ManualResetEvent(false); HttpWebRequest request = null; try { var resp = _connFactory.GetResponse(_source, "GET", "", out request); var buffer = new byte[16384 * 4]; // needs to be big enough to hold a decompressed frame IMp3FrameDecompressor decompressor = null; using (var responseStream = resp.GetResponseStream()) { var readFullyStream = new ReadFullyStream(responseStream); while (!_abort.WaitOne(20) && !MainForm.ShuttingDown) { if (_bufferedWaveProvider != null && _bufferedWaveProvider.BufferLength - _bufferedWaveProvider.BufferedBytes < _bufferedWaveProvider.WaveFormat.AverageBytesPerSecond / 4) { //Debug.WriteLine("Buffer getting full, taking a break"); Thread.Sleep(100); } else { var da = DataAvailable; if (da != null) { Mp3Frame frame; try { frame = Mp3Frame.LoadFromStream(readFullyStream); } catch (EndOfStreamException) { // reached the end of the MP3 file / stream break; } catch (WebException) { // probably we have aborted download from the GUI thread break; } if (decompressor == null || _bufferedWaveProvider == null) { // don't think these details matter too much - just help ACM select the right codec // however, the buffered provider doesn't know what sample rate it is working at // until we have a frame WaveFormat waveFormat = new Mp3WaveFormat(frame.SampleRate, frame.ChannelMode == ChannelMode.Mono ? 1 : 2, frame.FrameLength, frame.BitRate); RecordingFormat = new WaveFormat(frame.SampleRate, 16, frame.ChannelMode == ChannelMode.Mono ? 1 : 2); decompressor = new AcmMp3FrameDecompressor(waveFormat); _bufferedWaveProvider = new BufferedWaveProvider(decompressor.OutputFormat) { BufferDuration = TimeSpan.FromSeconds(5) }; _sampleChannel = new SampleChannel(_bufferedWaveProvider); _sampleChannel.PreVolumeMeter += SampleChannelPreVolumeMeter; } int decompressed = decompressor.DecompressFrame(frame, buffer, 0); _bufferedWaveProvider.AddSamples(buffer, 0, decompressed); var sampleBuffer = new float[buffer.Length]; int read = _sampleChannel.Read(sampleBuffer, 0, buffer.Length); da(this, new DataAvailableEventArgs((byte[])buffer.Clone(), read)); if (Listening) { WaveOutProvider?.AddSamples(buffer, 0, read); } } } } // was doing this in a finally block, but for some reason // we are hanging on response stream .Dispose so never get there if (decompressor != null) { decompressor.Dispose(); decompressor = null; } } } catch (Exception ex) { _res = ReasonToFinishPlaying.DeviceLost; Logger.LogException(ex, "MP3Stream"); } try { request?.Abort(); } catch { } request = null; AudioFinished?.Invoke(this, new PlayingFinishedEventArgs(_res)); _abort.Close(); }
//got helps from erszcz on stackoverflow static void Main(string[] args) { IPEndPoint ep = new IPEndPoint(IPAddress.Parse("127.0.0.1"), 11000); // endpoint where server is listening var buffer = new byte[16384 * 4]; client.Connect(ep); client.Send(new byte[] { 1, 2, 3, 4, 5 }, 5); // send data BufferedWaveProvider bufferedWaveProvider = null; WaveOut waveOut = new WaveOut(); IMp3FrameDecompressor decomp = null; int count = 0; // then receive data do { var receivedData = client.Receive(ref ep); Console.WriteLine("receive data from " + ep.ToString()); client.Send(new byte[] { 1, 2, 3, 4, 5 }, 5); Mp3Frame frame; Stream ms = new MemoryStream(); ms.Write(receivedData, 0, receivedData.Length); ms.Position = 0; frame = Mp3Frame.LoadFromStream(ms, true); if (decomp == null) { WaveFormat waveFormat = new Mp3WaveFormat(frame.SampleRate, frame.ChannelMode == ChannelMode.Mono ? 1 : 2, frame.FrameLength, frame.BitRate); decomp = new AcmMp3FrameDecompressor(waveFormat); bufferedWaveProvider = new BufferedWaveProvider(decomp.OutputFormat); bufferedWaveProvider.BufferDuration = TimeSpan.FromSeconds(20); //var volumeProvider = new VolumeWaveProvider16(bufferedWaveProvider); //volumeProvider.Volume = 1; waveOut.Init(bufferedWaveProvider); // allow us to get well ahead of ourselves //this.bufferedWaveProvider.BufferedDuration = 250; } if (bufferedWaveProvider.BufferedDuration.TotalSeconds > 4) { waveOut.Play(); } int decompressed = decomp.DecompressFrame(frame, buffer, 0); bufferedWaveProvider.AddSamples(buffer, 0, decompressed); count++; } while (bufferedWaveProvider.BufferedDuration.TotalSeconds < 18); //Debug.WriteLine(String.Format("Decompressed a frame {0}", decompressed)); //PlayMp3FromUrl(receivedData); Console.Read(); }
private void StreamMP3() { var webRequest = (HttpWebRequest)WebRequest.Create(_source); HttpWebResponse resp = null; try { resp = (HttpWebResponse)webRequest.GetResponse(); } catch (WebException e) { if (e.Status != WebExceptionStatus.RequestCanceled) { } return; } byte[] buffer = new byte[16384 * 4]; // needs to be big enough to hold a decompressed frame IMp3FrameDecompressor decompressor = null; try { using (var responseStream = resp.GetResponseStream()) { var readFullyStream = new ReadFullyStream(responseStream); while (!_stopEvent.WaitOne(0, false)) { if (_bufferedWaveProvider != null && _bufferedWaveProvider.BufferLength - _bufferedWaveProvider.BufferedBytes < _bufferedWaveProvider.WaveFormat.AverageBytesPerSecond / 4) { //Debug.WriteLine("Buffer getting full, taking a break"); Thread.Sleep(100); } else { Mp3Frame frame = null; try { frame = Mp3Frame.LoadFromStream(readFullyStream); } catch (EndOfStreamException) { // reached the end of the MP3 file / stream break; } catch (WebException) { // probably we have aborted download from the GUI thread break; } if (decompressor == null) { // don't think these details matter too much - just help ACM select the right codec // however, the buffered provider doesn't know what sample rate it is working at // until we have a frame WaveFormat waveFormat = new Mp3WaveFormat(frame.SampleRate, frame.ChannelMode == ChannelMode.Mono ? 1 : 2, frame.FrameLength, frame.BitRate); decompressor = new AcmMp3FrameDecompressor(waveFormat); this._bufferedWaveProvider = new BufferedWaveProvider(decompressor.OutputFormat) { BufferDuration = TimeSpan.FromSeconds(5) }; _waveOut = new DirectSoundOut(1000); _waveOut.Init(_bufferedWaveProvider); _waveOut.Play(); _waveOut.PlaybackStopped += wavePlayer_PlaybackStopped; } int decompressed = decompressor.DecompressFrame(frame, buffer, 0); //Debug.WriteLine(String.Format("Decompressed a frame {0}", decompressed)); _bufferedWaveProvider.AddSamples(buffer, 0, decompressed); } if (_stopEvent.WaitOne(0, false)) { break; } } Debug.WriteLine("Exiting"); // was doing this in a finally block, but for some reason // we are hanging on response stream .Dispose so never get there if (decompressor != null) { decompressor.Dispose(); decompressor = null; } } } finally { if (decompressor != null) { decompressor.Dispose(); } if (_waveOut != null) { _waveOut.Stop(); } } }
/// <summary>Liek MP3 plūsmu buferī.</summary> private async Task StreamMp3() { try { await stream.Open(); } catch { unexpectedStop.BeginInvoke(null, null); return; } IMp3FrameDecompressor decompressor = null; byte[] buffer = new byte[65536]; // Atspiests skaņas fragments. bool hasException = false; PlaybackState = PlaybackState.Buffering; playbackTimer.Start(); int sampleRate = 0; // Iepriekšēja skaņas fragmenta frekvence, piemēram, 44100. while (PlaybackState == PlaybackState.Buffering || PlaybackState == PlaybackState.Playing) { if (bufferedWaveProvider != null && bufferedWaveProvider.BufferLength - bufferedWaveProvider.BufferedBytes < bufferedWaveProvider.WaveFormat.AverageBytesPerSecond / 4) { await Task.Delay(500); // Kamēr buferī pietiekami datu, lejuplāde var pagaidīt. continue; } Mp3Frame frame = null; try { frame = Mp3Frame.LoadFromStream(stream); } catch (Exception) { hasException = PlaybackState != PlaybackState.Stopped; break; } if (frame.SampleRate != sampleRate) { if (decompressor == null) { waveOut = new WaveOut(); } else { decompressor.Dispose(); } Debug.WriteLine("{0} Hz, {1} bps, {2} bytes", frame.SampleRate, frame.BitRate, frame.FrameLength); // Sagatavo dekoderi saskaņā ar pirmā skaņas fragmenta īpatnībām. decompressor = new AcmMp3FrameDecompressor( new Mp3WaveFormat(frame.SampleRate, frame.ChannelMode == ChannelMode.Mono ? 1 : 2, frame.FrameLength, frame.BitRate)); bufferedWaveProvider = new BufferedWaveProvider(decompressor.OutputFormat); bufferedWaveProvider.BufferDuration = TimeSpan.FromSeconds(3); volumeProvider = new VolumeWaveProvider16(bufferedWaveProvider); volumeProvider.Volume = isMuted?0:volume; if (waveOut == null) { break; // Kad apstādina atskaņošanu, tad novērš kļūdu nākamā rindā. } waveOut.Init(volumeProvider); // Frekvencei jābūt nemainīgai visas plūsmas garumā, bet var tikt nepareizi noteikta pēc pirmā fragmenta. sampleRate = frame.SampleRate; } try { bufferedWaveProvider.AddSamples(buffer, 0, decompressor.DecompressFrame(frame, buffer, 0)); } catch { hasException = true; break; } } ; if (PlaybackState != PlaybackState.Stopped) { stream.Close(); } if (decompressor != null) { decompressor.Dispose(); } if (hasException) { unexpectedStop.BeginInvoke(null, null); } }
private void StreamMP3(object state) { fullyDownloaded = false; string url = (string)state; webRequest = (HttpWebRequest)WebRequest.Create(url); //why HttpWebRequest instead of WebRequest HttpWebResponse response; try { response = (HttpWebResponse)webRequest.GetResponse(); } catch (WebException e) { if (e.Status != WebExceptionStatus.RequestCanceled) { throw; } return; } byte[] buffer = new byte[16384 * 4]; //how to calc this number? IMp3FrameDecompressor decompressor = null; try { using (Stream responseStream = response.GetResponseStream()) { var readFullyStream = new ReadFullyStream(responseStream); do { if (bufferedWaveProvider != null && bufferedWaveProvider.BufferLength - bufferedWaveProvider.BufferedBytes < bufferedWaveProvider.WaveFormat.AverageBytesPerSecond / 4) { //buffer getting full Thread.Sleep(500); } else { Mp3Frame frame; try { frame = Mp3Frame.LoadFromStream(readFullyStream); } catch (EndOfStreamException) { fullyDownloaded = true; //file or stream reach end break; } catch (WebException) { break; } if (decompressor == null) { WaveFormat format = new Mp3WaveFormat(frame.SampleRate, frame.ChannelMode == ChannelMode.Mono ? 1 : 2, frame.FrameLength, frame.BitRate); decompressor = new AcmMp3FrameDecompressor(format); bufferedWaveProvider = new BufferedWaveProvider(decompressor.OutputFormat) { BufferDuration = TimeSpan.FromSeconds(20) }; } int decompressed = decompressor.DecompressFrame(frame, buffer, 0); bufferedWaveProvider.AddSamples(buffer, 0, decompressed); } } while (playbackState != StreamingPlaybackState.Stopped); decompressor.Dispose(); } } finally { if (decompressor != null) { decompressor.Dispose(); } } }
private void DecompressFrames() { IMp3FrameDecompressor decompressor = null; IWavePlayer waveOut = null; try { BufferedWaveProvider bufferedWaveProvider = null; var buffer = new byte[16384 * 4]; // needs to be big enough to hold a decompressed frame var firstLoop = true; do { //WaveBuffer getting full, taking a break if (bufferedWaveProvider != null && bufferedWaveProvider.BufferLength - bufferedWaveProvider.BufferedBytes < bufferedWaveProvider.WaveFormat.AverageBytesPerSecond / 4) { Thread.Sleep(500); } //StreamBuffer empty, taking a break else if (stream.Length < 16384 * 2) { Thread.Sleep(500); } else { Mp3Frame frame; try { frame = Mp3Frame.LoadFromStream(stream); } catch (EndOfStreamException) { break; } if (frame == null) { continue; } if (decompressor == null) { WaveFormat waveFormat = new Mp3WaveFormat(frame.SampleRate, frame.ChannelMode == ChannelMode.Mono ? 1 : 2, frame.FrameLength, frame.BitRate); decompressor = new AcmMp3FrameDecompressor(waveFormat); bufferedWaveProvider = new BufferedWaveProvider(decompressor.OutputFormat) { BufferDuration = TimeSpan.FromSeconds(5) }; // allow us to get well ahead of ourselves } var decompressed = decompressor.DecompressFrame(frame, buffer, 0); if (decompressed > 0) { bufferedWaveProvider.AddSamples(buffer, 0, decompressed); } if (firstLoop) { firstLoop = false; waveOut = CreateWaveOut(); if (onWaveProviderCreated != null) { var provider = onWaveProviderCreated(bufferedWaveProvider); waveOut.Init(provider); } waveOut.Play(); } } } while (IsPlaying); } finally { if (waveOut != null) { waveOut.Stop(); waveOut.Dispose(); } if (decompressor != null) { decompressor.Dispose(); } } }