Я реализую синтезатор речи с помощью Audio Unit, основанный на Примеры Core Audio. Все работает как положено, за исключением того, что StopSpeech и StopSpeechAt, похоже, ничего не делают.
Вот методы разговора и остановки:
void
Synthesizer::speak( const string &text )
{
mIsSpeaking = true;
mLastText = text;
NSString *ns_text = [NSString stringWithCString:text.c_str()
encoding:[NSString defaultCStringEncoding]];
CFStringRef cf_text = (__bridge CFStringRef)ns_text;
CheckError( SpeakCFString( mAuChannel, cf_text, NULL ), "SpeakCFString failed" );
}
void
Synthesizer::stop()
{
if ( isSpeaking() ) {
mStopRequested = true;
CheckError( StopSpeech( mAuChannel ), "StopSpeech failed" );
}
else {
mIsSpeaking = false;
}
}
Я убедился, что StopSpeech вызывается в том же потоке, что и SpeakCFString. Как ни странно, когда я пытаюсь войти в вызов StopSpeech с помощью отладчика, он сразу пропускается. Действительно странно, что Callback Done вызывается, когда вызывается StopSpeech, но речь продолжается независимо от этого.
Любая идея, что может происходить, или что я могу сделать, чтобы отладить? Есть ли какое-то временное решение, которое я мог бы использовать для временного отключения узла аудиоустройства?
Это на MacOS 10.12.5.
Задача ещё не решена.
Других решений пока нет …