Wohoo! That’s really great! Here is my current (OMG: it’s SDL + Tk)
proof-of-concept-script.

It plays a file via start and stop buttons. In case anyone has suggestions,
please don’t hesitate to drop me an email.

 

[code]

#!perl

 

use strict;

use warnings;

use utf8;

use Tk;

use DBI;

use SQL::Abstract::Limit;

use SDL;

use SDL::Audio;

use SDL::Mixer;

use SDL::Mixer::Samples;

use SDL::Mixer::Channels;

use SDL::Mixer::Music;

use SDL::RWOps;

SDL::init(SDL_INIT_AUDIO);

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

 

my $mw = tkinit();

 

unless( SDL::Mixer::open_audio( 44100, AUDIO_S16SYS, 2, 4096 ) == 0 ) {

                Carp::croak "Cannot open audio: ".SDL::get_error(); 

}

 

$mw->Button(

                -text => 'play',

                -command => sub{

                               my $buffer = get_audio_buffer();

                               my $rwops = SDL::RWOps->new_const_mem(
$buffer );

                               my $background_music =
SDL::Mixer::Music::load_MUS_RW( $rwops );

                               

                               unless( $background_music ) {

                                               Carp::croak "Cannot load
music file [buffer from DB]: " . SDL::get_error();

                               }

                

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

                },

)->pack();

 

$mw->Button(

                -text => 'stop',

                -command => sub{

                               SDL::Mixer::Music::halt_music();

                },

)->pack();

 

$mw->MainLoop();

 

 

 

sub get_audio_buffer {

    my $sql = SQL::Abstract::Limit->new( limit_dialect => 'LimitXY' );;

    

    my $table = 'words';

    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 = 'test';

    my $db_host = '127.0.0.1';

    my $db_port = '3306';

    my $dsn = "DBI:mysql:database=$database;host=$db_host;port=$db_port";

    my $username = 'test';

    my $password = 'test';

    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]

 

Here is the output of “perl Build.PL”. There is an error for : execinfo.h,
however, build, build test and build install runs fine.

 

[snip]

C:\zwischen\cpan\PerlGameDev-SDL-44c341f>perl Build.PL

*************************** !!!WARNING!!! ********************************

This Release breaks back compatibility support with versions 2.4x and below

**************************************************************************

Using 'My::Builder::Windows' class ...

Detecting available libraries ...

[Alien::SDL] Testing header(s): SDL.h

[Alien::SDL] Testing header(s): SDL_mixer.h

[Alien::SDL] Testing header(s): SDL_imageFilter.h

[Alien::SDL] Testing header(s): SDL_image.h

[Alien::SDL] Testing header(s): SDL_ttf.h

[Alien::SDL] Testing header(s): SDL_framerate.h

[Alien::SDL] Testing header(s): SDL_gfxBlitFunc.h

[Alien::SDL] Testing header(s): SDL_gfxPrimitives.h

[Alien::SDL] Testing header(s): SDL_rotozoom.h

[Alien::SDL] Testing header(s): SDL_Pango.h

Writing config_data ...

Saving some info to 'notes' ...

[Alien::SDL] Testing header(s): execinfo.h, signal.h NOK: (error:
execinfo.h: No

such file or directory)

Can't find dist packages without a MANIFEST file

Run 'Build manifest' to generate one

 

WARNING: Possible missing or corrupt 'MANIFEST' file.

Nothing to enter for 'provides' field in metafile.

Created MYMETA.yml and MYMETA.json

Creating new 'Build' script for 'SDL' version '2.535_01'

 

C:\zwischen\cpan\PerlGameDev-SDL-44c341f>

[/snip]

 

Will this be in an official release of SDL? Because this would be a really
nice feature, that could be advertised, e.g. via blogs entries etc.. I could
write a german one.

 

Best regards & thanks a lot,

Alex

 

Von: Tobias Leich [mailto:em...@froggs.de] 
Gesendet: Donnerstag, 1. Dezember 2011 18:37
An: Alexander Becker
Betreff: Re: How to play an mp3 file from a database

 

Hi Alex,

You can checkout the c-sdl-rwops branch at github or download the zipfile if
you are not experienced with git by using this link:

https://github.com/PerlGameDev/SDL/zipball/c-sdl-rwops

Usage:

 my $music = SDL::Mixer::Music::load_MUS_RW( $rwops );

load_MUS_RW does the same like load_MUS except that it accepts an SDL::RWOps
<http://search.cpan.org/perldoc?SDL%3A%3ARWOps> -object rather than a
filename.

Example for loading music from a variable:

 use SDL;
 use SDL::Mixer;
 use SDL::Mixer::Music;
 use SDL::RWOps;
 
 [...]
 
 my $rwops = SDL::RWOps->new_const_mem( $scalar_holding_music );
 my $music = SDL::Mixer::Music::load_MUS( $rwops );

Cheers

Am 30.11.2011 23:09, schrieb Alexander Becker: 

Hi!
 
The example code in your link gives me version 1.2.11 on Win 7 x64 with
strawberry perl 5.12.2 built for MSWin32-x64-multi-thread.
 
HTH, 
Alex
 
[code]
 use SDL::Mixer;
 use SDL::Version;
 
 my $version = SDL::Mixer::linked_version();
 
 printf("%d.%d.%d\n", $version->major, $version->minor, $version->patch); #
prints "1.2.11" for me
[/code]
 
-----Ursprüngliche Nachricht-----
Von: Tobias Leich [mailto:em...@froggs.de] 
Gesendet: Mittwoch, 30. November 2011 13:18
An: Alexander Becker
Cc: 'breno'; sdl-devel@perl.org
Betreff: Re: How to play an mp3 file from a database
 
Hi, can you please check what version of libSDL_mixer do you have installed?
 
http://sdl.perl.org/SDL-Mixer.html#linked_version
 
In case you have 1.2.7 or better we can add support for RWOps objects.
So you dont need temp files.
 
Cheers, FROGGS
 
 
Am 29.11.2011 20:37, schrieb Alexander Becker:

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
 

 
-----
eMail ist virenfrei.
Von AVG überprüft - www.avg.de
Version: 10.0.1411 / Virendatenbank: 2102/4048 - Ausgabedatum: 30.11.2011 
 

 

  _____  

eMail ist virenfrei.
Von AVG überprüft - www.avg.de
Version: 10.0.1411 / Virendatenbank: 2102/4048 - Ausgabedatum: 30.11.2011 

Reply via email to