Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/288.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C#DirectSound DirectSoundBuffer.SetVolume E#u NOINTERFACE_C#_Directx_Directsound - Fatal编程技术网

C#DirectSound DirectSoundBuffer.SetVolume E#u NOINTERFACE

C#DirectSound DirectSoundBuffer.SetVolume E#u NOINTERFACE,c#,directx,directsound,C#,Directx,Directsound,我正在为我的音频库编写DirectSound包装。 我遇到了directsound,它工作得很好。这意味着音频回放的效果比waveout等要好得多。 但现在我有一个问题。 我正在尝试设置secondarybuffer的音量。 我得到一个例外,因为我的接口无法转换或类似的东西,所以存在HResult E_NOINTERFACE。这怎么可能呢。我有Setvolume方法的代码:void Setvolume(int lVolume) 我正在将值-56传递给它 下面是确切的错误消息: 类型为“Syste

我正在为我的音频库编写DirectSound包装。 我遇到了directsound,它工作得很好。这意味着音频回放的效果比waveout等要好得多。 但现在我有一个问题。 我正在尝试设置secondarybuffer的音量。 我得到一个例外,因为我的接口无法转换或类似的东西,所以存在HResult E_NOINTERFACE。这怎么可能呢。我有Setvolume方法的代码:void Setvolume(int lVolume)

我正在将值-56传递给它

下面是确切的错误消息:

类型为“System.\u ComObject”的COM对象无法转换为接口类型“AMEngine.DX.IDirectSoundBuffer”。无法执行此操作,因为无法执行因错误而对IID“{279AFA85-4981-11CE-A521-0020AF0BE560}”接口的COM组件的QueryInterface调用:不支持此类接口(HRESULT的异常:0x80004002(E_NOINTERFACE))

我翻译了这个:

DEFINE_GUID(IID_IDirectSoundBuffer, 0x279AFA85, 0x4981, 0x11CE, 0xA5, 0x21, 0x00, 0x20, 0xAF, 0x0B, 0xE5, 0x60);

#undef INTERFACE
#define INTERFACE IDirectSoundBuffer
   DECLARE_INTERFACE_(IDirectSoundBuffer, IUnknown)
{
    STDMETHOD(QueryInterface)       (THIS_ __in REFIID, __deref_out LPVOID*) PURE;
    STDMETHOD_(ULONG,AddRef)        (THIS) PURE;
    STDMETHOD_(ULONG,Release)       (THIS) PURE;
    STDMETHOD(GetCaps)              (THIS_ __out LPDSBCAPS pDSBufferCaps) PURE;
    STDMETHOD(GetCurrentPosition)   (THIS_ __out_opt LPDWORD pdwCurrentPlayCursor, __out_opt LPDWORD pdwCurrentWriteCursor) PURE;
    STDMETHOD(GetFormat)            (THIS_ __out_bcount_opt(dwSizeAllocated) LPWAVEFORMATEX pwfxFormat, DWORD dwSizeAllocated, __out_opt LPDWORD pdwSizeWritten) PURE;
    STDMETHOD(GetVolume)            (THIS_ __out LPLONG plVolume) PURE;
    STDMETHOD(GetPan)               (THIS_ __out LPLONG plPan) PURE;
    STDMETHOD(GetFrequency)         (THIS_ __out LPDWORD pdwFrequency) PURE;
    STDMETHOD(GetStatus)            (THIS_ __out LPDWORD pdwStatus) PURE;
    STDMETHOD(Initialize)           (THIS_ __in LPDIRECTSOUND pDirectSound, __in LPCDSBUFFERDESC pcDSBufferDesc) PURE;
    STDMETHOD(Lock)                 (THIS_ DWORD dwOffset, DWORD dwBytes,
                                           __deref_out_bcount(*pdwAudioBytes1) LPVOID *ppvAudioPtr1, __out LPDWORD pdwAudioBytes1,
                                           __deref_opt_out_bcount(*pdwAudioBytes2) LPVOID *ppvAudioPtr2, __out_opt LPDWORD pdwAudioBytes2, DWORD dwFlags) PURE;
    STDMETHOD(Play)                 (THIS_ DWORD dwReserved1, DWORD dwPriority, DWORD dwFlags) PURE;
    STDMETHOD(SetCurrentPosition)   (THIS_ DWORD dwNewPosition) PURE;
    STDMETHOD(SetFormat)            (THIS_ __in LPCWAVEFORMATEX pcfxFormat) PURE;
    STDMETHOD(SetVolume)            (THIS_ LONG lVolume) PURE;
    STDMETHOD(SetPan)               (THIS_ LONG lPan) PURE;
    STDMETHOD(SetFrequency)         (THIS_ DWORD dwFrequency) PURE;
    STDMETHOD(Stop)                 (THIS) PURE;
    STDMETHOD(Unlock)               (THIS_ __in_bcount(dwAudioBytes1) LPVOID pvAudioPtr1, DWORD dwAudioBytes1,
                                           __in_bcount_opt(dwAudioBytes2) LPVOID pvAudioPtr2, DWORD dwAudioBytes2) PURE;
    STDMETHOD(Restore)              (THIS) PURE;
};
进入

音量是用以下代码设置的:(我传递的值是-56)no sound=0和maxsound=-10000

        private void SetCurrentVolume()
    {
        if (secondaryBuffer != null)
        {
            secondaryBuffer.SetVolume(volume);
        }
    }

E_NOINTERFACE
错误很简单:用于查询另一个接口的接口指针无法提供给您。也就是说,您(或者您正在使用的库)正在从非缓冲区对象的对象中提取代码。
IDirectSoundBuffer
。如果您在错误位置周围发布代码片段,这将非常有用。

可能是线程问题。很难说,没有人可以从异常消息中对代码进行反向工程。
 DSBufferDescription secondaryBufferDesc = new DSBufferDescription();
        secondaryBufferDesc.dwBufferBytes = (uint)(bufferSize * 2);
        //http://msdn.microsoft.com/en-us/library/windows/desktop/microsoft.directx_sdk.reference.dsbcaps%28v=vs.85%29.aspx
        secondaryBufferDesc.dwFlags = DirectSoundBufferCaps.DSBCAPS_CTRLVOLUME |
                                      DirectSoundBufferCaps.DSBCAPS_CTRLPOSITIONNOTIFY |
                                      DirectSoundBufferCaps.DSBCAPS_GETCURRENTPOSITION2 |
                                      DirectSoundBufferCaps.DSBCAPS_GLOBALFOCUS |
                                      DirectSoundBufferCaps.DSBCAPS_STICKYFOCUS;
        secondaryBufferDesc.dwReserved = 0;
        secondaryBufferDesc.dwSize = Marshal.SizeOf(secondaryBufferDesc);
        secondaryBufferDesc.guid3DAlgorithm = Guid.Empty;
        secondaryBufferDesc.guid3DAlgorithm = Guid.Empty;

        Wave.WaveFormat format = new Wave.WaveFormat(waveFormat, waveFormat.SampleRate);
        GCHandle lpwfxSecondaryPtr = GCHandle.Alloc(format, GCHandleType.Pinned);
        secondaryBufferDesc.lpwfxFormat = lpwfxSecondaryPtr.AddrOfPinnedObject();
        //IntPtr waveFormatPtr = Marshal.AllocHGlobal(Marshal.SizeOf(waveFormat));
        //Marshal.StructureToPtr(waveFormat, waveFormatPtr, false);
        //secondaryBufferDesc.lpwfxFormat = waveFormatPtr;

        object primaryBufferObj, secondaryBufferObj;
        //http://msdn.microsoft.com/en-us/library/windows/desktop/microsoft.directx_sdk.idirectsound8.idirectsound8.createsoundbuffer%28v=vs.85%29.aspx
        directSound.CreateSoundBuffer(primaryBufferDesc, out primaryBufferObj, IntPtr.Zero);
        directSound.CreateSoundBuffer(secondaryBufferDesc, out secondaryBufferObj, IntPtr.Zero);

        lpwfxSecondaryPtr.Free();

        this.primaryBuffer = (IDirectSoundBuffer)primaryBufferObj;
        this.secondaryBuffer = (IDirectSoundBuffer)secondaryBufferObj;
        private void SetCurrentVolume()
    {
        if (secondaryBuffer != null)
        {
            secondaryBuffer.SetVolume(volume);
        }
    }