C++ 解释C++;来自超级强大的Android CrossExample的代码

C++ 解释C++;来自超级强大的Android CrossExample的代码,c++,audio,signal-processing,superpowered,C++,Audio,Signal Processing,Superpowered,此代码出现在源中: 有人能帮我理解if语句中的第一行吗?特别是,我如何解释作业的右侧 *((SuperpoweredAdvancedAudioPlayer**)clientData)clientData作为无效指针传递。之后,它被转换为类型为超级强大的AdvancedAudioPlayer的指向指针的指针。在将其传递给函数之前,我认为clientData属于该类型,这就是为什么需要强制转换。我不知道为什么用这个void*来代替SuperpoweredAdvancedAudioPlayer**。不

此代码出现在源中:

有人能帮我理解
if
语句中的第一行吗?特别是,我如何解释作业的右侧


*((SuperpoweredAdvancedAudioPlayer**)clientData)
clientData
作为
无效指针传递。之后,它被转换为
类型为
超级强大的AdvancedAudioPlayer
的指向指针的
指针。在将其传递给函数之前,我认为
clientData
属于该类型,这就是为什么需要强制转换。我不知道为什么用这个
void*
来代替
SuperpoweredAdvancedAudioPlayer**
。不好,但也不少见

名为
playerA
的变量是指向类型为
SuperpoweredAdvancedAudioPlayer
的对象的指针。取消对指针的引用,您将得到一个指向
SuperpoweredAdvancedAudioPlayer
对象的指针,其类型与
playerA
相同。 请注意,
playerA
仅在if块内声明,其生命终止于此。块外还有另一个
playerA
,必须在将其分配给任何对象之前声明

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);