2013-11-23 3 views
0

У меня есть программа, которая выводит аудио через Portaudio. Он работает по большей части, но есть некоторые USB-устройства, которые используют встроенные драйверы USB-USB Windows, которые не работают.Portaudio не работает с некоторыми аудиоустройствами USB

У меня нет ошибок, и программа показывает данные, обрабатываемые в моей программе, но когда аудиопоток отправляется на portaudio, звук с USB-устройства не выводится. Кажется, что portaudio не инициализирует устройство и поэтому не может отправить ему поток данных.

Некоторые USB-устройства будут работать на одном USB-порту, но когда я переведу его на другой порт USB на том же компьютере, это не сработает.

Другие устройства USB не будут работать на любом USB-порту.

Однако все устройства USB прекрасно работают при выводе звука из других программ или при использовании тестового аудиовыхода Windows.

Я не могу понять, почему некоторые 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.

Вы можете проверить это, изменив настройки окна устройства в соответствии с настройками потока. Если настройки совпадают, вы должны иметь возможность успешно открыть устройство и поток.

Вы можете оставить устройство в режиме общего доступа, если вы запрашиваете устройство для получения частоты и типа выборки по умолчанию. В режиме общего доступа вы можете открыть устройство только с настройками по умолчанию.

MSDN article on exclusive streams