using Microsoft.Xna.Framework.Media; using System; using System.Collections.Generic; using System.IO; using System.Linq; using System.Text; using System.Threading; using System.Threading.Tasks; namespace RhythmBullet.Zer01HD.Audio { internal class MusicList { private volatile bool work; private List list = new List(); public List List { get { if (!thread.IsAlive) { lock (list) { return list; } } else { return null; } } } private string path; private Thread thread; public MusicList() { } public void Start() { if (thread == null || !thread.IsAlive) { work = true; thread = new Thread(Search); thread.Name = "Music Search Thread"; thread.Start(); } } public void Stop() { work = false; } private void Search() { lock (list) { list.AddRange(recursiveMusicSearch(path)); } } private List recursiveMusicSearch(string path) { List musicFiles = new List(); string[] files = Directory.GetFiles(path); for (int i = 0; i < files.Length && work; i++) { if (Directory.Exists(files[i])) { musicFiles.AddRange(recursiveMusicSearch(files[i])); } else { try { SupportedFormats format; Enum.TryParse(Path.GetExtension(files[i]).ToUpper(), out format); musicFiles.Add(files[i]); } catch (ArgumentException e) { Console.WriteLine("MusicList", "Unsupported file format: " + Path.GetFileName(files[i])); Console.WriteLine(e); } } } return musicFiles; } } }