package Audio::MikMod; # $Id: MikMod.pm,v 1.3 1999/07/29 18:56:30 daniel Exp $ use strict; use Carp; use vars qw($VERSION @ISA @EXPORT @EXPORT_OK %EXPORT_TAGS $AUTOLOAD); require Exporter; require DynaLoader; @ISA = qw(Exporter DynaLoader); @EXPORT_OK = qw( DMODE_16BITS DMODE_HQMIXER DMODE_INTERP DMODE_REVERSE DMODE_SOFT_MUSIC DMODE_SOFT_SNDFX DMODE_STEREO DMODE_SURROUND LIBMIKMOD_REVISION LIBMIKMOD_VERSION LIBMIKMOD_VERSION_MAJOR LIBMIKMOD_VERSION_MINOR PAN_CENTER PAN_LEFT PAN_RIGHT PAN_SURROUND SFX_CRITICAL MikMod_Active MikMod_DisableOutput MikMod_EnableOutput MikMod_Exit MikMod_GetVersion MikMod_InfoDriver MikMod_InfoLoader MikMod_Init MikMod_InitThreads MikMod_Lock MikMod_RegisterAllDrivers MikMod_RegisterAllLoaders MikMod_RegisterDriver MikMod_RegisterErrorHandler MikMod_RegisterLoader MikMod_RegisterPlayer MikMod_Reset MikMod_SetNumVoices MikMod_Unlock MikMod_Update MikMod_md_mode MikMod_strerror Player_Active Player_Free Player_GetChannelPeriod Player_GetChannelVoice Player_GetModule Player_Load Player_LoadFP Player_LoadGeneric Player_LoadTitle Player_Mute Player_Muted Player_NextPosition Player_Paused Player_PrevPosition Player_SetPosition Player_SetSpeed Player_SetTempo Player_SetVolume Player_Start Player_Stop Player_ToggleMute Player_TogglePause Player_Unmute Sample_Free Sample_Load Sample_LoadFP Sample_LoadGeneric Sample_Play Voice_GetFrequency Voice_GetPanning Voice_GetPosition Voice_GetVolume Voice_Play Voice_RealVolume Voice_SetFrequency Voice_SetPanning Voice_SetVolume Voice_Stop Voice_Stopped ); %EXPORT_TAGS = ( 'CONSTANTS' => [ grep /^(?:DMODE_|LIB|PAN_|SFX)/, @EXPORT_OK ], 'MikMod' => [ grep /^MikMod_/, @EXPORT_OK ], 'Player' => [ grep /^Player_/, @EXPORT_OK ], 'Sample' => [ grep /^Sample_/, @EXPORT_OK ], 'Voice' => [ grep /^Voice_/ , @EXPORT_OK ], 'all' => [ @EXPORT_OK], ); #################################################################### # The constant autoloading doesn't work right because of prototyping # problems, when I want to hand a constant to a function. If there is a # better way to do this, let me know! use constant DMODE_16BITS => 0x0001; # enable 16 bit output use constant DMODE_STEREO => 0x0002; # enable stereo output use constant DMODE_SOFT_SNDFX => 0x0004; # Process sound effects via software mixer use constant DMODE_SOFT_MUSIC => 0x0008; # Process music via software mixer use constant DMODE_HQMIXER => 0x0010; # Use high-quality (slower) software mixer use constant DMODE_SURROUND => 0x0100; # enable surround sound use constant DMODE_INTERP => 0x0200; # enable interpolation use constant DMODE_REVERSE => 0x0400; # reverse stereo use constant PAN_LEFT => 0; use constant PAN_CENTER => 128; use constant PAN_RIGHT => 255; use constant PAN_SURROUND => 512; # panning value for Dolby Surround $VERSION = '0.5'; bootstrap Audio::MikMod $VERSION; sub AUTOLOAD { my $constname; ($constname = $AUTOLOAD) =~ s/.*:://; croak "& not defined" if $constname eq 'constant'; my $val = constant($constname, @_ ? $_[0] : 0); if ($! != 0) { if ($! !~ /Invalid/) { croak "Your vendor has not defined Audio::MikMod macro $constname : $!"; } $AutoLoader::AUTOLOAD = $AUTOLOAD; goto &AutoLoader::AUTOLOAD; } no strict 'refs'; *$AUTOLOAD = sub () { $val }; goto &$AUTOLOAD; } 1; __END__ =head1 NAME Audio::MikMod - Perl extension for libmikmod. =head1 SYNOPSIS use Audio::MikMod qw(:all); use Time::HiRes; MikMod_RegisterAllDrivers(); MikMod_RegisterAllLoaders(); MikMod_Init(); my $module = Player_Load('filename', 64, 0); Player_Start($module); while(Player_Active()) { usleep(10000); MikMod_Update(); } Player_Stop(); Player_Free($module); MikMod_Exit(); =head1 DESCRIPTION This module provides an interface to the libmikmod library for playing MOD, IT, XM, S3M, MTM, 669, STM, ULT, FAR, MED, AMF, DSM, IMF, GDM, and STX tracker files. In addition, manipulation of WAV samples is supported. Please see the extensive libmikmod info documentation included with that package. libmikmod is required, and can be obtained at http://mikmod.darkorb.net/ =head1 AUTHOR Daniel Sully =head1 SEE ALSO info mikmod, perl(1). =cut