2012-09-05 6 views
0

Я создаю проект, используя wxWidgets, скомпилированный с компилятором MinGW g ++. Я также использовал компонент платформы wxWidgets для воспроизведения аудиоклипов mp3, но он был ненадежным, поэтому я пошел искать другое решение. Я нашел audiere и скачал версию 1.9.4 со своего сайта. Пакет содержит файл * .lib и * .dll. Я пытался добавить это в свой проект, но он не работает (я думаю, потому что пакет, который я загрузил, был скомпилирован в MSVC).Как использовать dll audiere с MinGW

Я создал файл * .def с помощью инструмента lib2a для преобразования из библиотеки MSVC в .a lib, который я мог бы использовать с MinGW. Файл Защиту имеет эти определения ...

БИБЛИОТЕКА "audiere.dll" ЭКСПоРТ _AdrCreateLoopPointSource @ 4 _AdrCreateMemoryFile @ 8 _AdrCreatePinkNoise @ 0 _AdrCreateSampleBuffer @ 20 _AdrCreateSampleBufferFromSource @ 4 _AdrCreateSquareWave @ 8 _AdrCreateTone @ 8 _AdrCreateWhiteNoise @ 0 _AdrEnumerateCDDevices @ 0 _AdrGetSampleSize @ 4 _AdrGetSupportedAudioDevices @ 0 _AdrGetSupportedFileFormats @ 0 _A drGetVersion @ 0 _AdrOpenCDDevice @ 4 _AdrOpenDevice @ 8 _AdrOpenFile @ 8 _AdrOpenMIDIDevice @ 4 _AdrOpenSampleSource @ 8 _AdrOpenSampleSourceFromFile @ 8 _AdrOpenSound @ 12 _AdrOpenSoundEffect @ 12

Когда я иду, чтобы связать мой проект, я получаю следующие ошибки:

* MinGWUnicodeRelease/AlphaPanel.o:. AlphaPanel.cpp :(текст + 0x8291): неопределенная ссылка на [email protected]' *** MinGWUnicodeRelease/AlphaPanel.o:AlphaPanel.cpp:(.text+0x82db): undefined reference toимп _AdrOpenSampleSource @ 8' * MinGWUnicodeRelease/AlphaPanel.o:. AlphaPanel.cpp :(текст + 0x830f): неопределенная ссылка на [email protected]' *** MinGWUnicodeRelease/AlphaPanel.o:AlphaPanel.cpp:(.text+0x87ce): undefined reference toимп _AdrOpenDevice @ 8' * MinGWUnicodeRelease/AlphaPanel.o: AlphaPanel . .cpp :(текст + 0x8818): неопределенная ссылка на [email protected]' *** MinGWUnicodeRelease/AlphaPanel.o:AlphaPanel.cpp:(.text+0x884c): undefined reference toимп _AdrOpenSound @ 12'

в моем коде, например, функция является "OpenDevice" ... в защиту это за файл> "_ AdrOpenDevice @ 8 ", но в моей неопределенной ссылке ссылка error это" i mp _AdrOpenDevice @ 8 ". Так что моя голова вращается и не уверен, что делать в этот момент.

Есть ли простой способ исправить проблему с изменением имени в dll?

Возможно, отредактировать его с помощью двоичного редактора, чтобы «исправить» имена и заставить их работать с моим существующим кодом (не загружая весь код audiere, чтобы перекомпилировать и создать dll [если возможно] с помощью MinGW ... Я хочу избежать этого, если смогу) ... отправной точкой является файл * .lib и dll, созданный в MSVC, но мне нужно использовать его в MinGW.

У кого-нибудь есть подсказки о том, как это сделать?

ответ

3

Я понял, как использовать audiere с Windows ....(это мое решение, но вы можете найти это полезным в качестве отправной точки, если вы хотите использовать это, и вам нужно сделать что-то подобное) ...

Я получаю целую кучу предупреждающих сообщений о том, виртуальные функции, но не имеющие виртуального деструктора ... не знают, как избавиться от них, но он по-прежнему работает.

1) Загрузить двоичные файлы для пакета 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 (звук -> воспроизведение(), а timer.Start (250);)

В двух словах, которые должны вас начать.

+0

Это отличный ответ. – dk123

0

Прошу прощения, но в , который * .h файл вашего исходного кода? :) Может быть полезно рассказать людям, с какими файлами работать.

 Смежные вопросы

  • Нет связанных вопросов^_^