Commit 26b071c3 authored by Aman Kumar Gupta's avatar Aman Kumar Gupta Committed by Johnny Jazeix
Browse files

Background music: Lowered background music volume.

Add a volume slider for background music and audio effects.
parent 66e3c6f4
......@@ -29,4 +29,5 @@ ExploreLevels {
numberOfLevels: 1
url: "qrc:/gcompris/src/activities/explore_farm_animals/resource/"
hasAudioQuestions: true
isMusicalActivity: true
}
......@@ -31,10 +31,5 @@ ExploreLevels {
numberOfLevels: 1
url: "qrc:/gcompris/src/activities/explore_world_music/resource/"
hasAudioQuestions: true
property bool backgroundMusicStatus
onStart: {
backgroundMusicStatus = ApplicationSettings.isBackgroundMusicEnabled
ApplicationSettings.isBackgroundMusicEnabled = false
}
onStop: ApplicationSettings.isBackgroundMusicEnabled = backgroundMusicStatus
isMusicalActivity: true
}
......@@ -29,10 +29,5 @@ FindIt {
mode: "Instruments"
dataset: Dataset
backgroundImg: "qrc:/gcompris/src/activities/instruments/resource/background.svg"
property bool backgroundMusicStatus
onStart: {
backgroundMusicStatus = ApplicationSettings.isBackgroundMusicEnabled
ApplicationSettings.isBackgroundMusicEnabled = false
}
onStop: ApplicationSettings.isBackgroundMusicEnabled = backgroundMusicStatus
isMusicalActivity: true
}
......@@ -59,8 +59,6 @@ ActivityBase {
}
onStart: {
items.backgroundMusicStatus = ApplicationSettings.isBackgroundMusicEnabled
ApplicationSettings.isBackgroundMusicEnabled = false
bar.level = 1
score.numberOfSubLevels = 5
score.currentSubLevel = 1
......
......@@ -27,12 +27,6 @@ import "../memory-sound/memorysounddataset.js" as Dataset
MemoryCommon {
dataset: Dataset.get()
backgroundImg: "qrc:/gcompris/src/activities/memory-sound/resource/gcompris_band.svg"
property bool backgroundMusicStatus
onStart: {
backgroundMusicStatus = ApplicationSettings.isBackgroundMusicEnabled
ApplicationSettings.isBackgroundMusicEnabled = false
}
onStop: ApplicationSettings.isBackgroundMusicEnabled = backgroundMusicStatus
withTux: true
isMusicalActivity: true
}
......@@ -28,10 +28,5 @@ import "memorysounddataset.js" as Dataset
MemoryCommon {
dataset: Dataset.get()
backgroundImg: "qrc:/gcompris/src/activities/memory-sound/resource/gcompris_band.svg"
property bool backgroundMusicStatus
onStart: {
backgroundMusicStatus = ApplicationSettings.isBackgroundMusicEnabled
ApplicationSettings.isBackgroundMusicEnabled = false
}
onStop: ApplicationSettings.isBackgroundMusicEnabled = backgroundMusicStatus
isMusicalActivity: true
}
/* GCompris - BackgroundMusicList.qml
*
* Copyright (C) 2019 Aman Kumar Gupta <gupta2140@gmail.com>
*
* Authors:
* Aman Kumar Gupta <gupta2140@gmail.com> (Qt Quick)
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, see <https://www.gnu.org/licenses/>.
*/
import QtQuick 2.6
import QtQuick.Controls 1.5
import GCompris 1.0
import "../../core"
import "qrc:/gcompris/src/core/core.js" as Core
Rectangle {
id: dialogBackground
color: "#696da3"
border.color: "black"
border.width: 1
z: 10000
anchors.fill: parent
visible: false
Keys.onEscapePressed: close()
signal close
property bool horizontalLayout: dialogBackground.width >= dialogBackground.height
Row {
spacing: 2
Item { width: 10; height: 1 }
Column {
spacing: 10
anchors.top: parent.top
Item { width: 1; height: 10 }
Rectangle {
id: titleRectangle
color: "#e6e6e6"
radius: 6.0
width: dialogBackground.width - 30
height: title.height * 1.2
border.color: "black"
border.width: 2
GCText {
id: title
text: qsTr("Pieces of background music")
width: dialogBackground.width - 30
horizontalAlignment: Text.AlignHCenter
verticalAlignment: Text.AlignVCenter
color: "black"
fontSize: 20
font.weight: Font.DemiBold
wrapMode: Text.WordWrap
}
}
Rectangle {
color: "#e6e6e6"
radius: 6.0
width: dialogBackground.width - 30
height: dialogBackground.height - 100
border.color: "black"
border.width: 2
anchors.margins: 100
Flickable {
id: flickableList
anchors.fill: parent
anchors.topMargin: 10
anchors.leftMargin: 20
contentWidth: parent.width
contentHeight: musicGrid.height
flickableDirection: Flickable.VerticalFlick
clip: true
Flow {
id: musicGrid
width: parent.width
spacing: 40
anchors.horizontalCenter: parent.horizontalCenter
Repeater {
model: dialogActivityConfig.configItem ? dialogActivityConfig.configItem.allBackgroundMusic : 0
Item {
width: dialogBackground.horizontalLayout ? dialogBackground.width / 5 : dialogBackground.width / 4
height: dialogBackground.height / 5
Button {
text: modelData.slice(0, modelData.lastIndexOf('.'))
onClicked: {
if(dialogActivityConfig.configItem.filteredBackgroundMusic.indexOf(modelData) == -1) {
// Keep the filtered playlist sorted w.r.t to their positions in "allBackgroundMusic" to maintain their playing order
var musicOriginalPosition = dialogActivityConfig.configItem.allBackgroundMusic.indexOf(modelData)
var i = 0
while(i < dialogActivityConfig.configItem.filteredBackgroundMusic.length) {
var filteredMusicName = dialogActivityConfig.configItem.filteredBackgroundMusic[i]
if(dialogActivityConfig.configItem.allBackgroundMusic.indexOf(filteredMusicName) > musicOriginalPosition)
break
i++
}
dialogActivityConfig.configItem.filteredBackgroundMusic.splice(i, 0, modelData)
}
else {
dialogActivityConfig.configItem.filteredBackgroundMusic.splice(dialogActivityConfig.configItem.filteredBackgroundMusic.indexOf(modelData), 1)
if(dialogActivityConfig.configItem.filteredBackgroundMusic == 0) {
dialogActivityConfig.configItem.filteredBackgroundMusic.push(modelData)
selectedIcon.visible = false
Core.showMessageDialog(dialogBackground,
qsTr("Disable the background music if you don't want to play them."),
"", null,
"", null,
null
);
}
}
selectedIcon.visible = !selectedIcon.visible
}
width: parent.width
height: parent.height * 0.8
style: GCButtonStyle {
theme: "dark"
}
Image {
id: selectedIcon
source: "qrc:/gcompris/src/core/resource/apply.svg"
sourceSize.width: height
sourceSize.height: height
width: height
height: parent.height / 4
anchors.bottom: parent.bottom
anchors.right: parent.right
anchors.margins: 2
visible: dialogActivityConfig.configItem.filteredBackgroundMusic ? dialogActivityConfig.configItem.filteredBackgroundMusic.indexOf(modelData) != -1 : false
}
}
}
}
}
}
// The scroll buttons
GCButtonScroll {
anchors.right: parent.right
anchors.rightMargin: 5 * ApplicationInfo.ratio
anchors.bottom: flickableList.bottom
anchors.bottomMargin: 30 * ApplicationInfo.ratio
width: parent.width / 20
height: width * heightRatio
onUp: flickableList.flick(0, 1400)
onDown: flickableList.flick(0, -1400)
upVisible: (flickableList.visibleArea.yPosition <= 0) ? false : true
downVisible: ((flickableList.visibleArea.yPosition + flickableList.visibleArea.heightRatio) >= 1) ? false : true
}
}
Item { width: 1; height: 10 }
}
}
GCButtonCancel {
onClose: {
parent.close()
}
}
}
......@@ -23,6 +23,7 @@ import QtQuick 2.6
import QtQuick.Controls 1.5
import QtQuick.Controls.Styles 1.4
import GCompris 1.0
import QtMultimedia 5.0
import "../../core"
import "qrc:/gcompris/src/core/core.js" as Core
......@@ -212,7 +213,27 @@ Item {
}
}
GCDialogCheckBox {
Flow {
spacing: 5
width: parent.width
GCSlider {
id: audioEffectsVolumeSlider
width: 250 * ApplicationInfo.ratio
maximumValue: 10
minimumValue: 0
value: audioEffectsVolume * 10
onValueChanged: ApplicationSettings.audioEffectsVolume = value / 10;
scrollEnabled: false
}
GCText {
id: audioEffectsVolumeText
text: qsTr("Audio effects volume")
fontSize: mediumSize
wrapMode: Text.WordWrap
}
}
GCDialogCheckBox {
id: enableBackgroundMusicBox
text: qsTr("Enable background music")
checked: isBackgroundMusicEnabled
......@@ -220,6 +241,75 @@ Item {
isBackgroundMusicEnabled = checked;
}
}
Flow {
width: parent.width
spacing: 5 * ApplicationInfo.ratio
GCText {
text: qsTr("Background Music")
fontSize: mediumSize
height: 50 * ApplicationInfo.ratio
}
// Padding
Item {
height: 1
width: 10 * ApplicationInfo.ratio
}
Button {
id: backgroundMusicName
height: 30 * ApplicationInfo.ratio
text: {
if(backgroundMusic.playbackState != Audio.PlayingState)
return qsTr("Not playing")
return configItem.extractMusicNameFromPath(backgroundMusic.source)
}
style: GCButtonStyle {}
onClicked: {
dialogConfig.visible = false
backgroundMusicList.visible = true
}
}
// Padding
Item {
height: 1
width: 10 * ApplicationInfo.ratio
}
Image {
source: "qrc:/gcompris/src/core/resource/bar_next.svg"
sourceSize.height: Math.min(50 * ApplicationInfo.ratio, parent.width / 8)
MouseArea {
anchors.fill: parent
enabled: (backgroundMusic.playbackState == Audio.PlayingState && !backgroundMusic.muted)
onClicked: backgroundMusic.nextAudio()
}
}
}
Flow {
spacing: 5
width: parent.width
GCSlider {
id: backgroundMusicVolumeSlider
width: 250 * ApplicationInfo.ratio
maximumValue: 10
minimumValue: 0
value: backgroundMusicVolume * 10
onValueChanged: ApplicationSettings.backgroundMusicVolume = value / 10;
scrollEnabled: false
}
GCText {
id: backgroundMusicVolumeText
text: qsTr("Background music volume")
fontSize: mediumSize
wrapMode: Text.WordWrap
}
}
GCDialogCheckBox {
id: enableFullscreenBox
......@@ -535,10 +625,21 @@ Item {
property bool isAutomaticDownloadsEnabled: ApplicationSettings.isAutomaticDownloadsEnabled
property bool sectionVisible: ApplicationSettings.sectionVisible
property string wordset: ApplicationSettings.wordset
property var filteredBackgroundMusic: ApplicationSettings.filteredBackgroundMusic
property var allBackgroundMusic: ApplicationInfo.getBackgroundMusicFromRcc()
property int baseFontSize // don't bind to ApplicationSettings.baseFontSize
property real fontLetterSpacing // don't bind to ApplicationSettings.fontLetterSpacing
// or we get a binding loop warning
property real backgroundMusicVolume
property real audioEffectsVolume
function extractMusicNameFromPath(musicPath) {
var musicDirectoryPath = ApplicationInfo.getAudioFilePath("backgroundMusic/")
var musicName = String(musicPath)
musicName = musicName.slice(musicDirectoryPath.length, musicName.length)
return musicName.slice(0, musicName.lastIndexOf('.'))
}
function loadFromConfig() {
// Synchronize settings with data
showLockedActivities = ApplicationSettings.showLockedActivities
......@@ -567,8 +668,14 @@ Item {
wordsetBox.checked = DownloadManager.isDataRegistered("words") || ApplicationSettings.wordset == 'data2/words/words.rcc'
wordsetBox.enabled = !DownloadManager.isDataRegistered("words")
baseFontSize = ApplicationSettings.baseFontSize;
fontLetterSpacing = ApplicationSettings.fontLetterSpacing;
baseFontSize = ApplicationSettings.baseFontSize
fontLetterSpacing = ApplicationSettings.fontLetterSpacing
backgroundMusicVolume = ApplicationSettings.backgroundMusicVolume
audioEffectsVolume = ApplicationSettings.audioEffectsVolume
filteredBackgroundMusic = ApplicationSettings.filteredBackgroundMusic
allBackgroundMusic = ApplicationInfo.getBackgroundMusicFromRcc()
if(filteredBackgroundMusic.length === 0)
filteredBackgroundMusic = allBackgroundMusic
// Set locale
for(var i = 0 ; i < dialogConfig.languages.length ; i ++) {
if(dialogConfig.languages[i].locale === ApplicationSettings.locale) {
......@@ -599,6 +706,7 @@ Item {
ApplicationSettings.isAudioVoicesEnabled = isAudioVoicesEnabled
ApplicationSettings.isAudioEffectsEnabled = isAudioEffectsEnabled
ApplicationSettings.isBackgroundMusicEnabled = isBackgroundMusicEnabled
ApplicationSettings.filteredBackgroundMusic = filteredBackgroundMusic
ApplicationSettings.isFullscreen = isFullscreen
ApplicationSettings.isVirtualKeyboard = isVirtualKeyboard
ApplicationSettings.isAutomaticDownloadsEnabled = isAutomaticDownloadsEnabled
......@@ -749,6 +857,17 @@ Item {
{ text: qsTr("All uppercase"), value: Font.AllUppercase },
{ text: qsTr("All lowercase"), value: Font.AllLowercase }
]
function isFilteredBackgroundMusicChanged() {
initialFilteredMusic = ApplicationSettings.filteredBackgroundMusic
if(initialFilteredMusic.length != filteredBackgroundMusic.length)
return true
for(var i = 0; i < initialFilteredMusic.length; i++)
if(filteredBackgroundMusic.indexOf(initialFilteredMusic[i]) == -1)
return true
return false
}
function hasConfigChanged() {
return (ApplicationSettings.locale !== dialogConfig.languages[languageBox.currentIndex].locale ||
......@@ -766,7 +885,8 @@ Item {
(ApplicationSettings.isVirtualKeyboard != isVirtualKeyboard) ||
(ApplicationSettings.isAutomaticDownloadsEnabled != isAutomaticDownloadsEnabled) ||
(ApplicationSettings.baseFontSize != baseFontSize) ||
(ApplicationSettings.showLockedActivities != showLockedActivities)
(ApplicationSettings.showLockedActivities != showLockedActivities) ||
isFilteredBackgroundMusicChanged()
);
}
}
......
......@@ -847,7 +847,7 @@ ActivityBase {
}
onSaveData: {
dialogActivityConfig.configItem.save();
dialogActivityConfig.configItem.save()
}
onClose: {
if(activity.currentTag != "search") {
......@@ -856,8 +856,44 @@ ActivityBase {
ActivityInfoTree.filterEnabledActivities()
} else
ActivityInfoTree.filterBySearch(searchTextField.text);
backgroundMusic.clearQueue()
/**
* 1. If the current playing background music is in new filtered playlist too, continue playing it and append all the next filtered musics to backgroundMusic element.
* 2. Else, stop the current music, find the filtered music which comes just after it, and append all the further musics after it.
*/
var backgroundMusicSource = String(backgroundMusic.source)
var backgroundMusicName = dialogActivityConfig.configItem.extractMusicNameFromPath(backgroundMusicSource) + backgroundMusicSource.slice(backgroundMusicSource.lastIndexOf('.'), backgroundMusicSource.length)
var nextMusicIndex = dialogActivityConfig.configItem.filteredBackgroundMusic.indexOf(backgroundMusicName)
if(nextMusicIndex != -1) {
nextMusicIndex++
while(nextMusicIndex < dialogActivityConfig.configItem.filteredBackgroundMusic.length)
backgroundMusic.append(ApplicationInfo.getAudioFilePath("backgroundMusic/" + dialogActivityConfig.configItem.filteredBackgroundMusic[nextMusicIndex++]))
}
else {
nextMusicIndex = dialogActivityConfig.configItem.allBackgroundMusic.indexOf(backgroundMusicName) + 1
while(nextMusicIndex < dialogActivityConfig.configItem.allBackgroundMusic.length) {
if(dialogActivityConfig.configItem.filteredBackgroundMusic.indexOf(dialogActivityConfig.configItem.allBackgroundMusic[nextMusicIndex]) != -1) {
nextMusicIndex = dialogActivityConfig.configItem.filteredBackgroundMusic.indexOf(dialogActivityConfig.configItem.allBackgroundMusic[nextMusicIndex])
break
}
nextMusicIndex++
}
while(nextMusicIndex < dialogActivityConfig.configItem.filteredBackgroundMusic.length)
backgroundMusic.append(ApplicationInfo.getAudioFilePath("backgroundMusic/" + dialogActivityConfig.configItem.filteredBackgroundMusic[nextMusicIndex++]))
backgroundMusic.nextAudio()
}
home()
}
BackgroundMusicList {
id: backgroundMusicList
onClose: {
visible = false
dialogActivityConfig.configItem.visible = true
}
}
}
}
}
......@@ -114,13 +114,23 @@ Item {
property GCSfx audioEffects
/**
* type:GCAudio
* type:GCAudio
* The global audio item for background music.
*
* @sa GCAudio backgroundMusic
*/
property GCAudio backgroundMusic
/**
* type: bool
* It tells whether the activity is a musical activity or not(if the activity contains it's own audio effects).
*
* If the activity is a musical activity, on starting it the background music pauses and when the activity is quit, background music resumes.
*
* Set it as true if the activity is musical.
*/
property bool isMusicalActivity: false
/**
* type:Loading
* The global loading object.
......
......@@ -49,11 +49,15 @@ static const char *PREVIOUS_WIDTH_KEY = "previousWidth";
static const char *SHOW_LOCKED_ACTIVITIES_KEY = "showLockedActivities";
static const char *ENABLE_AUDIO_VOICES_KEY = "enableAudioVoices";
static const char *ENABLE_AUDIO_EFFECTS_KEY = "enableAudioEffects";
static const char *ENABLE_BACKGROUND_MUSIC_KEY = "enableBackgroundMusic";
static const char *VIRTUALKEYBOARD_KEY = "virtualKeyboard";
static const char *LOCALE_KEY = "locale";
static const char *FONT_KEY = "font";
static const char *IS_CURRENT_FONT_EMBEDDED = "isCurrentFontEmbedded";
static const char *ENABLE_AUTOMATIC_DOWNLOADS = "enableAutomaticDownloads";
static const char *FILTERED_BACKGROUND_MUSIC_KEY = "filteredBackgroundMusic";
static const char *BACKGROUND_MUSIC_VOLUME_KEY = "backgroundMusicVolume";
static const char *AUDIO_EFFECTS_VOLUME_KEY = "audioEffectsVolume";
static const char *FILTERED_BACKGROUND_MUSIC_KEY = "filteredBackgroundMusic";
static const char *BACKGROUND_MUSIC_VOLUME_KEY = "backgroundMusicVolume";
......@@ -113,6 +117,9 @@ ApplicationSettings::ApplicationSettings(const QString &configPath, QObject *par
m_fontCapitalization = m_config.value(FONT_CAPITALIZATION, GC_DEFAULT_FONT_CAPITALIZATION).toUInt();
m_fontLetterSpacing = m_config.value(FONT_LETTER_SPACING, GC_DEFAULT_FONT_LETTER_SPACING).toReal();
m_isEmbeddedFont = m_config.value(IS_CURRENT_FONT_EMBEDDED, true).toBool();
m_filteredBackgroundMusic = m_config.value(FILTERED_BACKGROUND_MUSIC_KEY, ApplicationInfo::getInstance()->getBackgroundMusicFromRcc()).toStringList();
m_backgroundMusicVolume = m_config.value(BACKGROUND_MUSIC_VOLUME_KEY, 1).toReal();
m_audioEffectsVolume = m_config.value(AUDIO_EFFECTS_VOLUME_KEY, 1).toReal();
// Init the activation mode
if(QLatin1String(ACTIVATION_MODE) == "no")
......@@ -174,10 +181,11 @@ ApplicationSettings::ApplicationSettings(const QString &configPath, QObject *par
m_isBarHidden = false;
connect(this, &ApplicationSettings::showLockedActivitiesChanged, this, &ApplicationSettings::notifyShowLockedActivitiesChanged);
connect(this, &ApplicationSettings::audioVoicesEnabledChanged, this, &ApplicationSettings::notifyAudioVoicesEnabledChanged);
connect(this, &ApplicationSettings::audioEffectsEnabledChanged, this, &ApplicationSettings::notifyAudioEffectsEnabledChanged);
connect(this, &ApplicationSettings::backgroundMusicEnabledChanged, this, &ApplicationSettings::notifyBackgroundMusicEnabledChanged);
connect(this, &ApplicationSettings::fullscreenChanged, this, &ApplicationSettings::notifyFullscreenChanged);
connect(this, &ApplicationSettings::audioVoicesEnabledChanged, this, &ApplicationSettings::notifyAudioVoicesEnabledChanged);
connect(this, &ApplicationSettings::audioEffectsEnabledChanged, this, &ApplicationSettings::notifyAudioEffectsEnabledChanged);
connect(this, &ApplicationSettings::backgroundMusicEnabledChanged, this, &ApplicationSettings::notifyBackgroundMusicEnabledChanged);
connect(this, &ApplicationSettings::filteredBackgroundMusicChanged, this, &ApplicationSettings::notifyFilteredBackgroundMusicChanged);
connect(this, &ApplicationSettings::fullscreenChanged, this, &ApplicationSettings::notifyFullscreenChanged);
connect(this, &ApplicationSettings::previousHeightChanged, this, &ApplicationSettings::notifyPreviousHeightChanged);
connect(this, &ApplicationSettings::previousWidthChanged, this, &ApplicationSettings::notifyPreviousWidthChanged);
connect(this, &ApplicationSettings::localeChanged, this, &ApplicationSettings::notifyLocaleChanged);
......@@ -198,6 +206,8 @@ ApplicationSettings::ApplicationSettings(const QString &configPath, QObject *par
connect(this, &ApplicationSettings::exeCountChanged, this, &ApplicationSettings::notifyExeCountChanged);
connect(this, &ApplicationSettings::barHiddenChanged, this, &ApplicationSettings::notifyBarHiddenChanged);
connect(this, &ApplicationSettings::lastGCVersionRanChanged, this, &ApplicationSettings::notifyLastGCVersionRanChanged);
connect(this, &ApplicationSettings::backgroundMusicVolumeChanged, this, &ApplicationSettings::notifyBackgroundMusicVolumeChanged);
connect(this, &ApplicationSettings::audioEffectsVolumeChanged, this, &ApplicationSettings::notifyAudioEffectsVolumeChanged);
}
ApplicationSettings::~ApplicationSettings()
......@@ -208,6 +218,9 @@ ApplicationSettings::~ApplicationSettings()
m_config.setValue(SHOW_LOCKED_ACTIVITIES_KEY, m_showLockedActivities);
m_config.setValue(ENABLE_AUDIO_VOICES_KEY, m_isAudioVoicesEnabled);
m_config.setValue(ENABLE_BACKGROUND_MUSIC_KEY, m_isBackgroundMusicEnabled);
m_config.setValue(FILTERED_BACKGROUND_MUSIC_KEY, m_filteredBackgroundMusic);
m_config.setValue(BACKGROUND_MUSIC_VOLUME_KEY, m_backgroundMusicVolume);
m_config.setValue(AUDIO_EFFECTS_VOLUME_KEY, m_audioEffectsVolume);
m_config.setValue(LOCALE_KEY, m_locale);
m_config.setValue(FONT_KEY, m_font);
m_config.setValue(IS_CURRENT_FONT_EMBEDDED, m_isEmbeddedFont);
......@@ -273,6 +286,24 @@ void ApplicationSettings::notifyBackgroundMusicEnabledChanged()
qDebug() << "notifyBackgroundMusic: " << m_isBackgroundMusicEnabled;
}
void ApplicationSettings::notifyFilteredBackgroundMusicChanged()
{
updateValueInConfig(GENERAL_GROUP_KEY, FILTERED_BACKGROUND_MUSIC_KEY, m_filteredBackgroundMusic);
qDebug()<<"filteredBackgroundMusic: " << m_filteredBackgroundMusic;
}
void ApplicationSettings::notifyBackgroundMusicVolumeChanged()
{
updateValueInConfig(GENERAL_GROUP_KEY, BACKGROUND_MUSIC_VOLUME_KEY, m_backgroundMusicVolume);
qDebug()<<"backgroundMusicVolume: " << m_backgroundMusicVolume;
}
void ApplicationSettings::notifyAudioEffectsVolumeChanged()