private void Parse() { // Rvs added shuffle : 2014-10-06 try { using (var stream = new FileStream(Settings.FileSystem.RootDir + Settings.FileSystem.SystemDir + Settings.FileSystem.KnobScheduleFile, FileMode.OpenOrCreate)) { var length = (int) stream.Length; var buffer = new byte[length]; stream.Read(buffer, 0, length); stream.Close(); int bytesUsed; int charsUsed; bool completed; var chars = new char[length]; Encoding.UTF8.GetDecoder().Convert(buffer, 0, length, chars, 0, length, true, out bytesUsed, out charsUsed, out completed); if (length == 0) return; foreach (string item in new string(chars).Split('\r', '\n')) { if (item == "") continue; string[] values = item.Split(','); if (values.Length != 3) throw new Exception("Invalid knobset file"); var song = new AudioCore.MediaEntry { Name = values[0], Type = (AudioCore.MediaEntry.PlayType) int.Parse(values[1]), Shuffle = values[2] == "1", TaskSource = AudioCore.MediaEntry.Source.Knob, EndTime = TimeSpan.MinValue }; KnobEntries.Add(song); } } } catch (Exception ex) { Log.WriteException(ex); } }
// ==================================================================== // -------------------------------------------------------------------- /// <summary> /// Knob functions /// </summary> private void KnobSetRecord() { bool loadReload = true; var knobPositions = new string[1]; while (true) { if (loadReload) { knobPositions = new string[_knobSet.KnobEntries.Count + 1]; int count = _knobSet.KnobEntries.Count; int i; for (i = 0; i < count; i++) { knobPositions[i] = i + ":" + ((AudioCore.MediaEntry) _knobSet.KnobEntries[i]).Name; } knobPositions[i] = i + "-No Sound"; } int selectKnobPosition = VMenuSelectHScroll("Select Knob Pos.", knobPositions); if (selectKnobPosition == -1) return; string[] option = { "Assign ", "Record ", "Cancel" }; string file; switch (HmenuSelectOption("Editing:" + selectKnobPosition, option)) { case 0: // assign file = SelectFile(); if (selectKnobPosition == _knobSet.KnobEntries.Count) { // insert new entry var entry = new AudioCore.MediaEntry {Name = file, TaskSource = AudioCore.MediaEntry.Source.Knob, Type = AudioCore.MediaEntry.PlayType.Once}; _knobSet.AddItem(entry, SchedulingCore.InsertMode.After, _knobSet.KnobEntries.Count - 1); } else { // update existing one ((AudioCore.MediaEntry) _knobSet.KnobEntries[selectKnobPosition]).Name = file; } _knobSet.SaveSchedule(); loadReload = true; break; case 1: // Record file = RecordFile(); if (selectKnobPosition == _knobSet.KnobEntries.Count) { // insert new entry var entry = new AudioCore.MediaEntry {Name = file, TaskSource = AudioCore.MediaEntry.Source.Knob, Type = AudioCore.MediaEntry.PlayType.Once}; _knobSet.AddItem(entry, SchedulingCore.InsertMode.After, _knobSet.KnobEntries.Count - 1); } else { // update existing one ((AudioCore.MediaEntry) _knobSet.KnobEntries[selectKnobPosition]).Name = file; } _knobSet.SaveSchedule(); loadReload = true; break; default: return; //loadReload = false; } } }
private bool AddScheduleNew() { string file = SelectFile(); if (file == "") return false; var newEntry = new AudioCore.MediaEntry {Name = file}; _scheduler.AddItem(newEntry, SchedulingCore.InsertMode.After, _scheduler.MediaEntries.Count); while (EditSchedule(_scheduler.MediaEntries.Count - 1)) { } return true; }
private void LoadScheduleFile() { lock (_lockObject) { MediaEntries.Clear(); try { using (var stream = new FileStream(Settings.FileSystem.RootDir + Settings.FileSystem.SystemDir + Settings.FileSystem.ScheduleFile, FileMode.OpenOrCreate)) { var length = (int)stream.Length; var buffer = new byte[length]; stream.Read(buffer, 0, length); stream.Close(); stream.Dispose(); int bytesUsed; int charsUsed; bool completed; var chars = new char[length]; Encoding.UTF8.GetDecoder().Convert(buffer, 0, length, chars, 0, length, true, out bytesUsed, out charsUsed, out completed); if (length == 0) return; foreach (string item in new string(chars).Split('\r', '\n')) { if (item == "") continue; string[] values = item.Split(','); if (values.Length != 9) throw new Exception("Invalid schedule file"); // 2014-05-31 : RvS modified code to calculate proper start time of first play. int every = Int32.Parse(values[7]); DateTime n2; var startTime = new DateTime(DateTime.Now.Year, DateTime.Now.Month, DateTime.Now.Day) + new TimeSpan(Int64.Parse(values[1])); // B73 Added Date DateTime now = DateTime.Now; if (every != 0) { while (true) { if (startTime > now) { n2 = new DateTime(startTime.Year, startTime.Month, startTime.Day, startTime.TimeOfDay.Hours, startTime.TimeOfDay.Minutes, startTime.TimeOfDay.Seconds); break; } startTime += new TimeSpan(0, every, 0); } } else { n2 = new DateTime(startTime.Year, startTime.Month, startTime.Day, startTime.TimeOfDay.Hours, startTime.TimeOfDay.Minutes, startTime.TimeOfDay.Seconds); if (n2 < now) n2 += new TimeSpan(1, 0, 0, 0); // = startTime > DateTime.Now ? startTime : startTime.AddDays(1); } var song = new AudioCore.MediaEntry { Name = values[0], StartTime = new TimeSpan(Int64.Parse(values[1])), EndTime = new TimeSpan(Int64.Parse(values[2])), PlayDay = (DayOfWeek)Int32.Parse(values[3]), PlayDate = new DateTime(Int64.Parse(values[4])), Type = (AudioCore.MediaEntry.PlayType)Int32.Parse(values[5]), RepeatCount = Int32.Parse(values[6]), Every = Int32.Parse(values[7]), TaskSource = AudioCore.MediaEntry.Source.Schedule, NextEligibility = n2, Shuffle = values[8] == "1" }; Log.WriteString(LogMessageType.Debug, "Schedule song:" + song.Name + " First start is at: " + song.NextEligibility + "." + song.NextEligibility.Millisecond + " until:" + song.EndTime + " PlayType:" + PlayTypeStrings[(int)song.Type] + " PlayDay:" + song.PlayDay + " RepeatCount:" + song.RepeatCount + " Every:" + song.Every); MediaEntries.Add(song); } } } catch (Exception exception) { Log.WriteException(exception, "related file: " + Settings.FileSystem.RootDir + Settings.FileSystem.SystemDir + Settings.FileSystem.ScheduleFile); } } }
private void SetValet(HttpListenerResponse response, string requestBody) { Hashtable body = ParseBody(requestBody); var item = new AudioCore.MediaEntry(); foreach (DictionaryEntry entry in body) { string value = entry.Value.ToString(); switch (entry.Key.ToString()) { case "shuffleOption": item.Shuffle = value == "1"; break; case "control_type": if (value.ToLower() == "loop") item.Type = AudioCore.MediaEntry.PlayType.Loop; else if (value.ToLower() == "once") item.Type = AudioCore.MediaEntry.PlayType.Once; break; case "control_file_select": item.Name = TextTools.UrlDecode(TextTools.StringReplace("+", " ", value)); break; case "control_submit": if (value == "Stop") { _audio.Stop(); response.StatusCode = 302; response.RedirectLocation = "valet.html"; response.ContentLength64 = 0; return; } break; } } if (item.Name != "Select an audio file or playlist") // 2014-06-04 Added { item.TaskSource = AudioCore.MediaEntry.Source.Cgi; item.EndTime = TimeSpan.MinValue; if (item.Type == AudioCore.MediaEntry.PlayType.Once) { item.RepeatCount = 0; _audio.Play(item); } else if (item.Type == AudioCore.MediaEntry.PlayType.Loop) { item.RepeatCount = int.MaxValue; _audio.Play(item); } } response.StatusCode = 302; response.RedirectLocation = "valet.html"; response.ContentLength64 = 0; }
private void SetSchedule(HttpListenerResponse response, string requestBody) { Hashtable body = ParseBody(requestBody); var item = new AudioCore.MediaEntry(); var insertMode = SchedulingCore.InsertMode.After; int insertIndex = -1; int month = 0, day = 0, year = 0, dayOfWeek = 0; int startHour = 0, startMinute = 0, startSecond = 0; int endHour = 0, endMinute = 0, endSecond = 0; int interval = 0, repeatCount = 0; foreach (DictionaryEntry entry in body) { string value = entry.Value.ToString(); switch (entry.Key.ToString()) { case "insert_month_select": month = TextTools.StringToInt(value); break; case "insert_mode": insertMode = (SchedulingCore.InsertMode) TextTools.StringToInt(value); break; case "insert_task_select": insertIndex = TextTools.StringToInt(value) - 1; break; case "insert_file_select": item.Name = TextTools.UrlDecode(TextTools.StringReplace("+", " ", value)); break; case "insert_date_select": day = TextTools.StringToInt(value); break; case "insert_year_select": year = 2000 + TextTools.StringToInt(value); break; case "insert_day_select": dayOfWeek = TextTools.StringToInt(value); break; case "insert_hour_at": startHour = TextTools.StringToInt(value); break; case "insert_hour_until": if (value != "--") endHour = TextTools.StringToInt(value); break; case "insert_minute_at": startMinute = TextTools.StringToInt(value); break; case "insert_minute_until": if (value != "--") endMinute = TextTools.StringToInt(value); break; case "insert_second_at": startSecond = TextTools.StringToInt(value); break; case "insert_second_until": if (value != "--") endSecond = TextTools.StringToInt(value); break; case "insert_every": if (value != null && value != "") interval = TextTools.StringToInt(value); break; case "insert_loops": repeatCount = TextTools.StringToInt(value); break; case "shuffleOption": item.Shuffle = value == "on"; break; } } if (month > 0 && day > 0 && year >= 2013) { item.PlayDate = new DateTime(year, month, day); item.Type = AudioCore.MediaEntry.PlayType.SpecificDate; } else if (dayOfWeek > 0 && dayOfWeek < 8) { item.PlayDay = (DayOfWeek) (dayOfWeek%7); item.Type = AudioCore.MediaEntry.PlayType.DayOfWeek; } else if (dayOfWeek >= 8) { if (dayOfWeek == 8) item.Type = AudioCore.MediaEntry.PlayType.Daily; if (dayOfWeek == 9) item.Type = AudioCore.MediaEntry.PlayType.Weekdays; if (dayOfWeek == 10) item.Type = AudioCore.MediaEntry.PlayType.Weekends; } else if (interval > 0) { item.Type = AudioCore.MediaEntry.PlayType.Interval; } else { response.StatusCode = 302; response.RedirectLocation = "schedule.html"; response.ContentLength64 = 0; return; } item.StartTime = new TimeSpan(startHour, startMinute, startSecond); if (endHour > 0 || endMinute > 0 || endSecond > 0) item.EndTime = new TimeSpan(endHour, endMinute, endSecond); else item.EndTime = TimeSpan.MaxValue; item.RepeatCount = repeatCount; // why - 1?? 2013-09-21 RvS // B73 edit. removed -1 subtrack item.Every = interval; if (item.RepeatCount < 0) item.RepeatCount = 0; if (item.Name != "Select a file") _scheduler.AddItem(item, insertMode, insertIndex); response.StatusCode = 302; response.RedirectLocation = "schedule.html"; response.ContentLength64 = 0; }
private void SetKnob(HttpListenerResponse response, string requestBody) { Hashtable body = ParseBody(requestBody); var item = new AudioCore.MediaEntry(); var insertMode = SchedulingCore.InsertMode.After; int insertAtIndex = -1; foreach (DictionaryEntry entry in body) { string value = entry.Value.ToString(); switch (entry.Key.ToString()) { case "insert_type": if (value.ToLower() == "loop") item.Type = AudioCore.MediaEntry.PlayType.Loop; else if (value.ToLower() == "push") item.Type = AudioCore.MediaEntry.PlayType.Push; else if (value.ToLower() == "once") item.Type = AudioCore.MediaEntry.PlayType.Once; break; case "shuffleOption": item.Shuffle = value == "on"; break; case "insert_mode": insertMode = (SchedulingCore.InsertMode) TextTools.StringToInt(value); break; case "insert_task_select": insertAtIndex = TextTools.StringToInt(value) - 1; break; case "insert_file_select": item.Name = TextTools.UrlDecode(TextTools.StringReplace("+", " ", value)); break; } } _knob.AddItem(item, insertMode, insertAtIndex); response.StatusCode = 302; response.RedirectLocation = "knob.html"; response.ContentLength64 = 0; }
private void ProcessCgi(HttpListenerResponse response, Hashtable queryString) { // keys // rc : Numerical command issued to unit to begin action // 1 = play knob sound or stop knob sound when Sound=0 // 2 = play file or stop play when name="" // 3 = start recording // name$ : The name of the file without extension // plmod$ : The play mode for the file Options: ONE | LOOP // Sound : Starting and stopping playback 0=stop, 1=start // B524 : Knob lockout 0=lockout, 1=not lockout // KREC : Knob position. Number associated with a free knob position (for recording) // L : Name of page that initiates command to unit // play knob sound : rc=1, sound=knob postion 1 - 99, mode ONE or LOOP // stop knob sound : rc=1, sound=0 // play file : rc=2, name=filename (without extension), mode ONE or LOOP // stop play file : rc=2, name="" // knob lockout on : B524=1, L=target html file // knob lockout off : B527=0, L=target html file // start recording : rc=3, KREC=Free knob position, L=target html file int rc = 0, sound = 0; string name = "", playMode = "one"; foreach (DictionaryEntry dictionaryEntry in queryString) { var k = dictionaryEntry.Key as string; var v = dictionaryEntry.Value as string; if (k != null) k = k.ToLower(); if (v != null) v = v.ToLower(); switch (k) { case "rc": rc = v == null ? -1 : int.Parse(v); break; case "name$": name = v ?? ""; break; case "plmod$": playMode = v ?? ""; break; case "sound": sound = v == null ? -1 : int.Parse(v); break; } } // validate. bool validSyntax = true; switch (rc) { case 1: // knob command if (sound == 0) { _audio.Stop(); } else { if (sound <= _knob.KnobEntries.Count) { var mediaEntry = new AudioCore.MediaEntry { TaskSource = AudioCore.MediaEntry.Source.Cgi, Name = ((AudioCore.MediaEntry) _knob.KnobEntries[sound - 1]).Name }; switch (playMode) { case "loo": case "loop": mediaEntry.Type = AudioCore.MediaEntry.PlayType.Loop; break; case "one": mediaEntry.Type = AudioCore.MediaEntry.PlayType.Once; break; default: validSyntax = false; break; } if (validSyntax) _audio.Play(mediaEntry); } } break; case 2: // play command if (name == "") { _audio.Stop(); } else { foreach (string filename in _fileSystem.MediaFiles) { string[] fileNameParts = filename.ToLower().Split('.'); if (name == fileNameParts[0]) { var mediaEntry = new AudioCore.MediaEntry { Name = filename, TaskSource = AudioCore.MediaEntry.Source.Cgi }; switch (playMode) { case "loo": case "loop": mediaEntry.Type = AudioCore.MediaEntry.PlayType.Loop; break; case "one": mediaEntry.Type = AudioCore.MediaEntry.PlayType.Once; break; default: validSyntax = false; break; } if (validSyntax) _audio.Play(mediaEntry); break; } } } break; case -1: validSyntax = false; break; } response.StatusCode = validSyntax ? 200 : 400; response.ContentLength64 = 0; }