Callback function with carbon API

164 views Asked by At

I'm trying to install a callback function with a carbon API but it doesn't work: it is triggered correctly by the event (when it finishes speaking) but it returns a segmentation fault 11 instead of printing "...Finished.".

Here's the code:

...
/* Creates SpeechChannel */
SpeechChannel speechchannel;
NewSpeechChannel(NULL,&speechchannel);


/* Sets callback */
CFNumberRef cbf = CFNumberCreate (
                            NULL,
                            kCFNumberLongType,
                            MySpeechDoneProc
                            );
OSErr error1;
error1 = SetSpeechProperty (speechchannel,kSpeechSpeechDoneCallBack,cbf);


/* Speaks it */
OSErr error2;
error2 = SpeakCFString(speechchannel, finalString, NULL);
...

later there is:

void MySpeechDoneProc (SpeechChannel chan,long refCon)
{
printf("...Finished.");
};

I guess I'm not installing the callback function properly?

1

There are 1 answers

0
Anton Maria Prati On BEST ANSWER

The problem was that I didn't use the pointer to callback function in the creation of the CFNumberRef. The solution is twofold:

1) Declare the pointer for the function along with the function:

/* callback function */
void MySpeechDoneProc (SpeechChannel chan,long refCon);
/* callback function pointer */
void (*MySpeechDoneProcPtr)(SpeechChannel,long);

2) Pass the address of the callback function pointer as third argument in CFNumberCreate:

error1 = SetSpeechProperty (speechchannel,kSpeechSpeechDoneCallBack,cbf);

Here is the working code:

...
/* Creates SpeechChannel */
SpeechChannel speechchannel;
NewSpeechChannel(NULL,&speechchannel);


/* Sets callback */
MySpeechDoneProcPtr = &MySpeechDoneProc;
CFNumberRef cbf = CFNumberCreate (
                            NULL,
                            kCFNumberLongType,
                            &MySpeechDoneProcPtr
                            );
OSErr error1;
error1 = SetSpeechProperty (speechchannel,kSpeechSpeechDoneCallBack,cbf);


/* Speaks it */
OSErr error2;
printf("Speaking...\n");
error2 = SpeakCFString(speechchannel, finalString, NULL);
...