首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >CSCore:侦听音频会话事件时的访问冲突

CSCore:侦听音频会话事件时的访问冲突
EN

Stack Overflow用户
提问于 2016-05-31 20:37:56
回答 1查看 753关注 0票数 2

我刚刚开始使用CSCore,在经历了很多C++之后,我又回到了C#。下面是一个测试程序,它枚举默认音频会话管理器的音频会话,并在每个音频会话管理器上附加一个空事件处理程序:

代码语言:javascript
复制
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);
        }
    }
}

我希望能够改变我的计算机的体积,而这个程序运行时,没有任何问题。但是,如果尝试这样做,程序会在本机代码中与访问冲突崩溃。下面是堆栈跟踪:

代码语言:javascript
复制
>   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方法(枚举这里,但没有发现明显的差异。

这个火狐错误是我在网上找到的关于这个特定堆栈跟踪的唯一引用,并且它已经解决了。显然,它是在Flash 19.0.0.159中解决的,但据我所知,这个源是不可阅读的。

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

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-06-04 03:07:03

如果目标平台是32位(或者在我的例子中是“任意CPU”,但运行在32位VS进程中),则会发生此崩溃。切换到64位目标平台帮我修好了

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/37555207

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档