我刚刚开始使用CSCore,并在大量使用C ++之后又回到了C#。这是一个测试程序,该程序枚举默认音频会话管理器的音频会话,并将空事件处理程序附加到每个音频处理程序:

using System;
using CSCore.CoreAudioAPI;

class Program
{
    static void Main(string[] args)
    {
        using (var enumerator = new MMDeviceEnumerator())
        using (var device = enumerator.GetDefaultAudioEndpoint(DataFlow.Render, Role.Multimedia))
        using (var sessionManager = AudioSessionManager2.FromMMDevice(device))
        using (var sessionEnumerator = sessionManager.GetSessionEnumerator())
        {
            foreach (var control in sessionEnumerator)
            {
                var control2 = control.QueryInterface<AudioSessionControl2>();
                RegisterAudioSession(control2);
            }
        }

        Console.WriteLine("Waiting...");
        Console.ReadKey();
    }

    static void RegisterAudioSession(AudioSessionControl2 session)
    {
        if (session.Process != null)
        {
            var events = new AudioSessionEvents();
            session.RegisterAudioSessionNotification(events);
        }
    }
}


我希望能够在程序运行时更改计算机的容量,而不会出现任何问题。但是,如果尝试这样做,程序将崩溃,并出现本机代码中的访问冲突。这是堆栈跟踪:

>   AudioSes.dll!CLockedList<ATL::CComPtr<IAudioSessionEvents>,0,1>::ForEachEntry() Unknown
AudioSes.dll!CAudioSessionControl::OnAudioSessionEvent()    Unknown
AudioSes.dll!CAudioSessionControl::CAudioSessionNotificationDelegator::OnMediaNotification(struct MEDIA_NOTIFICATION_BLOCK *)   Unknown
MMDevAPI.dll!CMediaNotifications::OnMediaNotificationWorkerHandler(struct _TP_CALLBACK_INSTANCE *)  Unknown
MMDevAPI.dll!CMediaNotifications::MediaNotificationWorkerHandler(struct _TP_CALLBACK_INSTANCE *,void *) Unknown
ntdll.dll!TppSimplepExecuteCallback()   Unknown
ntdll.dll!TppWorkerThread() Unknown
kernel32.dll!@BaseThreadInitThunk@12()  Unknown
ntdll.dll!__RtlUserThreadStart()    Unknown
ntdll.dll!__RtlUserThreadStart@8()  Unknown


如果您删除对RegisterAudioSessionNotification的调用,则不会发生崩溃。

如果您注册一个非空事件处理程序,仍然会发生崩溃。

我尝试将Console.ReadKey();移到using块中,以防万一需要的资源被处理掉了,但是故障仍然存在。

我在各处搜索了说明和解决方案。 CSCore的github页面上没有相关的未解决问题。我读到某个地方,本机代码崩溃通常是由包装程序集中的错误签名引起的。我将CSCore的IAudioSessionEvents上的所有方法与本机IAudioSessionEvents方法(枚举了here)进行了比较,但没有发现明显的差异。

This Firefox bug是我在网上找到的关于此特定堆栈跟踪的唯一参考,并且已解决。显然,它已在Flash Player 19.0.0.159中解决,但据我所知,该源不可供细读。

我是在忽略代码中的错误,还是CSCore中的错误?

最佳答案

事实证明,如果目标平台是32位(或者在我的情况下为“任何CPU”但在32位VS进程中运行),则会发生此崩溃。切换到64位目标平台对我来说已经解决了

关于c# - CSCore:收听 Audio Session 事件时访问冲突,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/37555207/

10-11 15:06