private static byte[] GetWaveDataStream(string mlvFileName) { MLVCachedReader cache = GetReader(mlvFileName); Stream mem = new MemoryStream(); MLVTypes.mlv_wavi_hdr_t header = cache.handler.WaviHeader; WaveFormat fmt = new WaveFormat((int)header.samplingRate, header.bitsPerSample, header.channels); cache.handler.WaveProvider = new BufferedWaveProvider(fmt); cache.handler.WaveProvider.BufferLength = 20 * 1024 * 1024; WaveFileWriter wr = new WaveFileWriter(mem, fmt); lock (cache) { foreach (var frame in cache.reader.AudfXrefList.Keys) { /* seek to the correct block */ cache.reader.CurrentBlockNumber = cache.reader.GetAudioFrameBlockNumber(frame); cache.handler.AudfHeader.blockSize = 0; cache.reader.ReadBlock(); /* now the VIDF should be read correctly */ if (cache.handler.AudfHeader.blockSize == 0) { throw new InvalidDataException("Requested audio frame " + frame + " but the index points us wrong"); } /* save into wave file stream */ byte[] data = new byte[cache.handler.WaveProvider.BufferedBytes]; cache.handler.WaveProvider.Read(data, 0, data.Length); wr.Write(data, 0, data.Length); } } mem.Seek(0, SeekOrigin.Begin); byte[] buffer = new byte[mem.Length]; mem.Read(buffer, 0, buffer.Length); mem.Close(); wr.Close(); return(buffer); }
public void HandleBlock(string type, MLVTypes.mlv_wavi_hdr_t header, byte[] raw_data, int raw_pos, int raw_length) { WaviHeader = header; if (DriverOut != null) { DriverOut.Stop(); } try { DriverOut = new WaveOut(); DriverOut.DesiredLatency = 100; WaveFormat fmt = new WaveFormat((int)header.samplingRate, header.bitsPerSample, header.channels); WaveProvider = new BufferedWaveProvider(fmt); WaveProvider.BufferLength = 256 * 1024; DriverOut.Init(WaveProvider); DriverOut.Play(); } catch (Exception ex) { Console.WriteLine("No audio support on this platform (" + ex.ToString() + ")"); } }