Я только начинаю с 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();
в используемый блок в случае, если был выделен необходимый ресурс, но сбой продолжался.
Я искал повсюду для объяснения и решения. На странице Gigub CSCore нет релевантных открытых проблем. Я где-то читал, что сбой в собственном коде часто вызван неправильными сигнатурами в сборках оберток. Я сравнил все методы в IAudioSessionEvents CSCore с собственными методами IAudioSessionEvents (перечислены here), но не нашел явных расхождений.
This Firefox bug - единственная ссылка, которую я нашел в сети для этой конкретной трассировки стека, и она была разрешена. По-видимому, это было разрешено в Flash Player 19.0.0.159, но насколько я знаю, этот источник недоступен для прочтения.
Я пропустил ошибку в своем коде, или это ошибка в CSCore?