-
Notifications
You must be signed in to change notification settings - Fork 28
/
Sound.pm
106 lines (83 loc) · 2.16 KB
/
Sound.pm
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
package SDLx::Sound;
use strict;
use warnings;
use Carp;
use SDL;
#use SDL::Audio;
#use SDL::AudioSpec;
use SDL::Mixer;
use SDL::Mixer::Music;
#use SDL::Mixer::Channels;
#use SDL::Mixer::Samples;
#use SDL::Mixer::MixChunk;
# SDL::Mixer must be inited only one time
my $audioInited = undef;
sub new {
my $class = shift;
my $self = {@_};
bless ($self, $class);
_initAudio() unless $audioInited;
$self->{supported} = _initMixer();
return $self;
}
sub _initAudio {
SDL::Mixer::open_audio( 44100, AUDIO_S16SYS, 2, 4096 );
my ($status, $freq, $format, $channels) = @{ SDL::Mixer::query_spec() };
$audioInited = 1 if $status == 1;
return ($status, $freq, $format, $channels); #TODO: Save this information in $self;
}
sub _initMixer {
my $init_flags = SDL::Mixer::init( MIX_INIT_MP3 | MIX_INIT_MOD | MIX_INIT_FLAC | MIX_INIT_OGG );
my %init = ();
# Short circuit if we have and older version of SDL_Mixer
return \%init unless $init_flags;
$init{ mp3 } = 1 if $init_flags & MIX_INIT_MP3;
$init{ mod } = 1 if $init_flags & MIX_INIT_MOD;
$init{ flac } = 1 if $init_flags & MIX_INIT_FLAC;
$init{ ogg } = 1 if $init_flags & MIX_INIT_OGG;
return \%init
}
sub load {
my $self = shift;
$self->{files} = {@_};
}
sub unload {
my $self = shift;
$self->{files} = {};
}
sub play {
my $self = shift;
$self->{files} = {@_} if $#_ > 0 && @_;
my $play = 1;
if (-e $_[0]) {
my $music = SDL::Mixer::Music::load_MUS($_[0])
or Carp::croak 'Sound file not found: ' . SDL::get_error();
SDL::Mixer::Music::volume_music(85);
if (SDL::Mixer::Music::play_music($music, -1)<0) {
print("Can't play!\n". SDL::get_error()."\n");
$play = 0;
}
} else {
carp("No newline ".$self->{files}."\n".$_[0]."\n");
$play = 0;
}
return $play;
}
sub loud {
}
sub pause {
my $self = shift;
SDL::Mixer::Music::pause_music();
}
sub resume {
my $self = shift;
SDL::Mixer::Music::resume_music();
}
sub stop {
my $self = shift;
SDL::Mixer::Music::halt_music();
#SDL::Mixer::quit();
}
sub fade {
}
1; # End of SDLx::Sound