2016-08-18 30 views
0

当音频会话以NAudio开始和结束时,我希望收到回调。以下代码正在工作:使用NAudio为状态更改接收音频会话回调

private void SetupMediaSessionCallbacks() 
    { 
     // Foreach output endpoint 
     foreach (var md in new MMDeviceEnumerator().EnumerateAudioEndPoints(DataFlow.Render, DeviceState.Active)) 
     { 
      md.AudioSessionManager.OnSessionCreated += OnSessionCreated; 
     } 
    } 

此代码在创建新音频会话时触发。我是新来的n音讯,所以我不知道如何设置RegisterEventClient接收状态更改事件:

private void OnSessionCreated(object sender, IAudioSessionControl newSession) 
    { 
     // Not working, need help here! 
     AudioSessionControl audioSession = new AudioSessionControl(newSession); 
     IAudioSessionEventsHandler handler = null; 
     AudioSessionEventsCallback notifications = new AudioSessionEventsCallback(test); 
     handler.OnStateChanged += new EventHandler<AudioSessionState>(notifications_StateChanged); 
     audioSession.RegisterEventClient(handler); 
    } 

这里的回调,我相信这是正确的:

void notifications_StateChanged(object sender, AudioSessionState newState) 
    { 
     if (newState == AudioSessionState.AudioSessionStateActive) 
     { 
      Console.WriteLine("StateChanged"); 
     } 
    } 

任何帮助将不胜感激。我已经搜索了这个文件的高和低。

回答

1

想通了。我需要创建自己的继承自IAudioSessionEventsHandler的类。这里是OnSessionCreated的代码:

private void OnSessionCreated(object sender, IAudioSessionControl newSession) 
{ 
    AudioSessionControl audioSession = new AudioSessionControl(newSession); 
    NAudioEventCallbacks callbacks = new NAudioEventCallbacks(); 
    AudioSessionEventsCallback notifications = new AudioSessionEventsCallback(callbacks); 
    audioSession.RegisterEventClient(callbacks); 

} 

public class NAudioEventCallbacks : IAudioSessionEventsHandler 
{ 
    public void OnChannelVolumeChanged(uint channelCount, IntPtr newVolumes, uint channelIndex) { } 

    public void OnDisplayNameChanged(string displayName) { } 

    public void OnGroupingParamChanged(ref Guid groupingId) { } 

    public void OnIconPathChanged(string iconPath) { } 

    public void OnSessionDisconnected(AudioSessionDisconnectReason disconnectReason) { } 

    public void OnStateChanged(AudioSessionState state) { } 

    public void OnVolumeChanged(float volume, bool isMuted) { } 
} 

我现在可以在NAudioEventCallbacks中设置符合预期的断点。