我剛剛開始使用CSCore,並在C++之後回到C#。下面是列舉了默認的音頻會話管理器的音頻會議一個測試程序,並附加一個空的事件處理程序,以每一個:CSCore:偵聽音頻會話事件時的訪問衝突
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
[email protected]@12() Unknown
ntdll.dll!__RtlUserThreadStart() Unknown
[email protected]() Unknown
如果去掉調用RegisterAudioSessionNotification
的崩潰不會發生。
如果您註冊了非空事件處理程序,則仍會發生崩潰。
我試着將Console.ReadKey();
移動到使用塊中,以防處理必要的資源,但失敗依然存在。
我到處搜索了一個解釋和解決方案。 CSCore的github頁面上沒有相關的公開問題。我在本地代碼中讀到崩潰的地方通常是由包裝程序集中的錯誤簽名造成的。我將CSCore的IAudioSessionEvents上的所有方法與原生IAudioSessionEvents方法(枚舉爲here)進行了比較,但未發現明顯差異。
This Firefox bug是我在線找到的這個特定堆棧跟蹤的唯一參考,並且已經解決。很明顯,它已經在Flash Player 19.0.0.159中解決了,但據我所知,該源代碼不可用於閱讀。
我是否忽略了我的代碼中的錯誤,或者這是CSCore中的錯誤?