0

我正在使用用 MinGW g++ 编译器编译的 wxWidgets 构建一个项目。我也在使用 wxWidgets 平台的一个组件来播放 mp3 声音片段,但它不可靠,所以我去寻找另一个解决方案。我找到了 audiere 并从他们的网站下载了 1.9.4 版本。该软件包包含一个 *.lib 文件和一个 *.dll。我试图将它添加到我的项目中,但它不起作用(我认为是因为我下载的包是在 MSVC 中编译的)。

我使用名为 lib2a 的工具创建了一个 *.def 文件,以将 MSVC 库转换为可以与 MinGW 一起使用的 .a 库。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 toimp _AdrOpenSampleSource@8' * MinGWUnicodeRelease/AlphaPanel.o:AlphaPanel.cpp:(.text+0x830f): 未定义引用_imp__AdrOpenSound@12' *** MinGWUnicodeRelease/AlphaPanel.o:AlphaPanel.cpp:(.text+0x87ce): undefined reference toimp _AdrOpenDevice@ 8' * MinGWUnicodeRelease/AlphaPanel.o:AlphaPanel.cpp:(.text+0x8818): 未定义对_imp__AdrOpenSampleSource@8' *** MinGWUnicodeRelease/AlphaPanel.o:AlphaPanel.cpp:(.text+0x884c): undefined reference toimp _AdrOpenSound@12' 的引用

例如,在我的代码中,函数是“OpenDevice”...在 def 文件中它是 >“_AdrOpenDevice@8”,但在我的未定义引用链接错误中,它是“ imp _AdrOpenDevice@8”。所以我的头在旋转,不知道此时该做什么。

有没有一种简单的方法可以解决 dll 中的名称修改问题?

也许用二进制编辑器编辑它以“修复”名称并让它与我现有的代码一起工作(没有下载整个audiere代码来重新编译和创建dll [如果可能的话]使用MinGW ...我想避免如果可以的话)...我的起点是一个 *.lib 文件和一个在 MSVC 中创建的 dll,但我需要在 MinGW 中使用它。

有人对如何做到这一点有任何线索吗?

4

2 回答 2

3

我想出了如何在 Windows 中使用 audiere ......(这是我的解决方案,但如果你想使用它并且你需要做类似的事情,你可能会发现这作为起点很有用)......

我收到一大堆关于拥有虚拟函数但没有虚拟析构函数的警告消息......不知道如何摆脱这些,但它仍然有效。

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 中的最后两行(声音 -> play(); 和 timer.Start(250);)

简而言之,这应该可以帮助您入门。

于 2012-09-07T16:28:36.530 回答
0

请原谅,您的源代码在哪个*.h 文件中?:) 告诉人们使用哪些文件可能会有所帮助。

于 2014-03-21T04:06:36.807 回答