]>
git.saurik.com Git - wxWidgets.git/blob - contrib/src/mmedia/cdunix.cpp
1 ////////////////////////////////////////////////////////////////////////////////
4 // Author: Guilhem Lavaux
7 // Copyright: (C) 1997, 1998, Guilhem Lavaux
9 // License: wxWindows license
10 ////////////////////////////////////////////////////////////////////////////////
12 #pragma implementation "cdunix.h"
15 #include "wx/wxprec.h"
25 #if HAVE_KNOWN_CDROM_INTERFACE
27 // ---------------------------------------------------------------------------
29 // ---------------------------------------------------------------------------
31 #include "wx/mmedia/cdbase.h"
32 #include "wx/mmedia/cdunix.h"
34 // ---------------------------------------------------------------------------
36 // ---------------------------------------------------------------------------
38 #include <sys/types.h>
39 #include <sys/ioctl.h>
45 #include <linux/cdrom.h>
51 // ---------------------------------------------------------------------------
53 // ---------------------------------------------------------------------------
55 IMPLEMENT_DYNAMIC_CLASS(wxCDAudioLinux
, wxCDAudio
)
57 wxCDAudioLinux::wxCDAudioLinux()
58 : wxCDAudio(), m_fd(-1)
60 OpenDevice(wxT("/dev/cdrom"));
63 wxCDAudioLinux::wxCDAudioLinux(const wxString
& dev_name
)
64 : wxCDAudio(), m_fd(-1)
69 wxCDAudioLinux::~wxCDAudioLinux()
78 void wxCDAudioLinux::OpenDevice(const wxString
& dev_name
)
80 struct cdrom_tocentry entry
, old_entry
;
81 struct cdrom_tochdr diskinf
;
82 struct cdrom_msf0
*msf
= &entry
.cdte_addr
.msf
,
83 *old_msf
= &old_entry
.cdte_addr
.msf
;
87 int hour
, minute
, second
;
92 m_fd
= open(dev_name
.mb_str(), O_RDONLY
);
99 ioctl(m_fd
, CDROMREADTOCHDR
, &diskinf
);
101 nb_tracks
= diskinf
.cdth_trk1
-diskinf
.cdth_trk0
+1;
102 m_trksize
= new wxCDtime
[nb_tracks
+1];
103 m_trkpos
= new wxCDtime
[nb_tracks
+1];
107 for (i
=diskinf
.cdth_trk0
;i
<=diskinf
.cdth_trk1
;i
++) {
108 entry
.cdte_track
= i
;
109 entry
.cdte_format
= CDROM_MSF
;
110 ioctl(m_fd
, CDROMREADTOCENTRY
, &entry
);
112 minute
= msf
->minute
- old_msf
->minute
;
113 second
= msf
->second
- old_msf
->second
;
122 the_track
= &m_trksize
[i
-diskinf
.cdth_trk0
];
123 the_track
->track
= i
-diskinf
.cdth_trk0
;
124 the_track
->hour
= hour
;
125 the_track
->min
= minute
;
126 the_track
->sec
= second
;
128 the_track
= &m_trkpos
[i
-diskinf
.cdth_trk0
];
129 the_track
->track
= i
-diskinf
.cdth_trk0
;
130 the_track
->hour
= old_msf
->minute
/ 60;
131 the_track
->min
= old_msf
->minute
% 60;
132 the_track
->sec
= old_msf
->second
;
136 entry
.cdte_track
= CDROM_LEADOUT
;
137 entry
.cdte_format
= CDROM_MSF
;
138 ioctl(m_fd
, CDROMREADTOCENTRY
, &entry
);
140 tot_tm
.track
= nb_tracks
;
141 tot_tm
.hour
= msf
->minute
/ 60;
142 tot_tm
.min
= msf
->minute
% 60;
143 tot_tm
.sec
= msf
->second
% 60;
145 m_trksize
[nb_tracks
].track
= nb_tracks
;
146 minute
= msf
->minute
- old_msf
->minute
;
147 second
= msf
->second
- old_msf
->second
;
155 m_trksize
[nb_tracks
].hour
= hour
;
156 m_trksize
[nb_tracks
].min
= minute
;
157 m_trksize
[nb_tracks
].sec
= second
;
158 m_trkpos
[nb_tracks
].track
= nb_tracks
;
159 m_trkpos
[nb_tracks
].hour
= old_msf
->minute
/ 60;
160 m_trkpos
[nb_tracks
].min
= old_msf
->minute
% 60;
161 m_trkpos
[nb_tracks
].sec
= old_msf
->second
;
163 m_toc
= new CDtoc(tot_tm
, m_trksize
, m_trkpos
);
166 bool wxCDAudioLinux::Play(const wxCDtime
& beg_time
, const wxCDtime
& end_time
)
168 struct cdrom_msf track_msf
;
170 track_msf
.cdmsf_min0
= beg_time
.hour
* 60 + beg_time
.min
;
171 track_msf
.cdmsf_sec0
= beg_time
.sec
;
172 track_msf
.cdmsf_frame0
= 0;
173 track_msf
.cdmsf_min1
= end_time
.hour
* 60 + end_time
.min
;
174 track_msf
.cdmsf_sec1
= end_time
.sec
;
175 track_msf
.cdmsf_frame1
= 0;
176 return (ioctl(m_fd
, CDROMPLAYMSF
, &track_msf
) != -1);
179 bool wxCDAudioLinux::Pause()
181 return (ioctl(m_fd
, CDROMPAUSE
, 0) != -1);
184 bool wxCDAudioLinux::Resume()
186 return (ioctl(m_fd
, CDROMRESUME
, 0) != -1);
189 wxCDAudio::CDstatus
wxCDAudioLinux::GetStatus()
191 struct cdrom_subchnl subchnl
;
192 ioctl(m_fd
, CDROMSUBCHNL
, &subchnl
);
193 switch (subchnl
.cdsc_audiostatus
) {
194 case CDROM_AUDIO_PLAY
: return PLAYING
;
195 case CDROM_AUDIO_PAUSED
: return PAUSED
;
196 case CDROM_AUDIO_COMPLETED
: return STOPPED
;
202 wxCDtime
wxCDAudioLinux::GetTime()
205 struct cdrom_subchnl subchnl
;
207 ioctl(m_fd
, CDROMSUBCHNL
, &subchnl
);
208 cdtime
.track
= subchnl
.cdsc_trk
;
209 cdtime
.min
= subchnl
.cdsc_reladdr
.msf
.minute
;
210 cdtime
.hour
= cdtime
.min
/ 60;
212 cdtime
.sec
= subchnl
.cdsc_reladdr
.msf
.second
;
217 wxCDAudio::CDtoc
& wxCDAudioLinux::GetToc()