Example #1
0
        private void OpenWaveFileThread()
        {
            CreateOptimizedArray();
            mDrawWave = true;

            WaveFormat fmt = mDrawSource.WaveFormat;

            mRawDrawReader  = new FileStream(mRawFileName, FileMode.Open, FileAccess.Read);
            mDrawSource     = new RawDataReader(mRawDrawReader, fmt).ToSampleSource();
            SamplesPerPixel = (int)(mDrawSource.Length / CWidth);
            mRawPlayReader  = new FileStream(mRawFileName, FileMode.Open, FileAccess.Read);
            mPlaySource     = new RawDataReader(mRawPlayReader, fmt).ToSampleSource();
            PeakMeter peakMeter = new PeakMeter(mPlaySource)
            {
                Interval = 50
            };

            peakMeter.PeakCalculated += PeakMeter_PeakCalculated;
            mWaveSource = peakMeter.ToWaveSource(16);
            mMusicPlayer.Open(mWaveSource, mDevice);

            InvokeOnUiThreadIfRequired(() => {
                progress.Value      = 0;
                cursorTimer.Enabled = true;
                playTimer.Enabled   = true;
                hrScroll.Enabled    = true;
                Refresh();
            });
        }
Example #2
0
        static void Main(string[] args)
        {
            if (args.Length < 0)
            {
                return;
            }

            PeakMeter   peakMeter1 = new PeakMeter();
            Amplifier   amplifier  = new Amplifier(AudioTools.dBFSToLinearf(12f));
            PeakLimiter limiter    = new PeakLimiter(20, 20, AudioTools.dBFSToLinearf(-3.0f));
            PeakMeter   peakMeter2 = new PeakMeter();

            FilterChain filterChain = new FilterChain();

            filterChain.Filters.Add(peakMeter1);
            filterChain.Filters.Add(amplifier);
            filterChain.Filters.Add(limiter);
            filterChain.Filters.Add(peakMeter2);

            WaveFileReader waveFileReader = new WaveFileReader(args[0]);

            waveFileReader.Position = 0;
            byte[]   byteBuffer = new byte[10 * 1024];
            float [] floatBuffer = null;
            int      bytesRead = 0, samplesAvailable = 0;

            filterChain.Init(waveFileReader.WaveFormat.SampleRate, waveFileReader.WaveFormat.Channels);

            int processed = 0;

            while (true)
            {
                bytesRead = waveFileReader.Read(byteBuffer, 0, 10 * 1024);

                if (bytesRead == 0)
                {
                    break;
                }
                AudioBufferConverter.ConvertByteArrayToFloatArray(byteBuffer, bytesRead, waveFileReader.WaveFormat.BitsPerSample, ref floatBuffer, ref samplesAvailable);

                filterChain.ProcessFrames(floatBuffer, samplesAvailable);
                processed += bytesRead;
            }
            System.Console.WriteLine("processed: " + processed);
            System.Console.WriteLine("peak1: " + peakMeter1.GlobalPeakSinceStartdBFS);
            System.Console.WriteLine("peak2: " + peakMeter2.GlobalPeakSinceStartdBFS);

            System.Console.ReadKey();
        }
        private void RenderPeakMeter(Sample Sample)
        {
            Dispatcher.BeginInvoke(() =>
            {
                try
                {
                    int barSpacing        = 25;
                    int barWidth          = (barSpacing - 8);
                    int lineWidth         = (barWidth + 1);
                    int leftOffset        = 60;
                    byte[] frequencyPeaks = PeakMeter.CalculateFrequencies(Sample.Spectrogram, 44100);

                    if (!(_clearEffectIsEnabled))
                    {
                        ClearOutputBitmap();
                    }

                    int baseY   = 255;
                    int offsetX = 0;
                    int offsetY = 0;
                    for (int x = 0; x < frequencyPeaks.Length; x++)
                    {
                        offsetX = (x * barSpacing) + leftOffset;
                        offsetY = (baseY - frequencyPeaks[x]);

                        _lastPeaks[x]    = CalculatePeakDelay(_lastPeaks[x], offsetY, 2, baseY);
                        _maximumPeaks[x] = CalculatePeakDelay(_maximumPeaks[x], offsetY, 1, baseY);

                        _outputWriteableBitmap.FillRectangle(offsetX, _lastPeaks[x], (offsetX + barWidth), baseY, _primaryColour);
                        // Only draw the maximum peak if it is above the empty bar level (cutoff)
                        if (_lastPeaks[x] < baseY)
                        {
                            _outputWriteableBitmap.DrawLine(offsetX, _maximumPeaks[x], (offsetX + lineWidth), _maximumPeaks[x], _secondaryColour);
                        }
                    }

                    if (_clearEffectIsEnabled)
                    {
                        RunClearEffect();
                    }

                    FlushOutputBitmap();
                }
                catch
                { }
            });
        }
Example #4
0
        public void Open(string filename, MMDevice device)
        {
            CleanupPlayback();

            _peakMeter = CodecFactory.Instance.GetCodec(filename)
                         .ToSampleSource()
                         .AppendSource(Equalizer.Create10BandEqualizer, out _equalizer)
                         .ToMono()
                         .AppendSource(src => new PeakMeter(src));
            _pitchShifter = _peakMeter
                            .AppendSource(src => new PitchShifter(src));

            _sampleSource = _pitchShifter
                            .AppendSource(x => new BiQuadFilterSource(x));
            _soundOut = new WasapiOut()
            {
                Latency = 100, Device = device
            };
            _soundOut.Initialize(_sampleSource.ToWaveSource());
            if (PlaybackStopped != null)
            {
                _soundOut.Stopped += PlaybackStopped;
            }
        }
        protected override void GetSampleAsync(MediaStreamType mediaStreamType)
        {
            try
            {
                _logger.LogSampleRequested();

                var resetEvents = new AutoResetEvent[AudioControllers.Count];

                // Dequeue the sample from the media controllers, so that each controller's entire audio stack gets exercised.
                for (int i = 0; i < AudioControllers.Count; i++)
                {
                    var audioControllerEntry = AudioControllers[i];
                    resetEvents[i] = audioControllerEntry.ResetEvent;

                    // Throw the decoding work into a thread pool.
                    ThreadPool.QueueUserWorkItem(obj =>
                    {
                        var entry = (AudioControllerEntry)obj;
                        entry.MediaController.GetNextAudioFrame(ms =>
                        {
                            try
                            {
                                entry.LastMemoryStream = ms;

                                // Check to see if the frame has the expected frequency, and if not, update a counter.
                                if (!UseGeneratedTone)
                                {
                                    return;
                                }
                                if (entry.WriteToBuffer(entry.LastMemoryStream))
                                {
                                    entry.Clear();
                                    byte[] frequencies     = PeakMeter.CalculateFrequencies(entry.SampleBuffer, AudioFormat.Default.SamplesPerSecond);
                                    bool frequencyMismatch = false;
                                    if (frequencies[_frequencyIndex] == 0)
                                    {
                                        frequencyMismatch = true;
                                    }
                                    else
                                    {
                                        if (frequencies.Where((t, j) => j != _frequencyIndex && t > frequencies[_frequencyIndex]).Any())
                                        {
                                            frequencyMismatch = true;
                                        }
                                    }
                                    entry.LogFrequencyCounterMismatch(frequencyMismatch);
                                }
                            }
                            catch (Exception ex)
                            {
                                ClientLogger.Debug(ex.ToString);
                            }
                            finally
                            {
                                entry.ResetEvent.Set();
                            }
                        });
                    }, audioControllerEntry);
                }

                // Wait for all the decoding jobs to finish
                WaitHandle.WaitAll(resetEvents);

                // Submit only the first sample retrieved to be played.
                var rawSample = AudioControllers[0].LastMemoryStream;

                var sample = new MediaStreamSample(
                    _mediaStreamDescription,
                    rawSample,
                    0,
                    rawSample.Length,
                    (DateTime.Now - _startTime).Ticks,
                    _emptySampleDict);
                ReportGetSampleCompleted(sample);
            }
            catch (Exception ex)
            {
                ClientLogger.Debug(ex.ToString());
            }
        }
Example #6
0
        public bool StartCapture(Action <byte[]> data)
        {
            var inputBufferSize     = aac_enc.GetInputBufferSize();
            var outputBufferMaxSize = aac_enc.GetMaxOutputBufferSize();

            if (inputBufferSize <= 0 || outputBufferMaxSize <= 0)
            {
                return(false);
            }

            var inputBuffer  = new byte[inputBufferSize];
            var outputBuffer = new byte[outputBufferMaxSize];
            var outputPtr    = InteropHelper.AllocByteArray(outputBuffer);

            var soundInSource = new SoundInSource(_waveIn);

            var peakMeter = new PeakMeter(soundInSource.ToSampleSource());

            _finalSource = peakMeter.ToWaveSource(BitPerSample);

            soundInSource.DataAvailable += (s, e) =>
            {
                try
                {
                    int read;
                    while ((read = _finalSource.Read(inputBuffer, 0, inputBufferSize)) > 0)
                    {
                        var inputPtr = InteropHelper.AllocByteArray(inputBuffer);
                        var size     = aac_enc.EncodeBuffer(inputPtr, read, outputPtr, outputBufferMaxSize);
                        InteropHelper.FreeObjectArray(inputPtr, typeof(byte), inputBufferSize);

                        if (size > 0)
                        {
                            byte[] result;
                            if (InteropHelper.ParsePtrToByteArray(outputPtr, size, out result))
                            {
                                data.Invoke(result);
                            }
                        }
                    }
                }
                catch (Exception ex)
                {
                }
            };

            peakMeter.PeakCalculated += PeakMeterOnPeakCalculated;

            try
            {
                _waveIn.Start();
            }
            catch (MmException ex)
            {
                peakMeter.PeakCalculated -= PeakMeterOnPeakCalculated;
                return(false);
            }

            _canStop = true;
            return(true);
        }
        private void RenderFFTScan(Sample Sample)
        {
            Dispatcher.BeginInvoke(() =>
            {
                try
                {
                    int height            = (int)_outputWriteableBitmap.PixelHeight;
                    int width             = (int)_outputWriteableBitmap.PixelWidth;
                    byte[] frequencyPeaks = PeakMeter.CalculateFrequencies(Sample.Spectrogram, 44100);

                    if (_fftScanIsCleared)
                    {
                        ClearOutputBitmap();
                        _xRunningScanCounter = _marginLeft;
                        _fftScanIsCleared    = false;
                    }

                    int offsetY            = 0;
                    int baseOffsetY        = 0;
                    int maximumPeak        = 0;
                    int bandTotal          = frequencyPeaks.Length;
                    int drawingColour      = _primaryColour;
                    bool isAlternateColour = false;

                    // Clear previous scan line
                    _outputWriteableBitmap.DrawLine(_xRunningScanCounter, 0, _xRunningScanCounter, height, _clearColour);

                    for (int x = 0; x < bandTotal; x++)
                    {
                        maximumPeak      = (frequencyPeaks[x] >> 1);
                        baseOffsetY      = ((bandTotal - x) * 39);
                        _maximumPeaks[x] = ((_maximumPeaks[x] + maximumPeak) >> 1);
                        offsetY          = (baseOffsetY - _maximumPeaks[x]);

                        if (isAlternateColour)
                        {
                            drawingColour = _alternatePrimaryColour;
                        }
                        else
                        {
                            drawingColour = _primaryColour;
                        }
                        isAlternateColour = !(isAlternateColour);

                        if (offsetY == baseOffsetY)
                        {
                            _outputWriteableBitmap.SetPixel(_xRunningScanCounter, baseOffsetY, drawingColour);
                        }
                        else
                        {
                            _outputWriteableBitmap.DrawLine(_xRunningScanCounter, offsetY, _xRunningScanCounter, baseOffsetY, drawingColour);
                        }
                    }

                    // Current Scanline
                    _outputWriteableBitmap.DrawLine((_xRunningScanCounter + 1), 0, (_xRunningScanCounter + 1), height, _secondaryColour);

                    _xRunningScanCounter++;
                    if (_xRunningScanCounter >= _widthWithoutMarginRight)
                    {
                        _outputWriteableBitmap.DrawLine(_xRunningScanCounter, 0, _xRunningScanCounter, height, _clearColour);
                        _xRunningScanCounter = _marginLeft;
                    }

                    FlushOutputBitmap();
                }
                catch
                {
                }
            });
        }