private void ThreadProc()
 {
     while (!m_Finished)
     {
         Advance();
         if (m_FillProc != null && !m_Finished)
         {
             m_FillProc(ref m_CurrentBuffer);
         }
         else
         {
             // zero out buffer
             byte   v = m_zero;
             byte[] b = new byte[m_CurrentBuffer.Size];
             //for (int i = 0; i < b.Length; i++)
             //	b[i] = v;
             System.Array.Clear(b, 0, m_CurrentBuffer.Size);
             Marshal.Copy(b, 0, m_CurrentBuffer.Data, b.Length);
         }
         if (!m_CurrentBuffer.Finished)
         {
             m_CurrentBuffer.Play();
         }
         else
         {
             m_CurrentBuffer.OnCompleted();
         }
         m_Finished = AllFinished();
     }
     WaitForAllBuffers();
 }
 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 {
         }
     }
 }