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