2013-08-17 41 views
0

我想使用NAudio作为记录程序,但我遇到了意想不到的限制。 NAudio.Wave.WaveIn.GetCapabilities(deviceNumber)返回一个WaveInCapabilities结构,但只有该结构的几个字段是公共的。使用NAudio获取输入设备支持的格式

特别是我需要知道设备支持哪些格式。该信息位于:

private SupportedWaveFormat supportedFormats;

我可以将其更改为公开并生成NAaudio.dll,但我想知道是否有某些原因将该字段标记为私有?还是有另一个地方,我可以找到这些信息?

回答

1

有在网络上一个例子,我编辑它,这对我的作品让所有不同的设备支持购买(这是相当丑陋,但它的工作原理...):

using System; 
using System.Collections.Generic; 
using System.Text; 
using System.Runtime.InteropServices; 
using System.Collections; 
namespace _4ch_stream 
{ 
    class clsRecDevices 
    { 


     [StructLayout(LayoutKind.Sequential, Pack = 4)] 
     public struct WaveInCaps 
     { 
      public short wMid; 
      public short wPid; 
      public int vDriverVersion; 
      [MarshalAs(UnmanagedType.ByValArray, SizeConst = 32)] 
      public char[] szPname; 
      public uint dwFormats; 
      public short wChannels; 
      public short wReserved1; 
     } 

     [DllImport("winmm.dll")] 
     public static extern int waveInGetNumDevs(); 
     [DllImport("winmm.dll", EntryPoint = "waveInGetDevCaps")] 
     public static extern int waveInGetDevCapsA(int uDeviceID, 
          ref WaveInCaps lpCaps, int uSize); 
     public ArrayList arrLst = new ArrayList(); 
     //using to store all sound recording devices strings 

     static int devcount = waveInGetNumDevs(); 
     public static short[] Mid = new short[devcount]; 
     public static short[] Pid = new short[devcount]; 
     public static int[] DriverVersion = new int[devcount]; 
     public static uint[] Formats = new uint[devcount]; 
     public static short[] Channels = new short[devcount]; 
     public static short[] Reserved1 = new short[devcount]; 

     public int Count 
     //to return total sound recording devices found 
     { 
      get { return arrLst.Count; } 
     } 
     public string this[int indexer] 
     //return spesipic sound recording device name 
     { 
      get { return (string)arrLst[indexer]; } 
     } 
     public clsRecDevices() //fill sound recording devices array 
     { 
      int waveInDevicesCount = waveInGetNumDevs(); //get total 
      if (waveInDevicesCount > 0) 
      { 
       for (int uDeviceID = 0; uDeviceID < waveInDevicesCount; uDeviceID++) 
       { 
        WaveInCaps waveInCaps = new WaveInCaps(); 
        waveInGetDevCapsA(uDeviceID, ref waveInCaps, 
             Marshal.SizeOf(typeof(WaveInCaps))); 
        arrLst.Add(new string(waveInCaps.szPname).Remove(
           new string(waveInCaps.szPname).IndexOf('\0')).Trim()); 
        Mid[uDeviceID] = waveInCaps.wMid; 
        Pid[uDeviceID] = waveInCaps.wPid; 
        Formats[uDeviceID] = waveInCaps.dwFormats; 
        Channels[uDeviceID] = waveInCaps.wChannels; 
        Reserved1[uDeviceID] = waveInCaps.wReserved1; 
        //clean garbage 
       } 
      } 
     } 
    } 
} 

希望它有帮助。

+0

谢谢,我敢肯定,工作。我最终只是公开了格式并重建。 – TomJeffries