public void DetectOnsets(float sensitivity = 1.5f) { onsetDetection = new OnsetDetection(PCMStream.WaveFormat.SampleRate, 1024); // Has finished reading in the audio file // Set the pcm data back to the beginning SetTrackPosition(0); float[] buf = new float[SAMPLE_SIZE]; var readtotal = 0; do { var read = PCMStream.Read(buf, 0, buf.Length); readtotal += read; if (read == 0) { break; } // Read in audio data and find the flux values until end of audio file onsetDetection.AddFlux(buf); }while (readtotal < PCMStream.Length); Console.WriteLine("Finished adding flux!"); // Find peaks onsetDetection.FindOnsets(sensitivity); }
// Read in a sample and convert it to mono float[] ReadMonoPCM() { int size = SAMPLE_SIZE; // If stereo if (PCMStream.WaveFormat.Channels == 2) { size *= 2; } float[] output = new float[size]; // Read in a sample if (PCMStream.Read(output, 0, size) == 0) { // If end of audio file return(null); } // If stereo, convert to mono if (PCMStream.WaveFormat.Channels == 2) { return(ConvertStereoToMono(output)); } else { return(output); } }
private void SetDisconnected() { State = PlayerState.Disconnected; try { PCMStream.Dispose(); } catch { } // it may already be disposed PCMStream = null; VoiceChannelId = 0; TextChannelId = 0; BackupTime = TimeSpan.Zero; }
static unsafe IAudioStream[] CreateStreams(RSTMHeader *rstm) { switch ((WaveEncoding)rstm->HEADData->Part1->_format._encoding) { case WaveEncoding.ADPCM: return(ADPCMStream.GetStreams(rstm, rstm->DATAData->Data)); case WaveEncoding.PCM16: return(PCMStream.GetStreams(rstm, rstm->DATAData->Data)); } throw new Exception("RSTMLib does not support decoding RSTM files with this encoding."); }
public void DisposeAudioAnalysis() { DisposeOutputDevice(); if (PCMStream != null) { PCMStream.Dispose(); PCMStream = null; OnsetsFound = null; TimePerSample = 0.0f; } }
public IAudioStream[] CreateStreams() { if (Header == null) { return(null); } StrmDataInfo *info = Header->HEADData->Part1; if (Header != null) { switch ((WaveEncoding)info->_format._encoding) { case WaveEncoding.ADPCM: return(ADPCMStream.GetStreams(Header, _audioSource.Address)); case WaveEncoding.PCM16: return(PCMStream.GetStreams(Header, _audioSource.Address)); } } return(new IAudioStream[] { null }); }
public abstract void playStream(PCMStream pcmStream);
public override void playStream(PCMStream pcmStream) { for (int count = 0; count < pcmStream.getData().Length; count++) { } }
public async Task PlayAsync(ICommandContext Context, ITextChannel Channel = null, bool KeepCurrent = false, TimeSpan?SeekTo = null, bool AvoidState = false) { if (Channel == null) { Channel = Context.Channel as ITextChannel; } string lId = Channel.GetSettings().Language; LanguageEntry Language = Global.Languages.GetLanguage(lId); if (!AvoidState) { if (State == PlayerState.Playing || State == PlayerState.Paused) { await Channel.SendMessageAsync(Language.GetEntry("MusicHandler:AlreadyPlaying")); return; } } if (State == PlayerState.Disconnected) { bool Success = await ConnectAsync(Context); if (!Success) { return; } } if (!KeepCurrent || Current == null) { Current = Queue[QueueIndex]; } string Url = Current.UrlOrId; WebSocket ws = null; if (Current.IsYouTube) { YoutubeClient Client = new YoutubeClient(); StreamManifest sm = null; try { sm = await Client.Videos.Streams.GetManifestAsync(VideoId.TryParse(Current.UrlOrId).Value); } catch (Exception e) { File.WriteAllText("tempexceptionfrommusicplayer.json", JsonConvert.SerializeObject(e, Formatting.Indented)); await Global.Client.GetGuild(Global.Settings.DevServer.Id) .GetTextChannel(Global.Settings.DevServer.ErrorReportChannelId).SendFileAsync("tempexceptionfrommusicplayer.json", ""); File.Delete("tempexceptionfrommusicplayer.json"); } if (sm != null) { IEnumerable <IAudioStreamInfo> streamInfos = sm.GetAudioStreams(); if (streamInfos.Count() > 0) { IStreamInfo info = streamInfos.GetWithHighestBitrate(); Url = info.Url; } } if (Url == Current.UrlOrId) { Url = null; } } else { if (Current.IsListenMoe) { Url = Current.PublicUrl; ws = new WebSocket(Current.PublicUrl.Contains("kpop") ? "wss://listen.moe/kpop/gateway_v2" : "wss://listen.moe/gateway_v2"); Timer t = new Timer((state) => { try { ws.Send("{ \"op\": 9 }"); } catch { Logger.Log(LogType.WebSocket, ConsoleColor.Red, "Error", "Couldn't send heartbeat to LISTEN.moe!"); } }, null, -1, -1); ws.OnOpen += (s, e) => { ws.Send("{ \"op\": 0, \"d\": { \"auth\": \"\" } }"); // { op: 0, d: { auth: "" } } }; ws.OnMessage += (s, e) => { ListenMoe parsed = JsonConvert.DeserializeObject <ListenMoe>(e.Data); if (parsed.OpCode == 0) { t.Change(0, parsed.Data.HeartBeat); } else if (parsed.OpCode == 1 && parsed.Type == "TRACK_UPDATE") { ListenMoeStartTime = parsed.Data.StartTime; Current.Author = string.Join(" && ", parsed.Data.Song.Artists.Select(i => i.NameRomaji ?? i.Name)); Current.Duration = TimeSpan.FromSeconds(parsed.Data.Song.Duration); Current.Title = parsed.Data.Song.Title; Current.Thumbnail = null; foreach (ListenMoeAlbum album in parsed.Data.Song.Albums) { if (album.Image != null) { Current.Thumbnail = album.Image; break; } } if (State > PlayerState.Connected && State != PlayerState.Paused) { SendNowPlayingAsync(Context, Channel).GetAwaiter().GetResult(); } } }; ws.OnClose += (s, e) => { t.Change(Timeout.Infinite, Timeout.Infinite); t.Dispose(); }; ws.Connect(); } else if (Global.SoundCloud == null) { if (!IterateIndex(true)) { Current = null; await Channel.SendMessageAsync(Language.GetEntry("MusicHandler:SoundCloudNotAvailable")); } else { await Channel.SendMessageAsync(Language.GetEntry("MusicHandler:OnlySoundCloudTracks")); new Task(async() => await PlayAsync(Context, Channel, AvoidState: true)); } return; } else { Url += "?client_id=" + Global.SoundCloud.ClientId; } } if (Url == null) { if (!IterateIndex()) { Current = null; await Channel.SendMessageAsync(Language.GetEntry("MusicHandler:FinishedPlaying")); State = PlayerState.Connected; } else { new Task(async() => await PlayAsync(Context, Channel, AvoidState: true)).Start(); return; } } try { Reader = new FFmpegReader(Url); /* * switch (encoding.Name) * { * case "webm": * case "3gpp": * Stream s = await new HttpClient().GetStreamAsync(Url); * Reader = new NAudio.Vorbis.VorbisWaveReader(s); * break; * * default: * Reader = new MediaFoundationReader(Url); * break; * } */ } catch (Exception e) { System.Console.WriteLine(e); await Channel.SendMessageAsync(Language.GetEntry("MusicHandler:SongInaccessible", "SONGNAME", Current.Title)); if (!IterateIndex(Global.SoundCloud == null)) { Current = null; await Channel.SendMessageAsync(Language.GetEntry("MusicHandler:FinishedPlaying")); State = PlayerState.Connected; } else { new Task(async() => await PlayAsync(Context, Channel, AvoidState: true)).Start(); } return; } if (PCMStream == null || !PCMStream.CanWrite) { PCMStream = Client.CreatePCMStream(AudioApplication.Music, 128 * 1024, 200, 0); } //WaveFormat OutFormat = new WaveFormat(48000, 16, 2); /* * MediaFoundationResampler Resampler = new MediaFoundationResampler(Reader, OutFormat) * { * ResamplerQuality = 60 * }; */ //if (SeekTo.HasValue && !Current.IsListenMoe) Reader.CurrentTime = SeekTo.Value; if (SeekTo.HasValue && SeekTo != TimeSpan.Zero && !Current.IsListenMoe) { Reader.ReadUntil(SeekTo.Value); } BackupTime = TimeSpan.Zero; //int Size = OutFormat.AverageBytesPerSecond / 50; int Size = Reader.BufferSize(1); byte[] Buffer = new byte[Size]; int Count = 0; State = PlayerState.Playing; TextChannelId = Channel.Id; if (!Current.IsListenMoe) { await SendNowPlayingAsync(Context, Channel); } /*while (Reader.CanRead && (Count = Resampler.Read(Buffer, 0, Size)) > 0 * && Request == PlayerRequest.Idle && State > PlayerState.Connected)*/ while (Reader.CanRead && (Count = Reader.Read(Buffer, 0, Size)) > 0 && Request == PlayerRequest.Idle && State > PlayerState.Connected) { if (State == PlayerState.Paused) { await Channel.SendMessageAsync("", embed : new EmbedBuilder() { Title = Language.GetEntry("MusicHandler:Paused"), Color = Color }.Build()); while (State == PlayerState.Paused && Request == PlayerRequest.Idle) { Thread.Sleep(100); } string cId = Channel.GetSettings().Language; if (cId != lId) { Language = Global.Languages.GetLanguage(cId); } lId = cId; if (State == PlayerState.Playing) { await Channel.SendMessageAsync("", embed : new EmbedBuilder() { Title = Language.GetEntry("MusicHandler:Resumed"), Color = Color }.Build()); if (Current.IsListenMoe) { await SendNowPlayingAsync(Context, Channel); } } } if (Request > 0) { break; } if (CurrentTime.TotalSeconds % 10 == 0 && BackupTime.TotalSeconds != CurrentTime.TotalSeconds) { PropertyChanged?.Invoke(); BackupTime = CurrentTime; } try { if (State < PlayerState.Playing) { break; } ChangeVolume(Buffer, Volume / 100f); await PCMStream.WriteAsync(Buffer, 0, Count); } catch (Exception e) { if (State == PlayerState.Disconnected || Client.ConnectionState == ConnectionState.Disconnected || Client.ConnectionState == ConnectionState.Disconnecting) { break; } string cId = Channel.GetSettings().Language; if (cId != lId) { Language = Global.Languages.GetLanguage(cId); } lId = cId; await Channel.SendMessageAsync(Language.GetEntry("MusicHandler:PlaybackErrorOccured")); Request = PlayerRequest.Stop; Logger.Log(LogType.Music, ConsoleColor.Red, "Error", e.ToString()); if (Global.Settings.DevServer.ErrorReportChannelId != 0) { ITextChannel Report = Global.Client.GetChannel(Global.Settings.DevServer.ErrorReportChannelId) as ITextChannel; await Report.SendMessageAsync($"An error occured while playing on a server!\n```\n{ e }\n```\n" + $"Client:\n { JsonConvert.SerializeObject(this) }"); } break; } } if (ws != null && ws.IsAlive) { ws.Close(); } if (Request == PlayerRequest.Idle && State > PlayerState.Connected) { Request = PlayerRequest.Next; } //Resampler.Dispose(); Reader.Dispose(); Reader = null; //Resampler = null; try { await PCMStream.FlushAsync(); } catch { } // It may be disposed if (Request == PlayerRequest.Next) { Request = PlayerRequest.Idle; if (!IterateIndex(Global.SoundCloud == null)) { if (State != PlayerState.Connected && State != PlayerState.Disconnected) { State = PlayerState.Connected; } Current = null; string cId = Channel.GetSettings().Language; if (cId != lId) { Language = Global.Languages.GetLanguage(cId); } lId = cId; await Channel.SendMessageAsync(Language.GetEntry("MusicHandler:FinishedPlaying")); } } else if (Request == PlayerRequest.Stop) { Request = PlayerRequest.Idle; State = PlayerState.Connected; Current = null; } if (State > PlayerState.Connected) { new Task(async() => await PlayAsync(Context, Channel, AvoidState: true)).Start(); } }