public void PlayModule(bool loopIndefinitely = false) { _mainPlayer.Pause(SongPlayer); _mainPlayer.Unload(SongPlayer); _mainPlayer.Load(SongPlayer, SilenceHelper.GetSilenceAudioFile()); var songLength = _loopLength * Module.Sequence.Count; _mainPlayer.AddSection(SongPlayer, SongPlayer, 0, songLength, bpm: _targetBpm); var section = _mainPlayer.GetAudioSection(SongPlayer, SongPlayer); section.LoopIndefinitely = loopIndefinitely; var patternOffset = 0D; foreach (var sequence in Module.Sequence) { var pattern = Module.Patterns.FirstOrDefault(x => x.Key == sequence); if (pattern == null) { continue; } for (var channelIndex = 0; channelIndex < Module.Channels.Count; channelIndex++) { var channelSequence = pattern.Sequence[channelIndex]; var positions = GetPositions(channelSequence); var player = _channelPlayers[channelIndex]; if (!positions.Any() || positions[0].Item2 != 0D) { _mainPlayer.AddEvent(SongPlayer, patternOffset, "", "", EventType.PauseAll, player); } foreach (var position in positions) { var currentPosition = position.Item2 + patternOffset; _mainPlayer.AddEvent(SongPlayer, currentPosition, position.Item1, position.Item1, EventType.PlaySolo, player); } } patternOffset += _loopLength; } if (!loopIndefinitely) { for (var channelIndex = 0; channelIndex < Module.Channels.Count; channelIndex++) { var player = _channelPlayers[channelIndex]; _mainPlayer.AddEvent(SongPlayer, patternOffset, "", "", EventType.PauseAll, player); } } _mainPlayer.QueueSection(SongPlayer, SongPlayer); _mainPlayer.Play(SongPlayer); }
public ProcessorWaveProvider(string sourceName, IWaveProvider sourceWaveProvider, string waveFilePath, WaveFormat outFormat, Common.ProcessRadioSignalingItemDelegate sigDelegate, Action<bool> hasPropertyChanged, bool recordEnabled, Common.SignalRecordingType recordType, int recordKickTime, Common.NoiseFloor noiseFloor, int customNoiseFloor,bool removeNoise, bool decodeMDC1200, bool decodeGEStar, bool decodeFleetSync, bool decodeP25) : base(sourceWaveProvider, waveFilePath) { LastValidStreamTitle = string.Empty; _sourceName = sourceName; _sourceFormat = sourceWaveProvider.WaveFormat; _outFormat = outFormat; _hasPropertyChanged = hasPropertyChanged; _silenceHelper = new SilenceHelper(outFormat.AverageBytesPerSecond / (outFormat.BitsPerSample / 8), noiseFloor, removeNoise, customNoiseFloor); if (outFormat.Equals(sourceWaveProvider.WaveFormat)) { _resampleStream = null; _useResampler = false; } else { if (Common.AppSettings.Instance.DiagnosticMode) { Common.ConsoleHelper.ColorWriteLine(ConsoleColor.Magenta, "{0}: Source Format <> Out Format [{1}] <> [{2}]", sourceName, sourceWaveProvider.WaveFormat, outFormat); } _resampleStream = new NAudio.Wave.Compression.AcmStream(sourceWaveProvider.WaveFormat, outFormat); _useResampler = true; } if (decodeMDC1200) { _mdc = new Decoders.MDC1200(outFormat.SampleRate, ProcessMDC1200, sourceName); } else { _mdc = null; } if (decodeGEStar) { _star = new Decoders.STAR(outFormat.SampleRate, ProcessSTAR, Decoders.STAR.star_format.star_format_1_16383, sourceName); } else { _star = null; } _rootDecoder = new Decoders.RootDecoder(outFormat.SampleRate, decodeFleetSync, decodeP25, ProcessRootDecoder); _recorder = new AudioRecorder(sourceName, recordType, recordKickTime, outFormat, AudioProcessingGlobals.DefaultSaveFileWaveFormat, recordEnabled); _bytesPerSample = outFormat.BitsPerSample / 8; _encoding = outFormat.Encoding; _sigDelegate = sigDelegate; }
public ProcessorWaveProvider(string sourceName, IWaveProvider sourceWaveProvider, string waveFilePath, WaveFormat outFormat, Common.ProcessRadioSignalingItemDelegate sigDelegate, Action <bool> hasPropertyChanged, bool recordEnabled, Common.SignalRecordingType recordType, int recordKickTime, Common.NoiseFloor noiseFloor, int customNoiseFloor, bool removeNoise, bool decodeMDC1200, bool decodeGEStar, bool decodeFleetSync, bool decodeP25) : base(sourceWaveProvider, waveFilePath) { LastValidStreamTitle = string.Empty; _sourceName = sourceName; _sourceFormat = sourceWaveProvider.WaveFormat; _outFormat = outFormat; _hasPropertyChanged = hasPropertyChanged; _silenceHelper = new SilenceHelper(outFormat.AverageBytesPerSecond / (outFormat.BitsPerSample / 8), noiseFloor, removeNoise, customNoiseFloor); if (outFormat.Equals(sourceWaveProvider.WaveFormat)) { _resampleStream = null; _useResampler = false; } else { if (Common.AppSettings.Instance.DiagnosticMode) { Common.ConsoleHelper.ColorWriteLine(ConsoleColor.Magenta, "{0}: Source Format <> Out Format [{1}] <> [{2}]", sourceName, sourceWaveProvider.WaveFormat, outFormat); } _resampleStream = new NAudio.Wave.Compression.AcmStream(sourceWaveProvider.WaveFormat, outFormat); _useResampler = true; } if (decodeMDC1200) { _mdc = new Decoders.MDC1200(outFormat.SampleRate, ProcessMDC1200, sourceName); } else { _mdc = null; } if (decodeGEStar) { _star = new Decoders.STAR(outFormat.SampleRate, ProcessSTAR, Decoders.STAR.star_format.star_format_1_16383, sourceName); } else { _star = null; } _rootDecoder = new Decoders.RootDecoder(outFormat.SampleRate, decodeFleetSync, decodeP25, ProcessRootDecoder); _recorder = new AudioRecorder(sourceName, recordType, recordKickTime, outFormat, AudioProcessingGlobals.DefaultSaveFileWaveFormat, recordEnabled); _bytesPerSample = outFormat.BitsPerSample / 8; _encoding = outFormat.Encoding; _sigDelegate = sigDelegate; }
public void PlayPatternChannel(string patternKey, string channelKey) { var pattern = Module.Patterns.FirstOrDefault(x => x.Key == patternKey); if (pattern == null) { return; } var channel = Module.Channels.FirstOrDefault(x => x.Key == channelKey); if (channel == null) { return; } var channelIndex = Module.Channels.IndexOf(channel); var channelSequence = pattern.Sequence[channelIndex]; var positions = GetPositions(channelSequence); var player = _channelPlayers[channelIndex]; Pause(); _mainPlayer.Unload(PatternPlayer); _mainPlayer.Load(PatternPlayer, SilenceHelper.GetSilenceAudioFile()); _mainPlayer.AddSection(PatternPlayer, PatternPlayer, 0, _loopLength, bpm: _targetBpm); var section = _mainPlayer.GetAudioSection(PatternPlayer, PatternPlayer); section.LoopIndefinitely = true; foreach (var position in positions) { var currentPosition = position.Item2; _mainPlayer.AddEvent(PatternPlayer, currentPosition, position.Item1, position.Item1, EventType.PlaySolo, player); } _mainPlayer.QueueSection(PatternPlayer, PatternPlayer); _mainPlayer.Play(PatternPlayer); }