Example #1
0
        public void Dispose()
        {
            try
            {
                // Do unregistration, can throw
                if (_events != null)
                {
                    _events.StateChanged        -= OnStateChanged;
                    _events.SimpleVolumeChanged -= OnVolumeChanged;
                    Session.UnregisterAudioSessionNotification(_events);
                }
            }
            catch { }

            // Do disposal chains, each can throw
            try { _session2.Dispose(); }
            catch { }
            try { Session.Dispose(); }
            catch { }

            // Set to null
            _simpleAudio = null;
            _session2    = null;
            Session      = null;
        }
Example #2
0
        /// <summary>
        /// アプリケーションの音量をdouble型で取得
        /// </summary>
        /// <param name="processId">プロセスID</param>
        /// <returns>
        /// 音量(0~1) as double.
        /// -1 means no audio.
        /// </returns>
        public static double GetVolume(int processId)
        {
            double  volume  = -1;
            Process process = Process.GetProcessById(processId);

            // Call from a new thread.
            Task.Run(() => GetAudioSessions((AudioSessionControl session) =>
            {
                try
                {
                    AudioSessionControl2 session2 = session.QueryInterface <AudioSessionControl2>();

                    // // Ideal is branch if the process id is equal. (not working)
                    // if (session2.ProcessID == processId)

                    // モジュールのパスが同じであるか
                    if (process.MainModule != null && session2.Process.MainModule.FileName == process.MainModule.FileName)
                    {
                        SimpleAudioVolume audioVolume = session.QueryInterface <SimpleAudioVolume>();
                        volume = audioVolume.MasterVolume;
                    }
                }
                catch (Exception e)
                {
                    // Usually Win32Exception.
                    Console.WriteLine(e.Message);
                }
            }));

            return(volume);
        }
 public VolumeControl(SimpleAudioVolume simpleVol)
 {
     getVolume = () => simpleVol.MasterVolume;
     setVolume = (volume) => simpleVol.MasterVolume = volume;
     isMuted   = () => simpleVol.Mute;
     setMuted  = (mute) => simpleVol.Mute = mute;
 }
        public void TestforAdvert(Object stateInfo)
        {
            // Stop executing if Spotify was closed
            if (ToBreak())
            {
                return;
            }

            spotifyControl = programGUI.getSpotify().QueryInterface <AudioSessionControl2>();
            if (spotifyControl == null)
            {
                return;
            }

            // Make sure display is null
            programGUI.setDisplayVariable(null);

            // If an advert is playing
            if (spotifyControl.Process.MainWindowTitle.Equals("Advertisement") || spotifyControl.Process.MainWindowTitle.Equals("Spotify"))
            {
                spotifyVolume = spotifyControl.QueryInterface <SimpleAudioVolume>();
                if (!spotifyVolume.IsMuted)
                {
                    spotifyVolume.IsMuted = true;
                }

                if (!programGUI.getSongTitle().Equals(spotifyControl.Process.MainWindowTitle))
                {
                    programGUI.setSongTitle(spotifyControl.Process.MainWindowTitle);
                    programGUI.setDisplayVariable("Advert detected...");
                    programGUI.playAudio();
                }
                programGUI.setToPause(true);
            }
        }
        public async void TestToUnmuteAsync(Object stateInfo)
        {
            // If Spotify was closed, return
            if (ToBreak())
            {
                return;
            }

            spotifyControl = programGUI.getSpotify().QueryInterface <AudioSessionControl2>();
            spotifyVolume  = spotifyControl.QueryInterface <SimpleAudioVolume>();

            if (!spotifyControl.Process.MainWindowTitle.Equals("Advertisement") && !spotifyControl.Process.MainWindowTitle.Equals("Spotify"))
            {
                // If Spotify is muted
                if (spotifyVolume.IsMuted)
                {
                    // Save song name
                    programGUI.setSongTitle(spotifyControl.Process.MainWindowTitle);

                    // Wait for the presumed advert to completely stop playing
                    await programGUI.pauseAsync();

                    // Unmute the audio session
                    spotifyVolume.IsMuted = false;

                    // Display advert prevented & the song now playing
                    programGUI.setDisplayVariable("Advert prevented..." + System.Environment.NewLine + "Now playing... - " + programGUI.getSongTitle() + System.Environment.NewLine + "One song since an advert...");
                    programGUI.setSongsAfterAdvertChange(1);
                }
            }
        }
 private SimpleAudioVolume GetVolumeObject()
 {
     if (simpleAudioVolume == null)
     {
         var      deviceEnumerator = new MMDeviceEnumerator();
         MMDevice devices;
         try
         {
             devices = deviceEnumerator.GetDefaultAudioEndpoint(EDataFlow.eRender, ERole.eMultimedia);
         }
         catch
         {
             return(null);
         }
         for (int i = 0; i < devices.AudioSessionManager.Sessions.Count; i++)
         {
             var session = devices.AudioSessionManager.Sessions[i];
             if (session.ProcessID == ProcessID)
             {
                 simpleAudioVolume = session.SimpleAudioVolume;
                 break;
             }
         }
     }
     return(simpleAudioVolume);
 }
Example #7
0
        public static void Main()
        {
            using (MMDeviceEnumerator enumerator = new MMDeviceEnumerator())
                using (MMDevice device = enumerator.GetDefaultAudioEndpoint(DataFlow.Render, Role.Console))
                    using (AudioEndpointVolume endpointVolume = AudioEndpointVolume.FromDevice(device))
                        using (AudioSessionManager2 sessionManager2 = AudioSessionManager2.FromMMDevice(device))
                            using (AudioSessionEnumerator sessionEnumerator = sessionManager2.GetSessionEnumerator())
                            {
                                Console.WriteLine("Default Render Device: " + device.FriendlyName);
                                Console.WriteLine("Master Volume Scalar: " + endpointVolume.GetMasterVolumeLevelScalar());
                                Console.WriteLine("\nGetting audio sessions...");

                                foreach (AudioSessionControl sessionControl in sessionEnumerator)
                                {
                                    PrintSessionName(sessionControl);
                                    Console.WriteLine("\t- State: " + sessionControl.SessionState.ToString());

                                    using (SimpleAudioVolume sessionSimpleVolume = sessionControl.QueryInterface <SimpleAudioVolume>())
                                    {
                                        Console.WriteLine("\t- Volume: " + sessionSimpleVolume.MasterVolume);
                                        sessionSimpleVolume.MasterVolume = 1.0f;
                                    }

                                    sessionControl.Dispose();
                                }
                            }
            Console.WriteLine("\nVolumes reset!");
            Console.ReadLine();
        }
Example #8
0
        private void InitializeInternal()
        {
            _audioClient  = AudioClient.FromMMDevice(Device);
            _outputFormat = SetupWaveFormat(_source.WaveFormat, _audioClient);

            long latency = _latency * 10000;

            if (!_eventSync)
            {
                _audioClient.Initialize(_shareMode, AudioClientStreamFlags.None, latency, 0, _outputFormat, Guid.Empty);
            }
            else                                                  //event sync
            {
                if (_shareMode == AudioClientShareMode.Exclusive) //exclusive
                {
                    _audioClient.Initialize(_shareMode, AudioClientStreamFlags.StreamFlags_EventCallback, latency, latency, _outputFormat, Guid.Empty);
                }
                else                 //shared
                {
                    _audioClient.Initialize(_shareMode, AudioClientStreamFlags.StreamFlags_EventCallback, 0, 0, _outputFormat, Guid.Empty);
                    _latency = (int)(_audioClient.StreamLatency / 10000);
                }

                _eventWaitHandle = new EventWaitHandle(false, EventResetMode.AutoReset);
                _audioClient.SetEventHandle(_eventWaitHandle.SafeWaitHandle.DangerousGetHandle());
            }

            _renderClient      = AudioRenderClient.FromAudioClient(_audioClient);
            _simpleAudioVolume = SimpleAudioVolume.FromAudioClient(_audioClient);
            _simpleAudioVolume.MasterVolume = 1f;
        }
Example #9
0
        public static void Stop()
        {
            if (State == MediaState.Stopped)
            {
                return;
            }

#if WINDOWS_MEDIA_ENGINE
            _mediaEngineEx.Source = null;
#elif WINDOWS_MEDIA_SESSION
            _session.ClearTopologies();
            _session.Stop();
            _volumeController.Dispose();
            _volumeController = null;
            _clock.Dispose();
            _clock = null;
#else
            // Loop through so that we reset the PlayCount as well
            foreach (var song in Queue.Songs)
            {
                _queue.ActiveSong.Stop();
            }
#endif
            State = MediaState.Stopped;
        }
Example #10
0
        private void PlatformPlay()
        {
            // Cleanup the last song first.
            if (State != MediaState.Stopped)
            {
                _session.Stop();
                _volumeController.Dispose();
                _clock.Dispose();
            }

            // Set the new song.
            _session.SetTopology(0, _currentVideo.Topology);

            _volumeController              = CppObject.FromPointer <SimpleAudioVolume>(GetVolumeObj(_session));
            _volumeController.Mute         = IsMuted;
            _volumeController.MasterVolume = _volume;

            // Get the clock.
            _clock = _session.Clock.QueryInterface <PresentationClock>();

            //create the callback if it hasn't been created yet
            if (_callback == null)
            {
                _callback = new Callback();
                _session.BeginGetEvent(_callback, null);
            }

            // Start playing.
            var varStart = new Variant();

            _session.Start(null, varStart);
        }
Example #11
0
        private static void PlaySong(Song song)
        {
#if WINDOWS_MEDIA_ENGINE
            _mediaEngineEx.Source = song.FilePath;
            _mediaEngineEx.Load();
            _mediaEngineEx.Play();
#elif WINDOWS_MEDIA_SESSION
            // Cleanup the last song first.
            if (State != MediaState.Stopped)
            {
                _session.Stop();
                _volumeController.Dispose();
                _clock.Dispose();
            }

            // Set the new song.
            _session.SetTopology(0, song.GetTopology());

            // Get the volume interface.
            IntPtr volumeObj;


            try
            {
                MediaFactory.GetService(_session, MRPolicyVolumeService, SimpleAudioVolumeGuid, out volumeObj);
            }
            catch (Exception e)
            {
                MediaFactory.GetService(_session, MRPolicyVolumeService, SimpleAudioVolumeGuid, out volumeObj);
            }


            _volumeController              = CppObject.FromPointer <SimpleAudioVolume>(volumeObj);
            _volumeController.Mute         = _isMuted;
            _volumeController.MasterVolume = _volume;

            // Get the clock.
            _clock = _session.Clock.QueryInterface <PresentationClock>();

            // Start playing.
            var varStart = new Variant();
            _session.Start(null, varStart);
#elif WINDOWS_PHONE
            Deployment.Current.Dispatcher.BeginInvoke(() =>
            {
                _mediaElement.Source = new Uri(song.FilePath, UriKind.Relative);
                _mediaElement.Play();

                // Ensure only one subscribe
                _mediaElement.MediaEnded -= OnSongFinishedPlaying;
                _mediaElement.MediaEnded += OnSongFinishedPlaying;
            });
#else
            song.SetEventHandler(OnSongFinishedPlaying);
            song.Volume = _isMuted ? 0.0f : _volume;
            song.Play();
#endif
            State = MediaState.Playing;
        }
 public AudioSessionInformation(AudioSessionControl2 session)
 {
     this.session      = session;
     this.process      = session.ProcessID;
     this.volumeObject = session.QueryInterface <SimpleAudioVolume>();
     this.audioMeter   = session.QueryInterface <AudioMeterInformation>();
     this.processName  = session.Process.ProcessName;
 }
Example #13
0
 private void GetNewSoundOut()
 {
     _soundOut.Stop();
     _soundOut.WaitForStopped();
     GetOutputSound();
     _systemSimpleAudioVolume = GetSimpleAudioVolume();
     _soundOut.Volume         = AlarmVolume;
 }
Example #14
0
 public void CanCreateSimpleAudioVolume()
 {
     using (var audioClient = Utils.CreateDefaultRenderClient())
     {
         audioClient.Initialize(AudioClientShareMode.Shared, AudioClientStreamFlags.None, 1000, 0, audioClient.GetMixFormat(), Guid.Empty);
         SimpleAudioVolume.FromAudioClient(audioClient).Dispose();
     }
 }
Example #15
0
        /// <summary>
        /// Add the programs outputting audio to the simple volume array
        /// </summary>
        private static void GetChannelVolumes()
        {
            //create array of channels
            m_ChannelVolume = new SimpleAudioVolume[9];

            //get processes outputting audio
            AudioSessionManager2 sessionManager = null;
            var thread = new Thread
                         (
                () => { sessionManager = GetDefaultAudioSessionManager2(DataFlow.Render); }
                         );

            thread.Start();
            thread.Join();

            AudioSessionEnumerator sessionEnumerator = sessionManager.GetSessionEnumerator();

            //loop through processes - clamp to number of channels
            //skip the master channel
            m_NumberOfOccupiedChannels = 0;
            for (int i = 1; i < Math.Min(sessionEnumerator.Count, 10); i++)
            {
                //get the process and name
                var    process = sessionEnumerator[i].QueryInterface <AudioSessionControl2>().Process;
                string name    = process == null ? "Unnamed" : process.ProcessName;

                //check if this process is valid for audio monitoring
                bool flag = false;
                for (int x = 0; x < m_ForbiddenProcesses.Length; x++)
                {
                    if (name == m_ForbiddenProcesses[x])
                    {
                        flag = true;
                    }
                }

                if (flag)
                {
                    continue;
                }

                //get process icon
                Icon icon = Icon.ExtractAssociatedIcon(process.MainModule.FileName);

                //set icon
                m_Icons[m_NumberOfOccupiedChannels].Fill = new ImageBrush(icon.ToImageSource());

                //get the simple volume
                SimpleAudioVolume simpleVolume = sessionEnumerator[i].QueryInterface <SimpleAudioVolume>();
                m_ChannelVolume[m_NumberOfOccupiedChannels] = simpleVolume;

                //get the peak meter
                m_PeakMeters[m_NumberOfOccupiedChannels] = sessionEnumerator[i].QueryInterface <AudioMeterInformation>();

                m_NumberOfOccupiedChannels++;
            }
        }
        public void Dispose()
        {
            _events.StateChanged        -= OnStateChanged;
            _events.SimpleVolumeChanged -= OnVolumeChanged;

            Session.UnregisterAudioSessionNotification(_events);
            Session      = null;
            _session2    = null;
            _simpleAudio = null;
        }
Example #17
0
 private static void PlatformStop()
 {
     _session.ClearTopologies();
     _session.Stop();
     _session.Close();
     _volumeController.Dispose();
     _volumeController = null;
     _clock.Dispose();
     _clock = null;
 }
Example #18
0
        private static void AudioVolume(AudioSessionControl session)
        {
            SimpleAudioVolume simpleVolume = session.QueryInterface <SimpleAudioVolume>();

            simpleVolume.MasterVolume = 1.0f;

            bool muted = simpleVolume.IsMuted;

            simpleVolume.IsMuted = !muted;
            simpleVolume.IsMuted = muted;
        }
Example #19
0
        void IVolumeControl.SetMute(bool value)
        {
            _mute = value;
            List <AudioSession> controls = GetSessions();

            foreach (AudioSession session in controls)
            {
                SimpleAudioVolume volume = session.Session.SimpleAudioVolume;
                volume.Mute = value;
            }
        }
Example #20
0
        private static void AudioVolume(AudioSessionControl session, int volume)
        {
            SimpleAudioVolume simpleVolume = session.QueryInterface <SimpleAudioVolume>();

            simpleVolume.MasterVolume = (float)volume / 100;

            bool muted = simpleVolume.IsMuted;

            simpleVolume.IsMuted = !muted;
            simpleVolume.IsMuted = muted;
        }
Example #21
0
 public void Close()
 {
     Stop();
     try {
         _audioVolume?.Dispose();
         _videoControl?.Dispose();
         _mediaSession?.Close();
     } catch (SharpDXException) { }
     _audioVolume  = null;
     _videoControl = null;
 }
Example #22
0
 private void KeepSystemVolume()
 {
     try
     {
         _systemSimpleAudioVolume.MasterVolume = _systemVolume;
         _systemSimpleAudioVolume.IsMuted      = false;
     }
     catch (CoreAudioAPIException exp)
     {
         Trace.TraceError(exp.Message);
         _systemSimpleAudioVolume = GetSimpleAudioVolume();
     }
 }
Example #23
0
 public void CanMuteThroughSimpleAudioVolume()
 {
     using (var audioClient = Utils.CreateDefaultRenderClient())
     {
         audioClient.Initialize(AudioClientShareMode.Shared, AudioClientStreamFlags.None, 1000, 0, audioClient.GetMixFormat(), Guid.Empty);
         using (var volume = SimpleAudioVolume.FromAudioClient(audioClient))
         {
             var muted = volume.IsMuted;
             volume.IsMuted = !muted;
             volume.IsMuted = muted;
         }
     }
 }
Example #24
0
 public void CanSetVolumeThroughSimpleAudioVolume()
 {
     using (var audioClient = Utils.CreateDefaultRenderClient())
     {
         audioClient.Initialize(AudioClientShareMode.Shared, AudioClientStreamFlags.None, 1000, 0, audioClient.GetMixFormat(), Guid.Empty);
         using (var volume = SimpleAudioVolume.FromAudioClient(audioClient))
         {
             for (float v = 0; v < 1.0; v += 0.01f)
             {
                 volume.MasterVolume = v;
             }
         }
     }
 }
Example #25
0
 private void setMute(bool mute, uint windowPid)
 {
     for (int i = 0; i < device.AudioSessionManager2.Sessions.Count; i++)
     {
         AudioSessionControl2 session = device.AudioSessionManager2.Sessions[i];
         uint pid = session.GetProcessID;
         AudioMeterInformation mi  = session.AudioMeterInformation;
         SimpleAudioVolume     vol = session.SimpleAudioVolume;
         if (pid == windowPid)
         {
             vol.Mute = mute;
         }
     }
 }
        public void Dispose()
        {
            _events.StateChanged        -= OnStateChanged;
            _events.SimpleVolumeChanged -= OnVolumeChanged;

            _session?.UnregisterAudioSessionNotification(_events);
            _session?.Dispose();
            _session = null;

            _session2?.Dispose();
            _session2 = null;

            // Disposing of SimpleAudioVolume causes it to freeze.
            _simpleAudio = null;
        }
Example #27
0
        public async Task <bool> SetMuteAsync(bool muted, CancellationToken cancellationToken)
        {
            ThrowIfDisposed();

            if (_isMuted == muted)
            {
                return(_isMuted);
            }

            ComThread.Invoke(() => SimpleAudioVolume.SetMute(muted, Guid.Empty));

            await _muteResetEvent.WaitOneAsync(cancellationToken);

            return(_isMuted);
        }
Example #28
0
        private static void PlatformPlaySong(Song song)
        {
            // Cleanup the last song first.
            if (State != MediaState.Stopped)
            {
                _session.Stop();
                _session.ClearTopologies();
                _session.Close();
                _volumeController.Dispose();
                _clock.Dispose();
            }

            // Set the new song.
            _session.SetTopology(SessionSetTopologyFlags.Immediate, song.Topology);

            // Get the volume interface.
            IntPtr volumeObj;


            try
            {
                MediaFactory.GetService(_session, MRPolicyVolumeService, SimpleAudioVolumeGuid, out volumeObj);
            }
            catch
            {
                MediaFactory.GetService(_session, MRPolicyVolumeService, SimpleAudioVolumeGuid, out volumeObj);
            }


            _volumeController              = CppObject.FromPointer <SimpleAudioVolume>(volumeObj);
            _volumeController.Mute         = _isMuted;
            _volumeController.MasterVolume = _volume;

            // Get the clock.
            _clock = _session.Clock.QueryInterface <PresentationClock>();

            //create the callback if it hasn't been created yet
            if (_callback == null)
            {
                _callback = new Callback();
                _session.BeginGetEvent(_callback, null);
            }

            // Start playing.
            var varStart = new Variant();

            _session.Start(null, varStart);
        }
Example #29
0
        public async Task <double> SetVolumeAsync(double volume, CancellationToken cancellationToken)
        {
            ThrowIfDisposed();

            if (Math.Abs(_volume - volume) < 0.1)
            {
                return(_volume);
            }

            var normalizedVolume = volume.NormalizeVolume();

            ComThread.Invoke(() => SimpleAudioVolume.SetMasterVolume(normalizedVolume, Guid.Empty));
            await _volumeResetEvent.WaitOneAsync(cancellationToken);

            return(_volume);
        }
Example #30
0
        private void RefreshVolume()
        {
            if (_isDisposed)
            {
                return;
            }

            ComThread.Invoke(() =>
            {
                float vol;
                SimpleAudioVolume.GetMasterVolume(out vol);
                _volume = vol * 100;

                bool isMuted;
                SimpleAudioVolume.GetMute(out isMuted);

                _isMuted = isMuted;
            });
        }
Example #31
0
        private void PlatformPlay()
        {
            // Cleanup the last song first.
            if (State != MediaState.Stopped)
            {
                _session.Stop();
                _volumeController.Dispose();
                _clock.Dispose();
            }

            // Set the new song.
            _session.SetTopology(0, _currentVideo.Topology);

            _volumeController = CppObject.FromPointer<SimpleAudioVolume>(GetVolumeObj(_session));
            _volumeController.Mute = IsMuted;
            _volumeController.MasterVolume = _volume;

            // Get the clock.
            _clock = _session.Clock.QueryInterface<PresentationClock>();

            //create the callback if it hasn't been created yet
            if (_callback == null)
            {
                _callback = new Callback();
                _session.BeginGetEvent(_callback, null);
            }

            // Start playing.
            var varStart = new Variant();
            _session.Start(null, varStart);
        }
Example #32
0
        private static void PlatformStop()
		{
			_session.ClearTopologies();
			_session.Stop();
			_session.Close();
            _volumeController.Dispose();
            _volumeController = null;
            _clock.Dispose();
            _clock = null;
        }
Example #33
0
        private static void PlatformPlaySong(Song song)
        {
            // Cleanup the last song first.
            if (State != MediaState.Stopped)
            {
				_session.Stop();
                _session.ClearTopologies();
                _session.Close();
                _volumeController.Dispose();
                _clock.Dispose();
			}

            // Set the new song.
            _session.SetTopology(SessionSetTopologyFlags.Immediate, song.Topology);

            // Get the volume interface.
            IntPtr volumeObj;

            
            try
            {
                MediaFactory.GetService(_session, MRPolicyVolumeService, SimpleAudioVolumeGuid, out volumeObj);
            }
            catch
            {
                MediaFactory.GetService(_session, MRPolicyVolumeService, SimpleAudioVolumeGuid, out volumeObj);
            }  
          

            _volumeController = CppObject.FromPointer<SimpleAudioVolume>(volumeObj);
            _volumeController.Mute = _isMuted;
            _volumeController.MasterVolume = _volume;

            // Get the clock.
            _clock = _session.Clock.QueryInterface<PresentationClock>();

			//create the callback if it hasn't been created yet
			if (_callback == null)
			{
				_callback = new Callback();
				_session.BeginGetEvent(_callback, null);
			}

            // Start playing.
            var varStart = new Variant();
            _session.Start(null, varStart);
        }