Raspberry Pi

Raspberry audio in c

굿쏘 2020. 11. 24. 08:55

http://hzqtc.github.io/2012/05/play-mp3-with-libmpg123-and-libao.html 

 

#include <ao/ao.h>

#include <mpg123.h>

 

#define BITS 8

 

int main(int argc, char *argv[])

{

    mpg123_handle *mh;

    unsigned char *buffer;

    size_t buffer_size;

    size_t done;

    int err;

 

    int driver;

    ao_device *dev;

 

    ao_sample_format format;

    int channels, encoding;

    long rate;

 

    if(argc < 2)

        exit(0);

 

    /* initializations */

    ao_initialize();

    driver = ao_default_driver_id();

    mpg123_init();

    mh = mpg123_new(NULL, &err);

    buffer_size = mpg123_outblock(mh);

    buffer = (unsigned char*) malloc(buffer_size * sizeof(unsigned char));

 

    /* open the file and get the decoding format */

    mpg123_open(mh, argv[1]);

    mpg123_getformat(mh, &rate, &channels, &encoding);

 

    /* set the output format and open the output device */

    format.bits = mpg123_encsize(encoding) * BITS;

    format.rate = rate;

    format.channels = channels;

    format.byte_format = AO_FMT_NATIVE;

    format.matrix = 0;

    dev = ao_open_live(driver, &format, NULL);

 

    /* decode and play */

    while (mpg123_read(mh, buffer, buffer_size, &done) == MPG123_OK)

        ao_play(dev, buffer, done);

 

    /* clean up */

    free(buffer);

    ao_close(dev);

    mpg123_close(mh);

    mpg123_delete(mh);

    mpg123_exit();

    ao_shutdown();

 

    return 0;

}

 

#include <curl/curl.h>#include <mpg123.h>#include <ao/ao.h> #define BITS 8 mpg123_handle *mh = NULL;ao_device *dev = NULL; size_t play_stream(void *buffer, size_t size, size_t nmemb, void *userp){    int err;    off_t frame_offset;    unsigned char *audio;    size_t done;    ao_sample_format format;    int channels, encoding;    long rate;     mpg123_feed(mh, (const unsigned char*) buffer, size * nmemb);    do {        err = mpg123_decode_frame(mh, &frame_offset, &audio, &done);        switch(err) {            case MPG123_NEW_FORMAT:                mpg123_getformat(mh, &rate, &channels, &encoding);                format.bits = mpg123_encsize(encoding) * BITS;                format.rate = rate;                format.channels = channels;                format.byte_format = AO_FMT_NATIVE;                format.matrix = 0;                dev = ao_open_live(ao_default_driver_id(), &format, NULL);                break;            case MPG123_OK:                ao_play(dev, audio, done);                break;            case MPG123_NEED_MORE:                break;            default:                break;        }    } while(done > 0);     return size * nmemb;} int main(int argc, char *argv[]){    if(argc < 2)        return 0;     ao_initialize();        mpg123_init();    mh = mpg123_new(NULL, NULL);    mpg123_open_feed(mh);     CURL *curl = curl_easy_init();    curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, play_stream);    curl_easy_setopt(curl, CURLOPT_URL, argv[1]);    curl_easy_perform(curl);    curl_easy_cleanup(curl);     mpg123_close(mh);    mpg123_delete(mh);    mpg123_exit();     ao_close(dev);    ao_shutdown();     return 0;}