public override async Task InitializeAsync() { var fi = new FileInfo(_filePath); if (!fi.Exists) { _filePath = Path.Combine(Domain.DefaultPath, "blank.wav"); } _reader = new MyAudioFileReader(_filePath) { Volume = 1f * PlayerConfig.Current.Volume.Music * PlayerConfig.Current.Volume.Main }; _device = new WasapiOut(NAudio.CoreAudioApi.AudioClientShareMode.Shared, Latency); _device.PlaybackStopped += (sender, args) => { PlayerStatus = PlayerStatus.Finished; RaisePlayerFinishedEvent(this, new EventArgs()); }; _device.Init(_reader); PlayerConfig.Current.Volume.PropertyChanged += Volume_PropertyChanged; Task.Factory.StartNew(UpdateProgress, TaskCreationOptions.LongRunning); PlayerStatus = PlayerStatus.Ready; RaisePlayerLoadedEvent(this, new EventArgs()); await Task.CompletedTask; }
public void AnalyzeSong(string fileDirectory) { visualFacade.SetProgress("Loading Song...", 0.0f); SongFile songFile = MyAudioFileReader.ReadAudioFile(fileDirectory); visualFacade.SetSongFile(songFile); List <SongPropertyValues> songPropertyValuesList = new List <SongPropertyValues>(); visualFacade.SetProgress("Analyze...", 0.1f); AudioAnalyzer audioAnalyzer = new AudioAnalyzer(); audioAnalyzer.LoadAudioFromFile(fileDirectory); audioAnalyzer.Analyze(); songPropertyValuesList.Add(GetSingleBeatsSPV(audioAnalyzer.SongElements)); songPropertyValuesList.Add(GetHeldNoteSPV(audioAnalyzer.SongElements)); visualFacade.PlotSongPropertyValues(songPropertyValuesList); visualFacade.SetProgress("done :)", 1); }
public MusicPlayer(string filePath) { FileInfo fi = new FileInfo(filePath); if (!fi.Exists) { //throw new FileNotFoundException("找不到音乐文件…", fi.FullName); filePath = Path.Combine(Domain.DefaultPath, "blank.wav"); } _reader = new MyAudioFileReader(filePath); //if (UseSoundTouch) _device = new WasapiOut(NAudio.CoreAudioApi.AudioClientShareMode.Shared, Latency); //else // _device = new WaveOutEvent { DesiredLatency = App.Config.Play.DesiredLatency }; //_device = new WaveOutEvent { DesiredLatency = 70 }; _device.PlaybackStopped += (sender, args) => { PlayerStatus = PlayerStatus.Finished; }; if (UseSoundTouch) { // init provider _blockAlignReductionStream = new BlockAlignReductionStream(_reader); _waveChannel = new WaveChannel32(_blockAlignReductionStream); _provider = new CusBufferedWaveProvider(_waveChannel.WaveFormat); InitSoundTouch(); _device.Init(_provider); SetPlayMod(App.Config.Play.PlayMod); _playThread = new Thread(ProcessWave) { Name = "PlayThread" }; _playThread.Start(); } else { _device.Init(_reader); } PlayerStatus = PlayerStatus.Ready; Task.Run(() => { while (!_cts.IsCancellationRequested) { if (PlayerStatus != PlayerStatus.NotInitialized && _reader != null) { _reader.Volume = 1f * App.Config.Volume.Music * App.Config.Volume.Main; PlayTime = (int)_reader?.CurrentTime.TotalMilliseconds; if (PlayTime >= (int)_reader?.TotalTime.TotalMilliseconds) { PlayerStatus = PlayerStatus.Finished; } } Thread.Sleep(10); } }); }
public void Dispose() { _cts.Cancel(); _playThread?.Abort(); _soundTouch?.Dispose(); _blockAlignReductionStream?.Dispose(); _device?.Dispose(); _device = null; _reader?.Dispose(); _reader = null; _cts?.Dispose(); }
public CachedSound(string audioFileName) { var newFileName = CachePath; if (!File.Exists(audioFileName)) { foreach (var ext in _supportExtensions) { var autoAudioFile = audioFileName + ext; if (!File.Exists(autoAudioFile)) { continue; } audioFileName = autoAudioFile; break; } } try { int outRate = 44100; int channels = 2; var outFormat = new WaveFormat(outRate, channels); using (var audioFileReader = new MyAudioFileReader(audioFileName)) using (var resampler = new MediaFoundationResampler(audioFileReader, outFormat)) using (var stream = new FileStream(newFileName, FileMode.Create)) { resampler.ResamplerQuality = 60; WaveFileWriter.WriteWavFileToStream(stream, resampler); } } catch (Exception e) { Console.WriteLine(audioFileName); throw; } using (var audioFileReader = new AudioFileReader(newFileName)) { WaveFormat = audioFileReader.WaveFormat; var wholeFile = new List <float>((int)(audioFileReader.Length / 4)); var readBuffer = new float[audioFileReader.WaveFormat.SampleRate * audioFileReader.WaveFormat.Channels]; int samplesRead; while ((samplesRead = audioFileReader.Read(readBuffer, 0, readBuffer.Length)) > 0) { wholeFile.AddRange(readBuffer.Take(samplesRead)); } AudioData = wholeFile.ToArray(); } }
public override void Dispose() { base.Dispose(); _cts.Cancel(); _device?.Dispose(); _device = null; _reader?.Dispose(); _reader = null; _cts?.Dispose(); PlayerConfig.Current.Volume.PropertyChanged -= Volume_PropertyChanged; }
public override void Dispose() { base.Dispose(); _cts.Cancel(); _device?.Dispose(); _device = null; _reader?.Dispose(); _reader = null; _cts?.Dispose(); AppSettings.Default.Volume.PropertyChanged -= Volume_PropertyChanged; }
public override async Task InitializeAsync() { FileInfo fi = new FileInfo(_filePath); if (!fi.Exists) { //throw new FileNotFoundException("找不到音乐文件…", fi.FullName); _filePath = Path.Combine(Domain.DefaultPath, "blank.wav"); } _reader = new MyAudioFileReader(_filePath); //if (UseSoundTouch) _device = new WasapiOut(NAudio.CoreAudioApi.AudioClientShareMode.Shared, Latency); //else // _device = new WaveOutEvent { DesiredLatency = App.Config.Play.DesiredLatency }; //_device = new WaveOutEvent { DesiredLatency = 70 }; _device.PlaybackStopped += (sender, args) => { PlayerStatus = PlayerStatus.Finished; RaisePlayerFinishedEvent(this, new EventArgs()); }; if (UseSoundTouch) { // init provider _blockAlignReductionStream = new BlockAlignReductionStream(_reader); _waveChannel = new WaveChannel32(_blockAlignReductionStream); _provider = new CusBufferedWaveProvider(_waveChannel.WaveFormat); InitSoundTouch(); _device.Init(_provider); SetPlayMod(PlayerConfig.Current.Play.PlayMod); _playThread = new Thread(ProcessWave) { Name = "PlayThread" }; _playThread.Start(); } else { _device.Init(_reader); } PlayerConfig.Current.Volume.PropertyChanged += Volume_PropertyChanged; Task.Factory.StartNew(UpdateProgress, TaskCreationOptions.LongRunning); PlayerStatus = PlayerStatus.Ready; RaisePlayerLoadedEvent(this, new EventArgs()); }