File Coverage

blib/lib/Win32/MCI/CD.pm
Criterion Covered Total %
statement 7 9 77.7
branch n/a
condition n/a
subroutine 3 3 100.0
pod n/a
total 10 12 83.3


line stmt bran cond sub pod time code
1             package Win32::MCI::CD;
2            
3 1     1   6845 use warnings;
  1         2  
  1         34  
4 1     1   5 use strict;
  1         2  
  1         52  
5            
6             require 5;
7            
8             our $VERSION = "0.02";
9            
10 1     1   1564 use Win32::API;
  0            
  0            
11             use Carp;
12            
13            
14             ###########################################################################
15             ###
16             ### Define variables for this module.
17             ###
18             ###########################################################################
19            
20             my $mci_sendstring = new Win32::API("winmm.dll", "mciSendStringA", ['P', 'P', 'N', 'N'], 'N') || croak "Creating api call mciSendStringA failed";
21             my $mci_error = new Win32::API("winmm.dll", "mciGetErrorStringA", ['N', 'P', 'N'], 'N') || croak "Creating api call mciGetErrorStringA failed";
22             my $last_error = 0;
23            
24            
25             ###########################################################################
26             ###
27             ### Construct our object.
28             ###
29             ###########################################################################
30            
31             sub new {
32             my $class = shift;
33             my %parms = @_;
34             my $self;
35             if(!defined $parms{-aliasname}) { croak "Option -aliasname was ignored";}
36             if(!defined $parms{-drive}) { croak "Option -drive was ignored";}
37             %{$self} = %parms;
38             bless $self, $class;
39             return $self;
40             }
41            
42            
43             ###########################################################################
44             ###
45             ### Functions below are used by the module itself.
46             ###
47             ###########################################################################
48            
49             sub strip_spaces { return unpack('A*', shift); }
50            
51             sub sendstring
52             {
53             my $command = shift;
54             my $return_string = " " x 256;
55             my $return = $mci_sendstring->Call($command, $return_string, length($return_string), 0);
56             return ($return, strip_spaces($return_string));
57             }
58            
59            
60             ###########################################################################
61             ###
62             ### Functions below can be called by user, as methods.
63             ###
64             ###########################################################################
65            
66             sub cd_opendevice
67             {
68             my $self = shift;
69             my $drive = $self->{-drive};
70             my $namedevice = $self->{-aliasname};
71             my $ret = (sendstring("open $drive type cdaudio ALIAS $namedevice wait shareable"))[0];
72             if($ret != 0) { $last_error = $ret; return 0;}
73             return 1;
74             }
75            
76             sub cd_closedevice
77             {
78             my $self = shift;
79             my $namedevice = $self->{-aliasname};
80             my $ret = (sendstring("close $namedevice"))[0];
81             if($ret != 0) { $last_error = $ret; return 0;}
82             return 1;
83             }
84            
85             sub cd_getlasterror
86             {
87             my $self = shift;
88             my $return_string = " " x 128;
89             my $return = $mci_error->Call($last_error, $return_string, length($return_string));
90             return ($last_error, strip_spaces($return_string));
91             }
92            
93             sub cd_mode_milliseconds
94             {
95             my $self = shift;
96             my $namedevice = $self->{-aliasname};
97             my $ret = (sendstring("set $namedevice time format milliseconds wait"))[0];
98             if($ret != 0) { $last_error = $ret; return 0; }
99             return 1;
100             }
101            
102             sub cd_mode_tmsf
103             {
104             my $self = shift;
105             my $namedevice = $self->{-aliasname};
106             my $ret = (sendstring("set $namedevice time format tmsf wait"))[0];
107             if($ret != 0) { $last_error = $ret; return 0; }
108             return 1;
109             }
110            
111             sub cd_play
112             {
113             my ($self, $pos) = @_;
114             my $namedevice = $self->{-aliasname};
115             my $ret;
116             if($pos)
117             {
118             $ret = (sendstring("play $namedevice from $pos"))[0];
119             if($ret != 0) { $last_error = $ret; return 0; }
120             }
121             else
122             {
123             $ret = (sendstring("play $namedevice"))[0];
124             if($ret != 0) { $last_error = $ret; return 0; }
125             }
126             return 1;
127             }
128            
129             sub cd_stop
130             {
131             my $self = shift;
132             my $namedevice = $self->{-aliasname};
133             my $ret = (sendstring("stop $namedevice"))[0];
134             if($ret != 0) { $last_error = $ret; return 0; }
135             return 1;
136             }
137            
138             sub cd_pause
139             {
140             my $self = shift;
141             my $namedevice = $self->{-aliasname};
142             my $ret = (sendstring("pause $namedevice"))[0];
143             if($ret != 0) { $last_error = $ret; return 0; }
144             return 1;
145             }
146            
147             sub cd_status
148             {
149             my $self = shift;
150             my $namedevice = $self->{-aliasname};
151             my ($ret, $status) = sendstring("status $namedevice mode");
152             if($ret != 0) { $last_error = $ret; return 0; }
153             return $status;
154             }
155            
156             sub cd_currentpos
157             {
158             my $self = shift;
159             my $namedevice = $self->{-aliasname};
160             my ($ret, $pos) = sendstring("status $namedevice position");
161             if($ret != 0) { $last_error = $ret; return 0; }
162             return $pos;
163             }
164            
165             sub cd_tracklength
166             {
167             my ($self, $track) = @_;
168             my $namedevice = $self->{-aliasname};
169             my ($ret, $length) = sendstring("status $namedevice length track $track");
170             if($ret != 0) { $last_error = $ret; return 0; }
171             return $length;
172             }
173            
174             sub cd_cdlength
175             {
176             my $self = shift;
177             my $namedevice = $self->{-aliasname};
178             my ($ret, $length) = sendstring("status $namedevice length wait");
179             if($ret != 0) { $last_error = $ret; return 0; }
180             return $length;
181             }
182            
183             sub cd_tracks
184             {
185             my $self = shift;
186             my $namedevice = $self->{-aliasname};
187             my ($ret, $tracks) = sendstring("status $namedevice number of tracks wait");
188             if($ret != 0) { $last_error = $ret; return 0; }
189             return $tracks;
190             }
191            
192             sub cd_opentray
193             {
194             my $self = shift;
195             my $namedevice = $self->{-aliasname};
196             my $ret = (sendstring("set $namedevice door open"))[0];
197             if($ret != 0) { $last_error = $ret; return 0; }
198             return 1;
199             }
200            
201             sub cd_closetray
202             {
203             my $self = shift;
204             my $namedevice = $self->{-aliasname};
205             my $ret = (sendstring("set $namedevice door closed"))[0];
206             if($ret != 0) { $last_error = $ret; return 0; }
207             return 1;
208             }
209            
210             sub cd_present
211             {
212             my $self = shift;
213             my $namedevice = $self->{-aliasname};
214             my ($ret, $status) = sendstring("status $namedevice media present");
215             if($ret != 0) { $last_error = $ret; return 0; }
216             return $status;
217             }
218            
219             sub cd_seek
220             {
221             my ($self, $pos) = @_;
222             my $namedevice = $self->{-aliasname};
223             my $ret = (sendstring("seek $namedevice to $pos"))[0];
224             if($ret != 0) { $last_error = $ret; return 0; }
225             return 1;
226             }
227            
228             1;
229            
230             __END__