我正在使用使用MinGW g ++编译器编译的wxWidgets构建项目。我也使用wxWidgets平台的一个组件来播放mp3声音片段,但它一直不可靠,所以我去寻找另一个解决方案。我从他们的网站上找到了audiere并下载了1.9.4版。该软件包包含* .lib文件和* .dll。我试图将此添加到我的项目中,但它不起作用(我认为因为我下载的软件包是在MSVC中编译的)。
我使用名为lib2a的工具创建了一个* .def文件,以便从MSVC lib转换为可以与MinGW一起使用的.a lib。 def文件有这些定义......
LIBRARY" audiere.dll" EXPORTS _AdrCreateLoopPointSource @ 4 _AdrCreateMemoryFile @ 8 _AdrCreatePinkNoise @ 0 _AdrCreateSampleBuffer @ 20 _AdrCreateSampleBufferFromSource @ 4 _AdrCreateSquareWave @ 8 _AdrCreateTone @ 8 _AdrCreateWhiteNoise @ 0 _AdrEnumerateCDDevices @ 0 _AdrGetSampleSize @ 4 _AdrGetSupportedAudioDevices @ 0 _AdrGetSupportedFileFormats @ 0 _AdrGetVersion @ 0 _AdrOpenCDDevice @ 4 _AdrOpenDevice @ 8 _AdrOpenFile @ 8 _AdrOpenMIDIDevice @ 4 _AdrOpenSampleSource @ 8 _AdrOpenSampleSourceFromFile @ 8 _AdrOpenSound @ 12 _AdrOpenSoundEffect @ 12
当我去链接我的项目时,我收到以下错误:
* MinGWUnicodeRelease / AlphaPanel.o:AlphaPanel.cpp :(。text + 0x8291):未定义引用
_imp__AdrOpenDevice@8' *** MinGWUnicodeRelease/AlphaPanel.o:AlphaPanel.cpp:(.text+0x82db): undefined reference to
imp _AdrOpenSampleSource @ 8' * MinGWUnicodeRelease / AlphaPanel.o:AlphaPanel.cpp :(。text + 0x830f):未定义引用_imp__AdrOpenSound@12' *** MinGWUnicodeRelease/AlphaPanel.o:AlphaPanel.cpp:(.text+0x87ce): undefined reference to
imp _AdrOpenDevice @ 8' * MinGWUnicodeRelease / AlphaPanel.o:AlphaPanel.cpp :(。text + 0x8818):未定义引用_imp__AdrOpenSampleSource@8' *** MinGWUnicodeRelease/AlphaPanel.o:AlphaPanel.cpp:(.text+0x884c): undefined reference to
imp _AdrOpenSound @ 12'
在我的代码中,例如函数是" OpenDevice" ...在def文件中它是>" _AdrOpenDevice @ 8",但在我的未定义引用链接错误中它是" 小鬼 _AdrOpenDevice @ 8&#34 ;.所以我的头在旋转,不知道该做什么。
有没有一种简单的方法来修复dll中的名称修改问题?
也许用二进制编辑器编辑它来修复"这些名称让我的现有代码工作(没有下载整个audiere代码重新编译并使用MinGW创建dll [如果可能] ...如果可以的话我想避免这种情况... ...我的出发点是a * .lib文件和在MSVC中创建的dll,但我需要在MinGW中使用它。
任何人都有关于如何做到这一点的线索?
答案 0 :(得分:3)
我想出了如何在Windows上使用audiere ....(这是我的解决方案,但如果你想使用它并且你需要做类似的事情,你可能会发现这个有用的起点......)< / p>
我得到了一大堆关于虚拟函数但没有虚拟析构函数的警告消息......不知道如何摆脱这些,但它仍然有效。
1)下载适用于Windows的1.9.4包的二进制文件 2)从这个包中,你只需要3个文件。 audiere.h,audiere.dll和audiere.lib,它们位于不同的目录中。 3)将audiere.lib重命名为audiere.a 4)将audiere.dll复制到运行可执行文件的同一目录,以便在运行时找到它。 5)将audiere.a复制到链接器目录并将其添加到项目的文件列表中。 6)将audiere.h复制到您的所有其他* .h文件所在的源目录。 7)在源代码的* .h文件中,添加#include“audiere.h”(注意不要) 8)同样在* .h文件中,将以下内容添加为全局变量(我不使用名称空间,因此我指定了完全限定名称)
audiere::AudioDevicePtr device;
audiere::OutputStreamPtr sound;
9)在* .cpp文件的构造函数中,添加以下内容:
device = audiere::OpenDevice();
10)添加计时器,以便您可以监听声音剪辑何时播放完毕。对我来说,它每秒发射4次。剪辑完成后,计时器停止。这是我的代码:
void MyClass::OnTimerEvent( wxTimerEvent& event )
{
bool restartTimer = true;
bool isItPlaying;
timer.Stop();
isItPlaying = sound -> isPlaying();
// check status of audio clip
if (isItPlaying == false)
timer.Start(250);
else {
// re-enable any controls you disabled while audio clip was playing
} // end else
} // end OnTimerEvent
11)在您的代码中,您实际上想要启动(加载和播放)声音片段 - 添加如下内容:
(请注意,您需要使用char_str方法将其从wxString对象中拉出来)
fileName.sprintf(wxT("c:\\testsound.mp3"));
sound = audiere::OpenSound(device, fileName.char_str(), true);
sound -> play();
timer.Start(250);
12)假设您已经加载了剪辑并希望在不重新加载的情况下再次播放它。在这种情况下,只需重复步骤11中的最后两行(sound - &gt; play();和timer.Start(250);)
简而言之,应该让你开始。
答案 1 :(得分:0)
请原谅,但在源代码的 * .h文件中? :)可能有助于告诉人们使用哪些文件。