C# 在函数中整合委托函数不';没有道理

C# 在函数中整合委托函数不';没有道理,c#,delegates,pinvoke,C#,Delegates,Pinvoke,我为我的C#应用程序找到了一个更简单的NAudio版本的开源代码。这对我来说更好,因为我想做的就是从扬声器中播放一个简短的声音,以测试它们是否插入并工作,我还想听听麦克风的声音。项目本身看起来还行,但我觉得它可以重构成更小的卡盘。我发现的另一件事是WaveBuffer.cs和WaveInBuffer.cs文件非常相似。所以我开始制作一个抽象类WaveBuffer。这将有所有相似的函数和变量在其中传递。我遇到的问题如下。另一个文件WaveNative.cs中有委托。我对代表和活动都很陌生,所以我知

我为我的C#应用程序找到了一个更简单的NAudio版本的开源代码。这对我来说更好,因为我想做的就是从扬声器中播放一个简短的声音,以测试它们是否插入并工作,我还想听听麦克风的声音。项目本身看起来还行,但我觉得它可以重构成更小的卡盘。我发现的另一件事是WaveBuffer.cs和WaveInBuffer.cs文件非常相似。所以我开始制作一个抽象类WaveBuffer。这将有所有相似的函数和变量在其中传递。我遇到的问题如下。另一个文件WaveNative.cs中有委托。我对代表和活动都很陌生,所以我知道这可能非常重要。但是我不喜欢它的使用方式。因此,我将发布每个文件中的内容以及如何使用它,然后展示我一直在努力实现的目标。也许在我们所有人的头脑中,我们可以整合和重构它,使之更有效:)

所以首先

WaveNative.cs

//callbacks
public delegate void WaveDelegate(IntPtr hdrvr, int uMsg, int dwUser, ref WaveHdr wavhdr, int dwParam2);
    internal static void WaveInProc(IntPtr hdrvr, int uMsg, int dwUser, ref WaveNative.WaveHdr wavhdr, int dwParam2)
    {
        if (uMsg == WaveNative.MM_WIM_DATA)
        {
            try
            {
                GCHandle h = (GCHandle)wavhdr.dwUser;
                WaveInBuffer buf = (WaveInBuffer)h.Target;
                buf.OnCompleted();
            }
            catch
            {
            }
        }
    }
//WaveOutBuffer.cs version
    internal static void WaveOutProc(IntPtr hdrvr, int uMsg, int dwUser, ref WaveNative.WaveHdr wavhdr, int dwParam2)
    {
        if (uMsg == WaveNative.MM_WOM_DONE)
        {
            try
            {
                GCHandle h = (GCHandle)wavhdr.dwUser;
                WaveOutBuffer buf = (WaveOutBuffer)h.Target;
                buf.OnCompleted();
            }
            catch
            {
            }
        }
    }
WaveInBuffer.cs/waveburffer.cs

//callbacks
public delegate void WaveDelegate(IntPtr hdrvr, int uMsg, int dwUser, ref WaveHdr wavhdr, int dwParam2);
    internal static void WaveInProc(IntPtr hdrvr, int uMsg, int dwUser, ref WaveNative.WaveHdr wavhdr, int dwParam2)
    {
        if (uMsg == WaveNative.MM_WIM_DATA)
        {
            try
            {
                GCHandle h = (GCHandle)wavhdr.dwUser;
                WaveInBuffer buf = (WaveInBuffer)h.Target;
                buf.OnCompleted();
            }
            catch
            {
            }
        }
    }
//WaveOutBuffer.cs version
    internal static void WaveOutProc(IntPtr hdrvr, int uMsg, int dwUser, ref WaveNative.WaveHdr wavhdr, int dwParam2)
    {
        if (uMsg == WaveNative.MM_WOM_DONE)
        {
            try
            {
                GCHandle h = (GCHandle)wavhdr.dwUser;
                WaveOutBuffer buf = (WaveOutBuffer)h.Target;
                buf.OnCompleted();
            }
            catch
            {
            }
        }
    }
WaveInRecorder.cs/WaveOutRecorder

private WaveNative.WaveDelegate m_BufferProc = new WaveNative.WaveDelegate(WaveInBuffer.WaveInProc);
private WaveNative.WaveDelegate m_BufferProc = new WaveNative.WaveDelegate(WaveOutBuffer.WaveOutProc);
最后,它们被用于PInvoke调用,如下所示

    [DllImport(mmdll)]
    public static extern int waveOutOpen(out IntPtr hWaveOut, int uDeviceID, WaveFormat lpFormat, WaveDelegate dwCallback, int dwInstance, int dwFlags);
    [DllImport(mmdll)]
    public static extern int waveInOpen(out IntPtr phwi, int uDeviceID, WaveFormat lpFormat, WaveDelegate dwCallback, int dwInstance, int dwFlags);
我在WaveBuffer的抽象版本中整合了大多数其他内容,如HeaderData、头的大小、IntPtr数据、GCHandle HeaderHandle和HeaderDataHandle。WaitFor命令、oncomplete命令、bool-Busy命令和AutoResetEvent命令。不确定它是用来做什么的,但它是用来做什么的,但它在每个文件中都是一样的,所以我把它移了过来。感谢您的耐心和阅读本帖

编辑

抱歉搞混了,我忙着找这些东西,忘了问我想问什么。基本上,问题是如何组合这两个功能,它们做的几乎完全相同?这个委托是如何从WaveNative开始工作的,这样我就可以在WaveInBuffer/WaveBuffer中创建一个新实例,这意味着同样的事情。我只是假设我必须总是从另一个调用这个,或者只调用基类。至于m_BufferedProc,我将发布整个代码,因为我很难理解。请注意,我发布的代码不是我自己的。给你

public class WaveInRecorder : IDisposable
{
    private IntPtr m_WaveIn;
    private WaveInBuffer m_Buffers; // linked list
    private WaveInBuffer m_CurrentBuffer;
    private Thread m_Thread;
    private BufferDoneEventHandler m_DoneProc;
    private bool m_Finished;

    private WaveNative.WaveDelegate m_BufferProc = new WaveNative.WaveDelegate(WaveInBuffer.WaveInProc);

    public static int DeviceCount
    {
        get { return WaveNative.waveInGetNumDevs(); }
    }

    public WaveInRecorder(int device, WaveFormat format, int bufferSize, int bufferCount, BufferDoneEventHandler doneProc)
    {
        m_DoneProc = doneProc;
        WaveInHelper.Try(WaveNative.waveInOpen(out m_WaveIn, device, format, m_BufferProc, 0, WaveNative.CALLBACK_FUNCTION));
        AllocateBuffers(bufferSize, bufferCount);
        for (int i = 0; i < bufferCount; i++)
        {
            SelectNextBuffer();
            m_CurrentBuffer.Record();
        }
        WaveInHelper.Try(WaveNative.waveInStart(m_WaveIn));
        m_Thread = new Thread(new ThreadStart(ThreadProc));
        m_Thread.Start();
    }
    ~WaveInRecorder()
    {
        Dispose();
    }
    public void Dispose()
    {
        if (m_Thread != null)
            try
            {
                m_Finished = true;
                if (m_WaveIn != IntPtr.Zero)
                    WaveNative.waveInReset(m_WaveIn);
                WaitForAllBuffers();
                m_Thread.Join();
                m_DoneProc = null;
                FreeBuffers();
                if (m_WaveIn != IntPtr.Zero)
                    WaveNative.waveInClose(m_WaveIn);
            }
            finally
            {
                m_Thread = null;
                m_WaveIn = IntPtr.Zero;
            }
        GC.SuppressFinalize(this);
    }
    private void ThreadProc()
    {
        while (!m_Finished)
        {
            Advance();
            if (m_DoneProc != null && !m_Finished)
                m_DoneProc(m_CurrentBuffer.Data, m_CurrentBuffer.Size);
            m_CurrentBuffer.Record();
        }
    }
    private void AllocateBuffers(int bufferSize, int bufferCount)
    {
        FreeBuffers();
        if (bufferCount > 0)
        {
            m_Buffers = new WaveInBuffer(m_WaveIn, bufferSize);
            WaveInBuffer Prev = m_Buffers;
            try
            {
                for (int i = 1; i < bufferCount; i++)
                {
                    WaveInBuffer Buf = new WaveInBuffer(m_WaveIn, bufferSize);
                    Prev.NextBuffer = Buf;
                    Prev = Buf;
                }
            }
            finally
            {
                Prev.NextBuffer = m_Buffers;
            }
        }
    }
    private void FreeBuffers()
    {
        m_CurrentBuffer = null;
        if (m_Buffers != null)
        {
            WaveInBuffer First = m_Buffers;
            m_Buffers = null;

            WaveInBuffer Current = First;
            do
            {
                WaveInBuffer Next = Current.NextBuffer;
                Current.Dispose();
                Current = Next;
            } while(Current != First);
        }
    }
    private void Advance()
    {
        SelectNextBuffer();
        m_CurrentBuffer.WaitFor();
    }
    private void SelectNextBuffer()
    {
        m_CurrentBuffer = m_CurrentBuffer == null ? m_Buffers : m_CurrentBuffer.NextBuffer;
    }
    private void WaitForAllBuffers()
    {
        WaveInBuffer Buf = m_Buffers;
        while (Buf.NextBuffer != m_Buffers)
        {
            Buf.WaitFor();
            Buf = Buf.NextBuffer;
        }
    }
公共类WaveInRecorder:IDisposable
{
私人IntPtr m_WaveIn;
私有WaveInBuffer m_Buffers;//链表
专用WaveInBuffer m_CurrentBuffer;
私有线程m_线程;
私人BufferDoneEventHandler m_DoneProc;
私人住宅已完工;
私有WaveNative.WaveDelegate m_BufferProc=新的WaveNative.WaveDelegate(WaveInBuffer.WaveInProc);
公共静态int设备计数
{
获取{return WaveNative.waveInGetNumDevs();}
}
公共WaveInRecorder(int设备、波形格式、int bufferSize、int bufferCount、BufferDoneEventHandler doneProc)
{
m_DoneProc=DoneProc;
Try(WaveNative.waveInOpen(out m_WaveIn,device,format,m_BufferProc,0,WaveNative.CALLBACK_函数));
AllocateBuffers(缓冲大小、缓冲计数);
for(int i=0;i0)
{
m_Buffers=新的WaveInBuffer(m_WaveIn,bufferSize);
WaveInBuffer Prev=m_缓冲器;
尝试
{
for(int i=1;i