如何在MinGW中使用audiere dll

时间:2012-09-05 15:50:51

标签: visual-c++ dll linker mingw name-mangling

我正在使用使用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中使用它。

任何人都有关于如何做到这一点的线索?

2 个答案:

答案 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文件中? :)可能有助于告诉人们使用哪些文件。