我一直在使用Dragonmobile sdk和音频音响系统,尝试进行语音识别 - >文本到语音链。
这是我的代码:
(这里有语音识别部分)
- (void)recognizer:(SKRecognizer *)recognizer didFinishWithResults:{
...
SystemSoundID id = [self playSound:url2]; //playSound
AudioServicesAddSystemSoundCompletion (
id,
NULL,
NULL,
detectSoundFinish,
NULL
);
...
}
- (void)performRecognition:(id)sender
{
if (!recognizer){
self.recognizer = [[SKRecognizer alloc] initWithType:SKDictationRecognizerType detection:SKLongEndOfSpeechDetection language:@"en_US" delegate:self];
}
}
void detectSoundFinish ( SystemSoundID ssID, void *clientData )
{
printf("end\n");
//I want to call performRecognition here, or an equivalent thing.
}
我是目标C的新手(甚至是C.我主要用Python编写代码),我理解回调函数不属于我的类。所以,我的问题是 1.有没有办法在回调函数中调用objc方法? 2.或者,一种从回调访问主类属性的方法? 我一整天都在搜索和尝试,但还没弄明白该怎么做。 谢谢!
答案 0 :(得分:2)
您不能使用Objective-C函数作为C函数的回调。
你可以做的是使用最后一个参数,用于传递你想要的任何数据,将指针传递给你的类实例。
AudioServicesAddSystemSoundCompletion (id,
NULL,
NULL,
MyAudioServicesSystemSoundCompletionProc,
self);
并在C回调函数体内,将指针强制转换为类,并使用它!
void MyAudioServicesSystemSoundCompletionProc (SystemSoundID ssID, void *clientData);
{
MyClass *obj = (MyClass*)clientData;
// use obj in the normal Objective-C way!!!
}