2012-03-23 2 views
0

녹음 기능을 제공하기 위해 System.Windows.Media.AudioSink에서 파생 된 클래스를 만들었습니다. 나는 다음을 수행 내 콘크리트 싱크의 상태를 확인하려면 : 나는 this._myAudioSink.Stop()을 수행 할 때CaptureSource.State를 확인할 때 InvalidOperationException이 발생합니다.

{System.InvalidOperationException: Capture source is not stopped 
    at MS.Internal.XcpImports.CheckHResult(UInt32 hr) 
    at MS.Internal.XcpImports.SetValue(IManagedPeerBase obj, DependencyProperty property, DependencyObject doh) 
    at System.Windows.DependencyObject.SetValue(DependencyProperty property, DependencyObject doh) 
    at System.Windows.Media.CaptureSource..ctor() 
    at MS.Internal.CoreTypes.GetCoreWrapper(UInt32 typeId) 
    at MS.Internal.ManagedPeerTable.EnsureManagedPeer(IntPtr unmanagedPointer, Int32 typeIndex, Type type, Boolean preserveManagedObjectReference) 
    at MS.Internal.XcpImports.ConvertDO(IntPtr doPointer, Int32 typeIndex, Boolean releaseObjectReference) 
    at MS.Internal.XcpImports.ConvertType(CValue outVal, Int32 typeIndex, Boolean releaseObjectReference, Boolean deleteBuffer, IManagedPeerBase fromObject) 
    at MS.Internal.XcpImports.AudioSink_GetSource(AudioSink Sink) 
    at System.Windows.Media.AudioSink.get_CaptureSource() 
    at MyViewModel.get_IsRecording() 

때때로, 내가 얻을 : 때때로

public class MyViewModel 
{ 
    private readonly MyAudioSink _myAudioSink; // this field is ensured in the ctor 
    public bool IsRecording 
    { 
     get 
     { 
      if (this._myAudioSink == null) 
      { 
       return false; // I know that `false` is wrong ... 
      } 
      return this._myAudioSink.CaptureSource.State == CaptureState.Started; 
     } 
    } 
} 

나는이 커서 IsRecording에 대해 쿼리 할 때, 나는 다음과 같은 예외를 얻을 다음과 같은 (유사한) 예외 :

{System.InvalidOperationException: Capture source is not stopped 
    at MS.Internal.XcpImports.CheckHResult(UInt32 hr) 
    at MS.Internal.XcpImports.SetValue(IManagedPeerBase obj, DependencyProperty property, DependencyObject doh) 
    at System.Windows.DependencyObject.SetValue(DependencyProperty property, DependencyObject doh) 
    at System.Windows.Media.CaptureSource..ctor() 
    at MS.Internal.CoreTypes.GetCoreWrapper(UInt32 typeId) 
    at MS.Internal.ManagedPeerTable.EnsureManagedPeer(IntPtr unmanagedPointer, Int32 typeIndex, Type type, Boolean preserveManagedObjectReference) 
    at MS.Internal.XcpImports.ConvertDO(IntPtr doPointer, Int32 typeIndex, Boolean releaseObjectReference) 
    at MS.Internal.XcpImports.ConvertType(CValue outVal, Int32 typeIndex, Boolean releaseObjectReference, Boolean deleteBuffer, IManagedPeerBase fromObject) 
    at MS.Internal.XcpImports.AudioSink_GetSource(AudioSink Sink) 
    at System.Windows.Media.AudioSink.get_CaptureSource() 

그래서 ... 그 이유는 무엇입니까? 이 예외를 방지하려면 어떻게해야합니까? (내 필드를 도입하고이를 OnCaptureStartedOnCaptureStopped의 무시로 설정하는 것을 제외하고)? 내가 인터넷에서 발견 한이 문제의 유일한 주제는 here입니다

...

답변

0

내가 (.., OnCaptureStopped, OnCaptureStarted) 특정 명령을 무시하여 결국 내 모델 상태를 캡슐화 그리고은 별도의 필드에서 내 구체적인 오디오 싱크 내부에 captureSource를 캡슐화했습니다.

분명히이 트릭을 수행하고, 나는 다시 전혀 문제가 없었어요.

추신 : 나는 어딘가 captureSource의 캡슐화가 충분해야한다는 것을 읽었습니다. - 나는 링크를 제공 할 수 없습니다 ... 그것은 어딘가에 있습니다!

관련 문제