public static void StartStream() { _initialized = false; _wo = new WaveOut(); _listenMoeThread = new Thread(() => { using (var mf = new MediaFoundationReader(Url)) { _wo.Init(mf); _initialized = true; while (true) { Thread.Sleep(1000 * 60 * 60 * 24); // 1 day because this loop literally does nothing } } }); _listenMoeThread.Start(); while (!_initialized) { Thread.Sleep(100); } _wo.Volume = Properties.Settings.Default.volume; _wo.Play(); IsPlaying = true; PlayingStateChanged?.Invoke(); SongDataChanged?.Invoke(); }
public static void StartWs() { _ws = new WebSocket(Gateway); _ws.OnMessage += (s, e) => { Debug.WriteLine(e.Data); dynamic data = JObject.Parse(e.Data); var opcode = (int)data.op; switch (opcode) { case 0: // welcome _wsHeartbeatThread = new Thread(() => { while (true) { Thread.Sleep((int)data.d.heartbeat); _ws.Send(@"{""op"":9}"); // heartbeat opcode } }); _wsHeartbeatThread.Start(); break; case 1: // playback information if (data.t == "TRACK_UPDATE" || data.t == "TRACK_UPDATE_REQUEST") { SongInfo = new SongData { Seconds = (int)data.d.song.duration, StartTime = (DateTime)data.d.startTime, Name = (string)data.d.song.title, Author = string.Join(", ", ((JArray)data.d.song.artists).Select(a => a["name"])), AuthorRomaji = string.Join(", ", ((JArray)data.d.song.artists).Select(a => a["nameRomaji"])) }; if (((JArray)data.d.song.albums).Count > 0) { SongInfo.Album = (string)((JArray)data.d.song.albums)[0]["name"]; SongInfo.AlbumRomaji = (string)((JArray)data.d.song.albums)[0]["nameRomaji"]; if ((string)((JArray)data.d.song.albums)[0]["image"] != null) { SongInfo.AlbumArtUrl = "https://cdn.listen.moe/covers/" + (string)((JArray)data.d.song.albums)[0]["image"]; } } SongDataChanged?.Invoke(); } break; // not required but nice case 10: // heartbeat acknowledged serverside Debug.WriteLine("heartbeat acknowledged"); break; default: Debug.WriteLine("unknown opcode " + opcode); break; } }; _ws.Connect(); }