Wohoo! Thats really great! Here is my current (OMG: its SDL + Tk) proof-of-concept-script.
It plays a file via start and stop buttons. In case anyone has suggestions, please dont 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