Dear all!

It took me quite some time, but I'm moving forward. 
Here are some screens from my vocabulary trainer:
https://picasaweb.google.com/104129024313554475104/Vokabeltrainer?authuser=0
&authkey=Gv1sRgCKLyn6SSwIvCgwE&feat=directlink

Now I want to play  a vocable audio file (that is of course, stored in a
database :)). I can't use SDL::Mixer::Music for that, because there is
already some background music playing. AFAIK I need to use
SDL::Mixer::Samples.
I tried it, but there occurred an error when using mp3 files: "Cannot load
music file [music/terminal.mp3]: Unrecognized sound file type at
play_effect.pl line 34"

Here is the script:
[code]
#!perl
use strict;
use warnings;
use utf8;

use SDL;
use SDL::Event;
use SDL::Events;
use SDLx::App;
use SDLx::Controller;
use SDL::Mixer;
use SDL::Mixer::Music;
use SDL::RWOps;
use SDL::Mixer::Samples;
use SDL::Mixer::Channels;
SDL::init(SDL_INIT_AUDIO);
SDL::Mixer::init( MIX_INIT_MP3 | MUS_MP3 );

my $app = SDLx::App->new(
        title => 'play mp3 effect',
        exit_on_quit => 1,
);

unless( SDL::Mixer::open_audio( 44100, AUDIO_S16SYS, 2, 4096 ) == 0 ) {
        Carp::croak "Cannot open audio: ".SDL::get_error(); 
}

my $file = 'music/terminal.mp3';
#my $file = 'music/br_crossing_bell_dop.r.wav';
#my $file = 'music/Windows Logon Sound.wav';
my $sample = SDL::Mixer::Samples::load_WAV( $file );

unless( $sample ) {
        Carp::croak "Cannot load music file [$file]: " . SDL::get_error();
}

my $playing_channel = SDL::Mixer::Channels::play_channel( -1, $sample, 0 );

$app->run();

SDL::Mixer::Music::halt_music();
SDL::Mixer::close_audio;
exit(0);
[/code]

There also occurred some other errors using .wav files:
- Cannot load music file [music/br_crossing_bell_dop.r.wav]: Complex WAVE
files not supported at play_effect.pl line 34
- Cannot load music file [music/Windows Logon Sound.wav]: MPEG Layer 3 data
not supported play_effect.pl line 34

But, I only want to play mp3 files.

Maybe you can hint me at the solution for this problem? How can I play an
mp3 file once, e.g. on a button click event?

Best regards,
Alex

-----Ursprüngliche Nachricht-----
Von: breno [mailto:oainikus...@gmail.com] 
Gesendet: Dienstag, 29. November 2011 06:34
An: Alexander Becker
Cc: sdl-devel@perl.org
Betreff: Re: How to play an mp3 file from a database

On Mon, Nov 28, 2011 at 8:13 PM, Alexander Becker <alexanderbec...@gmx.net>
wrote:
> Dear all!
>

Hi there!

> I just tried the example code of the SDL Manual where you play some music.
> By the SDL manual, I refer to the one that is hidden at the bottom of 
> the sdl.perl.org page, so that you really have to search for it in 
> order to find it - and even then you have to get along with an ugly github
interface.
>

There's a new project website under way, but we're missing people to work in
it. Please join #sdl in irc.perl.org if you want to help us get it right :)

> So, in general: Is there a way to play mp3 files?

Yup.

If your libsdl was compiled with mp3 support, all you have to do
(iirc) is set the MIX_INIT_MP3 (for effects) and MUS_MP3 (for audio) flags
when you call SDL::Mixer::init():

  SDL::Mixer::init( MIX_INIT_MP3 | MUS_MP3 );

then use load_MUS() and play_music() from SDL::Mixer::Music to play
mp3 files as background music, or load_WAV() from SDL::Mixer::Samples to
play mp3 effects (yes, the function is named load_WAV() but plays different
formats too if they're available).

The documentation in SDL::Mixer, SDL::Mixer::Music and SDL::Mixer::Samples
should be helpful, as some of the test files (t/mixer_music.t comes to
mind).

> And in particular: is there a way to play mp3 files that are in a
variable?
> Or do I have to work with temporary files?
>

Not sure. I *think* SDL::Mixer::quick_load_WAV( $buffer ) might do the right
thing. You'll have to test it though.

Cheers,

breno 

Reply via email to