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,
};