我确定我有两个音效设备 (waveInGetNumDevs()return 2)
但是只要不用WAVE_MAPPER 就会传回 32 error
WAVERR_BADFORMAT
不知道高手有何见解
可能的错误会在哪边呢? 
谢谢

解决方案 »

  1.   

    我也遇到這樣的問題啊~~我的Modem設備的ID是1,不是-1,傳到waveinopen的時候結果就是32
    不曉得問題出在哪兒啊~高手指教!謝謝
      

  2.   

    UP,我也遇到这个问题了,我有2个设备,分别对应声卡和modem卡,当用WAVE_MAPPER或者0(声卡对应deviceID)都能正确返回0,但用1(Modem对应的deviceID)就返回32,说是an unsupported waveform-audio format,以下是我定义的WaveFormat:
    [StructLayout(LayoutKind.Sequential)]
        public struct WaveFormat
        {
            public short wFormatTag;
            public short nChannels;
            public int nSamplesPerSec;
            public int nAvgBytesPerSec;
            public short nBlockAlign;
            public short wBitsPerSample;
            public short cbSize;        public WaveFormat(int rate, int bits, int channels)
            {
                wFormatTag = (short)WaveFormats.PCM;
                nChannels = (short)channels;
                nSamplesPerSec = rate;
                wBitsPerSample = (short)bits;
                cbSize = 0;            nBlockAlign = (short)(channels * (bits / 8));
                nAvgBytesPerSec = nSamplesPerSec * nBlockAlign;
            }
        }高手来指点啊
      

  3.   

    還有一個奇怪的現象是 我用waveInGetDevCaps(int uDeviceID,ref WaveinCaps pwic,int size);
    傳值uDeviceID=1,得到的結構體WaveinCaps中的formates為0,也就是說不支持任何wave文件格式
     
    WAVE_FORMAT_1M08
     11.025 kHz, mono, 8-bit
     
    WAVE_FORMAT_1M16
     11.025 kHz, mono, 16-bit
     
    WAVE_FORMAT_1S08
     11.025 kHz, stereo, 8-bit
     
    WAVE_FORMAT_1S16
     11.025 kHz, stereo, 16-bit
     
    WAVE_FORMAT_2M08
     22.05 kHz, mono, 8-bit
     
    WAVE_FORMAT_2M16
     22.05 kHz, mono, 16-bit
     
    WAVE_FORMAT_2S08
     22.05 kHz, stereo, 8-bit
     
    WAVE_FORMAT_2S16
     22.05 kHz, stereo, 16-bit
     
    WAVE_FORMAT_4M08
     44.1 kHz, mono, 8-bit
     
    WAVE_FORMAT_4M16
     44.1 kHz, mono, 16-bit
     
    WAVE_FORMAT_4S08
     44.1 kHz, stereo, 8-bit
     
    WAVE_FORMAT_4S16
     44.1 kHz, stereo, 16-bit
     
    但是0不在以上結果之內,這說明什麽問題呢?
      

  4.   

    procedure TSoundCap.OpenCapture(handle: THandle);
    var
      BufLen: word;
      buf: pointer;
    begin
      BufSize := 3 * 500 + 100;
      Bits16 := false;
      with header do
      begin
        wFormatTag := WAVE_FORMAT_PCM;
        nChannels := 1;
        nSamplesPerSec := 22050;
        wBitsPerSample := integer(Bits16) * 8 + 8;
        nBlockAlign := nChannels * (wBitsPerSample div 8 );
        nAvgBytesPerSec := nSamplesPerSec * nBlockAlign;
        cbSize := 0;
      end;                     //若改用其它值,则无法正常捕获到输入数据
      WaveInOpen(Addr(WaveIn), WAVE_MAPPER , addr(header),Handle , 0, CALLBACK_WINDOW);
      BufLen := header.nBlockAlign * BufSize;
      hBuf := GlobalAlloc(GMEM_MOVEABLE and GMEM_SHARE, BufLen);   
      Buf := GlobalLock(hBuf);                                      
      with BufHead do
      begin
        lpData := Buf;
        dwBufferLength := BufLen;
        dwFlags := WHDR_BEGINLOOP;
      end;
      WaveInPrepareHeader(WaveIn, Addr(BufHead), sizeof(BufHead)); 
      WaveInAddBuffer(WaveIn, addr(BufHead), sizeof(BufHead));     
      stop := true;                                                
      WaveInStart(WaveIn); 
    end;