我刚刚开始使用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/