2016-08-18 2 views
0

Je souhaite recevoir des rappels lorsque les sessions audio commencent et se terminent avec NAudio. Le code suivant fonctionne:Réception de rappels de session audio pour les modifications d'état avec NAudio

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

Ce code se déclenche lorsque de nouvelles sessions audio sont créées. Je suis nouveau à NAudio, donc je ne comprends pas comment RegisterEventClient configuré pour recevoir des événements de changement d'état:

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); 
    } 

Voici le rappel que je crois est correct:

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

Toute aide être grandement apprécié. J'ai recherché haut et bas pour la documentation pour ceci.

Répondre

1

Compris. J'ai besoin de créer ma propre classe qui hérite de IAudioSessionEventsHandler. Voici le code pour 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) { } 
} 

Je peux maintenant mettre en NAudioEventCallbacks que des points d'arrêt fonctionnent comme prévu.