コード例 #1
0
 public IAsyncOperation <InternetRadioNextPresetResult> NextPresetAsync(AllJoynMessageInfo info)
 {
     return(Task.Run(() =>
     {
         TelemetryManager.WriteTelemetryEvent("Action_AllJoyn");
         this.playlistManager.NextTrack();
         return new InternetRadioNextPresetResult();
     }).AsAsyncOperation());
 }
コード例 #2
0
 public IAsyncOperation <InternetRadioGetCurrentlyPlayingResult> GetCurrentlyPlayingAsync(AllJoynMessageInfo info)
 {
     return(Task.Run(() =>
     {
         TelemetryManager.WriteTelemetryEvent("Action_AllJoyn");
         return InternetRadioGetCurrentlyPlayingResult.CreateSuccessResult(
             (null != this.playlistManager.CurrentTrack) ? this.playlistManager.CurrentTrack.Name : string.Empty);
     }).AsAsyncOperation());
 }
コード例 #3
0
 public IAsyncOperation <InternetRadioSetVolumeResult> SetVolumeAsync(AllJoynMessageInfo info, double value)
 {
     return(Task.Run(() =>
     {
         TelemetryManager.WriteTelemetryEvent("Action_AllJoyn");
         this.playbackManager.Volume = value;
         return InternetRadioSetVolumeResult.CreateSuccessResult();
     }).AsAsyncOperation());
 }
コード例 #4
0
        public IAsyncOperation <InternetRadioSetPowerResult> SetPowerAsync(AllJoynMessageInfo info, bool value)
        {
            return(Task.Run(() =>
            {
                TelemetryManager.WriteTelemetryEvent("Action_AllJoyn");
                this.powerManager.PowerState = (false) ?  PowerState.Standby : PowerState.Powered;

                return InternetRadioSetPowerResult.CreateSuccessResult();
            }).AsAsyncOperation());
        }
コード例 #5
0
 public IAsyncOperation <InternetRadioAddPresetResult> AddPresetAsync(AllJoynMessageInfo info, string interfaceMemberPresetName, string interfaceMemberPresetAddress)
 {
     return(Task.Run(() =>
     {
         TelemetryManager.WriteTelemetryEvent("Action_AllJoyn");
         var newPreset = new Track();
         newPreset.Name = interfaceMemberPresetName;
         newPreset.Address = interfaceMemberPresetAddress;
         this.playlistManager.CurrentPlaylist.Tracks.Add(newPreset);
         return InternetRadioAddPresetResult.CreateSuccessResult();
     }).AsAsyncOperation());
 }
コード例 #6
0
        public async Task InitialzeAsync()
        {
            this.mediaEngine = new MediaEngine();
            var result = await this.mediaEngine.InitializeAsync();

            if (result == MediaEngineInitializationResult.Fail)
            {
                TelemetryManager.WriteTelemetryEvent("MediaEngine_FailedToInitialize");
            }

            this.mediaEngine.MediaStateChanged += MediaEngine_MediaStateChanged;
        }
コード例 #7
0
        public IAsyncOperation <InternetRadioRemovePresetResult> RemovePresetAsync(AllJoynMessageInfo info, string interfaceMemberPresetName)
        {
            return(Task.Run(() =>
            {
                TelemetryManager.WriteTelemetryEvent("Action_AllJoyn");
                var trackPresetToDelete = this.playlistManager.CurrentPlaylist.Tracks.FirstOrDefault(t => t.Name == interfaceMemberPresetName);
                if (null != trackPresetToDelete)
                {
                    this.playlistManager.CurrentPlaylist.Tracks.Remove(trackPresetToDelete);
                }

                return InternetRadioRemovePresetResult.CreateSuccessResult();
            }).AsAsyncOperation());
        }
コード例 #8
0
        public IAsyncOperation <InternetRadioGetPresetsResult> GetPresetsAsync(AllJoynMessageInfo info)
        {
            return(Task.Run(() =>
            {
                TelemetryManager.WriteTelemetryEvent("Action_AllJoyn");
                var presets = new XElement("Presets");

                foreach (var preset in this.playlistManager.CurrentPlaylist.Tracks)
                {
                    presets.Add(preset.Serialize());
                }

                return InternetRadioGetPresetsResult.CreateSuccessResult(presets.ToString());
            }).AsAsyncOperation());
        }
コード例 #9
0
 public IAsyncOperation <InternetRadioPlayPresetResult> PlayPresetAsync(AllJoynMessageInfo info, string interfaceMemberPresetName)
 {
     return(Task.Run(() =>
     {
         TelemetryManager.WriteTelemetryEvent("Action_AllJoyn");
         if (this.playlistManager.PlayTrack(interfaceMemberPresetName))
         {
             return InternetRadioPlayPresetResult.CreateSuccessResult();
         }
         else
         {
             return InternetRadioPlayPresetResult.CreateFailureResult(-1);
         }
     }).AsAsyncOperation());
 }
コード例 #10
0
        private static async Task WriteFileToStreamHelper(StorageFile file, IOutputStream os)
        {
            using (Stream resp = os.AsStreamForWrite())
            {
                bool exists = true;
                try
                {
                    using (Stream fs = await file.OpenStreamForReadAsync())
                    {
                        string header = String.Format("HTTP/1.1 200 OK\r\n" +
                                                      "Content-Length: {0}\r\n" +
                                                      "Connection: close\r\n\r\n",
                                                      fs.Length);
                        byte[] headerArray = Encoding.UTF8.GetBytes(header);
                        await resp.WriteAsync(headerArray, 0, headerArray.Length);

                        await fs.CopyToAsync(resp);
                    }
                }
                catch (FileNotFoundException ex)
                {
                    exists = false;

                    // Log telemetry event about this exception
                    var events = new Dictionary <string, string> {
                        { "WebHelper", ex.Message }
                    };
                    TelemetryManager.WriteTelemetryEvent("FailedToWriteFileToStream", events);
                }

                if (!exists)
                {
                    byte[] headerArray = Encoding.UTF8.GetBytes(
                        "HTTP/1.1 404 Not Found\r\n" +
                        "Content-Length:0\r\n" +
                        "Connection: close\r\n\r\n");
                    await resp.WriteAsync(headerArray, 0, headerArray.Length);
                }

                await resp.FlushAsync();
            }
        }
コード例 #11
0
        private void handleButton(GpioPin sender, GpioPinValueChangedEventArgs args)
        {
            Debug.WriteLine("Value Change on pin:" + sender.PinNumber + " : " + args.Edge);
            TelemetryManager.WriteTelemetryEvent("Action_PhysicalButton");
            if (args.Edge == GpioPinEdge.RisingEdge)
            {
                switch (this.buttonPins[sender.PinNumber])
                {
                case InputAction.NextChannel:
                    this.playlistManager.NextTrack();
                    break;

                case InputAction.PreviousChannel:
                    this.playlistManager.PreviousTrack();
                    break;

                case InputAction.VolumeUp:
                    this.playbackManager.Volume += 0.1;
                    break;

                case InputAction.VolumeDown:
                    this.playbackManager.Volume -= 0.1;
                    break;

                case InputAction.Sleep:
                    if (PowerState.Powered == this.powerManager.PowerState)
                    {
                        this.powerManager.PowerState = PowerState.Standby;
                    }
                    else
                    {
                        this.powerManager.PowerState = PowerState.Powered;
                    }
                    break;
                }
            }
        }
コード例 #12
0
ファイル: WebServer.cs プロジェクト: bethoma/internetradio
        private async Task writeResponseAsync(string request, IOutputStream os, StreamSocketInformation socketInfo)
        {
            try
            {
                request = request.TrimEnd('\0'); //remove possible null from POST request

                string[] requestParts = request.Split('/');

                // Request for the root page, so redirect to home page
                if (request.Equals("/"))
                {
                    await redirectToPage(NavConstants.HOME_PAGE, os);
                }
                // Request for the home page
                else if (request.Contains(NavConstants.HOME_PAGE))
                {
                    // Generate the default config page
                    string html = await GeneratePageHtml(NavConstants.HOME_PAGE);

                    string onState = (this.playbackManager.PlaybackState == PlaybackState.Playing) ? "On" : "Off";

                    html = html.Replace("#onState#", onState);
                    html = html.Replace("#radioVolume#", (this.playbackManager.Volume * 100).ToString());
                    html = html.Replace("#currentTrack#", this.playlistManager.CurrentTrack.Name);

                    await WebHelper.WriteToStream(html, os);
                }
                // Request for the settings page
                else if (request.Contains(NavConstants.SETTINGS_PAGE))
                {
                    if (!string.IsNullOrEmpty(request))
                    {
                        string settingParam = "";
                        IDictionary <string, string> parameters = WebHelper.ParseGetParametersFromUrl(new Uri(string.Format("http://0.0.0.0/{0}", request)));
                        bool   waitForPlaying     = (this.playbackManager.PlaybackState == PlaybackState.Playing);
                        bool   waitForTrackChange = false;
                        string trackName          = this.playlistManager.CurrentTrack.Name;

                        settingParam = "onStateVal";
                        if (parameters.ContainsKey(settingParam) && !string.IsNullOrWhiteSpace(parameters[settingParam]))
                        {
                            switch (parameters[settingParam])
                            {
                            case "On":
                                if (!waitForPlaying)
                                {
                                    this.playbackManager.Play(new Uri(this.playlistManager.CurrentTrack.Address));
                                }
                                waitForPlaying = true;
                                break;

                            case "Off":
                                this.playbackManager.Pause();
                                waitForPlaying = false;
                                break;
                            }
                        }
                        settingParam = "volumeSlide";
                        if (parameters.ContainsKey(settingParam) && !string.IsNullOrWhiteSpace(parameters[settingParam]))
                        {
                            double newVolume = this.playbackManager.Volume;
                            if (double.TryParse(parameters[settingParam], out newVolume))
                            {
                                newVolume = Math.Round(newVolume / 100, 2);
                                if (newVolume >= 0 && newVolume <= 1 && newVolume != this.playbackManager.Volume)
                                {
                                    this.playbackManager.Volume = newVolume;
                                }
                            }
                        }
                        settingParam = "trackAction";
                        if (parameters.ContainsKey(settingParam) && !string.IsNullOrWhiteSpace(parameters[settingParam]))
                        {
                            waitForTrackChange = true;
                            switch (parameters[settingParam])
                            {
                            case "prev":
                                this.playbackManager.Pause();
                                this.playlistManager.PreviousTrack();
                                break;

                            case "next":
                                this.playbackManager.Pause();
                                this.playlistManager.NextTrack();
                                break;

                            case "track":
                                if (parameters.ContainsKey("trackName") && !string.IsNullOrWhiteSpace(parameters["trackName"]))
                                {
                                    if (trackName != parameters["trackName"])
                                    {
                                        this.playbackManager.Pause();
                                        this.playlistManager.PlayTrack(parameters["trackName"]);
                                    }
                                    else
                                    {
                                        waitForTrackChange = false;
                                    }
                                }
                                break;
                            }
                            if (waitForTrackChange)
                            {
                                waitForPlaying = true;
                            }
                        }

                        DateTime timeOut = DateTime.Now.AddSeconds(30);
                        Debug.WriteLine("Waiting on State: playback={0}; trackname={1}", this.playbackManager.PlaybackState, trackName);
                        while (DateTime.Now.CompareTo(timeOut) < 0 && (
                                   (this.playbackManager.PlaybackState == PlaybackState.Playing) != waitForPlaying ||
                                   (this.playlistManager.CurrentTrack.Name != trackName) != waitForTrackChange
                                   ))
                        {
                            ;
                        }

                        if (DateTime.Now.CompareTo(timeOut) >= 0)
                        {
                            Debug.WriteLine("track did not start playing in time limit");
                        }
                    }
                    //handle UI interaction
                    await redirectToPage(NavConstants.HOME_PAGE, os);
                }
                else if (request.Contains(NavConstants.ADDSTATION_PAGE))
                {
                    string html = await GeneratePageHtml(NavConstants.ADDSTATION_PAGE);

                    string trackName = "";
                    string trackUrl  = "";
                    if (!string.IsNullOrEmpty(request))
                    {
                        string settingParam = "trackName";
                        IDictionary <string, string> parameters = WebHelper.ParseGetParametersFromUrl(new Uri(string.Format("http://0.0.0.0/{0}", request)));
                        if (parameters.ContainsKey(settingParam) && !string.IsNullOrWhiteSpace(parameters[settingParam]))
                        {
                            Track trackToUpdate = playlistManager.CurrentPlaylist.Tracks.First(t => t.Name == parameters[settingParam]);
                            if (null != trackToUpdate)
                            {
                                trackName = trackToUpdate.Name;
                                trackUrl  = trackToUpdate.Address;
                            }
                        }
                    }
                    html = html.Replace("var stationName = '';", string.Format("var stationName = '{0}';", trackName));
                    html = html.Replace("var stationUrl = '';", string.Format("var stationUrl = '{0}';", trackUrl));
                    await WebHelper.WriteToStream(html, os);
                }
                else if (request.Contains(NavConstants.ADDSTATIONSET_PAGE))
                {
                    if (!string.IsNullOrEmpty(request))
                    {
                        Track  origTrack   = null;
                        Track  newTrack    = null;
                        string trackAction = "";
                        IDictionary <string, string> parameters = WebHelper.ParseGetParametersFromUrl(new Uri(string.Format("http://0.0.0.0/{0}", request)));
                        if (parameters.ContainsKey("name") && !string.IsNullOrWhiteSpace(parameters["name"]))
                        {
                            if (parameters.ContainsKey("url") && !string.IsNullOrWhiteSpace(parameters["url"]))
                            {
                                newTrack = new Track()
                                {
                                    Name = parameters["name"], Address = parameters["url"]
                                };
                            }
                        }
                        if (parameters.ContainsKey("nameOrig") && !string.IsNullOrWhiteSpace(parameters["nameOrig"]))
                        {
                            origTrack = this.playlistManager.CurrentPlaylist.Tracks.First(t => t.Name == parameters["nameOrig"]);
                        }
                        if (parameters.ContainsKey("trackAction") && !string.IsNullOrWhiteSpace(parameters["trackAction"]))
                        {
                            trackAction = parameters["trackAction"];
                        }

                        if (null != newTrack)
                        {
                            switch (trackAction)
                            {
                            case "Update":
                                if (null != origTrack)
                                {
                                    this.playlistManager.CurrentPlaylist.Tracks.Remove(origTrack);
                                }
                                this.playlistManager.CurrentPlaylist.Tracks.Add(newTrack);
                                break;

                            case "Remove":
                                if (null != origTrack)
                                {
                                    this.playlistManager.CurrentPlaylist.Tracks.Remove(origTrack);
                                }
                                break;

                            case "":
                            case "Add":
                                this.playlistManager.CurrentPlaylist.Tracks.Add(newTrack);
                                break;
                            }
                        }
                    }
                    await redirectToPage(NavConstants.HOME_PAGE, os);
                }
                // Request for a file that is in the Assets\Web folder (e.g. logo, css file)
                else
                {
                    using (Stream resp = os.AsStreamForWrite())
                    {
                        bool exists = true;
                        try
                        {
                            var folder = Windows.ApplicationModel.Package.Current.InstalledLocation;

                            // Map the requested path to Assets\Web folder
                            string filePath = NavConstants.ASSETSWEB + request.Replace('/', '\\');

                            // Open the file and write it to the stream
                            using (Stream fs = await folder.OpenStreamForReadAsync(filePath))
                            {
                                string contentType = "";
                                if (request.Contains("css"))
                                {
                                    contentType = "Content-Type: text/css\r\n";
                                }
                                if (request.Contains("htm"))
                                {
                                    contentType = "Content-Type: text/html\r\n";
                                }
                                string header = String.Format("HTTP/1.1 200 OK\r\n" +
                                                              "Content-Length: {0}\r\n{1}" +
                                                              "Connection: close\r\n\r\n",
                                                              fs.Length,
                                                              contentType);
                                byte[] headerArray = Encoding.UTF8.GetBytes(header);
                                await resp.WriteAsync(headerArray, 0, headerArray.Length);

                                await fs.CopyToAsync(resp);
                            }
                        }
                        catch (FileNotFoundException ex)
                        {
                            exists = false;

                            // Log telemetry event about this exception
                            var events = new Dictionary <string, string> {
                                { "WebServer", ex.Message }
                            };
                            TelemetryManager.WriteTelemetryEvent("FailedToOpenStream", events);
                        }

                        // Send 404 not found if can't find file
                        if (!exists)
                        {
                            byte[] headerArray = Encoding.UTF8.GetBytes(
                                "HTTP/1.1 404 Not Found\r\n" +
                                "Content-Length:0\r\n" +
                                "Connection: close\r\n\r\n");
                            await resp.WriteAsync(headerArray, 0, headerArray.Length);
                        }

                        await resp.FlushAsync();
                    }
                }
            }
            catch (Exception ex)
            {
                Debug.WriteLine("Exception in writeResponseAsync(): " + ex.Message);
                Debug.WriteLine(ex.StackTrace);

                // Log telemetry event about this exception
                var events = new Dictionary <string, string> {
                    { "WebServer", ex.Message }
                };
                TelemetryManager.WriteTelemetryEvent("FailedToWriteResponse", events);

                try
                {
                    // Try to send an error page back if there was a problem servicing the request
                    string html = helper.GenerateErrorPage("There's been an error: " + ex.Message + "<br><br>" + ex.StackTrace);
                    await WebHelper.WriteToStream(html, os);
                }
                catch (Exception e)
                {
                    TelemetryManager.WriteTelemetryException(e);
                }
            }
        }
コード例 #13
0
ファイル: RadioManager.cs プロジェクト: bethoma/internetradio
        public IAsyncAction Initialize(InternetRadioConfig config)
        {
            return(Task.Run(async() =>
            {
                this.config = config;
                this.playbackRetries = 0;

                var telemetryInitializeProperties = new Dictionary <string, string>();
#pragma warning disable CS0618 // No current view for Background task
                this.resourceLoader = new ResourceLoader("Resources");
#pragma warning restore CS0618 // No current view for Background task

                this.radioPowerManager = new RadioPowerManager();
                this.radioPowerManager.PowerStateChanged += RadioPowerManager_PowerStateChanged;

                this.radioPresetManager = new RadioLocalPresetManager();
                this.radioPresetManager.PlaylistChanged += RadioPresetManager_PlaylistChanged;
                this.radioPresetManager.CurrentTrackChanged += RadioPresetManager_CurrentTrackChanged;

                this.radioPlaybackManager = new MediaEnginePlaybackManager();
                this.radioPlaybackManager.VolumeChanged += RadioPlaybackManager_VolumeChanged;
                this.radioPlaybackManager.PlaybackStateChanged += RadioPlaybackManager_PlaybackStateChanged;
                await this.radioPlaybackManager.InitialzeAsync();

                // Initialize the input managers

                // AllJoyn
                this.allJoynInterfaceManager = new AllJoynInterfaceManager(this.radioPlaybackManager, this.radioPresetManager, this.radioPowerManager);
                this.allJoynInterfaceManager.Initialize();

                // GPIO
                this.gpioInterfaceManager = new GpioInterfaceManager(this.radioPlaybackManager, this.radioPresetManager, this.radioPowerManager);
                if (!this.gpioInterfaceManager.Initialize(this.config.Buttons_Debounce, this.config.Buttons_Pins))
                {
                    Debug.WriteLine("RadioManager: Failed to initialize GPIO");
                    telemetryInitializeProperties.Add("GpioAvailable", false.ToString());
                }
                else
                {
                    telemetryInitializeProperties.Add("GpioAvailable", true.ToString());
                }

                // HTTP
                this.httpInterfaceManager = new HttpInterfaceManager(8001, this.radioPlaybackManager, this.radioPresetManager, this.radioPowerManager);
                this.httpInterfaceManager.StartServer();

                // Manage settings
                this.radioPlaybackManager.Volume = this.loadVolume();
                var previousPlaylist = this.loadPlaylistId();
                if (previousPlaylist.HasValue)
                {
                    await this.radioPresetManager.LoadPlayList(previousPlaylist.Value);
                    telemetryInitializeProperties.Add("FirstBoot", false.ToString());
                }
                else
                {
                    telemetryInitializeProperties.Add("FirstBoot", true.ToString());
                    this.radioPlaybackManager.Volume = .25;
                }

                if (this.radioPresetManager.CurrentPlaylist == null)
                {
                    var newPlaylistId = await this.radioPresetManager.StartNewPlaylist("DefaultPlaylist", new List <Track>(), true);
                    this.savePlaylistId(newPlaylistId);
                }

                var displays = await TextDisplayManager.GetDisplays();
                this.display = displays.FirstOrDefault();
                if (null != this.display)
                {
                    telemetryInitializeProperties.Add("DisplayAvailable", true.ToString());
                    telemetryInitializeProperties.Add("DisplayHeight", this.display.Height.ToString());
                    telemetryInitializeProperties.Add("DisplayWidth", this.display.Width.ToString());
                }
                else
                {
                    Debug.WriteLine("RadioManager: No displays available");
                    telemetryInitializeProperties.Add("DisplayAvailable", false.ToString());
                }

                // Wake up the radio
                this.radioPowerManager.PowerState = PowerState.Powered;

                if (this.radioPresetManager.CurrentPlaylist.Tracks.Count <= 0)
                {
                    this.radioPresetManager.CurrentPlaylist.Tracks.Add(this.config.Playlist_BuiltInStation);
                }

                TelemetryManager.WriteTelemetryEvent("App_Initialize", telemetryInitializeProperties);
            }).AsAsyncAction());
        }