Search code examples
calsa

ALSA equivalent to /dev/audio dump?


This will be my poorest question ever...

On an old netbook, I installed an even older version of Debian, and toyed around a bit. One of the rather pleasing results was a very basic MP3 player (using libmpg123), integrated for adding background music to a little application doing something completely different. I grew rather fond of this little solution.

In that program, I dumped the decoded audio (from mpg123_decode()) to /dev/audio via a simple fwrite().

This worked fine - on the netbook.

Now, I came to understand that /dev/audio was something done by OSS, and is no longer supported on newer (ALSA) machines. Sure enough, my laptop (running a current Linux Mint) does not have this device.

So apparently I have to use ALSA instead. Searching the web, I've found a couple of tutorials, and they pretty much blow my mind. Modes, parameters, capabilities, access type, sample format, sample rate, number of channels, number of periods, period size... I understand that ALSA is a powerful API for the ambitious, but that's not what I am looking for (or have the time to grok). All I am looking for is how to play the output of mpg123_decode (the format of which I don't even know, not being an audio geek by a long shot).

Can anybody give me some hints on what needs to be done?

tl;dr

How do I get ALSA to play raw audio data?


Solution

  • And ten years later, the "actual" answer is found: That's the wrong way to do it in the first place.

    libmpg123 comes with a companion library, libout123, which abstracts the underlying audio system for you. Based on libmpg123 example code:

    #include <stdlib.h>
    #include "mpg123.h"
    #include "out123.h"
    
    int main()
    {
        mpg123_handle * _mpg_handle;
        out123_handle * _out_handle;
        double rate, channels, encoding;
        size_t position, buffer_size;
        unsigned char * buffer;
        char filename[] = "Example.mp3";
    
        mpg123_open( _mpg_handle, filename );
        mpg123_getformat( _mpg_handle, &rate, &channels, &encoding );
        out123_open( _out_handle, NULL, NULL );
        mpg123_format_none( _mpg_handle );
        mpg123_format( _mpg_handle, rate, channels, encoding );
        out123_start( _out_handle, rate, channels, encoding );
    
        buffer_size = mpg123_outblock( _mpg_handle );
        buffer = malloc( buffer_size );
    
        do
        {
            mpg123_read( _mpg_handle, buffer.get(), buffer_size, &position );
            out123_play( _out_handle, buffer.get(), position );
        } while ( position );
    
        out123_close( _out_handle );
        mpg123_close( _mpg_handle );
        free( buffer );
    }