annotate audio.c @ 1166:e89500dd9064 libavformat

remove STATS code (probably hasnt been used for years ..., and its not completely clear what it was good for anyway)
author michael
date Sun, 09 Jul 2006 10:33:49 +0000
parents 2d57ce58f576
children d89d7ef290da
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1 /*
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
2 * Linux audio play and grab interface
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
3 * Copyright (c) 2000, 2001 Fabrice Bellard.
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
4 *
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
5 * This library is free software; you can redistribute it and/or
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
6 * modify it under the terms of the GNU Lesser General Public
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
7 * License as published by the Free Software Foundation; either
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
8 * version 2 of the License, or (at your option) any later version.
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
9 *
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
10 * This library is distributed in the hope that it will be useful,
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
13 * Lesser General Public License for more details.
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
14 *
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
15 * You should have received a copy of the GNU Lesser General Public
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
16 * License along with this library; if not, write to the Free Software
896
edbe5c3717f9 Update licensing information: The FSF changed postal address.
diego
parents: 887
diff changeset
17 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
18 */
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
19 #include "avformat.h"
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
20
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
21 #include <stdlib.h>
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
22 #include <stdio.h>
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
23 #include <string.h>
754
aa52767bb802 OpenBSD support patch by (Jacob Meuser // jakemsr jakemsr com)
michael
parents: 482
diff changeset
24 #ifdef __OpenBSD__
aa52767bb802 OpenBSD support patch by (Jacob Meuser // jakemsr jakemsr com)
michael
parents: 482
diff changeset
25 #include <soundcard.h>
aa52767bb802 OpenBSD support patch by (Jacob Meuser // jakemsr jakemsr com)
michael
parents: 482
diff changeset
26 #else
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
27 #include <sys/soundcard.h>
754
aa52767bb802 OpenBSD support patch by (Jacob Meuser // jakemsr jakemsr com)
michael
parents: 482
diff changeset
28 #endif
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
29 #include <unistd.h>
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
30 #include <fcntl.h>
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
31 #include <sys/ioctl.h>
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
32 #include <sys/mman.h>
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
33 #include <sys/time.h>
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
34
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
35 #define AUDIO_BLOCK_SIZE 4096
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
36
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
37 typedef struct {
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
38 int fd;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
39 int sample_rate;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
40 int channels;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
41 int frame_size; /* in bytes ! */
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
42 int codec_id;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
43 int flip_left : 1;
65
a58a8a53eb46 * UINTX -> uintx_t INTX -> intx_t
kabi
parents: 56
diff changeset
44 uint8_t buffer[AUDIO_BLOCK_SIZE];
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
45 int buffer_ptr;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
46 } AudioData;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
47
30
90fd30dd68b3 grab device is in AVFormatParameter (at least better than global variable)
bellard
parents: 0
diff changeset
48 static int audio_open(AudioData *s, int is_output, const char *audio_device)
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
49 {
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
50 int audio_fd;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
51 int tmp, err;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
52 char *flip = getenv("AUDIO_FLIP_LEFT");
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
53
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
54 /* open linux audio device */
30
90fd30dd68b3 grab device is in AVFormatParameter (at least better than global variable)
bellard
parents: 0
diff changeset
55 if (!audio_device)
754
aa52767bb802 OpenBSD support patch by (Jacob Meuser // jakemsr jakemsr com)
michael
parents: 482
diff changeset
56 #ifdef __OpenBSD__
887
d70e50f1495f COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 885
diff changeset
57 audio_device = "/dev/sound";
754
aa52767bb802 OpenBSD support patch by (Jacob Meuser // jakemsr jakemsr com)
michael
parents: 482
diff changeset
58 #else
30
90fd30dd68b3 grab device is in AVFormatParameter (at least better than global variable)
bellard
parents: 0
diff changeset
59 audio_device = "/dev/dsp";
754
aa52767bb802 OpenBSD support patch by (Jacob Meuser // jakemsr jakemsr com)
michael
parents: 482
diff changeset
60 #endif
30
90fd30dd68b3 grab device is in AVFormatParameter (at least better than global variable)
bellard
parents: 0
diff changeset
61
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
62 if (is_output)
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
63 audio_fd = open(audio_device, O_WRONLY);
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
64 else
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
65 audio_fd = open(audio_device, O_RDONLY);
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
66 if (audio_fd < 0) {
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
67 perror(audio_device);
482
0fdc96c2f2fe sweeping change from -EIO -> AVERROR_IO
melanson
parents: 481
diff changeset
68 return AVERROR_IO;
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
69 }
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
70
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
71 if (flip && *flip == '1') {
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
72 s->flip_left = 1;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
73 }
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
74
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
75 /* non blocking mode */
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
76 if (!is_output)
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
77 fcntl(audio_fd, F_SETFL, O_NONBLOCK);
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
78
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
79 s->frame_size = AUDIO_BLOCK_SIZE;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
80 #if 0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
81 tmp = (NB_FRAGMENTS << 16) | FRAGMENT_BITS;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
82 err = ioctl(audio_fd, SNDCTL_DSP_SETFRAGMENT, &tmp);
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
83 if (err < 0) {
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
84 perror("SNDCTL_DSP_SETFRAGMENT");
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
85 }
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
86 #endif
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
87
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
88 /* select format : favour native format */
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
89 err = ioctl(audio_fd, SNDCTL_DSP_GETFMTS, &tmp);
885
da1d5db0ce5c COSMETICS: Remove all trailing whitespace.
diego
parents: 820
diff changeset
90
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
91 #ifdef WORDS_BIGENDIAN
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
92 if (tmp & AFMT_S16_BE) {
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
93 tmp = AFMT_S16_BE;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
94 } else if (tmp & AFMT_S16_LE) {
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
95 tmp = AFMT_S16_LE;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
96 } else {
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
97 tmp = 0;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
98 }
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
99 #else
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
100 if (tmp & AFMT_S16_LE) {
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
101 tmp = AFMT_S16_LE;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
102 } else if (tmp & AFMT_S16_BE) {
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
103 tmp = AFMT_S16_BE;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
104 } else {
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
105 tmp = 0;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
106 }
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
107 #endif
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
108
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
109 switch(tmp) {
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
110 case AFMT_S16_LE:
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
111 s->codec_id = CODEC_ID_PCM_S16LE;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
112 break;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
113 case AFMT_S16_BE:
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
114 s->codec_id = CODEC_ID_PCM_S16BE;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
115 break;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
116 default:
370
845f9de2c883 av_log() patch by (Michel Bardiaux <mbardiaux at peaktime dot be>)
michael
parents: 241
diff changeset
117 av_log(NULL, AV_LOG_ERROR, "Soundcard does not support 16 bit sample format\n");
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
118 close(audio_fd);
482
0fdc96c2f2fe sweeping change from -EIO -> AVERROR_IO
melanson
parents: 481
diff changeset
119 return AVERROR_IO;
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
120 }
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
121 err=ioctl(audio_fd, SNDCTL_DSP_SETFMT, &tmp);
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
122 if (err < 0) {
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
123 perror("SNDCTL_DSP_SETFMT");
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
124 goto fail;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
125 }
885
da1d5db0ce5c COSMETICS: Remove all trailing whitespace.
diego
parents: 820
diff changeset
126
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
127 tmp = (s->channels == 2);
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
128 err = ioctl(audio_fd, SNDCTL_DSP_STEREO, &tmp);
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
129 if (err < 0) {
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
130 perror("SNDCTL_DSP_STEREO");
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
131 goto fail;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
132 }
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
133 if (tmp)
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
134 s->channels = 2;
885
da1d5db0ce5c COSMETICS: Remove all trailing whitespace.
diego
parents: 820
diff changeset
135
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
136 tmp = s->sample_rate;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
137 err = ioctl(audio_fd, SNDCTL_DSP_SPEED, &tmp);
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
138 if (err < 0) {
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
139 perror("SNDCTL_DSP_SPEED");
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
140 goto fail;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
141 }
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
142 s->sample_rate = tmp; /* store real sample rate */
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
143 s->fd = audio_fd;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
144
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
145 return 0;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
146 fail:
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
147 close(audio_fd);
482
0fdc96c2f2fe sweeping change from -EIO -> AVERROR_IO
melanson
parents: 481
diff changeset
148 return AVERROR_IO;
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
149 }
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
150
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
151 static int audio_close(AudioData *s)
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
152 {
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
153 close(s->fd);
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
154 return 0;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
155 }
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
156
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
157 /* sound output support */
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
158 static int audio_write_header(AVFormatContext *s1)
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
159 {
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
160 AudioData *s = s1->priv_data;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
161 AVStream *st;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
162 int ret;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
163
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
164 st = s1->streams[0];
820
feca73904e67 changing AVCodecContext codec -> *codec in AVStream so additions to AVCodecContext dont randomize AVStream and break binary compatibility
michael
parents: 754
diff changeset
165 s->sample_rate = st->codec->sample_rate;
feca73904e67 changing AVCodecContext codec -> *codec in AVStream so additions to AVCodecContext dont randomize AVStream and break binary compatibility
michael
parents: 754
diff changeset
166 s->channels = st->codec->channels;
30
90fd30dd68b3 grab device is in AVFormatParameter (at least better than global variable)
bellard
parents: 0
diff changeset
167 ret = audio_open(s, 1, NULL);
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
168 if (ret < 0) {
482
0fdc96c2f2fe sweeping change from -EIO -> AVERROR_IO
melanson
parents: 481
diff changeset
169 return AVERROR_IO;
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
170 } else {
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
171 return 0;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
172 }
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
173 }
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
174
468
60f897e8dd2d pass AVPacket into av_write_frame()
michael
parents: 462
diff changeset
175 static int audio_write_packet(AVFormatContext *s1, AVPacket *pkt)
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
176 {
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
177 AudioData *s = s1->priv_data;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
178 int len, ret;
468
60f897e8dd2d pass AVPacket into av_write_frame()
michael
parents: 462
diff changeset
179 int size= pkt->size;
60f897e8dd2d pass AVPacket into av_write_frame()
michael
parents: 462
diff changeset
180 uint8_t *buf= pkt->data;
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
181
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
182 while (size > 0) {
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
183 len = AUDIO_BLOCK_SIZE - s->buffer_ptr;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
184 if (len > size)
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
185 len = size;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
186 memcpy(s->buffer + s->buffer_ptr, buf, len);
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
187 s->buffer_ptr += len;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
188 if (s->buffer_ptr >= AUDIO_BLOCK_SIZE) {
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
189 for(;;) {
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
190 ret = write(s->fd, s->buffer, AUDIO_BLOCK_SIZE);
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
191 if (ret > 0)
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
192 break;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
193 if (ret < 0 && (errno != EAGAIN && errno != EINTR))
482
0fdc96c2f2fe sweeping change from -EIO -> AVERROR_IO
melanson
parents: 481
diff changeset
194 return AVERROR_IO;
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
195 }
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
196 s->buffer_ptr = 0;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
197 }
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
198 buf += len;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
199 size -= len;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
200 }
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
201 return 0;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
202 }
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
203
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
204 static int audio_write_trailer(AVFormatContext *s1)
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
205 {
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
206 AudioData *s = s1->priv_data;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
207
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
208 audio_close(s);
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
209 return 0;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
210 }
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
211
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
212 /* grab support */
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
213
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
214 static int audio_read_header(AVFormatContext *s1, AVFormatParameters *ap)
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
215 {
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
216 AudioData *s = s1->priv_data;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
217 AVStream *st;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
218 int ret;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
219
1003
2d57ce58f576 simplify AVFormatParameters NULL checks
michael
parents: 921
diff changeset
220 if (ap->sample_rate <= 0 || ap->channels <= 0)
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
221 return -1;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
222
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
223 st = av_new_stream(s1, 0);
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
224 if (!st) {
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
225 return -ENOMEM;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
226 }
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
227 s->sample_rate = ap->sample_rate;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
228 s->channels = ap->channels;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
229
30
90fd30dd68b3 grab device is in AVFormatParameter (at least better than global variable)
bellard
parents: 0
diff changeset
230 ret = audio_open(s, 0, ap->device);
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
231 if (ret < 0) {
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
232 av_free(st);
482
0fdc96c2f2fe sweeping change from -EIO -> AVERROR_IO
melanson
parents: 481
diff changeset
233 return AVERROR_IO;
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
234 }
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
235
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
236 /* take real parameters */
820
feca73904e67 changing AVCodecContext codec -> *codec in AVStream so additions to AVCodecContext dont randomize AVStream and break binary compatibility
michael
parents: 754
diff changeset
237 st->codec->codec_type = CODEC_TYPE_AUDIO;
feca73904e67 changing AVCodecContext codec -> *codec in AVStream so additions to AVCodecContext dont randomize AVStream and break binary compatibility
michael
parents: 754
diff changeset
238 st->codec->codec_id = s->codec_id;
feca73904e67 changing AVCodecContext codec -> *codec in AVStream so additions to AVCodecContext dont randomize AVStream and break binary compatibility
michael
parents: 754
diff changeset
239 st->codec->sample_rate = s->sample_rate;
feca73904e67 changing AVCodecContext codec -> *codec in AVStream so additions to AVCodecContext dont randomize AVStream and break binary compatibility
michael
parents: 754
diff changeset
240 st->codec->channels = s->channels;
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
241
921
547675092e98 video4linux2 input support
diego
parents: 896
diff changeset
242 av_set_pts_info(st, 64, 1, 1000000); /* 64 bits pts in us */
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
243 return 0;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
244 }
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
245
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
246 static int audio_read_packet(AVFormatContext *s1, AVPacket *pkt)
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
247 {
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
248 AudioData *s = s1->priv_data;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
249 int ret, bdelay;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
250 int64_t cur_time;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
251 struct audio_buf_info abufi;
885
da1d5db0ce5c COSMETICS: Remove all trailing whitespace.
diego
parents: 820
diff changeset
252
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
253 if (av_new_packet(pkt, s->frame_size) < 0)
482
0fdc96c2f2fe sweeping change from -EIO -> AVERROR_IO
melanson
parents: 481
diff changeset
254 return AVERROR_IO;
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
255 for(;;) {
56
01d48dc59dab Fix the 'hard cpu loop' problem when capturing audio from /dev/dsp. This
philipjsg
parents: 30
diff changeset
256 struct timeval tv;
01d48dc59dab Fix the 'hard cpu loop' problem when capturing audio from /dev/dsp. This
philipjsg
parents: 30
diff changeset
257 fd_set fds;
01d48dc59dab Fix the 'hard cpu loop' problem when capturing audio from /dev/dsp. This
philipjsg
parents: 30
diff changeset
258
01d48dc59dab Fix the 'hard cpu loop' problem when capturing audio from /dev/dsp. This
philipjsg
parents: 30
diff changeset
259 tv.tv_sec = 0;
01d48dc59dab Fix the 'hard cpu loop' problem when capturing audio from /dev/dsp. This
philipjsg
parents: 30
diff changeset
260 tv.tv_usec = 30 * 1000; /* 30 msecs -- a bit shorter than 1 frame at 30fps */
01d48dc59dab Fix the 'hard cpu loop' problem when capturing audio from /dev/dsp. This
philipjsg
parents: 30
diff changeset
261
01d48dc59dab Fix the 'hard cpu loop' problem when capturing audio from /dev/dsp. This
philipjsg
parents: 30
diff changeset
262 FD_ZERO(&fds);
01d48dc59dab Fix the 'hard cpu loop' problem when capturing audio from /dev/dsp. This
philipjsg
parents: 30
diff changeset
263 FD_SET(s->fd, &fds);
01d48dc59dab Fix the 'hard cpu loop' problem when capturing audio from /dev/dsp. This
philipjsg
parents: 30
diff changeset
264
01d48dc59dab Fix the 'hard cpu loop' problem when capturing audio from /dev/dsp. This
philipjsg
parents: 30
diff changeset
265 /* This will block until data is available or we get a timeout */
01d48dc59dab Fix the 'hard cpu loop' problem when capturing audio from /dev/dsp. This
philipjsg
parents: 30
diff changeset
266 (void) select(s->fd + 1, &fds, 0, 0, &tv);
01d48dc59dab Fix the 'hard cpu loop' problem when capturing audio from /dev/dsp. This
philipjsg
parents: 30
diff changeset
267
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
268 ret = read(s->fd, pkt->data, pkt->size);
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
269 if (ret > 0)
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
270 break;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
271 if (ret == -1 && (errno == EAGAIN || errno == EINTR)) {
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
272 av_free_packet(pkt);
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
273 pkt->size = 0;
921
547675092e98 video4linux2 input support
diego
parents: 896
diff changeset
274 pkt->pts = av_gettime();
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
275 return 0;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
276 }
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
277 if (!(ret == 0 || (ret == -1 && (errno == EAGAIN || errno == EINTR)))) {
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
278 av_free_packet(pkt);
482
0fdc96c2f2fe sweeping change from -EIO -> AVERROR_IO
melanson
parents: 481
diff changeset
279 return AVERROR_IO;
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
280 }
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
281 }
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
282 pkt->size = ret;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
283
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
284 /* compute pts of the start of the packet */
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
285 cur_time = av_gettime();
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
286 bdelay = ret;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
287 if (ioctl(s->fd, SNDCTL_DSP_GETISPACE, &abufi) == 0) {
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
288 bdelay += abufi.bytes;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
289 }
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
290 /* substract time represented by the number of bytes in the audio fifo */
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
291 cur_time -= (bdelay * 1000000LL) / (s->sample_rate * s->channels);
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
292
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
293 /* convert to wanted units */
921
547675092e98 video4linux2 input support
diego
parents: 896
diff changeset
294 pkt->pts = cur_time;
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
295
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
296 if (s->flip_left && s->channels == 2) {
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
297 int i;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
298 short *p = (short *) pkt->data;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
299
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
300 for (i = 0; i < ret; i += 4) {
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
301 *p = ~*p;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
302 p += 2;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
303 }
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
304 }
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
305 return 0;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
306 }
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
307
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
308 static int audio_read_close(AVFormatContext *s1)
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
309 {
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
310 AudioData *s = s1->priv_data;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
311
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
312 audio_close(s);
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
313 return 0;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
314 }
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
315
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
316 static AVInputFormat audio_in_format = {
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
317 "audio_device",
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
318 "audio grab and output",
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
319 sizeof(AudioData),
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
320 NULL,
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
321 audio_read_header,
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
322 audio_read_packet,
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
323 audio_read_close,
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
324 .flags = AVFMT_NOFILE,
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
325 };
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
326
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
327 static AVOutputFormat audio_out_format = {
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
328 "audio_device",
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
329 "audio grab and output",
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
330 "",
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
331 "",
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
332 sizeof(AudioData),
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
333 /* XXX: we make the assumption that the soundcard accepts this format */
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
334 /* XXX: find better solution with "preinit" method, needed also in
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
335 other formats */
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
336 #ifdef WORDS_BIGENDIAN
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
337 CODEC_ID_PCM_S16BE,
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
338 #else
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
339 CODEC_ID_PCM_S16LE,
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
340 #endif
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
341 CODEC_ID_NONE,
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
342 audio_write_header,
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
343 audio_write_packet,
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
344 audio_write_trailer,
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
345 .flags = AVFMT_NOFILE,
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
346 };
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
347
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
348 int audio_init(void)
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
349 {
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
350 av_register_input_format(&audio_in_format);
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
351 av_register_output_format(&audio_out_format);
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
352 return 0;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
353 }