Exemple #1
0
        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() + ")");
            }
        }