问题描述
我一直在尝试使用 portaudio 用 C++ 编写程序,尝试制作一个简单的音频应用程序,可以录制和播放音频只是为了学习。所以我有一个类,在这个类中,我初始化了一个变量 PaStreamParameters inputParameters
。好的,稍后在代码中,我打开流以像任何其他程序一样使用 Pa_OpenStream
,
err = Pa_OpenStream(
&stream,&inputParameters,NULL,sampleRate,framesPerBuffer,paNoFlag,recordCallback,data);
而且我收到一个错误,提示我进行了从 int (*)(const void*,const void*,long unsigned int,const PaStreamCallbackTimeInfo*,PaStreamCallbackFlags,void*)
到 int (*)(const void*,void*,void*)
的无效转换;注意第二个参数,从 const void*
转换为 void*
。这对我来说很有意义,实际上传递了一个非 const 变量,而 Pa_OpenStream
被编写为具有一个 const 输入。它甚至出现在文档中:http://www.portaudio.com/docs/v19-doxydocs/portaudio_8h.html#a443ad16338191af364e3be988014cbbe。所以有什么问题?我在多个地方看到过,Pa_OpenStream
被传递了一个非常量参数。录制示例代码 http://portaudio.com/docs/v19-doxydocs/paex__record_8c_source.html 初始化 PaStreamParameters inputParameters,outputParameters;
,改变它们,然后像我一样将其传递给 Pa_OpenStream
。 Ardor 源代码,在 libs/backends/portaudio/portaudio_io.cc
中,open_callback_stream
函数初始化两个 PaStreamParameters
变量,都不是 const,并将它们传递给 Pa_OpenStream
(以修改的方式,检查它是否应该传递NULL)。
这些代码如何工作,而我的不行?它们都没有将 const 输入和输出参数传递给 Pa_OpenStream
并且它们工作。他们如何不会得到从 const void*
到 void*
的无效转换?
audour 源代码供参考:https://github.com/Ardour/ardour/blob/master/libs/backends/portaudio/portaudio_io.cc
解决方法
C++ 将非常量指针转换为常量指针没有问题,两者完全兼容,并且会自动进行转换。但这不是编译器在这里抱怨的。
它在抱怨指向回调函数 recordCallback
的指针。为函数声明的参数类型是该函数类型的一部分,它们必须完全匹配,否则类型不同。