Commit 14b44676e462d47d3dc8793a8022a96754b832b2

Authored by 김태훈
1 parent c19a6df603
Exists in master and in 2 other branches fhd, fhd-demo

음원 재생 루틴 개선

- 재생 전용 스레드 생성
 - 클릭 음원 반응성 개선
app/gui/oven_control/soundplayer.cpp
1 #include "soundplayer.h" 1 #include "soundplayer.h"
2 2
3 -QMap<QString, QSound *> SoundPlayer::map;  
4 -QSound *SoundPlayer::current = 0; 3 +namespace {
  4 +QThread playThread;
  5 +}
5 6
6 -void SoundPlayer::play(const QString &filename) 7 +SoundPlayWorker::SoundPlayWorker()
  8 +{
  9 + current = 0;
  10 + click = 0;
  11 +}
  12 +
  13 +void SoundPlayWorker::play(const QString &filename)
7 { 14 {
8 if (current && !current->isFinished()) 15 if (current && !current->isFinished())
9 current->stop(); 16 current->stop();
@@ -19,27 +26,77 @@ void SoundPlayer::play(const QString &amp;filename) @@ -19,27 +26,77 @@ void SoundPlayer::play(const QString &amp;filename)
19 current->play(); 26 current->play();
20 } 27 }
21 28
  29 +void SoundPlayWorker::playClick()
  30 +{
  31 + if (click == 0)
  32 + {
  33 + click = new QSoundEffect;
  34 + click->setSource(QUrl::fromLocalFile(":/sounds/button.wav"));
  35 + click->setVolume(1.0);
  36 + }
  37 +
  38 + click->play();
  39 +}
  40 +
  41 +SoundPlayer *SoundPlayer::instance = 0;
  42 +SoundPlayer::SoundPlayer()
  43 +{
  44 + instance = this;
  45 +
  46 + SoundPlayWorker *w = new SoundPlayWorker;
  47 + w->moveToThread(&playThread);
  48 + connect(this, SIGNAL(operate(QString)), w, SLOT(play(QString)));
  49 + connect(this, SIGNAL(click()), w, SLOT(playClick()));
  50 +
  51 + playThread.start();
  52 +}z
  53 +
  54 +void SoundPlayer::play(const QString &filename)
  55 +{
  56 + emit operate(filename);
  57 +}
  58 +
  59 +void SoundPlayer::emitClick()
  60 +{
  61 + emit click();
  62 +}
  63 +
22 void SoundPlayer::playClick() 64 void SoundPlayer::playClick()
23 { 65 {
24 - play(":/sounds/button.wav"); 66 + if (instance == 0)
  67 + instance = new SoundPlayer;
  68 +
  69 + instance->emitClick();
25 } 70 }
26 71
27 void SoundPlayer::playStart() 72 void SoundPlayer::playStart()
28 { 73 {
29 - play(":/sounds/start.wav"); 74 + if (instance == 0)
  75 + instance = new SoundPlayer;
  76 +
  77 + instance->play(":/sounds/start.wav");
30 } 78 }
31 79
32 void SoundPlayer::playStop() 80 void SoundPlayer::playStop()
33 { 81 {
34 - play(":/sounds/stop.wav"); 82 + if (instance == 0)
  83 + instance = new SoundPlayer;
  84 +
  85 + instance->play(":/sounds/stop.wav");
35 } 86 }
36 87
37 void SoundPlayer::playError1() 88 void SoundPlayer::playError1()
38 { 89 {
39 - play(":/sounds/error1.wav"); 90 + if (instance == 0)
  91 + instance = new SoundPlayer;
  92 +
  93 + instance->play(":/sounds/error1.wav");
40 } 94 }
41 95
42 void SoundPlayer::playError2() 96 void SoundPlayer::playError2()
43 { 97 {
44 - play(":/sounds/error2.wav"); 98 + if (instance == 0)
  99 + instance = new SoundPlayer;
  100 +
  101 + instance->play(":/sounds/error2.wav");
45 } 102 }
app/gui/oven_control/soundplayer.h
@@ -3,13 +3,37 @@ @@ -3,13 +3,37 @@
3 3
4 #include <QObject> 4 #include <QObject>
5 #include <QSound> 5 #include <QSound>
  6 +#include <QSoundEffect>
  7 +#include <QThread>
6 #include <QMap> 8 #include <QMap>
7 9
  10 +class SoundPlayWorker : public QObject
  11 +{
  12 + Q_OBJECT
  13 +public:
  14 + explicit SoundPlayWorker();
  15 +
  16 +public slots:
  17 + void play(const QString &filename);
  18 + void playClick();
  19 +
  20 +private:
  21 + QMap<QString, QSound *> map;
  22 + QSound *current;
  23 + QSoundEffect *click;
  24 +};
  25 +
8 class SoundPlayer : public QObject 26 class SoundPlayer : public QObject
9 { 27 {
10 Q_OBJECT 28 Q_OBJECT
  29 +
  30 + explicit SoundPlayer();
  31 + void play(const QString &filename);
  32 + void emitClick();
  33 +
  34 + static SoundPlayer *instance;
  35 +
11 public: 36 public:
12 - static void play(const QString &filename);  
13 static void playClick(); 37 static void playClick();
14 static void playStart(); 38 static void playStart();
15 static void playStop(); 39 static void playStop();
@@ -17,13 +41,8 @@ public: @@ -17,13 +41,8 @@ public:
17 static void playError2(); 41 static void playError2();
18 42
19 signals: 43 signals:
20 -  
21 -public slots:  
22 -  
23 -private:  
24 - static QMap<QString, QSound *> map;  
25 - static QSound *current;  
26 - 44 + void operate(const QString &);
  45 + void click();
27 }; 46 };
28 47
29 #endif // SOUNDPLAYER_H 48 #endif // SOUNDPLAYER_H