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; }
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); }
//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); }
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(); }
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()); }; }
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; }
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); }