Develop and Download Open Source Software

Browse Subversion Repository

Contents of /sound/CdromPlayer.cpp

Parent Directory Parent Directory | Revision Log Revision Log


Revision 366 - (show annotations) (download) (as text)
Fri May 9 11:33:40 2008 UTC (16 years ago) by satofumi
File MIME type: text/x-c++src
File size: 3114 byte(s)
adjust for fullscreen
1 /*!
2 \file
3 \brief CD-ROM の再生
4
5 \author Satofumi KAMIMURA
6
7 $Id$
8 */
9
10 #include "CdromPlayer.h"
11 #include "SdlCdromInit.h"
12 #include <SDL.h>
13 #include <string>
14
15 using namespace beego;
16
17
18 struct CdromPlayer::pImpl : private SdlCdromInit {
19 std::string error_message_;
20 SDL_CD* cdrom_;
21 size_t drives_;
22 std::vector<track_t> track_list_;
23
24 pImpl(void) : error_message_("no error."), cdrom_(NULL), drives_(0) {
25 openDrive();
26 }
27
28 ~pImpl(void) {
29 if (cdrom_) {
30 stop();
31 SDL_CDClose(cdrom_);
32 }
33 }
34
35 static pImpl* getObject(void) {
36 static pImpl obj;
37 return &obj;
38 }
39
40 // !!! ドライバ番号を引数に与えられるように変更する
41 bool openDrive(void) {
42 drives_ = SDL_CDNumDrives();
43 //fprintf(stderr, "drives: %d\n", drives_);
44 if (drives_ == 0) {
45 error_message_ = "not found CD-ROM drive.";
46 return false;
47 }
48
49 cdrom_ = SDL_CDOpen(0);
50 if (! cdrom_) {
51 error_message_ = SDL_GetError();
52 return false;
53 }
54
55 return true;
56 }
57
58 bool checkDrive(void) {
59
60 if (! cdrom_) {
61 if (! openDrive()) {
62 return false;
63 }
64 }
65
66 CDstatus status = SDL_CDStatus(cdrom_);
67 if (! CD_INDRIVE(status)) {
68 error_message_ = "not found CD-ROM.";
69 return false;
70 }
71
72 track_list_.clear();
73 for (int i = 0; i < cdrom_->numtracks; ++i) {
74
75 track_t info;
76 SDL_CDtrack& track = cdrom_->track[i];
77 info.id = track.id;
78 info.frame_length = track.length;
79 info.type = (track.type == SDL_AUDIO_TRACK) ? AudioTrack : DataTrack;
80
81 int frame;
82 FRAMES_TO_MSF(track.length, &info.min, &info.sec, &frame);
83
84 track_list_.push_back(info);
85 }
86
87 return true;
88 }
89
90 bool getTrackList(std::vector<track_t>& list) {
91
92 if (! checkDrive()) {
93 return false;
94 }
95
96 list = track_list_;
97 return true;
98 }
99
100 bool play(size_t id, size_t start_frame, size_t play_frame) {
101 if (! checkDrive()) {
102 return false;
103 }
104
105 if ((id >= track_list_.size()) || (track_list_[id].type == DataTrack)) {
106 return false;
107 }
108
109 int ntrack = (play_frame == 0) ? 1 : 0;
110 SDL_CDPlayTracks(cdrom_, static_cast<int>(id),
111 static_cast<int>(start_frame),
112 ntrack, static_cast<int>(play_frame));
113 return true;
114 }
115
116 void stop(void) {
117 SDL_CDStop(cdrom_);
118 }
119 };
120
121
122 CdromPlayer::CdromPlayer(void) : pimpl(pImpl::getObject()) {
123 }
124
125
126 CdromPlayer::~CdromPlayer(void) {
127 }
128
129
130 const char* CdromPlayer::what(void) {
131 return pimpl->error_message_.c_str();
132 }
133
134
135 bool CdromPlayer::getTrackList(std::vector<track_t>& list) {
136 return pimpl->getTrackList(list);
137 }
138
139
140 size_t CdromPlayer::play(size_t id, size_t start_frame, size_t play_frame) {
141 if (! pimpl->play(id, start_frame, play_frame)) {
142 return 0;
143 }
144
145 size_t play_msec = 0;
146 if (play_frame != 0) {
147 play_msec = 1000 * play_frame / CD_FPS;
148
149 } else {
150 play_msec =
151 1000 * (pimpl->track_list_[id].frame_length - start_frame) / CD_FPS;
152 }
153 return play_msec;
154 }
155
156
157 void CdromPlayer::stop(void) {
158 pimpl->stop();
159 }
160
161
162 void CdromPlayer::eject(void) {
163 SDL_CDEject(pimpl->cdrom_);
164 }

Back to OSDN">Back to OSDN
ViewVC Help
Powered by ViewVC 1.1.26