0

MinGWg++コンパイラでコンパイルされたwxWidgetsを使用してプロジェクトを構築しています。また、wxWidgetsプラットフォームのコンポーネントを使用してmp3サウンドクリップを再生していましたが、信頼性が低いため、別の解決策を探しました。私はaudiereを見つけ、彼らのWebサイトからバージョン1.9.4をダウンロードしました。パッケージには、*。libファイルと*.dllが含まれていました。これをプロジェクトに追加しようとしましたが、機能しません(ダウンロードしたパッケージがMSVCでコンパイルされているためだと思います)。

lib2aというツールを使用して*.defファイルを作成し、MSVClibからMinGWで使用できる.alibに変換しました。defファイルにはこれらの定義があります...

ライブラリー "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の名前マングリングの問題を修正する簡単な方法はありますか?

おそらく、バイナリエディタで編集して名前を「修正」し、これを既存のコードで機能させることができます(MinGWを使用して[可能であれば]再コンパイルしてdllを作成するためにaudiereコード全体をダウンロードすることはできません...避けたい可能であればこれ)...私の出発点は* .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) タイマーを追加して、サウンド クリップの再生がいつ終了するかを監視できるようにします。私の場合、1秒間に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) 実際にサウンド クリップを開始 (ロードして再生) したいコードで、次のようなものを追加します。

(wxString オブジェクトから取り出すには char_str メソッドが必要であることに注意してください)

fileName.sprintf(wxT("c:\\testsound.mp3"));
sound = audiere::OpenSound(device, fileName.char_str(), true);
sound -> play();
timer.Start(250);

12) すでにクリップがロードされていて、再ロードせずにもう一度再生したいとします。その場合は、手順 11 の最後の 2 行を繰り返すだけです (sound -> play(); と timer.Start(250);)。

一言で言えば、始める必要があります。

于 2012-09-07T16:28:36.530 に答える