I know this is a couple years late, but I just ran into this frustrating problem as well. I combed through a lot of documentation and eventually found this:
"...there is no expiration mechanism enforced by the audio system on the session control objects. A session control is valid as long as the application has a reference to the session control..." (
link).
If the audio system doesn't control session lifetime, then the OnSessionDisconnected event must not be the right approach to detecting the end of a session's life.
This implies that you need to look outside of the audio system for information about whether an audio session is still needed. In my program I release audio sessions when the process they are associated with exits, which seems to work well. You can get the relevant process ID from the IAudioSessionControl2 interface. I'm using a C# wrapper around the core audio APIs, so I detect process expiration by subscribing to the Process.Exited event (
link).
I hope this helps!