为 Android 解释 Superpowered CrossExample 中的 C++ 代码

Explain C++ code from Superpowered CrossExample for Android

此代码出现在 CrossExample from superpowered.com:

static void playerEventCallbackA(void *clientData, SuperpoweredAdvancedAudioPlayerEvent event, void * __unused value) {
    if (event == SuperpoweredAdvancedAudioPlayerEvent_LoadSuccess) {

        SuperpoweredAdvancedAudioPlayer *playerA = *((SuperpoweredAdvancedAudioPlayer **)clientData);

        playerA->setBpm(126.0f);
        playerA->setFirstBeatMs(353);
        playerA->setPosition(playerA->firstBeatMs, false, false);
    };
}    

    playerA = new SuperpoweredAdvancedAudioPlayer(&playerA , playerEventCallbackA, samplerate, 0);

    playerA->open(path, fileAoffset, fileAlength);

任何人都可以帮助我理解 if 语句中的第一行吗?特别是,我如何解释作业的右侧?

*((SuperpoweredAdvancedAudioPlayer **)clientData)

clientData 作为 void pointer 传递。后来,它被转换为 SuperpoweredAdvancedAudioPlayer 类型的 pointer to pointer。我 suposse clientData 在将它传递给函数之前是那种类型,这就是为什么需要强制转换的原因。我不知道为什么用这个void*而不是SuperpoweredAdvancedAudioPlayer**。不好,但也不罕见。

名为 playerA 的 var 是指向类型 SuperpoweredAdvancedAudioPlayer 的对象的指针。取消引用指向指针的指针,您将获得指向 SuperpoweredAdvancedAudioPlayer 对象的指针,与 playerA 的类型相同。

请注意 playerA 仅在 if 块内声明,它的生命到此结束。块外还有另一个 playerA,必须在将其分配给任何东西之前声明。