2013-11-23 61 views
0

我有一個程序可以通過Portaudio輸出音頻。它大部分都能正常工作,但有些USB設備使用內置的Windows USBAudio驅動程序無法工作。Portaudio不能使用一些USB音頻設備

我沒有收到任何錯誤,程序顯示正在我的程序中處理的數據,但是當音頻流發送到portaudio時,沒有聲音從USB設備輸出。看起來好像portaudio沒有初始化設備,因此無法將數據流發送給它。

某些USB設備可以在一個USB端口上工作,但是當我將它移動到同一臺計算機上的另一個USB端口時,它將無法工作。

其他USB設備無法在任何USB端口上工作。

但是,從其他程序輸出聲音或使用Windows測試音頻輸出時,所有USB設備均可正常工作。

我不明白爲什麼一些USB設備的工作和其他人不,即使他們都使用相同的USB驅動程序。

下面是啓動portaudio流我的代碼的一部分:

static int paPlayCallback(const void *inputBuffer, void *output, 
          unsigned long framesPerBuffer, 
          const PaStreamCallbackTimeInfo* timeInfo, 
          PaStreamCallbackFlags statusFlags, 
          void *userData){ 
    if(Out2){ 
     int sz= Out2->Size(); 

     if(sz>QUEUE_SIZE)start=1; 
     if(sz==0){ 
      for(int i=0;i<10;i++) 
       averagePower[i]= 0.0; 
      start=0; 
     } 
     if(start){ 
      printf("Output queue size %d\n",sz); 

      while(sampleCount<OUT_BUF_SIZE) 
       sampleCount+= AddBuffer(); 

      Resample((float*)output, l,r,framesPerBuffer,dev.parameters.channelCount); 

      DelBuffer(); 

      return paContinue; 
     } 
    } 
    memset(output,0, framesPerBuffer*dev.parameters.channelCount*4); 
    return paContinue; 
} 

    static void StreamFinished(void* userData) 
{ 
    // exit(-1); 
} 


BOOL Play(int device){ 
    dev.info = Pa_GetDeviceInfo(device); 
    dev.parameters.device = device; 
    dev.parameters.channelCount = dev.info->maxOutputChannels; 
    dev.parameters.sampleFormat = paFloat32; 

    if((dev.sampleRate = GetSampleRate(&dev.parameters))<=0){ 
     fprintf(stderr,"Error: Bad output device sample rate.\n"); 
     goto error; 
    } 
    int frameSize= (int)floor(dev.sampleRate/FPS); 
    PaError err; 
    do{ 
     err= Pa_OpenStream(
       &dev.stream, 
       NULL,    
       &dev.parameters, 
       dev.sampleRate, 
       frameSize,   
       paClipOff,   
       paPlayCallback, 
       0); 

     if(err){ 
      fprintf(stderr,"Error: Can't open %s in WASAPI exclusive mode.\n",dev.info->name); 

     } 
    }while(err != paNoError); 
    error_check(Pa_SetStreamFinishedCallback(dev.stream, &StreamFinished)); 
    error_check(Pa_StartStream(dev.stream)); 

    return TRUE; 
error: 
    return FALSE; 
} 

回答

0

看起來你是在共享模式開啓蒸汽。您必須明確設置蒸汽以使用API​​特定參數的獨佔模式。

This post should demonstrate the correct syntax.

你可能會通過修改Windows設備的設置,以符合您的視頻流設置驗證這一點。如果設置相匹配,您應該能夠打開設備併成功流入設備。

如果您查詢設備以獲取默認採樣率和類型,則可以將設備保持共享模式。在共享模式下,您只能使用默認設置打開設備。

MSDN article on exclusive streams