Я пытаюсь интегрировать SoundTouch (https://www.surina.net/soundtouch/) в качестве общей библиотеки в кроссплатформенное приложение Qt. Версия в репозиториях Ubuntu, кажется, предоставляет интерфейс C ++, подобный этому:
this->soundTouchHandle = new SoundTouch();
this->soundTouchHandle->setSampleRate(44100);
this->soundTouchHandle->setChannels(2);
this->soundTouchHandle->setSetting(SETTING_USE_AA_FILTER, 1);
this->soundTouchHandle->setPitch(this->pitchScalingFactor);
Но похоже, что нормальный способ использовать его в Windows — через оболочку SoundTouchDLL C (которая обеспечивает __cdecl
экспорт):
this->soundTouchHandle = soundtouch_createInstance();
soundtouch_setSampleRate(this->soundTouchHandle, 44100);
soundtouch_setChannels(this->soundTouchHandle, 2);
soundtouch_setSetting(this->soundTouchHandle, SETTING_USE_AA_FILTER, 1);
soundtouch_setPitch(this->soundTouchHandle, this->pitchScalingFactor);
Если я правильно понимаю, Linux не нуждается в __cdecl
аннотации, интерфейс SoundTouchDLL на основе C специально для Windows. SoundTouchDLL.h четко содержит специфичный для Windows код (например, #include <windows.h>
). С другой стороны, базовая библиотека C ++ SoundTouch не включает аннотации для экспорта любых символов с __cdecl
, поэтому он не может использоваться в качестве общей библиотеки (DLL) в Windows, требуется интерфейс C.
Правильно ли я понял это? Действительно ли нормально использовать C API для SoundTouch в Windows, но использовать C ++ API в Linux? Есть ли способ использовать один и тот же API на обеих платформах (желательно без изменения SoundTouch)?
Задача ещё не решена.
Других решений пока нет …