Luca Abeni <[EMAIL PROTECTED]> added the comment:

Alsa support: muxer

______________________________________________________
FFmpeg issue tracker <[EMAIL PROTECTED]>
<https://roundup.mplayerhq.hu/roundup/ffmpeg/issue247>
______________________________________________________
#include "avformat.h"
#include <alsa/asoundlib.h>

#include "alsa-audio.h"

static int audio_write_header(AVFormatContext *s1)
{
    AlsaData *s = s1->priv_data;
    AVStream *st;
    int res;

    st = s1->streams[0];
    s->sample_rate = st->codec->sample_rate;
    s->channels = st->codec->channels;
    if (!ff_alsa_supported_codec_id(st->codec->codec_id)) {
        av_log(NULL, AV_LOG_ERROR, "sample format %x is not supported\n", st->codec->codec_id);
        return AVERROR(ENOSYS);
    }
    s->codec_id = st->codec->codec_id;
    res = ff_alsa_open(s1, SND_PCM_STREAM_PLAYBACK);

    return res;
}

static int audio_write_packet(AVFormatContext *s1, AVPacket *pkt)
{
    AlsaData *s = s1->priv_data;
    int res;
    int size= pkt->size;
    uint8_t *buf= pkt->data;

    while((res = snd_pcm_writei(s->h, buf, size / (av_get_bits_per_sample(s->codec_id) / 8 * s->channels))) < 0) {
        if (res == -EAGAIN) {

            return AVERROR(EAGAIN);
        }

        if (ff_alsa_xrun_recover(s1, res) < 0) {
            av_log(s1, AV_LOG_ERROR, "Alsa write error: %s\n",
                   snd_strerror(res));
                    
            return AVERROR(EIO);
	}
    }

    return 0;
}

static int audio_write_trailer(AVFormatContext *s1)
{
    AlsaData *s = s1->priv_data;

    ff_alsa_close(s);
    return 0;
}

AVOutputFormat alsa_muxer = {
    "alsa",
    "Alsa audio output",
    "",
    "",
    sizeof(AlsaData),
    DEFAULT_CODEC_ID,
    CODEC_ID_NONE,
    audio_write_header,
    audio_write_packet,
    audio_write_trailer,
    .flags = AVFMT_NOFILE,
};

Reply via email to