public async Task <IAudioExtended> Build()
        {
            IAudioExtended service;

            if (BuildServer)
            {
                IMqttAudioService server = Service as IMqttAudioService;

                if (server != null && (ServerPort != server.Port || windowHandler != server.WindowHandle))
                {
                    if (server.IsOpen)
                    {
                        await server.CloseAsync();
                    }

                    server = null;
                }

                if (server == null)
                {
                    server = new MqttAudioService(ServerPort, windowHandler);
                }

                if (!server.IsOpen)
                {
                    await server.OpenAsync();
                }

                service = server;
            }
            else if (BuildClient)
            {
                IMqttAudioClient client = Service as IMqttAudioClient;

                if (client != null && (ServerAddress != client.ServerAddress ||
                                       ClientPort != client.Port || windowHandler != client.WindowHandle))
                {
                    client = null;
                }

                if (client == null)
                {
                    client = clientPort.HasValue ? new MqttAudioClient(serverAddress, clientPort.Value, windowHandler)
                        : new MqttAudioClient(serverAddress, windowHandler);
                }

                if (!client.IsOpen)
                {
                    await client.OpenAsync();
                }

                if (isStreaming.HasValue)
                {
                    client.IsStreaming = isStreaming.Value;
                }
                if (clientVolume.HasValue)
                {
                    client.ClientVolume = clientVolume.Value;
                }

                service = client;
            }
            else
            {
                service = Service == null || Service is IMqttAudio ? new AudioService(windowHandler) : Service;

                if (mediaSources == null)
                {
                    mediaSources = new string[] { Environment.GetFolderPath(Environment.SpecialFolder.MyMusic) }
                }
                ;
            }

            bool setMediaSources = mediaSources != null && (!ifNon || !service.MediaSources.ToNotNull().Any());

            if (setMediaSources && !mediaSources.BothNullOrSequenceEqual(service.MediaSources))
            {
                service.MediaSources = mediaSources;
            }
            else if (reload)
            {
                service.Reload();
            }

            if (!reload && Service != null && ContainsSameSongs(Service.AllSongsShuffled, service.AllSongsShuffled))
            {
                service.AllSongsShuffled = Service.AllSongsShuffled;
                service.CurrentSong      = Service.CurrentSong;
            }

            if (IsAllShuffle.HasValue)
            {
                service.IsAllShuffle = IsAllShuffle.Value;
            }
            if (IsSearchShuffle.HasValue)
            {
                service.IsSearchShuffle = IsSearchShuffle.Value;
            }
            if (IsOnlySearch.HasValue)
            {
                service.IsOnlySearch = IsOnlySearch.Value;
            }
            if (SearchKey != null)
            {
                service.SearchKey = SearchKey;
            }
            if (play.HasValue)
            {
                service.PlayState = play.Value ? PlaybackState.Playing : PlaybackState.Paused;
            }
            if (volume.HasValue)
            {
                service.Volume = volume.Value;
            }

            return(service);
        }
 private ServiceBuilder WithService(IMqttAudioService server)
 {
     return(WithServer(server.Port));
 }