2016-05-31 3 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); 
     } 
    } 
} 
이 프로그램이있는 동안 내 컴퓨터의 볼륨을 변경할 수 있도록 기대

아무런 문제없이 달리고있다. 그러나이 방법을 시도하면 프로그램이 네이티브 코드의 액세스 위반으로 인해 충돌합니다. 당신이 RegisterAudioSessionNotification에 전화를 제거하면

> 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 

이 충돌은 발생하지 않습니다 여기에 스택 추적입니다.

비어 있지 않은 이벤트 처리기를 등록하면 여전히 충돌이 발생합니다.

필요한 리소스가 삭제 될 경우를 대비하여 Console.ReadKey();을 사용 블록으로 옮겨 보았지만 오류가 지속되었습니다.

나는 곳곳에서 설명과 해결책을 찾았다. CSCore의 github 페이지에는 관련 미결 문제가 없습니다. 어딘가에서 네이티브 코드의 충돌은 래퍼 어셈블리의 잘못된 서명으로 인해 발생합니다. CSCore의 IAudioSessionEvents에있는 모든 메서드를 기본 IAudioSessionEvents 메서드 (here 열거)와 비교했지만 명백한 불일치는 발견되지 않았습니다.

This Firefox bug이 온라인에서이 특정 스택 추적으로 발견 된 유일한 참조이며 해결되었습니다. 분명히 Flash Player 19.0.0.159에서 해결되었지만 소스가 열람 할 수 없다는 것을 알고있는 한 분명합니다.

내 코드의 오류가 간과되었거나 CSCore의 버그입니까?

답변

1

이 충돌은 대상 플랫폼이 32 비트 (또는 "모든 CPU"이지만 32 비트 VS 프로세스에서 실행중인 경우) 발생합니다. 64 비트 대상 플랫폼으로 전환하면 나를 대신했습니다.

관련 문제