解释来自 Superpowered CrossExample for Android 的 C++ 代码

Posted

技术标签:

【中文标题】解释来自 Superpowered CrossExample for Android 的 C++ 代码【英文标题】:Explain C++ code from Superpowered CrossExample for Android 【发布时间】:2016-12-16 01:22:36 【问题描述】:

此代码出现在来自superpowered.com 的CrossExample 中:

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)

【问题讨论】:

【参考方案1】:

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

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

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

【讨论】:

以上是关于解释来自 Superpowered CrossExample for Android 的 C++ 代码的主要内容,如果未能解决你的问题,请参考以下文章

当 Superpowered Reverb 与 Audio Graph 一起使用时,处理的音频非常嘈杂

通过 BPM 将音轨分割成片段,并使用 Superpowered iOS 分析每个片段

解释来自 KDAB 博客的引述

在 WPF 中,解释来自 Dispatcher 与来自事件处理程序的 UI 更新顺序 [重复]

解释来自 OpenCV matchShapes() 的数字

来自管道模型的 pyspark 模型解释