Пример #1
0
        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;
        }
Пример #2
0
        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);
        }
Пример #3
0
        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);
                }
            });
        }
Пример #4
0
 public void Dispose()
 {
     _cts.Cancel();
     _playThread?.Abort();
     _soundTouch?.Dispose();
     _blockAlignReductionStream?.Dispose();
     _device?.Dispose();
     _device = null;
     _reader?.Dispose();
     _reader = null;
     _cts?.Dispose();
 }
Пример #5
0
        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();
            }
        }
Пример #6
0
        public override void Dispose()
        {
            base.Dispose();

            _cts.Cancel();
            _device?.Dispose();
            _device = null;
            _reader?.Dispose();
            _reader = null;
            _cts?.Dispose();

            PlayerConfig.Current.Volume.PropertyChanged -= Volume_PropertyChanged;
        }
Пример #7
0
        public override void Dispose()
        {
            base.Dispose();

            _cts.Cancel();
            _device?.Dispose();
            _device = null;
            _reader?.Dispose();
            _reader = null;
            _cts?.Dispose();

            AppSettings.Default.Volume.PropertyChanged -= Volume_PropertyChanged;
        }
Пример #8
0
        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());
        }