CoreAudioApi with threading - InvalidCastException

本文关键字:InvalidCastException threading with CoreAudioApi | 更新日期: 2023-09-27 17:49:36

我正在编写一个应用程序来修改另一个应用程序的卷,并使用CoreAudioApi dll来这样做。下面的代码块在主线程上工作得很好,但是当在单独的线程中调用时,会引发InvalidCastException。我抛出了一个互斥锁,以防这只是两个线程试图访问相同资源的问题,但情况似乎并非如此。你知道是什么问题吗?作为一个新的c#程序员,我被难住了。我读了其他问题,其中建议只有主线程可以访问COM对象,如CoreAudioApi,所以我需要向主线程发送某种消息。如果这是正确的,那么最好的方法是什么?

异常(发生在第一个Math。if语句):

Unable to cast COM object of type 'System.__ComObject' to interface type 'CoreAudioApi.Interfaces.IMMDevice'. This operation failed because the QueryInterface call on the COM component for the interface with IID '{D666063F-1587-4E43-81F1-B948E807363F}' failed due to the following error: No such interface supported (Exception from HRESULT: 0x80004002 (E_NOINTERFACE)).

代码:

muteSoundMutex.WaitOne();
AudioSessionControl sASC = sInfo.getSAudioSession();
if (Math.Abs(sASC.SimpleAudioVolume.MasterVolume -
      (0.05f / defaultDevice.AudioEndpointVolume.MasterVolumeLevelScalar)) < 0.0001 
    && savedVol > 0)
{
   ... // other code here. all mutexes are released correctly.

CoreAudioApi with threading - InvalidCastException

您的错误消息告诉您在IMMDevice的某些操作中发生了转换错误。
根据这个规范,IMMDevice只有4个方法:

  • Activate
  • OpenPropertyStore
  • GetId
  • GetState

您提供的代码没有提到这些方法,所以要么您误解了错误发生的位置,要么这是应用程序的内部错误。

我认为这是从设备获取卷时的内部错误。

如果这个错误发生在sASC.SimpleAudioVolume.MasterVolumedefaultDevice.AudioEndpointVolume.MasterVolumeLevelScalar,那么这个错误是因为代码运行到后台模式。否则,请为您的异常添加一些代码和堆栈跟踪。

错误码为E_NOINTERFACE的错误可能在设备的Activate方法中发生。你需要在主线程中调用这个方法来激活设备,然后尝试在后台模式中使用它。不能提供任何示例代码,抱歉。

我的应用抛出了这个异常。我已经收集了一些关于这个的见解。

  • COM对象要求所有线程运行
  • 如果你试图从另一个线程运行这个对象,确保线程正在运行
  • 如果你的程序在STAThread上运行,你正在使用这个COM对象到Task或另一个Thread,那么它会抛出一个异常,像这样。

所以请确保你的程序在MTAThread下运行,而使用COM对象到TaskThread

希望对你有帮助。

谢谢。

相关文章:
  • 没有找到相关文章