#perl -w use strict; use Win32::API; Win32::API->Import("kernel32", "UINT GetWindowsDirectory(LPTSTR lpBuffer, UINT uSize)",) or die "Can't import the GetWindowsDirectory API:\n$!"; Win32::API::Type->typedef(MCIERROR => 'DWORD'); Win32::API->Import( "winmm", q( MCIERROR mciSendString( LPCTSTR lpszCommand, LPTSTR lpszReturnString, UINT cchReturn, HANDLE hwndCallback ) ) ) or die "Can't import the mciSendString API:\n$!"; doMM("close cdaudio"); doMM("open cdaudio shareable"); if (doMM("status cdaudio media present") eq "true") { my $cdi = doMM("info cdaudio identity"); printf("CD identifier: %X\n", $cdi); my ($artist, $title, %track) = GetCDinfo($cdi); print "Artist: $artist\n" if $artist; print "Title: $title\n" if $title; my $not = doMM("status cdaudio number of tracks"); printf("Number of tracks: %d\n", $not); my $i; my $tt; for $i (1 .. $not) { printf("Track %d: ", $i); $tt = doMM("status cdaudio type track $i"); if ($tt eq "audio") { printf("(%s) ", $track{$i - 1}) if exists($track{$i - 1}); doMM("set cdaudio time format msf"); printf("%s\n", doMM("status cdaudio length track $i")); } else { printf("(data) "); doMM("set cdaudio time format milliseconds"); printf("%.02f Mb\n", doMM("status cdaudio length track $i") * (150 * 1024 / 1000) / 1024**2); } } } else { print "No disc loaded.\n"; } doMM("close cdaudio"); sub doMM { my ($cmd) = @_; my $ret = "\0" x 1025; my $rc = mciSendString($cmd, $ret, 1024, 0); if ($rc == 0) { $ret =~ s/\0*$//; return $ret; } else { return "error '$cmd': $rc"; } } sub GetCDinfo { my ($cdi) = @_; my $xcdi = sprintf("%X", $cdi); my $artist; my $title; my %track; my $windir = "\0" x 1025; if (GetWindowsDirectory($windir, 1024)) { $windir =~ s/\0*$//; open(INI, "<$windir\\cdplayer.ini"); my $insec = 0; while () { if (/\[$xcdi\]/) { $insec = 1; } else { if ($insec) { if (/^artist=(.*)$/) { $artist = $1; } elsif (/^title=(.*)$/) { $title = $1; } elsif (/^(\d+)=(.*)$/) { $track{$1} = $2; } elsif (/^\[/) { $insec = 0; } } } } close(INI); return ($artist, $title, %track); } else { return undef; } }