Hi breno,

thank you for the quick response. It helped.
I had a look into mixer_samples.t and line 106 states, that quick_load_WAV
is not (yet? Who do I have to bribe with what to get it?) implemented.

Here is a working piece of code using temporary files. Of course, you need a
database containing audio files. 

Best regards,
Alex

[code]
#!perl

use strict;
use warnings;
use utf8;
use DBI;
use SQL::Abstract::Limit;
use File::Temp;
use SDL;
use SDL::Audio;
use SDL::Mixer;
use SDL::Mixer::Samples;
use SDL::Mixer::Channels;
use SDL::Mixer::Music;
SDL::init(SDL_INIT_AUDIO);
SDL::Mixer::init( MIX_INIT_MP3 | MUS_MP3 );

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

my $buffer = get_audio_buffer();

# -- write audio buffer to temp file
my $fh = File::Temp->new( UNLINK => 1, SUFFIX => '.mp3' );
$fh->unlink_on_destroy( 1 );
print $fh $buffer;
my $fname = $fh->filename;

# close the handle or the temfile will have some sort of lock on it and
cannot be read
$fh->close();

my $background_music = SDL::Mixer::Music::load_MUS( $fname );

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

SDL::Mixer::Music::play_music( $background_music,0 );

sleep(6);

SDL::Mixer::Music::halt_music();
SDL::Mixer::close_audio;
exit(0);



sub get_audio_buffer {
    my $sql = SQL::Abstract::Limit->new( limit_dialect => 'LimitXY' );;
    
    my $table = 'audio_files';
    my @fields = (qw/audio/);
    my %where = (
        id => 2,
    );
    my @order = ();
    my $limit = 1;
    my $offset = 0;
    my ( $stmt, @bind ) = $sql->select( $table, \@fields, \%where, \@order,
$limit, $offset );
    my $database = 'database_name';
    my $db_host = 'your_host';
    my $db_port = '3306';
    my $dsn = "DBI:mysql:database=$database;host=$db_host;port=$db_port";
    my $username = 'username';
    my $password = 'password';
    my $dbh = DBI->connect($dsn, $username, $password) or die('Cannot
connect to DB: ' . DBI->errstr());
    my $sth = $dbh->prepare( $stmt );
    $sth->execute( @bind );
    
    my ($buffer) = $sth->fetchrow_array();
    
    return $buffer;
} # /get_audio_buffer
[/code]

-----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 < > 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
-----
eMail ist virenfrei.
Von AVG überprüft - www.avg.de
Version: 10.0.1411 / Virendatenbank: 2092/4046 - Ausgabedatum: 29.11.2011 

Reply via email to