私は、PortAudio V19-devel(pa_stable_v19_20140130)を使用して、テキスト読み上げエンジンの出力を合成します。PortAudioでPa_IsStreamActiveを使用するには?
まず、PaStreamFinishedCallback (void *userData)
を使用して関数を登録しました。そのため、オーディオストリームが非アクティブになったときに呼び出されます。
(オーディオデータを処理するためのコールバックでbeeingて換言すれば)「アクティブ」状態にbeeingて及びpaAbort
を戻しながらStream State Machineによれば、我々は状態への遷移は、すべての後に、「コールバックが完了」とPa_IsStreamActive
戻り0トリガバッファがキャンセルされました。
残念ながらPa_IsStreamActive
はpaAbort
の後に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