]> git.saurik.com Git - wxWidgets.git/blame - utils/wxMMedia/cdunix.cpp
Added test for sprintf and vsnprintf to fix string.cpp for non-GNU systems.
[wxWidgets.git] / utils / wxMMedia / cdunix.cpp
CommitLineData
4d6306eb
GL
1////////////////////////////////////////////////////////////////////////////////
2// Name: cdlinux.cpp
3// Purpose: wxMMedia
4// Author: Guilhem Lavaux
5// Created: 1997
6// Updated: 1998
7// Copyright: (C) 1997, 1998, Guilhem Lavaux
8// License: wxWindows license
9////////////////////////////////////////////////////////////////////////////////
10#ifdef __GNUG__
11#pragma implementation "cdunix.h"
12#endif
13
14#include <sys/types.h>
15#include <sys/ioctl.h>
16#include <stdio.h>
17#include <fcntl.h>
18#include <unistd.h>
19
20#ifdef __linux__
21#include <linux/cdrom.h>
22#else
23// For Solaris
24#include <sys/cdio.h>
25#endif
26
27#ifdef WX_PRECOMP
28#include "wx/wxprec.h"
29#else
30#include "wx/wx.h"
31#endif
32#include "mmtype.h"
33#include "cdunix.h"
34
35wxCDAudioLinux::wxCDAudioLinux()
36 : wxCDAudio(), m_fd(-1)
37{
38 OpenDevice("/dev/cdrom");
39}
40
41wxCDAudioLinux::wxCDAudioLinux(const char *dev_name)
42 : wxCDAudio(), m_fd(-1)
43{
44 OpenDevice(dev_name);
45}
46
47wxCDAudioLinux::~wxCDAudioLinux()
48{
49 if (m_fd != -1) {
50 close(m_fd);
51 wxDELETE(m_trksize);
52 wxDELETE(m_trkpos);
53 }
54}
55
56void wxCDAudioLinux::OpenDevice(const char *dev_name)
57{
58 struct cdrom_tocentry entry, old_entry;
59 struct cdrom_tochdr diskinf;
60 struct cdrom_msf0 *msf = &entry.cdte_addr.msf,
61 *old_msf = &old_entry.cdte_addr.msf;
62 wxCDtime *the_track;
63 wxCDtime tot_tm;
64 wxUint8 nb_tracks, i;
65 int hour, minute, second;
66
67 if (m_fd != -1)
68 return;
69
70 m_fd = open(dev_name, O_RDONLY);
71 if (m_fd == -1) {
72 m_toc = NULL;
73 return;
74 }
75 m_status = STOPPED;
76
77 ioctl(m_fd, CDROMREADTOCHDR, &diskinf);
78
79 nb_tracks = diskinf.cdth_trk1-diskinf.cdth_trk0+1;
80 m_trksize = new wxCDtime[nb_tracks+1];
81 m_trkpos = new wxCDtime[nb_tracks+1];
82
83 old_msf->minute = 0;
84 old_msf->second = 0;
85 for (i=diskinf.cdth_trk0;i<=diskinf.cdth_trk1;i++) {
86 entry.cdte_track = i;
87 entry.cdte_format = CDROM_MSF;
88 ioctl(m_fd, CDROMREADTOCENTRY, &entry);
89
90 minute = msf->minute - old_msf->minute;
91 second = msf->second - old_msf->second;
92 if (second < 0) {
93 minute--;
94 second += 60;
95 }
96
97 hour = minute / 60;
98 minute %= 60;
99
100 the_track = &m_trksize[i-diskinf.cdth_trk0];
101 the_track->track = i-diskinf.cdth_trk0;
102 the_track->hour = hour;
103 the_track->min = minute;
104 the_track->sec = second;
105
106 the_track = &m_trkpos[i-diskinf.cdth_trk0];
107 the_track->track = i-diskinf.cdth_trk0;
108 the_track->hour = old_msf->minute / 60;
109 the_track->min = old_msf->minute % 60;
110 the_track->sec = old_msf->second;
111 old_entry = entry;
112 }
113
114 entry.cdte_track = CDROM_LEADOUT;
115 entry.cdte_format = CDROM_MSF;
116 ioctl(m_fd, CDROMREADTOCENTRY, &entry);
117
118 tot_tm.track = nb_tracks;
119 tot_tm.hour = msf->minute / 60;
120 tot_tm.min = msf->minute % 60;
121 tot_tm.sec = msf->second % 60;
122
123 m_trksize[nb_tracks].track = nb_tracks;
124 minute = msf->minute - old_msf->minute;
125 second = msf->second - old_msf->second;
126 if (second < 0) {
127 minute--;
128 second += 60;
129 }
130 hour = minute / 60;
131 minute %= 60;
132
133 m_trksize[nb_tracks].hour = hour;
134 m_trksize[nb_tracks].min = minute;
135 m_trksize[nb_tracks].sec = second;
136 m_trkpos[nb_tracks].track = nb_tracks;
137 m_trkpos[nb_tracks].hour = old_msf->minute / 60;
138 m_trkpos[nb_tracks].min = old_msf->minute % 60;
139 m_trkpos[nb_tracks].sec = old_msf->second;
140
141 m_toc = new CDtoc(tot_tm, m_trksize, m_trkpos);
142}
143
144bool wxCDAudioLinux::Play(const wxCDtime& beg_time, const wxCDtime& end_time)
145{
146 struct cdrom_msf track_msf;
147
148 track_msf.cdmsf_min0 = beg_time.hour * 60 + beg_time.min;
149 track_msf.cdmsf_sec0 = beg_time.sec;
150 track_msf.cdmsf_frame0 = 0;
151 track_msf.cdmsf_min1 = end_time.hour * 60 + end_time.min;
152 track_msf.cdmsf_sec1 = end_time.sec;
153 track_msf.cdmsf_frame1 = 0;
154 return (ioctl(m_fd, CDROMPLAYMSF, &track_msf) != -1);
155}
156
157bool wxCDAudioLinux::Pause()
158{
159 return (ioctl(m_fd, CDROMPAUSE, 0) != -1);
160}
161
162bool wxCDAudioLinux::Resume()
163{
164 return (ioctl(m_fd, CDROMRESUME, 0) != -1);
165}
166
167wxCDAudio::CDstatus wxCDAudioLinux::GetStatus()
168{
169 struct cdrom_subchnl subchnl;
170 ioctl(m_fd, CDROMSUBCHNL, &subchnl);
171 switch (subchnl.cdsc_audiostatus) {
172 case CDROM_AUDIO_PLAY: return PLAYING;
173 case CDROM_AUDIO_PAUSED: return PAUSED;
174 case CDROM_AUDIO_COMPLETED: return STOPPED;
175 }
176
177 return STOPPED;
178}
179
180wxCDtime wxCDAudioLinux::GetTime()
181{
182 wxCDtime cdtime;
183 struct cdrom_subchnl subchnl;
184
185 ioctl(m_fd, CDROMSUBCHNL, &subchnl);
186 cdtime.track = subchnl.cdsc_trk;
187 cdtime.min = subchnl.cdsc_reladdr.msf.minute;
188 cdtime.hour = cdtime.min / 60;
189 cdtime.min %= 60;
190 cdtime.sec = subchnl.cdsc_reladdr.msf.second;
191
192 return cdtime;
193}
194
195wxCDAudio::CDtoc& wxCDAudioLinux::GetToc()
196{
197 return *m_toc;
198}