• R/O
  • SSH
  • HTTPS

qrobosdk: コミット


コミットメタ情報

リビジョン1958 (tree)
日時2011-08-02 23:11:18
作者satofumi

ログメッセージ

addd code to BackMusic.cpp. not tested.

変更サマリ

差分

--- trunk/libs/audio/sdl_mixer/BackMusic.cpp (revision 1957)
+++ trunk/libs/audio/sdl_mixer/BackMusic.cpp (revision 1958)
@@ -8,25 +8,64 @@
88 */
99
1010 #include "BackMusic.h"
11+#include <SDL_mixer.h>
12+#include <map>
13+#include <string>
1114
15+#include <cstdio>
16+
1217 using namespace qrk;
18+using namespace std;
1319
1420
1521 struct BackMusic::pImpl
1622 {
17- // !!!
23+ typedef map<string, Mix_Music*> Musics;
1824
25+ bool is_playing_;
26+ Musics musics_;
1927
20- pImpl(void)
28+
29+ pImpl(void) : is_playing_(false)
2130 {
2231 }
2332
2433
34+#if 0
35+ // !!! 必要ならば musics_ を解放する
36+ // !!! valgrind で警告がでなかったら、解放しなくてもよいことにしたい
37+ ~pImpl(void)
38+ {
39+ }
40+#endif
41+
42+
2543 static pImpl* object(void)
2644 {
2745 static pImpl singleton_object;
2846 return &singleton_object;
2947 }
48+
49+
50+ Mix_Music* find_music(const char* file_path)
51+ {
52+ // Load に失敗した場合には musics_ に NULL を格納し、
53+ // 成功した場合にはリソースのポインタを格納する
54+ Musics::iterator it = musics_.find(file_path);
55+ if (it != musics_.end()) {
56+ return it->second;
57+ }
58+
59+ Mix_Music* music = Mix_LoadMUS(file_path);
60+ musics_[file_path] = music;
61+ return music;
62+ }
63+
64+
65+ void free_music(const char* file_path)
66+ {
67+ musics_.erase(file_path);
68+ }
3069 };
3170
3271
@@ -40,10 +79,22 @@
4079 }
4180
4281
82+void BackMusic::free_music_resource(const char* file_path)
83+{
84+ Mix_Music* music = pimpl->find_music(file_path);
85+ if (music) {
86+ Mix_FreeMusic(music);
87+ pimpl->free_music(file_path);
88+ }
89+}
90+
91+
4392 void BackMusic::setVolume(size_t percent)
4493 {
45- (void)percent;
46- // !!!
94+ fprintf(stderr, "BackMusic::setVolume: %d\n", percent);
95+
96+ int mix_volume = static_cast<int>(MIX_MAX_VOLUME * 100.0 / percent);
97+ Mix_VolumeMusic(mix_volume);
4798 }
4899
49100
@@ -50,24 +101,39 @@
50101 bool BackMusic::play(const char* file_path, int fade_in_msec,
51102 int play_times, int fade_out_msec)
52103 {
53- (void)file_path;
54- (void)fade_in_msec;
55- (void)play_times;
104+ fprintf(stderr, "play %s\n", file_path);
105+
106+ Mix_Music* music = pimpl->find_music(file_path);
107+ if (!music) {
108+ return false;
109+ }
110+
111+ // !!! 現在再生中の music の fade out を待ってから、
112+ // !!! 指定された music を再生するように実装を変更する
56113 (void)fade_out_msec;
57- // !!!
58- return false;
114+
115+ int ret = Mix_FadeInMusic(music, play_times, fade_in_msec);
116+ if (ret == -1) {
117+ return false;
118+ }
119+
120+ pimpl->is_playing_ = true;
121+ return true;
59122 }
60123
61124
62125 void BackMusic::stop(int fade_out_msec)
63126 {
64- (void)fade_out_msec;
65- // !!!
127+ fprintf(stderr, "stop\n");
128+
129+ Mix_FadeOutMusic(fade_out_msec);
130+ pimpl->is_playing_ = false;
66131 }
67132
68133
69134 bool BackMusic::isPlaying(void) const
70135 {
71- // !!!
72- return false;
136+ // !!! 終了を監視するスレッドにて is_playing_ フラグを監視する
137+
138+ return pimpl->is_playing_;
73139 }
--- trunk/libs/audio/sdl_mixer/SoundEffect.cpp (revision 1957)
+++ trunk/libs/audio/sdl_mixer/SoundEffect.cpp (revision 1958)
@@ -22,6 +22,11 @@
2222 }
2323
2424
25+enum {
26+ DefaultVolumePercent = 30,
27+};
28+
29+
2530 struct SoundEffect::pImpl
2631 {
2732 static bool initialized_;
@@ -30,14 +35,18 @@
3035 int channel_id_;
3136 Mix_Chunk* chunk_;
3237
38+ size_t master_percent_;
3339
40+
3441 pImpl(const char* play_file)
35- : channel_id_(-1), chunk_(Mix_LoadWAV(play_file))
42+ : channel_id_(-1), chunk_(Mix_LoadWAV(play_file)),
43+ master_percent_(DefaultVolumePercent)
3644 {
3745 if (! initialized_) {
3846 Mix_ChannelFinished(finished);
3947 initialized_ = true;
4048 }
49+ fprintf(stderr, "SoundEffect:play_file: %s)\n", play_file);
4150 }
4251
4352
@@ -89,10 +98,15 @@
8998 }
9099
91100
92-void SoundEffect::setDefaultVolume(size_t percent)
101+void SoundEffect::setMasterVolume(size_t percent)
93102 {
94- (void)percent;
103+ fprintf(stderr, "SoundEffect::setMasterVolume: %d\n", percent);
104+ static_cast<void>(percent);
105+
106+ // Mix_Volume() を用いる
107+
95108 // !!!
109+ //pimpl->master_percent_ = max(percent, static_cast<size_t>(100));
96110 }
97111
98112
@@ -130,6 +144,8 @@
130144 static_cast<void>(y);
131145 static_cast<void>(z);
132146
147+ // !!! SDL_Mixer の Effect を利用すると再生位置の表現ができるかもしれない
148+
133149 // 実装しない
134150 }
135151
旧リポジトリブラウザで表示