2016-10-03 2 views
0

Я читаю аудиофайлы wav с помощью PortAudio. Функция обратного вызова работает нормально, и файлы воспроизводятся ОК в Ubunto, как и должно быть. Проблема в том, что когда я пытаюсь получить время, используя Pa_GetStreamTime, когда он возвращает 0, я читал документацию и примеры portaudio, но я не мог найти способ устранения неполадок или, по крайней мере, пример использования этой функции. Я просмотрел документацию API here, но ничего не звонит в колокол. Если кто-то может дать подсказку, это будет очень признательно. Ниже представлена ​​часть реализации, в которой выполняется функция обратного вызова, я использую Qt, так как моя конечная цель отображает FTT любого wav-файла. Заранее спасибо.Pa_GetStreamTime возвращается 0 раз

int playAudio::patestCallback(const void *inputBuffer, void *outputBuffer, 
         unsigned long framesPerBuffer, 
         const PaStreamCallbackTimeInfo* timeInfo, 
         PaStreamCallbackFlags statusFlags, 
         void *userData) 
{ 

    /* Cast data passed through stream to our structure. */ 
    // data = (WAV*)userData; 
    float *out = (float*)outputBuffer; 
    (void) inputBuffer; /* Prevent unused variable warning. */ 

    /*terminates the stream flows and reset cursor.*/ 
    if (cursor == playAudio::SubChunk2Size/4) 
    { 
     cursor = 0; 
     return paComplete; 
    } 

    for (int i = 0; i < framesPerBuffer; i++) 
    { 
     if (cursor == playAudio::SubChunk2Size/4) break; // breaks if samples reached last. 
     *(out++) = pLeftChannel[cursor]; 
     *(out++) = pRightChannel[cursor]; 
     cursor++; 

    } 
    // qDebug()<<cursor; 
    playAudio::audioTime = Pa_GetStreamTime(stream); 
    qDebug() << playAudio::audioTime; 
    return paContinue; 
} 

ответ

0

Цитирую the documentation для аудио обратного вызова Portaudio:

Прежде чем мы начнем, это важно понимать, что обратный вызов является тонкое место. Это связано с тем, что некоторые системы выполняют обратный вызов в специальном потоке или обработчике прерываний, и он редко обрабатывает так же, как и остальную часть вашего кода. Для большинства современных систем вам не будет , способным вызвать сбои, сделав запрещенные вызовы в обратном вызове, но , если вы хотите, чтобы ваш код генерировал звук без глюков, вам нужно будет , убедитесь, что вы избегаете функциональных вызовов, которые могут возьмите неограниченную сумму времени для выполнения. Именно то, что зависит от вашей платформы, но почти наверняка включает в себя следующее: память распределение/освобождение, ввод-вывод (включая ввод/вывод файлов, а также консоль I/O, например printf()), контекст (например, exec() или yield()), операции mutex или что-либо еще, что может положиться на ОС. Если вы считаете, что короткие критические разделы безопасны, пожалуйста, прочитайте о приоритете инверсии. Планировщики Windows amd Mac OS не имеют безопасной защиты от приоритетов в режиме реального времени . Другие платформы требуют специальных флагов mutex . Кроме того, небезопасно вызывать любые функции API PortAudio в обратном вызове, за исключением случаев, явно разрешенных в документации.

Emphasis mine.

Другими словами, вызов Pa_GetStreamTime() из обратного вызова является неопределенным поведением. Но вам не нужно называть эту функцию в первую очередь. Зачем? Поскольку четвертым параметром обратного вызова является структура PaStreamCallbackTimeInfo, которая содержит ту же самую информацию о времени, к которой вы пытаетесь получить доступ.

Кроме того, звонок qDebug, скорее всего, испортит ваше воспроизведение звука. Запись на stdout просто занимает слишком много времени, чтобы завершить внутри обратного вызова звука в реальном времени.

+0

Спасибо, действительно, я пробовал эту структуру PaStreamCall ... раньше, потому что я не хотел испортить функцию обратного вызова, но в члене currentTime, я получил 0s; используя outputBufferDACtime, я мог видеть время данных, но не уверен, как справиться с этим, я добавляю их, но результат не имеет смысла, поэтому попытка Pa_getStreamTime дала тот же результат, когда я использовал currentTime. О qDebug вы правы, в моем случае не дают проблем, в конечном итоге будут удалены. Если вы можете обмениваться информацией с помощью portaudio и получать время или знать, как обрабатывать эти данные из timeInfo.OutputBufferDACTime. – luffyKun

 Смежные вопросы

  • Нет связанных вопросов^_^