public DateTime GetNextWakeupTime(DateTime earliestWakeupTime)
        {
            TvBusinessLayer layer              = new TvBusinessLayer();
            Schedule        recSchedule        = null;
            DateTime        scheduleWakeupTime = DateTime.MaxValue;
            DateTime        nextWakeuptime     = DateTime.MaxValue;

            foreach (Schedule schedule in Schedule.ListAll())
            {
                if (schedule.Canceled != Schedule.MinSchedule)
                {
                    continue;
                }
                List <Schedule> schedules = layer.GetRecordingTimes(schedule);
                if (schedules.Count > 0)
                {
                    int i = 0;
                    // Take first occurrence of this schedule if not a canceled serie
                    while (i < schedules.Count)
                    {
                        recSchedule = schedules[i];
                        if (!recSchedule.IsSerieIsCanceled(recSchedule.StartTime))
                        {
                            break;
                        }
                        i++;
                    }
                    if (recSchedule != null)
                    {
                        scheduleWakeupTime = recSchedule.StartTime.AddMinutes(-recSchedule.PreRecordInterval);
                    }
                }
                if (recSchedule == null)
                {
                    // manually determine schedule's wakeup time of no guide data is present
                    scheduleWakeupTime = GetWakeupTime(schedule);
                }
                if (scheduleWakeupTime < nextWakeuptime && scheduleWakeupTime >= earliestWakeupTime)
                {
                    nextWakeuptime = scheduleWakeupTime;
                }
            }
            return(nextWakeuptime);
        }