2 * Linux audio grab interface
3 * Copyright (c) 2000, 2001 Fabrice Bellard
5 * This file is part of FFmpeg.
7 * FFmpeg is free software; you can redistribute it and/or
8 * modify it under the terms of the GNU Lesser General Public
9 * License as published by the Free Software Foundation; either
10 * version 2.1 of the License, or (at your option) any later version.
12 * FFmpeg is distributed in the hope that it will be useful,
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
15 * Lesser General Public License for more details.
17 * You should have received a copy of the GNU Lesser General Public
18 * License along with FFmpeg; if not, write to the Free Software
19 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
25 #include <soundcard.h>
27 #include <sys/soundcard.h>
34 #include <sys/ioctl.h>
36 #include "libavutil/internal.h"
38 #include "libavcodec/avcodec.h"
41 #include "libavformat/internal.h"
43 #include "oss_audio.h"
45 static int audio_write_header(AVFormatContext
*s1
)
47 OSSAudioData
*s
= s1
->priv_data
;
52 s
->sample_rate
= st
->codec
->sample_rate
;
53 s
->channels
= st
->codec
->channels
;
54 ret
= ff_oss_audio_open(s1
, 1, s1
->filename
);
62 static int audio_write_packet(AVFormatContext
*s1
, AVPacket
*pkt
)
64 OSSAudioData
*s
= s1
->priv_data
;
67 uint8_t *buf
= pkt
->data
;
70 len
= FFMIN(OSS_AUDIO_BLOCK_SIZE
- s
->buffer_ptr
, size
);
71 memcpy(s
->buffer
+ s
->buffer_ptr
, buf
, len
);
73 if (s
->buffer_ptr
>= OSS_AUDIO_BLOCK_SIZE
) {
75 ret
= write(s
->fd
, s
->buffer
, OSS_AUDIO_BLOCK_SIZE
);
78 if (ret
< 0 && (errno
!= EAGAIN
&& errno
!= EINTR
))
89 static int audio_write_trailer(AVFormatContext
*s1
)
91 OSSAudioData
*s
= s1
->priv_data
;
93 ff_oss_audio_close(s
);
97 static const AVClass oss_muxer_class
= {
98 .class_name
= "OSS muxer",
99 .item_name
= av_default_item_name
,
100 .version
= LIBAVUTIL_VERSION_INT
,
101 .category
= AV_CLASS_CATEGORY_DEVICE_AUDIO_OUTPUT
,
104 AVOutputFormat ff_oss_muxer
= {
106 .long_name
= NULL_IF_CONFIG_SMALL("OSS (Open Sound System) playback"),
107 .priv_data_size
= sizeof(OSSAudioData
),
108 /* XXX: we make the assumption that the soundcard accepts this format */
109 /* XXX: find better solution with "preinit" method, needed also in
111 .audio_codec
= AV_NE(AV_CODEC_ID_PCM_S16BE
, AV_CODEC_ID_PCM_S16LE
),
112 .video_codec
= AV_CODEC_ID_NONE
,
113 .write_header
= audio_write_header
,
114 .write_packet
= audio_write_packet
,
115 .write_trailer
= audio_write_trailer
,
116 .flags
= AVFMT_NOFILE
,
117 .priv_class
= &oss_muxer_class
,