#ifndef CSOUNDSERVER_H#define CSOUNDSERVER_H#include <QObject>#include <phonon>#include "cec.h"#include "csoundalertitem.h"class CSoundServer : public QObject{ Q_OBJECT Phonon::AudioOutput * audioOutput; //устройсто вывода звука QString ffilePath; //путь к звуковым файлам QHash<QString,Phonon::MediaObject*> fsoundFileHash; //хеш медиаобъектов (ссылки на файлы) QHash<QString,QString> falertLinkToFileHash; //хеш ссылок objectId:alertRole -> fileNamepublic: explicit CSoundServer(QObject *parent = 0); ~CSoundServer(); void setAlerts(CEcMap &ecMap, const CSoundAlertItemList & alerts); const QString & filePath() const;public slots: void playAlert(QString alertRole); //проиграть алерт void clear();private slots: void stateChange(Phonon::State newstate, Phonon::State oldstate); };#endif // CSOUNDSERVER_H
#include "csoundserver.h"#include "crailobject.h"#include "cec.h"#include <QDir>static const QString linkTemplate = QString("%1:%2:%3");CSoundServer::CSoundServer(QObject *parent) : QObject(parent){ audioOutput = new Phonon::AudioOutput(Phonon::MusicCategory, this); //через это устройство будет звук QDir dir = QDir::current(); dir.cdUp(); if(!dir.cd("sounds")) { dir = QDir::home(); if(dir.cd("sounds")) { ffilePath = dir.absolutePath(); } } else ffilePath = dir.absolutePath(); if(ffilePath.isEmpty()) qDebug("Dir 'sounds' not found. Sound alerts woun't works");}CSoundServer::~CSoundServer(){ clear();}void CSoundServer::setAlerts(CEcMap &ecMap, const CSoundAlertItemList &alerts){ clear(); if(ecMap.isEmpty()) return; QString fileName; QString alertRole; CRailObject * railObject; CEC * ec; QString realFileName; QString linkId; foreach(CSoundAlertItem alertItem, alerts) //проходимся по всем алертам загруженым с файла { fileName = alertItem.fileName(); alertRole = alertItem.alertRole(); ec = ecMap.value(alertItem.ecId(),NULL); if(!ec) continue; railObject = ec->fieldObjectsHash().value(alertItem.objectId(),NULL); if(!railObject) continue; //игнорируем алерт if(alertRole.isEmpty()) //если не указан алерт { qDebug("Alert role for %s:%s hasn't defined", qPrintable(railObject->objectId()), qPrintable(railObject->name)); continue; //игнорируем } if(fileName.isEmpty()) //если не указано имя файла { qDebug("Alert for %s:%s:%s has no sound filename", qPrintable(railObject->objectId()), qPrintable(railObject->name), qPrintable(alertItem.alertRole())); continue; //игнорируем } if(!fsoundFileHash.contains(fileName)) { realFileName = ffilePath+"/"+fileName; //создаем полный путь к файлу if(QFile::exists(realFileName)) //проверяем, существует ли такой файл вообще, если да, то: { Phonon::MediaObject * mediaObject = new Phonon::MediaObject; //создаем медиа объект mediaObject->setCurrentSource(Phonon::MediaSource(realFileName)); //задаем имя файла Phonon::createPath(mediaObject, audioOutput); //соединяем с выходом fsoundFileHash.insert(fileName,mediaObject); //добавляем его в хеш } else //иначе если файла нет { qDebug("File %s not found, ignoring", qPrintable(realFileName)); } } //создаем ссылку между алертом конкретного объекта и именем файла на который он указывает linkId = linkTemplate.arg(railObject->parentEC()->id).arg(railObject->objectId()).arg(alertItem.alertRole()); falertLinkToFileHash.insert(linkId,fileName); }}const QString &CSoundServer::filePath() const{ return ffilePath;}#if 0void CSoundServer::playFile(QString fileName){ mediaObject->setCurrentSource(Phonon::MediaSource(fileName)); Phonon::createPath(mediaObject, audioOutput); mediaObject->play();}void CSoundServer::setFile(QString fileName){ if(fileName.isEmpty()) return; if(ffileName!=fileName) { ffileName = fileName; mediaObject->setCurrentSource(Phonon::MediaSource(fileName)); Phonon::createPath(mediaObject, audioOutput); }}#endifvoid CSoundServer::playAlert(QString alertRole){ CRailObject * railObject = qobject_cast<CRailObject*>(sender()); if(railObject) { QString linkId = linkTemplate.arg(railObject->parentEC()->id).arg(railObject->objectId()).arg(alertRole); QString fileName = falertLinkToFileHash.value(linkId); if(!fileName.isEmpty()) { Phonon::MediaObject * mediaObject = fsoundFileHash.value(fileName,NULL); if(mediaObject) { mediaObject->play(); } } }}void CSoundServer::clear(){ foreach(Phonon::MediaObject * mediaObject, fsoundFileHash.values()) { delete mediaObject; } fsoundFileHash.clear(); falertLinkToFileHash.clear();}void CSoundServer::stateChange(Phonon::State newstate, Phonon::State oldstate){ Q_UNUSED(newstate) Q_UNUSED(oldstate)}
C++ (Qt)Phonon::MediaObject * mediaObject = new Phonon::MediaObject; //создаем медиа объектPhonon::createPath(mediaObject, audioOutput); //соединяем с выходом
C++ (Qt)while(!asleep()) sheep++;