Commit 14b44676e462d47d3dc8793a8022a96754b832b2
1 parent
c19a6df603
Exists in
master
and in
2 other branches
음원 재생 루틴 개선
- 재생 전용 스레드 생성 - 클릭 음원 반응성 개선
Showing
2 changed files
with
92 additions
and
16 deletions
Show diff stats
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 &filename) | @@ -19,27 +26,77 @@ void SoundPlayer::play(const QString &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 |