2016-05-31 8 views
2

Я только начинаю с 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?

ответ

1

Оказывается, этот сбой происходит, если целевая платформа 32-разрядная (или в моем случае «Любой процессор», но работает в 32-битном VS-процессе). Переключение на 64-битную целевую платформу исправило это для меня