Skip to content

Commit

Permalink
MP1-4781V10 : madVR V422 (Handle audio wave device to match master vo…
Browse files Browse the repository at this point in the history
…lume)
  • Loading branch information
Sebastiii committed Jan 7, 2018
1 parent 184e189 commit 78a1a1d
Showing 1 changed file with 103 additions and 2 deletions.
105 changes: 103 additions & 2 deletions mediaportal/Core/Mixer/Mixer.cs
Expand Up @@ -45,6 +45,8 @@ public sealed class Mixer : IDisposable
private CSCore.CoreAudioAPI.AudioEndpointVolumeCallback iAudioEndpointVolumeMixerCallback;
EventHandler<DefaultDeviceChangedEventArgs> iDefaultDeviceChangedHandler;
EventHandler<AudioEndpointVolumeCallbackEventArgs> iVolumeChangedHandler;
System.Timers.Timer _dispatchingTimer;
const string AppName = "MediaPortal";

#endregion

Expand Down Expand Up @@ -103,6 +105,7 @@ public void Dispose()
_mMdeviceEnumerator.Dispose();
_mMdeviceEnumerator = null;
}
Stop();
Close();
}

Expand All @@ -126,6 +129,104 @@ public void Dispose()
iAudioEndpointVolumeMixerCallback = new CSCore.CoreAudioAPI.AudioEndpointVolumeCallback();
iAudioEndpointVolumeMixerCallback.NotifyRecived += iVolumeChangedHandler = aVolumeChangedHandler;
iAudioEndpointVolume.RegisterControlChangeNotify(iAudioEndpointVolumeMixerCallback);

// For audio session
Stop();
DispatchingTimerStart();
}

public void DispatchingTimerStart()
{
_dispatchingTimer = new System.Timers.Timer(1000);
_dispatchingTimer.Elapsed += DispatchingTimer_Elapsed;
_dispatchingTimer.AutoReset = false;
_dispatchingTimer.Start();
}

private void DispatchingTimer_Elapsed(object sender, System.Timers.ElapsedEventArgs e)
{
CheckAudioLevels();
_dispatchingTimer?.Start(); // trigger next timer
}

public void Stop()
{
_dispatchingTimer?.Stop();
_dispatchingTimer?.Dispose();
}

public void CheckAudioLevels()
{
try
{
using (var sessionManager = GetDefaultAudioSessionManager2(DataFlow.Render))
{
if (sessionManager != null)
{
using (var sessionEnumerator = sessionManager.GetSessionEnumerator())
{
if (sessionEnumerator != null)
{
foreach (var session in sessionEnumerator)
{
if (session != null)
{
using (var audioSessionControl2 = session.QueryInterface<AudioSessionControl2>())
{
if (audioSessionControl2 != null)
{
var process = audioSessionControl2.Process;
string name = audioSessionControl2.DisplayName;
if (process != null)
{
if (name != null && name == "")
{
name = process.MainWindowTitle;
}
if (name != null && name == "")
{
name = process.ProcessName;
}
}

if (name != null && !name.Contains(AppName))
{
continue;
}
}

using (var simpleVolume = session.QueryInterface<SimpleAudioVolume>())
{
if (simpleVolume != null)
{
simpleVolume.MasterVolume = 1;
simpleVolume.IsMuted = _isMuted;
}
}
}
}
}
}
}
}
}
}
catch (Exception ex)
{
Log.Error("Exception in Audio Session {0}", ex);
}
}

private static AudioSessionManager2 GetDefaultAudioSessionManager2(DataFlow dataFlow)
{
using (var enumerator = new MMDeviceEnumerator())
{
using (var device = enumerator.GetDefaultAudioEndpoint(dataFlow, Role.Multimedia))
{
var sessionManager = AudioSessionManager2.FromMMDevice(device);
return sessionManager;
}
}
}

public void Open()
Expand Down Expand Up @@ -162,7 +263,7 @@ public void Open(int mixerIndex, bool isDigital, int[] volumeTable)
}
}
}
catch (Exception)
catch (Exception ex)
{
_isMuted = false;
_volume = VolumeMaximum;
Expand Down Expand Up @@ -376,7 +477,7 @@ public void OnDefaultMultiMediaDeviceChanged(object sender, DefaultDeviceChanged
_mMdeviceEnumerator.Dispose();
_mMdeviceEnumerator = null;
}

Stop();
CreateDevice(OnDefaultMultiMediaDeviceChanged, OnVolumeNotification);
//ResetAudioManagerThreadSafe();
}
Expand Down

0 comments on commit 78a1a1d

Please sign in to comment.