• R/O
  • SSH
  • HTTPS

qrobosdk: コミット


コミットメタ情報

リビジョン12 (tree)
日時2008-05-10 09:02:35
作者satofumi

ログメッセージ

add cdrom play sample

変更サマリ

差分

--- trunk/libs/sound/CdromPlay.h (revision 11)
+++ trunk/libs/sound/CdromPlay.h (revision 12)
@@ -11,6 +11,7 @@
1111 */
1212
1313 #include <memory>
14+#include <vector>
1415
1516
1617 namespace qrk {
@@ -22,13 +23,65 @@
2223 const std::auto_ptr<pImpl> pimpl;
2324
2425 public:
26+
27+ /*!
28+ \brief トラックのデータタイプ
29+ */
30+ typedef enum {
31+ AudioTrack,
32+ DataTrack,
33+ } TrackType;
34+
35+ /*!
36+ \brief トラック情報
37+ */
38+ typedef struct {
39+ int id; //!< トラック番号
40+ TrackType type; //!< データタイプ
41+ int frame_length; //!< フレーム長
42+ int min; //!< 分
43+ int sec; //!< 秒
44+ } track_t;
45+
2546 CdromPlay(void);
47+ explicit CdromPlay(size_t use_drive);
2648 ~CdromPlay(void);
49+
50+ /*!
51+ \brief ドライブ数の取得
52+
53+ \retrun CD-ROM ドライブ数
54+ */
55+ static size_t getDrives(void);
56+
57+ /*!
58+ \brief 状態の取得
59+
60+ \return 状態を示す文字列
61+ */
2762 const char* what(void);
2863
29- // !!! static で、ドライブ数を返す。初期化に注意
64+ /*!
65+ \brief トラック情報の取得
66+
67+ \param tracks [o] トラック情報の格納先
68+
69+ \retval true 正常終了
70+ \retval false エラー
71+ */
72+ bool getTracks(std::vector<track_t>& tracks);
73+
74+ int playTrack(size_t track_id,
75+ size_t start_frame = 0,
76+ size_t play_frame = 0,
77+ size_t tracks = 1);
78+
79+ bool isPlaying(void);
80+
81+ bool getCurrentFrame(size_t* frame,
82+ size_t* min = NULL, size_t* sec = NULL);
83+
3084 // !!! 指定トラックの再生 / 指定範囲の再生
31- // !!! 再生中か、を返す
3285 void stop(void);
3386 void pause(void);
3487 void resume(void);
--- trunk/libs/sound/SdlCdromInit.h (nonexistent)
+++ trunk/libs/sound/SdlCdromInit.h (revision 12)
@@ -0,0 +1,34 @@
1+#ifndef SDL_CDROM_INIT_H
2+#define SDL_CDROM_INIT_H
3+
4+/*!
5+ \file
6+ \brief SDL_CDROM システムの初期化
7+
8+ \author Satofumi KAMIMURA
9+
10+ $Id$
11+*/
12+
13+#include <memory>
14+
15+
16+namespace qrk {
17+
18+ /*!
19+ \brief SDL_CDROM システムの初期化クラス
20+ */
21+ class SdlCdromInit {
22+ SdlCdromInit(const SdlCdromInit& rhs);
23+ SdlCdromInit& operator = (const SdlCdromInit& rhs);
24+
25+ struct pImpl;
26+ const std::auto_ptr<pImpl> pimpl;
27+
28+ public:
29+ SdlCdromInit(void);
30+ ~SdlCdromInit(void);
31+ };
32+};
33+
34+#endif /* !SDL_CDROM_INIT_H */
--- trunk/libs/sound/VolumeCtrl.h (revision 11)
+++ trunk/libs/sound/VolumeCtrl.h (revision 12)
@@ -19,7 +19,7 @@
1919 VolumeCtrl& operator = (const VolumeCtrl& rhs);
2020
2121 struct pImpl;
22- const std::auto_ptr<pImpl> pimpl;
22+ pImpl* pimpl;
2323
2424 public:
2525 VolumeCtrl(void);
--- trunk/libs/sound/samples/Makefile (nonexistent)
+++ trunk/libs/sound/samples/Makefile (revision 12)
@@ -0,0 +1,32 @@
1+# Makefile for sound/samples
2+# Satofumi KAMIMURA
3+# $Id$
4+
5+# Compile options
6+CC = ${CXX}
7+CXXFLAGS = -g -O0 -Wall -Werror ${INCLUDES} `sdl-config --cflags`
8+INCLUDES = -I.. -I../../system
9+LDFLAGS =
10+LDLIBS = `sdl-config --libs`
11+
12+# Target
13+TARGET = \
14+ cdromPlaySample \
15+
16+all : ${TARGET}
17+
18+clean :
19+ ${RM} *.o ${TARGET}
20+
21+depend :
22+ makedepend -Y -- ${INCLUDES} -- ${wildcard *.h *.cpp}
23+
24+.PHONY : all clean depend
25+######################################################################
26+REQUIRE_LIBS = ../sound.a ../../system/sdl/system_sdl.a
27+${REQUIRE_LIBS} :
28+ cd ${@D} && ${MAKE} ${@F}
29+
30+${TARGET} : ${REQUIRE_LIBS}
31+
32+# DO NOT DELETE
--- trunk/libs/sound/samples/cdromPlaySample.cpp (nonexistent)
+++ trunk/libs/sound/samples/cdromPlaySample.cpp (revision 12)
@@ -0,0 +1,62 @@
1+/*!
2+ \file
3+ \brief CdromPlay の動作サンプル
4+
5+ \author Satofumi KAMIMURA
6+
7+ $Id$
8+*/
9+
10+#include "CdromPlay.h"
11+#include "Delay.h"
12+
13+using namespace qrk;
14+
15+
16+int main(int argc, char *argv[]) {
17+
18+ // CD-ROM ドライブの存在を確認
19+ size_t drives = CdromPlay::getDrives();
20+ printf("CD-ROM Drives: %d\n", drives);
21+ if (drives == 0) {
22+ printf("no drive.\n");
23+ exit(1);
24+ }
25+
26+ // トラック情報の取得と出力
27+ CdromPlay cdrom(0);
28+ std::vector<CdromPlay::track_t> tracks;
29+ if (! cdrom.getTracks(tracks)) {
30+ printf("CdromPlay::getTrack: %s\n", cdrom.what());
31+ exit(1);
32+ }
33+
34+ for (std::vector<CdromPlay::track_t>::iterator it = tracks.begin();
35+ it != tracks.end(); ++it) {
36+ if (it->type != CdromPlay::AudioTrack) {
37+ continue;
38+ }
39+ printf("track %2d: frame: %d, [%02d:%02d]\n",
40+ it->id, it->frame_length, it->min, it->sec);
41+ }
42+
43+ // トラックを順番に再生
44+ size_t n = tracks.size();
45+ for (size_t i = 0; i < n; ++i) {
46+ if (! cdrom.playTrack(i)) {
47+ printf("CdromPlay::playTrack: %s\n", cdrom.what());
48+ exit(1);
49+ }
50+
51+ while (cdrom.isPlaying()) {
52+ size_t min = 0;
53+ size_t sec = 0;
54+ cdrom.getCurrentFrame(NULL, &min, &sec);
55+ printf("\r[%2d:%02d]", min, sec);
56+ fflush(stdout);
57+ delay(200);
58+ }
59+ }
60+
61+ return 0;
62+}
--- trunk/libs/sound/CdromPlay.cpp (revision 11)
+++ trunk/libs/sound/CdromPlay.cpp (revision 12)
@@ -10,37 +10,205 @@
1010 #include <string>
1111 #include <SDL.h>
1212 #include "CdromPlay.h"
13-#include "SdlAudioInit.h"
13+#include "SdlCdromInit.h"
1414 #include "VolumeChangeInterface.h"
15+#include "Delay.h"
1516
1617 using namespace qrk;
1718
1819
19-struct CdromPlay::pImpl : private SdlAudioInit, public VolumeChangeInterface {
20+struct CdromPlay::pImpl : private SdlCdromInit, public VolumeChangeInterface {
21+
22+ class CdromInit : private SdlCdromInit {
23+ };
24+
25+ size_t drive_id_;
2026 std::string error_message_;
2127 SDL_CD* cdrom_;
28+ std::vector<track_t> track_list_;
2229
23- pImpl(void) : error_message_("no error"), cdrom_(NULL) {
30+ pImpl(size_t id)
31+ : drive_id_(id), error_message_("no error"), cdrom_(NULL) {
32+ openDrive(drive_id_);
2433 }
34+
35+ ~pImpl(void) {
36+ if (cdrom_) {
37+ stop();
38+ SDL_CDClose(cdrom_);
39+ }
40+ }
41+
42+ // CD-ROM ドライブの初期化
43+ bool openDrive(size_t id) {
44+
45+ if (SDL_CDNumDrives() <= 0) {
46+ error_message_ = "not found CD-ROM drive.";
47+ return false;
48+ }
49+
50+ cdrom_ = SDL_CDOpen(0);
51+ if (! cdrom_) {
52+ error_message_ = SDL_GetError();
53+ return false;
54+ }
55+
56+ return true;
57+ }
58+
59+ // ドライブのチェックと情報取得
60+ bool checkDrive(std::vector<track_t>& tracks) {
61+
62+ tracks.clear();
63+ if (! cdrom_) {
64+ if (! openDrive(drive_id_)) {
65+ return false;
66+ }
67+ }
68+
69+ CDstatus status = SDL_CDStatus(cdrom_);
70+ if (! CD_INDRIVE(status)) {
71+ error_message_ = "not found CD-ROM.";
72+ return false;
73+ }
74+
75+ for (int i = 0; i < cdrom_->numtracks; ++i) {
76+
77+ track_t info;
78+ SDL_CDtrack& track = cdrom_->track[i];
79+ info.id = track.id;
80+ info.frame_length = track.length;
81+ info.type = (track.type == SDL_AUDIO_TRACK) ? AudioTrack : DataTrack;
82+
83+ int frame;
84+ FRAMES_TO_MSF(track.length, &info.min, &info.sec, &frame);
85+
86+ tracks.push_back(info);
87+ }
88+
89+ return true;
90+ }
91+
92+ bool play(size_t id, size_t start_frame, size_t play_frame) {
93+ if (! checkDrive(track_list_)) {
94+ return false;
95+ }
96+
97+ if ((id >= track_list_.size()) || (track_list_[id].type == DataTrack)) {
98+ return false;
99+ }
100+
101+ int ntrack = (play_frame == 0) ? 1 : 0;
102+ SDL_CDPlayTracks(cdrom_, static_cast<int>(id),
103+ static_cast<int>(start_frame),
104+ ntrack, static_cast<int>(play_frame));
105+ return true;
106+ }
107+
108+ void stop(void) {
109+ SDL_CDStop(cdrom_);
110+ }
111+
112+ bool getCurrentFrame(size_t* frame, size_t* min, size_t* sec) {
113+
114+ //FRAMES_TO_MSF(cdrom->cur_frame, &min, &sec, &frame);
115+ //printf("現在位置: %d 分, %d 秒, %d フレーム\n", min, sec, frame);
116+
117+ if (! checkDrive(track_list_)) {
118+ return false;
119+ }
120+
121+ if (frame) {
122+ *frame = cdrom_->cur_frame;
123+ }
124+ return true;
125+ }
25126 };
26127
27128
28-CdromPlay::CdromPlay(void) : pimpl(new pImpl) {
129+CdromPlay::CdromPlay(void) : pimpl(new pImpl(0)) {
29130 }
30131
31132
133+CdromPlay::CdromPlay(size_t use_drive) : pimpl(new pImpl(use_drive)) {
134+}
135+
136+
32137 CdromPlay::~CdromPlay(void) {
33138 }
34139
35140
141+size_t CdromPlay::getDrives(void) {
142+
143+ // CD-ROM システムの初期化を行わせる
144+ static pImpl::CdromInit audio_init;
145+
146+ return SDL_CDNumDrives();
147+}
148+
149+
36150 const char* CdromPlay::what(void) {
37151 return pimpl->error_message_.c_str();
38152 }
39153
40154
155+int CdromPlay::playTrack(size_t track_id,
156+ size_t start_frame, size_t play_frame,
157+ size_t tracks) {
158+ fprintf(stderr, "play()\n");
159+
160+ if (! pimpl->play(track_id, start_frame, play_frame)) {
161+ return -1;
162+ }
163+
164+ size_t play_msec = 0;
165+ if (play_frame != 0) {
166+ play_msec = 1000 * play_frame / CD_FPS;
167+
168+ } else {
169+ size_t play_frame_ =
170+ pimpl->track_list_[track_id].frame_length - start_frame;
171+ play_msec = 1000 * play_frame_ / CD_FPS;
172+ }
173+ return play_msec;
174+}
175+
176+
177+bool CdromPlay::getTracks(std::vector<track_t>& tracks) {
178+ return pimpl->checkDrive(tracks);
179+}
180+
181+
182+bool CdromPlay::isPlaying(void) {
183+
184+ // CD_FPS 分だけ待機し、その間にフレーム位置が移動したら、再生中とみなす
185+ // !!! いいのかな? こんな実装で
186+
187+ // 現在のフレーム位置を取得
188+ size_t first_frame = 0;
189+ if (! getCurrentFrame(&first_frame)) {
190+ return false;
191+ }
192+
193+ delay(1000 / CD_FPS);
194+
195+ // CD_FPS 経過後のフレーム位置を取得
196+ size_t last_frame = 0;
197+ if (! getCurrentFrame(&last_frame)) {
198+ return false;
199+ }
200+
201+ return (first_frame == last_frame) ? false : true;
202+}
203+
204+
205+bool CdromPlay::getCurrentFrame(size_t* frame, size_t* min, size_t* sec) {
206+ return pimpl->getCurrentFrame(frame, min, sec);
207+}
208+
209+
41210 void CdromPlay::stop(void) {
42- // !!! 再生中か、のフラグをクリアする
43- SDL_CDStop(pimpl->cdrom_);
211+ pimpl->stop();
44212 }
45213
46214
--- trunk/libs/sound/SdlCdromInit.cpp (nonexistent)
+++ trunk/libs/sound/SdlCdromInit.cpp (revision 12)
@@ -0,0 +1,45 @@
1+/*!
2+ \file
3+ \brief SDL_CDROM システムの初期化
4+
5+ \author Satofumi KAMIMURA
6+
7+ $Id$
8+
9+ \todo SdlSubsystemInit クラスを作るべきか検討する
10+*/
11+
12+#include <SDL.h>
13+#include "SdlInit.h"
14+#include "SdlCdromInit.h"
15+
16+using namespace qrk;
17+
18+
19+struct SdlCdromInit::pImpl : private SdlInit {
20+ static bool initialized_;
21+
22+ void init(void) {
23+ if (initialized_) {
24+ return;
25+ }
26+ initialized_ = (SDL_InitSubSystem(SDL_INIT_CDROM) < 0) ? false : true;
27+ }
28+
29+ void quit(void) {
30+ // !!! 今のところ、この処理が明示的に呼ばれることは想定していない
31+ SDL_QuitSubSystem(SDL_INIT_CDROM);
32+ initialized_ = false;
33+ }
34+};
35+bool SdlCdromInit::pImpl::initialized_ = false;
36+
37+
38+SdlCdromInit::SdlCdromInit(void) : pimpl(new pImpl) {
39+ pimpl->init();
40+}
41+
42+
43+SdlCdromInit::~SdlCdromInit(void) {
44+ // exit() 時に SdlInit の実装内で SDL_Quit() が呼ばれるはずなので、何もしない
45+}
--- trunk/libs/sound/Makefile (revision 11)
+++ trunk/libs/sound/Makefile (revision 12)
@@ -5,7 +5,7 @@
55 # Compile options
66 CC = ${CXX}
77 CXXFLAGS = -g -O0 -Wall -Werror ${INCLUDES} `sdl-config --cflags`
8-INCLUDES = -I../system/sdl
8+INCLUDES = -I../system
99
1010 # Target
1111 SOUND_LIB = sound.a
@@ -15,6 +15,7 @@
1515
1616 clean :
1717 ${RM} *.o ${TARGET}
18+ cd samples/ && ${MAKE} clean
1819
1920 depend :
2021 makedepend -Y -- ${INCLUDES} -- ${wildcard *.h *.cpp}
@@ -23,6 +24,7 @@
2324 ######################################################################
2425 ${SOUND_LIB} : \
2526 ${SOUND_LIB}(SdlAudioInit.o) \
27+ ${SOUND_LIB}(SdlCdromInit.o) \
2628 ${SOUND_LIB}(SdlMixerInit.o) \
2729 ${SOUND_LIB}(VolumeCtrl.o) \
2830 ${SOUND_LIB}(CdromPlay.o)
@@ -29,7 +31,8 @@
2931
3032 # DO NOT DELETE
3133
32-CdromPlay.o: CdromPlay.h SdlAudioInit.h VolumeChangeInterface.h
34+CdromPlay.o: CdromPlay.h SdlCdromInit.h VolumeChangeInterface.h
3335 SdlAudioInit.o: ../system/sdl/SdlInit.h SdlAudioInit.h
36+SdlCdromInit.o: ../system/sdl/SdlInit.h SdlCdromInit.h
3437 SdlMixerInit.o: SdlAudioInit.h SdlMixerInit.h
3538 VolumeCtrl.o: VolumeCtrl.h
--- trunk/programs/CdPlayer/CdPlayerWidget.cpp (nonexistent)
+++ trunk/programs/CdPlayer/CdPlayerWidget.cpp (revision 12)
@@ -0,0 +1,10 @@
1+/*!
2+ \file
3+ \brief CD-ROM プレイヤー
4+
5+ \author Satofumi KAMIMURA
6+
7+ $Id$
8+*/
9+
10+#include "CdPlayerWidget.h"
--- trunk/programs/CdPlayer/CdPlayerWidget.h (nonexistent)
+++ trunk/programs/CdPlayer/CdPlayerWidget.h (revision 12)
@@ -0,0 +1,20 @@
1+#ifndef CD_PLAYER_WIDGET_H
2+#define CD_PLAYER_WIDGET_H
3+
4+/*!
5+ \file
6+ \brief CD-ROM プレイヤー
7+
8+ \author Satofumi KAMIMURA
9+
10+ $Id$
11+*/
12+
13+#include "ui_CdPlayerForm.h"
14+
15+namespace qrk {
16+ class CdPlayerWidget : public Ui::CdPlayerForm {
17+ };
18+};
19+
20+#endif /* !CD_PLAYER_WIDGET_H */
旧リポジトリブラウザで表示