File indexing completed on 2024-07-14 04:02:30

0001 /*
0002     SPDX-FileCopyrightText: 1999-2006 √Čric Bischoff <ebischoff@nerim.net>
0003     SPDX-FileCopyrightText: 2007 Albert Astals Cid <aacid@kde.org>
0004 
0005     SPDX-License-Identifier: GPL-2.0-or-later
0006 */
0007 
0008 /* Sound factory */
0009 
0010 #include "soundfactory.h"
0011 
0012 #include <stdlib.h>
0013 
0014 #include <QAudioOutput>
0015 #include <QDir>
0016 #include <QDomDocument>
0017 #include <QFile>
0018 #include <QMediaPlayer>
0019 #include <QSet>
0020 #include <QUrl>
0021 
0022 #include "filefactory.h"
0023 
0024 // Constructor
0025 SoundFactory::SoundFactory(SoundFactoryCallbacks *callbacks)
0026  : m_callbacks(callbacks)
0027 {
0028   player = new QMediaPlayer();
0029   player->setAudioOutput(new QAudioOutput);
0030 }
0031 
0032 // Destructor
0033 SoundFactory::~SoundFactory()
0034 {
0035   delete player;
0036 }
0037 
0038 // Play some sound
0039 void SoundFactory::playSound(const QString &soundRef) const
0040 {
0041   if (!m_callbacks->isSoundEnabled()) return;
0042 
0043   int sound;
0044   for (sound = 0; sound < sounds; sound++)
0045       if (!namesList[sound].compare(soundRef)) break;
0046   if (sound == sounds) return;
0047 
0048   const QString soundFile = FileFactory::locate(QLatin1String( "sounds/" ) + filesList[sound]);
0049   if (soundFile.isEmpty()) return;
0050 
0051   if (soundFile.startsWith(QLatin1Char(':'))) {
0052     player->setSource(QUrl(QLatin1String("qrc") + soundFile));
0053   } else {
0054     player->setSource(QUrl::fromLocalFile(soundFile));
0055   }
0056   // we need to go to 0, otherwise sounds don't play again if the soundfile hasn't changed
0057   player->setPosition(0);
0058   player->play();
0059 }
0060 
0061 // Register the various languages
0062 void SoundFactory::registerLanguages()
0063 {
0064   QSet<QString> list;
0065   const QStringList dirs = FileFactory::locateAll(QStringLiteral("sounds"));
0066   for (const QString &dir : dirs)
0067   {
0068     const QStringList fileNames = QDir(dir).entryList(QStringList() << QStringLiteral("*.soundtheme"));
0069     for (const QString &file :  fileNames)
0070     {
0071         list <<dir + QLatin1Char('/') + file;
0072     }
0073   }
0074 
0075   for(const QString &soundTheme : std::as_const(list))
0076   {
0077     QFile file(soundTheme);
0078     if (file.open(QIODevice::ReadOnly))
0079     {
0080       QDomDocument document;
0081       if (document.setContent(&file))
0082       {
0083         const QString code = document.documentElement().attribute(QStringLiteral( "code" ));
0084         const bool enabled = FileFactory::folderExists(QLatin1String( "sounds/" ) + code + QLatin1Char( '/' ));
0085         m_callbacks->registerLanguage(code, soundTheme, enabled);
0086       }
0087     }
0088   }
0089 }
0090 
0091 // Load the sounds of one given language
0092 bool SoundFactory::loadLanguage(const QString &selectedLanguageFile)
0093 {
0094   QDomNodeList languagesList,
0095                soundNamesList;
0096   QDomElement languageElement,
0097               soundNameElement;
0098   QDomAttr nameAttribute, fileAttribute;
0099 
0100   QFile file(selectedLanguageFile);
0101   if (!file.open(QIODevice::ReadOnly)) return false;
0102 
0103   QDomDocument document;
0104   if (!document.setContent(&file)) return false;
0105 
0106   languageElement = document.documentElement();
0107 
0108   soundNamesList = languageElement.elementsByTagName(QStringLiteral( "sound" ));
0109   sounds = soundNamesList.count();
0110   if (sounds < 1)
0111     return false;
0112 
0113 
0114   namesList.clear();
0115   filesList.clear();
0116   for (int sound = 0; sound < sounds; sound++)
0117   {
0118     soundNameElement = (const QDomElement &) soundNamesList.item(sound).toElement();
0119 
0120     nameAttribute = soundNameElement.attributeNode(QStringLiteral( "name" ));
0121     namesList << nameAttribute.value();
0122     fileAttribute = soundNameElement.attributeNode(QStringLiteral( "file" ));
0123     filesList << fileAttribute.value();
0124   }
0125 
0126   currentSndFile = selectedLanguageFile;
0127 
0128   return true;
0129 }
0130 
0131 QString SoundFactory::currentSoundFile() const
0132 {
0133   return currentSndFile;
0134 }