peony/libpeony-qt/sound-effect.cpp

135 lines
3.8 KiB
C++
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

/*
* Peony-Qt's Library
*
* Copyright (C) 2022, KylinSoft Co., Ltd.
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 3 of the License, or (at your option) any later version.
*
* This library 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
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this library. If not, see <https://www.gnu.org/licenses/>.
*
* Authors: Li ke <like1@kylinos.cn>
*
*/
#include "sound-effect.h"
#include <QFile>
using namespace Peony;
static SoundEffect * soundeffect_instance = nullptr;
SoundEffect::SoundEffect()
{
ca_context_create(&caContext);
if (QGSettings::isSchemaInstalled(KEY_SOUNDS_SCHEMA))
m_pSoundSettings = g_settings_new (KEY_SOUNDS_SCHEMA);
}
SoundEffect *SoundEffect::getInstance()
{
if(!soundeffect_instance){
soundeffect_instance = new SoundEffect;
}
return soundeffect_instance;
}
QList<char *> SoundEffect::listExistsPath()
{
char ** childs;
int len;
DConfClient * client = dconf_client_new();
childs = dconf_client_list (client, KEYBINDINGS_CUSTOM_DIR, &len);
g_object_unref (client);
QList<char *> vals;
for (int i = 0; childs[i] != NULL; i++){
if (dconf_is_rel_dir (childs[i], NULL)){
char * val = g_strdup (childs[i]);
vals.append(val);
}
}
g_strfreev (childs);
return vals;
}
void SoundEffect::playAlertSound(QString gsettingStr)
{
if (! m_pSoundSettings)
return;
QFile file("/usr/share/sounds/xunguang.xml");
if(!file.exists()){
qDebug() << "THE SOUND EFFECT FILE IS NOT EXIST";
return;
}
gint retval;
const gchar *desc = "Alert Sound";
QString filenameStr;
QList<char *> existsPath = this->listExistsPath();
for (char * path : existsPath) {
char * prepath = QString(KEYBINDINGS_CUSTOM_DIR).toLatin1().data();
char * allpath = strcat(prepath, path);
const QByteArray ba(KEYBINDINGS_CUSTOM_SCHEMA);
const QByteArray bba(allpath);
if(QGSettings::isSchemaInstalled(ba)){
QGSettings * settings = new QGSettings(ba, bba);
filenameStr = settings->get(FILENAME_KEY).toString();
QString nameStr = settings->get(NAME_KEY).toString();
//此处匹配对应的gsetting接口字段
if (nameStr == gsettingStr){
break;
}
else{
filenameStr = "";//新增处理如果未找到对应组件的音效文件则不予播放不做此处理会存在播放screen音效
}
}
}
const QByteArray text = filenameStr.toLocal8Bit();
const char *id = text.data();
const char *eventId =id;
if(desc && filenameStr.length() >0){
bool status = g_settings_get_boolean(m_pSoundSettings, EVENT_SOUNDS_KEY);
if (status)
retval = ca_context_play (this->caContext, 0,
CA_PROP_EVENT_ID, eventId,
CA_PROP_EVENT_DESCRIPTION, desc, NULL);
qDebug() << "ca_context_play" << status << eventId << retval;
}
}
void SoundEffect::recycleBinClearMusic()
{
playAlertSound("recycle-bin-clear");
}
void SoundEffect::recycleBinDeleteMusic()
{
playAlertSound("recycle-bin-delete");
}
void SoundEffect::copyOrMoveSucceedMusic()
{
playAlertSound("copyormove-succeed");
}
void SoundEffect::copyOrMoveFailedMusic()
{
playAlertSound("operation-notsupported");
}