// static void SoundSourceProxy::loadPlugins() { // Initialize built-in file types (last provider wins) #ifdef __SNDFILE__ // libsndfile is just a fallback and will be overwritten by // specialized providers! s_soundSourceProviders.registerProvider(Mixxx::SoundSourceProviderPointer( new Mixxx::SoundSourceProviderSndFile)); #endif s_soundSourceProviders.registerProvider(Mixxx::SoundSourceProviderPointer( new Mixxx::SoundSourceProviderFLAC)); s_soundSourceProviders.registerProvider(Mixxx::SoundSourceProviderPointer( new Mixxx::SoundSourceProviderOggVorbis)); #ifdef __OPUS__ s_soundSourceProviders.registerProvider(Mixxx::SoundSourceProviderPointer( new Mixxx::SoundSourceProviderOpus)); #endif #ifdef __MAD__ s_soundSourceProviders.registerProvider(Mixxx::SoundSourceProviderPointer( new Mixxx::SoundSourceProviderMp3)); #endif #ifdef __MODPLUG__ s_soundSourceProviders.registerProvider(Mixxx::SoundSourceProviderPointer( new Mixxx::SoundSourceProviderModPlug)); #endif #ifdef __COREAUDIO__ s_soundSourceProviders.registerProvider(Mixxx::SoundSourceProviderPointer( new Mixxx::SoundSourceProviderCoreAudio)); #endif #ifdef __FFMPEGFILE__ // FFmpeg currently overrides all other built-in providers // if enabled s_soundSourceProviders.registerProvider(Mixxx::SoundSourceProviderPointer( new Mixxx::SoundSourceProviderFFmpeg)); #endif // Scan for and initialize all plugins. // Loaded plugins will replace any built-in providers // that have been registered before (see above)! const QList<QDir> pluginDirs(getSoundSourcePluginDirectories()); foreach (QDir dir, pluginDirs) { qDebug() << "Loading SoundSource plugins" << dir.path(); const QStringList files(dir.entryList( SOUND_SOURCE_PLUGIN_FILENAME_PATTERN, QDir::Files | QDir::NoDotAndDotDot)); foreach (const QString& file, files) { const QString libFilePath(dir.filePath(file)); Mixxx::SoundSourcePluginLibraryPointer pPluginLibrary( Mixxx::SoundSourcePluginLibrary::load(libFilePath)); if (pPluginLibrary) { s_soundSourceProviders.registerPluginLibrary(pPluginLibrary); } else { qWarning() << "Failed to load SoundSource plugin" << libFilePath; } } }
/*static*/ SoundSourcePluginLibraryPointer SoundSourcePluginLibrary::load( const QString& libFilePath) { const QMutexLocker mutexLocker(&s_loadedPluginLibrariesMutex); if (s_loadedPluginLibraries.contains(libFilePath)) { return s_loadedPluginLibraries.value(libFilePath); } else { SoundSourcePluginLibraryPointer pPluginLibrary( new SoundSourcePluginLibrary(libFilePath)); if (pPluginLibrary->init()) { s_loadedPluginLibraries.insert(libFilePath, pPluginLibrary); return pPluginLibrary; } else { return SoundSourcePluginLibraryPointer(); } } }
// static void SoundSourceProxy::loadPlugins() { // Initialize built-in file types. // Fallback providers should be registered before specialized // providers to ensure that they are only after the specialized // provider failed to open a file. But the order of registration // only matters among providers with equal priority. #ifdef __FFMPEGFILE__ // Use FFmpeg as the last resort. s_soundSourceProviders.registerProvider( mixxx::newSoundSourceProvider<mixxx::SoundSourceProviderFFmpeg>()); #endif #ifdef __SNDFILE__ // libsndfile is another fallback s_soundSourceProviders.registerProvider( mixxx::newSoundSourceProvider<mixxx::SoundSourceProviderSndFile>()); #endif s_soundSourceProviders.registerProvider( mixxx::newSoundSourceProvider<mixxx::SoundSourceProviderFLAC>()); s_soundSourceProviders.registerProvider( mixxx::newSoundSourceProvider<mixxx::SoundSourceProviderOggVorbis>()); #ifdef __OPUS__ s_soundSourceProviders.registerProvider( mixxx::newSoundSourceProvider<mixxx::SoundSourceProviderOpus>()); #endif #ifdef __MAD__ s_soundSourceProviders.registerProvider( mixxx::newSoundSourceProvider<mixxx::SoundSourceProviderMp3>()); #endif #ifdef __MODPLUG__ s_soundSourceProviders.registerProvider( mixxx::newSoundSourceProvider<mixxx::SoundSourceProviderModPlug>()); #endif #ifdef __COREAUDIO__ s_soundSourceProviders.registerProvider( mixxx::newSoundSourceProvider<mixxx::SoundSourceProviderCoreAudio>()); #endif // Scan for and initialize all plugins. // Loaded plugins will replace any built-in providers // that have been registered before (see above)! const QList<QDir> pluginDirs(getSoundSourcePluginDirectories()); for (const auto& pluginDir: pluginDirs) { qDebug() << "Loading SoundSource plugins" << pluginDir.path(); const QStringList files(pluginDir.entryList( SOUND_SOURCE_PLUGIN_FILENAME_PATTERN, QDir::Files | QDir::NoDotAndDotDot)); for (const auto& file: files) { const QString libFilePath(pluginDir.filePath(file)); mixxx::SoundSourcePluginLibraryPointer pPluginLibrary( mixxx::SoundSourcePluginLibrary::load(libFilePath)); if (pPluginLibrary) { s_soundSourceProviders.registerPluginLibrary(pPluginLibrary); } else { qWarning() << "Failed to load SoundSource plugin" << libFilePath; } } } const QStringList supportedFileExtensions( s_soundSourceProviders.getRegisteredFileExtensions()); for (const auto &supportedFileExtension: supportedFileExtensions) { qDebug() << "SoundSource providers for file extension" << supportedFileExtension; const QList<mixxx::SoundSourceProviderRegistration> registrationsForFileExtension( s_soundSourceProviders.getRegistrationsForFileExtension( supportedFileExtension)); for (const auto& registration: registrationsForFileExtension) { if (registration.getPluginLibrary()) { qDebug() << " " << static_cast<int>(registration.getProviderPriority()) << ":" << registration.getProvider()->getName() << "@" << registration.getPluginLibrary()->getFilePath(); } else { qDebug() << " " << static_cast<int>(registration.getProviderPriority()) << ":" << registration.getProvider()->getName(); } } } // Turn the file extension list into a [ "*.mp3", "*.wav", ... ] style string list s_supportedFileNamePatterns.clear(); for (const auto& supportedFileExtension: supportedFileExtensions) { s_supportedFileNamePatterns += QString("*.%1").arg(supportedFileExtension); } // Build regular expression of supported file extensions QString supportedFileExtensionsRegex( RegexUtils::fileExtensionsRegex(supportedFileExtensions)); s_supportedFileNamesRegex = QRegExp(supportedFileExtensionsRegex, Qt::CaseInsensitive); }