… | |
… | |
21 | |
21 | |
22 | sub init { |
22 | sub init { |
23 | unless ($::SDL_MIXER) { |
23 | unless ($::SDL_MIXER) { |
24 | if (length $::CFG->{audio_driver}) { |
24 | if (length $::CFG->{audio_driver}) { |
25 | local $ENV{SDL_AUDIODRIVER} = $::CFG->{audio_driver}; |
25 | local $ENV{SDL_AUDIODRIVER} = $::CFG->{audio_driver}; |
26 | DC::SDL_Init DC::SDL_INIT_AUDIO |
26 | DC::SDL_InitSubSystem DC::SDL_INIT_AUDIO |
27 | and die "SDL::Init failed!\n"; |
27 | and die "SDL::Init failed!\n"; |
28 | } else { |
28 | } else { |
29 | DC::SDL_Init DC::SDL_INIT_AUDIO |
29 | DC::SDL_InitSubSystem DC::SDL_INIT_AUDIO |
30 | and die "SDL::Init failed!\n"; |
30 | and die "SDL::Init failed!\n"; |
31 | } |
31 | } |
32 | |
32 | |
33 | $ENV{MIX_EFFECTSMAXSPEED} = 1; |
33 | $ENV{MIX_EFFECTSMAXSPEED} = 1; |
34 | $::SDL_MIXER = !DC::Mix_OpenAudio |
34 | $::SDL_MIXER = !DC::Mix_OpenAudio |
… | |
… | |
40 | DC::Mix_AllocateChannels $::CFG->{audio_mix_channels} |
40 | DC::Mix_AllocateChannels $::CFG->{audio_mix_channels} |
41 | if $::SDL_MIXER; |
41 | if $::SDL_MIXER; |
42 | } |
42 | } |
43 | } |
43 | } |
44 | |
44 | |
|
|
45 | sub _probe { |
|
|
46 | my $pid = fork; |
|
|
47 | |
|
|
48 | return 1 unless defined $pid; |
|
|
49 | |
|
|
50 | unless ($pid) { |
|
|
51 | eval { |
|
|
52 | DC::SDL_Init DC::SDL_INIT_NOPARACHUTE; |
|
|
53 | init; |
|
|
54 | }; |
|
|
55 | DC::_exit $@ ? 1 : 0; |
|
|
56 | } |
|
|
57 | |
|
|
58 | waitpid $pid, 0 |
|
|
59 | and !$? |
|
|
60 | } |
|
|
61 | |
|
|
62 | sub probe { |
|
|
63 | return unless $^O eq "linux"; |
|
|
64 | |
|
|
65 | # on linux, both alsa and pulse (especially the latter) |
|
|
66 | # are prone to segfaults, while the other interfaces are |
|
|
67 | # simply unreliable. |
|
|
68 | |
|
|
69 | # let's check whether the default config and a few others segfault, |
|
|
70 | # then decide |
|
|
71 | |
|
|
72 | # user selected config |
|
|
73 | return if _probe; |
|
|
74 | |
|
|
75 | # default sdl config |
|
|
76 | delete $ENV{SDL_AUDIODRIVER}; |
|
|
77 | $::CFG->{audio_driver} = ""; |
|
|
78 | return if _probe; |
|
|
79 | |
|
|
80 | $::CFG->{audio_driver} = "pulse"; |
|
|
81 | return if _probe; |
|
|
82 | |
|
|
83 | $::CFG->{audio_driver} = "alsa"; |
|
|
84 | return if _probe; |
|
|
85 | |
|
|
86 | $::CFG->{audio_driver} = "dsp"; |
|
|
87 | return if _probe; |
|
|
88 | |
|
|
89 | $::CFG->{audio_driver} = "none"; |
|
|
90 | } |
|
|
91 | |
45 | 1; |
92 | 1; |
46 | |
93 | |
47 | =back |
94 | =back |
48 | |
95 | |
49 | =head1 AUTHOR |
96 | =head1 AUTHOR |