2016-09-27 4 views
1

私は、PortAudio V19-devel(pa_stable_v19_20140130)を使用して、テキスト読み上げエンジンの出力を合成します。PortAudioでPa_IsStreamActiveを使用するには?

まず、PaStreamFinishedCallback (void *userData)を使用して関数を登録しました。そのため、オーディオストリームが非アクティブになったときに呼び出されます。

(オーディオデータを処理するためのコールバックでbeeingて換言すれば)「アクティブ」状態にbeeingて及びpaAbortを戻しながらStream State Machineによれば、我々は状態への遷移は、すべての後に、「コールバックが完了」とPa_IsStreamActive戻り0トリガバッファがキャンセルされました。

残念ながらPa_IsStreamActivepaAbortの後に1を返しますので、残念ながら私はこのように正しく行う方法を知らないのです。問題は、すべてのバッファがキャンセルされたことを確認する方法です。これは、オーディオストリームの後に呼び出される私のコールバックのコードは、終了しているされて

int AudioConnection::onAudioDataReceived (const void *input, void *output, 
     unsigned long frames, const PaStreamCallbackTimeInfo *time, 
     PaStreamCallbackFlags status, void *userdata 
    ) { 

    int finished; 
    unsigned int i; 
    AudioConnection *data = (AudioConnection *)userdata; 
    unsigned int framesLeft = data->numFrames - data->cursor; 

    int8_t *out = (int8_t *)output; 

    // Declared to prevent unused variable warnings 
    (void) time; (void) input; (void) status; 

    if (framesLeft >= frames) { 
     for (i = 0; i < frames; i++) { 
      *out++ = data->audioSamples[data->cursor++]; 
      *out++ = data->audioSamples[data->cursor++]; 

     } 
     data->cursor += frames; 
     finished = paContinue; 
    } 

    else if (framesLeft == 0) { 
     *out++ = 0; 
     *out++ = 0; 
     data->cursor = 0; 
     finished = paAbort; 
    } 

    // final buffer 
    else if (framesLeft < frames) { 
     for (i = 0; i < framesLeft; i++) { 
      *out++ = data->audioSamples[data->cursor++]; 
      *out++ = data->audioSamples[data->cursor++]; 
     } 
     data->cursor = 0; 
     finished = paComplete; 
    } 

    // should never happen 
    else { 
     finished = paAbort; 
    } 

    return finished; 
} 

:あなたは私のコードの対応するスニペットを見ることができます

void AudioConnection::onAudioStreamFinished (void *userdata) { 

    AudioConnection *data = (AudioConnection *) userdata; 

    ACE_DEBUG ((LM_TRACE, ACE_TEXT ("(%t | %P | %D | %N) AudioConnection::onAudioStreamFinished()\n"))); 
    ACE_DEBUG ((LM_TRACE, ACE_TEXT ("(%t | %P | %D | %N) AudioConnection::isAudioStreamActive() = %d \n"), data->isAudioStreamActive())); 
} 

そして

bool AudioConnection::isAudioStreamActive() { 

    return Pa_IsStreamActive (audioStream) ? true : false; 
} 

次トレースは問題を示しています - 最後の行にあるisAudioStreamActiveが0を返すことを期待しています。これに関するフィードバックは高く評価されます。ありがとう!

(1987417168 | 19339 | 2016-09-27 23:10:30.935040 | ../src/AudioConnection.cpp) AudioConnection::isAudioStreamActive() = 0 
(1987417168 | 19339 | 2016-09-27 23:10:30.936162 | ../src/AudioConnection.cpp) AudioConnection::playAudioStream() 
(1954542672 | 19339 | 2016-09-27 23:10:30.977247 | ../src/AudioConnection.cpp) AudioConnection framesLeft: 27648 
(1954542672 | 19339 | 2016-09-27 23:10:31.007114 | ../src/AudioConnection.cpp) AudioConnection framesLeft: 26112 
(1954542672 | 19339 | 2016-09-27 23:10:31.037122 | ../src/AudioConnection.cpp) AudioConnection framesLeft: 24576 
(1954542672 | 19339 | 2016-09-27 23:10:31.067106 | ../src/AudioConnection.cpp) AudioConnection framesLeft: 23040 
(1954542672 | 19339 | 2016-09-27 23:10:31.097107 | ../src/AudioConnection.cpp) AudioConnection framesLeft: 21504 
(1954542672 | 19339 | 2016-09-27 23:10:31.137147 | ../src/AudioConnection.cpp) AudioConnection framesLeft: 19968 
(1954542672 | 19339 | 2016-09-27 23:10:31.187113 | ../src/AudioConnection.cpp) AudioConnection framesLeft: 18432 
(1954542672 | 19339 | 2016-09-27 23:10:31.237124 | ../src/AudioConnection.cpp) AudioConnection framesLeft: 16896 
(1954542672 | 19339 | 2016-09-27 23:10:31.287146 | ../src/AudioConnection.cpp) AudioConnection framesLeft: 15360 
(1954542672 | 19339 | 2016-09-27 23:10:31.337112 | ../src/AudioConnection.cpp) AudioConnection framesLeft: 13824 
(1954542672 | 19339 | 2016-09-27 23:10:31.387106 | ../src/AudioConnection.cpp) AudioConnection framesLeft: 12288 
(1954542672 | 19339 | 2016-09-27 23:10:31.437225 | ../src/AudioConnection.cpp) AudioConnection framesLeft: 10752 
(1954542672 | 19339 | 2016-09-27 23:10:31.487161 | ../src/AudioConnection.cpp) AudioConnection framesLeft: 9216 
(1954542672 | 19339 | 2016-09-27 23:10:31.537158 | ../src/AudioConnection.cpp) AudioConnection framesLeft: 7680 
(1954542672 | 19339 | 2016-09-27 23:10:31.587206 | ../src/AudioConnection.cpp) AudioConnection framesLeft: 6144 
(1954542672 | 19339 | 2016-09-27 23:10:31.637156 | ../src/AudioConnection.cpp) AudioConnection framesLeft: 4608 
(1954542672 | 19339 | 2016-09-27 23:10:31.687188 | ../src/AudioConnection.cpp) AudioConnection framesLeft: 3072 
(1954542672 | 19339 | 2016-09-27 23:10:31.737236 | ../src/AudioConnection.cpp) AudioConnection framesLeft: 1536 
(1954542672 | 19339 | 2016-09-27 23:10:31.787165 | ../src/AudioConnection.cpp) AudioConnection framesLeft: 0 .......silence. 
(1954542672 | 19339 | 2016-09-27 23:10:31.787428 | ../src/AudioConnection.cpp) AudioConnection::onAudioStreamFinished() 
(1954542672 | 19339 | 2016-09-27 23:10:31.787736 | ../src/AudioConnection.cpp) AudioConnection::isAudioStreamActive() = 1 

答えて

0

Pa_IsStreamActiveの結果は、使用するホストによって異なります。あまり驚くことではないが、paAbortの後に1を返すということは、何か異常が生じたことを意味し、PortAudioは直ちに終了すべきだからである。この場合、ほとんどの場合、代わりにpaCompleteを使用します。私はあなたが "最終バッファ"のためにframesLeft <= framesをしたいと思う。

関連する問題