gpt4 book ai didi

c# - CSCore:收听 Audio Session 事件时发生访问冲突

转载 作者:太空宇宙 更新时间:2023-11-03 12:45:13 25 4
gpt4 key购买 nike

我刚刚开始使用 CSCore,在学习了很多 C++ 之后又回到了 C#。这是一个测试程序,它枚举默认 Audio Session 管理器的 Audio Session ,并为每个 session 附加一个空事件处理程序:

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

我希望能够在该程序运行时毫无问题地更改计算机的音量。但是,如果您尝试这样做,程序会因 native 代码中的访问冲突而崩溃。这是堆栈跟踪:

>   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 block 中以防释放必要的资源,但失败仍然存在。

我到处搜索解释和解决方案。 CSCore 的 github 页面上没有相关的未解决问题。我在某处读到 native 代码的崩溃通常是由包装器程序集中的错误签名引起的。我将 CSCore 的 IAudioSessionEvents 上的所有方法与 native 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com