Ejemplo n.º 1
0
        private void InitializeCaptureSource()
        {
            if (_captureSource != null)
            {
                return;
            }

            // Setup the capture source (for recording audio)
            _captureSource = new CaptureSource();
            _captureSource.AudioCaptureDevice = CaptureDeviceConfiguration.GetDefaultAudioCaptureDevice();
            if (_captureSource.AudioCaptureDevice != null)
            {
                MediaDeviceConfig.SelectBestAudioFormat(_captureSource.AudioCaptureDevice);
                if (_captureSource.AudioCaptureDevice.DesiredFormat != null)
                {
                    var mediaStats       = new MediaStatistics();
                    var mediaEnvironment = new MediaEnvironment(mediaStats);
                    _captureSource.AudioCaptureDevice.AudioFrameSize = AudioFormat.Default.MillisecondsPerFrame;                     // 20 milliseconds
                    _audioSinkAdapter  = new MultipleControllerAudioSinkAdapter(GetMediaConfig(), _captureSource, 2000);
                    _mediaStreamSource = new MultipleControllerAudioMediaStreamSource(2000);
                    ClientLogger.Debug("CaptureSource initialized.");
                }
                else
                {
                    ClientLogger.Debug("No suitable audio format was found.");
                }
            }
            else
            {
                // Do something more here eventually, once we figure out what the user experience should be.
                ClientLogger.Debug("No audio capture device was found.");
            }
        }
Ejemplo n.º 2
0
 public MediaServerViewModel(MediaConfig mediaConfig, AudioFormat audioFormat, MediaStatistics mediaStatistics, MediaEnvironment mediaEnvironment, IMediaConnection mediaConnection, IVideoQualityController videoQualityController, string roomId)
 {
     MediaController = new MediaController(mediaConfig, audioFormat, mediaStatistics, mediaEnvironment, mediaConnection, videoQualityController);
     RoomId          = roomId;
     MediaServerKpis = new ObservableCollection <MediaServerKpi>();
     MediaController.MediaStats.Counters.CollectionChanged += Counters_CollectionChanged;
 }
Ejemplo n.º 3
0
 public SourceMediaController(MediaConfig mediaConfig, MediaStatistics mediaStatistics, MediaEnvironment mediaEnvironment, IMediaConnection mediaConnection, IVideoQualityController videoQualityController) :
     base(mediaConfig, AudioFormat.Default, mediaStatistics, mediaEnvironment, mediaConnection, videoQualityController)
 {
 }
Ejemplo n.º 4
0
        private void btnStart_Click(object sender, RoutedEventArgs e)
        {
            try
            {
                if (!(CaptureDeviceConfiguration.AllowedDeviceAccess || CaptureDeviceConfiguration.RequestDeviceAccess()))
                {
                    MessageBox.Show("Unable to capture microphone");
                    return;
                }

                _audioSinkAdapter.UseGeneratedTone  = chkUseGeneratedTone.IsChecked ?? true;
                _mediaStreamSource.UseGeneratedTone = chkUseGeneratedTone.IsChecked ?? true;

                // Create the context factory.
                var rootMediaConfig     = GetMediaConfig();
                var connectionSelection = (ComboBoxItem)cboConnection.SelectedItem;
                var connectionType      = (MediaConnectionType)Enum.Parse(typeof(MediaConnectionType), (string)connectionSelection.Content, true);
                var formatSelection     = (ComboBoxItem)cboAudioFormat.SelectedItem;
                var audioFormat         = new AudioFormat(int.Parse((string)formatSelection.Content));
                var enhancerSelection   = (ComboBoxItem)cboEnhancer.SelectedValue;
                var enhancerType        = (SpeechEnhancementStack)Enum.Parse(typeof(SpeechEnhancementStack), (string)enhancerSelection.Content, true);
                var encoderSelection    = (ComboBoxItem)cboEncoder.SelectedValue;
                var encoderType         = (AudioCodecType)Enum.Parse(typeof(AudioCodecType), (string)encoderSelection.Content, true);
                var ctxFactory          = new TestAudioContextFactory(rootMediaConfig, _audioSinkAdapter.RawAudioFormat, audioFormat, enhancerType, encoderType);
                _audioSinkAdapter.RootAudioContext = ctxFactory.GetAudioContext();

                _mediaServerVms.Clear();
                _audioSinkAdapter.AudioControllers.Clear();
                _audioSinkAdapter.AudioContexts.Clear();
                _mediaStreamSource.AudioControllers.Clear();
                var connections = (int)txtConnections.Value;
                var rooms       = (int)txtRooms.Value;
                _audioSinkAdapter.Rooms = rooms;
                _audioSinkAdapter.ConnectionsPerRoom = connections;
                for (int room = 0; room < rooms; room++)
                {
                    string roomId = string.Format("__alantaTestRoom{0}__", room);

                    var mediaStats       = new MediaStatistics();
                    var mediaEnvironment = new MediaEnvironment(mediaStats);

                    // Register each room on the remote server.
                    for (int connection = 0; connection < connections; connection++)
                    {
                        var connectionMediaConfig = GetMediaConfig();
                        IMediaConnection mediaConnection;
                        if (connectionType == MediaConnectionType.MediaServer)
                        {
                            mediaConnection = new RtpMediaConnection(connectionMediaConfig, mediaStats);
                        }
                        else
                        {
                            mediaConnection = new LoopbackMediaConnection(connectionMediaConfig.LocalSsrcId);
                        }
                        var vqc = new VideoQualityController(connectionMediaConfig.LocalSsrcId);
                        var vm  = new MediaServerViewModel(connectionMediaConfig, AudioFormat.Default, mediaStats, mediaEnvironment, mediaConnection, vqc, roomId);
                        _audioSinkAdapter.AudioControllers.Add(vm.MediaController);
                        _audioSinkAdapter.AudioContexts.Add(ctxFactory.GetAudioContext());
                        _mediaStreamSource.AudioControllers.Add(new AudioControllerEntry(vm.MediaController));
                        _mediaServerVms.Add(vm);
                        vm.Connect();
                    }

                    // Make sure each session knows about all the others in the same room.
                    var localVms = _mediaServerVms.Where(x => x.RoomId == roomId).ToList();
                    foreach (var localVm in localVms)
                    {
                        var vm        = localVm;
                        var remoteVms = localVms.Where(x => x.SsrcId != vm.SsrcId).ToList();
                        foreach (var remoteVm in remoteVms)
                        {
                            vm.MediaController.RegisterRemoteSession(remoteVm.SsrcId);
                        }
                    }
                }

                if (mediaElement.CurrentState == MediaElementState.Closed)
                {
                    mediaElement.SetSource(_mediaStreamSource);
                }
                _captureSource.Start();
                mediaElement.Play();
                btnStop.IsEnabled  = true;
                btnStart.IsEnabled = false;
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.ToString());
            }
        }
Ejemplo n.º 5
0
        public SourceRoomController(IViewModelFactory viewModelFactory, IRoomInfo roomInfo, IConfigurationService configurationService, MediaTest roomPage) :
            base(viewModelFactory, roomInfo, configurationService)
        {
            // Set the roomViewModel initial values.
            var rnd          = new Random();
            var sourceSsrcId = (ushort)rnd.Next(ushort.MinValue, ushort.MaxValue);
            var sourceConfig = new MediaConfig
            {
                MediaServerHost          = DataGlobals.MediaServerHost,
                MediaServerControlPort   = Constants.DefaultMediaServerControlPort,
                MediaServerStreamingPort = Constants.DefaultMediaServerStreamingPort,
                LocalSsrcId          = sourceSsrcId,
                CodecFactory         = new CodecFactory(AudioFormat.Default),
                ExpectedAudioLatency = 250
            };
            var sourceMediaStats       = new MediaStatistics();
            var sourceMediaEnvironment = new MediaEnvironment(sourceMediaStats);
            var sourceMediaConnection  = new RtpMediaConnection(sourceConfig, sourceMediaStats);
            var vqc = new VideoQualityController(sourceConfig.LocalSsrcId);

            _sourceMediaController = new SourceMediaController(sourceConfig, sourceMediaStats, sourceMediaEnvironment, sourceMediaConnection, vqc);
            RoomVm.RoomName        = Constants.DefaultRoomName;
            RoomVm.MediaController = _sourceMediaController;
            _sourceMediaController.InputAudioVisualizer = roomPage.audioVisualizer;

            // Setup the local session.
            var room = new Room {
                Name = Constants.DefaultRoomName, Sessions = new ObservableCollection <Session>()
            };
            var user = new RegisteredUser {
                UserId = Guid.NewGuid(), UserTag = "smithkl42", UserName = "******"
            };
            var session = new Session {
                SessionId = Guid.NewGuid(), SsrcId = _sourceMediaController.LocalSsrcId, User = user
            };
            var sessionViewModel = viewModelFactory.GetViewModel <SessionViewModel>(vm => vm.Model.SessionId == session.SessionId);

            sessionViewModel.Model      = session;
            _sessionCollectionViewModel = viewModelFactory.GetViewModel <SessionCollectionViewModel>();
            RoomVm.SessionVm            = sessionViewModel;
            _sessionCollectionViewModel.ViewModels.Add(sessionViewModel);
            RoomVm.SessionId = RoomVm.SessionVm.Model.SessionId;
            var owner = user;

            owner.SharedFiles  = new ObservableCollection <SharedFile>();
            room.SharedFiles   = owner.SharedFiles;
            room.User          = owner;
            RoomVm.UserTag     = owner.UserTag;
            room.UserId        = owner.UserId;
            RoomVm.Model       = room;
            LocalUserVm.Model  = owner;
            LocalUserVm.UserId = owner.UserId;

            // Add the destination sessions.
            var codecFactory = new DestinationCodecFactory();

            for (int i = 0; i < RemoteSessionCount; i++)
            {
                var destinationSsrcId = (ushort)rnd.Next(ushort.MinValue, ushort.MaxValue);
                var config            = new MediaConfig
                {
                    MediaServerHost          = DataGlobals.MediaServerHost,
                    MediaServerControlPort   = Constants.DefaultMediaServerControlPort,
                    MediaServerStreamingPort = Constants.DefaultMediaServerStreamingPort,
                    LocalSsrcId          = destinationSsrcId,
                    CodecFactory         = codecFactory,
                    ExpectedAudioLatency = 250
                };
                var mediaStatistics            = new MediaStatistics();
                var mediaEnvironment           = new MediaEnvironment(mediaStatistics);
                var mediaConnection            = new RtpMediaConnection(config, mediaStatistics);
                var destinationVqc             = new VideoQualityController(config.LocalSsrcId);
                var destinationMediaController = new DestinationMediaController(config, mediaStatistics, mediaEnvironment, mediaConnection, destinationVqc);
                var remoteSession = new Session {
                    SessionId = Guid.NewGuid(), SsrcId = destinationMediaController.LocalSsrcId
                };                                                                                                                               //todo: create sessionViewModel, add it to SessionCollectionViewModel

                _sourceMediaController.RegisterRemoteSession((ushort)(remoteSession.SsrcId));
                remoteSession.User = new RegisteredUser {
                    UserId = Guid.NewGuid(), UserTag = "smithkl42", UserName = "******"
                };
                room.Sessions.Add(remoteSession);
                var destinationRoomPage = new DestinationRoomPage();
                destinationMediaController.OutputAudioVisualizer = destinationRoomPage.audioVisualizer;
                // var newViewModelFactory = new ViewModelFactory(RoomService, MessageService, ViewLocator);
                var destinationController = new DestinationRoomController(destinationMediaController, viewModelFactory, new TestRoomInfo(), configurationService, RoomVm, remoteSession.SessionId);
                destinationMediaController.Connect(RoomVm.Model.RoomId.ToString());

                // Store references to the created objects.
                _destinationMediaControllers[remoteSession.SessionId] = destinationMediaController;
                _destinationRoomPages[remoteSession.SessionId]        = destinationRoomPage;
                _destinationRoomControllers[remoteSession.SessionId]  = destinationController;
            }

            // We have to wait until all the sessions have been created before we can register them with their media controllers and initialize their pages.
            foreach (Guid sessionId in _destinationRoomControllers.Keys)
            {
                var destinationRoomController = _destinationRoomControllers[sessionId];
                var destinationPage           = _destinationRoomPages[sessionId];
                destinationPage.Initialize(destinationRoomController);
            }
        }
Ejemplo n.º 6
0
        // ReSharper restore NotAccessedField.Local

        public DestinationMediaController(MediaConfig mediaConfig, MediaStatistics mediaStatistics, MediaEnvironment mediaEnvironment, IMediaConnection mediaConnection, IVideoQualityController videoQualityController) :
            base(mediaConfig, AudioFormat.Default, mediaStatistics, mediaEnvironment, mediaConnection, videoQualityController)
        {
            _audioTimer = new Timer(audioTimer_Tick, null, 20, 20);
        }
Ejemplo n.º 7
0
 public PlaylistManager()
 {
     _mediaEnvironment = new MediaEnvironment();
     _mediaEnvironment.RegisterDefaultCodecs();
     Initialize();
 }