Esempio n. 1
0
        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;
        }