Пример #1
0
        PlayableTrackInfo _backingTrack; // Keep for tracking player.

        #endregion private members

        public VlcJcfPlayer(JcfMedia media, MediaConfiguration[] configs, string[] options)
        {
            _libVLC  = new LibVLC(options);
            _players = new Dictionary <PlayableTrackInfo, MediaPlayer>(media.InstrumentTracks.Count + 1);

            var backingPath   = "file://" + Path.Combine(media.Path, media.BackingTrack.Identifier.ToString().ToUpper() + "_jcfx");
            var backingPlayer = new MediaPlayer(_libVLC);

            backingPlayer.Media = new Media(_libVLC, backingPath, FromType.FromLocation);
            foreach (var config in configs)
            {
                backingPlayer.Media.AddOption(config);
            }
            backingPlayer.PositionChanged += Player_PositionChanged;
            _players[media.BackingTrack]   = backingPlayer;
            _backingTrack = media.BackingTrack;

            foreach (var track in media.InstrumentTracks)
            {
                var path   = "file://" + Path.Combine(media.Path, track.Identifier.ToString().ToUpper() + "_jcfx");
                var player = new MediaPlayer(_libVLC);
                player.Media = new Media(_libVLC, path, FromType.FromLocation);
                foreach (var config in configs)
                {
                    player.Media.AddOption(config);
                }
                _players[track] = player;
            }

            Length = media.Length;
        }
Пример #2
0
        public NAudioJcfPlayer(JcfMedia media)
        {
            _media    = media;
            _waveOut  = new WaveOutEvent();
            _mixer    = new WaveMixerStream32();
            _channels = new Dictionary <TrackInfo, WaveChannel32>(media.InstrumentTracks.Count + 1 + 1);

            var songPath = Path.Combine(Jam.NET.Properties.Settings.Default.TrackPath, $"{media.Song.Id}.jcf");

            foreach (var track in media.InstrumentTracks)
            {
                var stream = File.OpenRead(Path.Combine(songPath, $"{track.Identifier}_jcfx"));
                _channels[track] = new WaveChannel32(new ImaWaveStream(stream));
            }

            var backingStream = File.OpenRead(Path.Combine(Jam.NET.Properties.Settings.Default.TrackPath, $"{media.Song.Id}.jcf"));

            _channels[media.BackingTrack] = new WaveChannel32(new ImaWaveStream(backingStream));

            _channels[media.ClickTrack] = new WaveChannel32(new ClickTrackStream(media.Beats));

            foreach (var channel in _channels.Values)
            {
                _mixer.AddInputStream(channel);
                channel.Volume = 0.75f;//TODO: bind?
            }

            _waveOut.PlaybackStopped += (sender, args) => { Position = TimeSpan.Zero; };
            _waveOut.DesiredLatency   = 60;//TODO: Why?
            _waveOut.NumberOfBuffers  = 2;
            _waveOut.Init(_mixer);
        }
Пример #3
0
        //Jam.NET.Properties.Settings.Default.TrackPath
        public NAudioJcfPlayer(JcfMedia media, IWavePlayer waveOut, string tracksPath, byte[] stick)
        {
            _media    = media;
            _waveOut  = waveOut;
            _mixer    = new WaveMixerStream32();
            _channels = new Dictionary <TrackInfo, WaveChannel32>(media.InstrumentTracks.Count + 1 + 1);

            var songPath = Path.Combine(tracksPath, $"{media.Song.Sku}.jcf");

            foreach (var track in media.InstrumentTracks)
            {
                var stream = File.OpenRead(Path.Combine(songPath, $"{track.Identifier.ToString().ToUpper()}_jcfx"));
                _channels[track] = new WaveChannel32(new ImaWaveStream(stream));
            }

            var backingStream = File.OpenRead(Path.Combine(songPath, $"{media.BackingTrack.Identifier.ToString().ToUpper()}_jcfx"));

            _channels[media.BackingTrack] = new WaveChannel32(new ImaWaveStream(backingStream));
            _channels[media.ClickTrack]   = new WaveChannel32(new ClickTrackStream(media.Beats, stick));

            foreach (var channel in _channels.Values)
            {
                _mixer.AddInputStream(channel);
                channel.Volume = 1.00f;//TODO: bind?
            }

            _waveOut.PlaybackStopped += (sender, args) => { Position = TimeSpan.Zero; };
            //_waveOut.DesiredLatency = 60;//TODO: Why?
            //_waveOut.NumberOfBuffers = 2;
            _waveOut.Init(_mixer);
        }
Пример #4
0
    public AndroidMediaJcfPlayer(JcfMedia media)
    {
      _player = new MediaPlayer();
      var path = System.IO.Path.Combine(media.Path, media.BackingTrack.Identifier.ToString().ToUpper() + "_jcfx");

      _player.SetDataSource(path);
      //_player.Prepare();
    }
Пример #5
0
        public AppleJcfPlayer(JcfMedia media, Func <PlayableTrackInfo, Stream, IAVAudioPlayer> playerFactory)
        {
            this.players = new Dictionary <PlayableTrackInfo, IAVAudioPlayer>(media.InstrumentTracks.Count + 1);
            this.media   = media;

            foreach (var track in media.InstrumentTracks)
            {
                players[track] = playerFactory(track, File.OpenRead(Path.Combine(media.Path, $"{track.Identifier.ToString().ToUpper()}_jcfx")));
                players[track].NumberOfLoops = 0;
            }

            players[media.BackingTrack] = playerFactory(media.BackingTrack, File.OpenRead(Path.Combine(media.Path, $"{media.BackingTrack.Identifier.ToString().ToUpper()}_jcfx")));
            players[media.BackingTrack].NumberOfLoops    = 0;
            players[media.BackingTrack].PositionChanged += (sender, args) =>
            {
                this.PositionChanged?.Invoke(this, new EventArgs());
            };
        }
Пример #6
0
        public AppleJcfPlayer(JcfMedia media)
        {
            this.players = new Dictionary <PlayableTrackInfo, AVAudioPlayer>(media.InstrumentTracks.Count + 1);
            this.media   = media;

            NSError error;

            foreach (var track in media.InstrumentTracks)
            {
                players[track] = AVAudioPlayer.FromData(NSData.FromStream(File.OpenRead(Path.Combine(media.Path, $"{track.Identifier.ToString().ToUpper()}_jcfx"))), out error);
                players[track].FinishedPlaying += delegate { };
                players[track].PrepareToPlay();

                //TODO: Do something useful here or remove (beware nullptr after playback done).

                players[track].NumberOfLoops = 0;
            }

            players[media.BackingTrack] = AVAudioPlayer.FromData(NSData.FromStream(File.OpenRead(Path.Combine(media.Path, $"{media.BackingTrack.Identifier.ToString().ToUpper()}_jcfx"))), out error);
            players[media.BackingTrack].NumberOfLoops = 0;
        }
Пример #7
0
        public static async Task <FFmpegJcfPlayer> CreateAsync(JcfMedia media)
        {
            var instance = new FFmpegJcfPlayer();

            // Capacity => instruments + backing (TODO: + click)
            instance._players = new Dictionary <PlayableTrackInfo, (MediaPlayer Player, FFmpegInterop.FFmpegInteropMSS)>(media.InstrumentTracks.Count + 1);
            instance._mediaTimelineController = new MediaTimelineController();
            instance._mediaTimelineController.PositionChanged += instance.MediaTimelineController_PositionChanged;
            instance._mediaTimelineController.StateChanged    += instance.MediaTimelineController_StateChanged;
            instance._mediaTimelineController.Ended           += instance.MediaTimelineController_Ended;

            var mediaPath = $"ms-appdata:///local/Tracks/{media.Song.Sku}.jcf";

            foreach (var track in media.InstrumentTracks)
            {
                await instance.InitPlayer(track, mediaPath);
            }
            await instance.InitPlayer(media.BackingTrack, mediaPath);

            instance.Length = media.Length;

            return(instance);
        }