Saturday, June 21, 2014

Audiodateien mit Perl abspielen (Windows only)

Wie man mit Perl und SDL MP3-Dateien abspielt, hatte ich in der Vergangenheit bereits in einem Blogeintrag beschrieben: MP3s mit Perl abspielen

Das sympathische an der Lösung mit SDL ist, dass sie plattformunabhängig funktioniert.

Wer nur auf Windows arbeitet kann aber auch andere Wege nutzen. So gibt es für Windows das Media Control Interface - kurz: MCI. Mir sind dazu bislang zwei Module auf CPAN untergekommen. Beide sind zugegebenermaßen über die klassische CPAN-Suche nicht immer so einfach zu finden, daher hier mal die Links dazu:
Von den kleinen Versionsnummern sollte man sich nicht schrecken lassen. Die Module funktionieren - soweit ich das bislang getestet habe - so wie sie sollen.

Die Dokumentation von Win32::MCI::Basic fällt derzeit sehr spartanisch aus. Eigentlich steht ja alles drin, was man braucht. Die beiden Befehle und ein Verweis auf die Microsoft-Dokumentation zum Thema. Leider gibt es (noch) kein Code-Beispiel.

Hier wäre dann eins:

#!/usr/bin/perl
use strict;
use warnings;
use Win32::MCI::Basic;
use File::Spec;

=comment

Let Perl play a sound file using Windows MCI.

Sources (all downloaded 2014-06-21):

http://search.cpan.org/dist/Win32-MCI-Basic-0.02/Basic.pm
https://metacpan.org/pod/Win32::MultiMedia::Mci
http://www.perlmonks.org/bare/?node_id=295558
http://msdn.microsoft.com/en-us/library/windows/desktop/dd757151%28v=vs.85%29.aspx
http://social.msdn.microsoft.com/Forums/es-ES/92803129-24c3-42d0-b32a-17d05606a151/win32-mci-api-for-playing-media?forum=vblanguage

=cut

# define your Audio file here. Tested with WMA and MP3
my $file_wma = File::Spec->catfile( $ENV{WINDIR}, '\Media\Alarm01.wav' );

run_or_die("open \"$file_wma\" alias myaudio");
run_or_die("play myaudio wait");
run_or_die("close myaudio");

print "done\n";

sub run_or_die {
    my $command = shift or die('Missing MCI command');

    my ($APICallReturnValue, $lpszReturnString) = mciSendString($command);
    printf("API Call Return Value: %s, that other string: %s\n", $APICallReturnValue, $lpszReturnString);
   
    die mciGetErrorString($APICallReturnValue) unless $APICallReturnValue == 0;
   
    return;
} # /run_or_die


Statt WAV-Dateien kann man auch MP3s reinwerfen und sie werden abgespielt. Läuft etwas schief, dann wird der Return-Code auf etwas anderes als 0 gesetzt.Der Return-Code kann dann mit dem Befehl mciGetErrorString in die dazugehörige Fehlermeldung umgewandelt werden.

Was es mit dem $lpszReturnString auf sich hat, habe ich leider noch nicht verstanden. Wer es weiß, darf gerne einen Kommentar hinterlassen.

No comments: