annotate libao2/ao_ivtv.c @ 31782:971b1ce234cd

Make the sys/cdio.h header test work by explictly including sys/types.h before. Broken headers are a Solaris and BSD tradition, hoping for them to get their act together is hopeless, so we work around it (for now at least).
author reimar
date Thu, 29 Jul 2010 08:44:44 +0000
parents a465b54b0897
children a3890036b137
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
19224
3fc39ced158e added audio output for ivtv cards
ben
parents:
diff changeset
1 /*
26743
0f42fb42843c Use standard license headers with standard formatting.
diego
parents: 19224
diff changeset
2 * audio output for WinTV PVR-150/250/350 (a.k.a IVTV) cards
0f42fb42843c Use standard license headers with standard formatting.
diego
parents: 19224
diff changeset
3 * through Connexant hardware MPEG decoder
0f42fb42843c Use standard license headers with standard formatting.
diego
parents: 19224
diff changeset
4 * See http://ivtvdriver.org/index.php/Main_Page for more details on the
0f42fb42843c Use standard license headers with standard formatting.
diego
parents: 19224
diff changeset
5 * cards supported by the ivtv driver.
0f42fb42843c Use standard license headers with standard formatting.
diego
parents: 19224
diff changeset
6 *
0f42fb42843c Use standard license headers with standard formatting.
diego
parents: 19224
diff changeset
7 * WARNING: You need to force -ac hwmpa for audio output to work.
0f42fb42843c Use standard license headers with standard formatting.
diego
parents: 19224
diff changeset
8 *
0f42fb42843c Use standard license headers with standard formatting.
diego
parents: 19224
diff changeset
9 * Copyright (C) 2006 Benjamin Zores
0f42fb42843c Use standard license headers with standard formatting.
diego
parents: 19224
diff changeset
10 *
0f42fb42843c Use standard license headers with standard formatting.
diego
parents: 19224
diff changeset
11 * This file is part of MPlayer.
19224
3fc39ced158e added audio output for ivtv cards
ben
parents:
diff changeset
12 *
26743
0f42fb42843c Use standard license headers with standard formatting.
diego
parents: 19224
diff changeset
13 * MPlayer is free software; you can redistribute it and/or modify
0f42fb42843c Use standard license headers with standard formatting.
diego
parents: 19224
diff changeset
14 * it under the terms of the GNU General Public License as published by
0f42fb42843c Use standard license headers with standard formatting.
diego
parents: 19224
diff changeset
15 * the Free Software Foundation; either version 2 of the License, or
0f42fb42843c Use standard license headers with standard formatting.
diego
parents: 19224
diff changeset
16 * (at your option) any later version.
19224
3fc39ced158e added audio output for ivtv cards
ben
parents:
diff changeset
17 *
26743
0f42fb42843c Use standard license headers with standard formatting.
diego
parents: 19224
diff changeset
18 * MPlayer is distributed in the hope that it will be useful,
0f42fb42843c Use standard license headers with standard formatting.
diego
parents: 19224
diff changeset
19 * but WITHOUT ANY WARRANTY; without even the implied warranty of
0f42fb42843c Use standard license headers with standard formatting.
diego
parents: 19224
diff changeset
20 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
0f42fb42843c Use standard license headers with standard formatting.
diego
parents: 19224
diff changeset
21 * GNU General Public License for more details.
19224
3fc39ced158e added audio output for ivtv cards
ben
parents:
diff changeset
22 *
26743
0f42fb42843c Use standard license headers with standard formatting.
diego
parents: 19224
diff changeset
23 * You should have received a copy of the GNU General Public License along
0f42fb42843c Use standard license headers with standard formatting.
diego
parents: 19224
diff changeset
24 * with MPlayer; if not, write to the Free Software Foundation, Inc.,
0f42fb42843c Use standard license headers with standard formatting.
diego
parents: 19224
diff changeset
25 * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
19224
3fc39ced158e added audio output for ivtv cards
ben
parents:
diff changeset
26 */
3fc39ced158e added audio output for ivtv cards
ben
parents:
diff changeset
27
3fc39ced158e added audio output for ivtv cards
ben
parents:
diff changeset
28 #include <inttypes.h>
3fc39ced158e added audio output for ivtv cards
ben
parents:
diff changeset
29
3fc39ced158e added audio output for ivtv cards
ben
parents:
diff changeset
30 #include "config.h"
3fc39ced158e added audio output for ivtv cards
ben
parents:
diff changeset
31
3fc39ced158e added audio output for ivtv cards
ben
parents:
diff changeset
32 #include "mp_msg.h"
3fc39ced158e added audio output for ivtv cards
ben
parents:
diff changeset
33 #include "help_mp.h"
3fc39ced158e added audio output for ivtv cards
ben
parents:
diff changeset
34
3fc39ced158e added audio output for ivtv cards
ben
parents:
diff changeset
35 #include "audio_out.h"
3fc39ced158e added audio output for ivtv cards
ben
parents:
diff changeset
36 #include "audio_out_internal.h"
3fc39ced158e added audio output for ivtv cards
ben
parents:
diff changeset
37 #include "libaf/af_format.h"
3fc39ced158e added audio output for ivtv cards
ben
parents:
diff changeset
38 #include "libmpdemux/mpeg_packetizer.h"
31353
a465b54b0897 Add header for ivtv_write() instead of forward declaring it.
diego
parents: 31352
diff changeset
39 #include "libvo/vo_ivtv.h"
19224
3fc39ced158e added audio output for ivtv cards
ben
parents:
diff changeset
40
3fc39ced158e added audio output for ivtv cards
ben
parents:
diff changeset
41 #define MPEG_AUDIO_ID 0x1C0
3fc39ced158e added audio output for ivtv cards
ben
parents:
diff changeset
42
3fc39ced158e added audio output for ivtv cards
ben
parents:
diff changeset
43 static int freq = 0;
3fc39ced158e added audio output for ivtv cards
ben
parents:
diff changeset
44
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 28823
diff changeset
45 static const ao_info_t info =
19224
3fc39ced158e added audio output for ivtv cards
ben
parents:
diff changeset
46 {
3fc39ced158e added audio output for ivtv cards
ben
parents:
diff changeset
47 "IVTV MPEG Audio Decoder output",
3fc39ced158e added audio output for ivtv cards
ben
parents:
diff changeset
48 "ivtv",
3fc39ced158e added audio output for ivtv cards
ben
parents:
diff changeset
49 "Benjamin Zores",
3fc39ced158e added audio output for ivtv cards
ben
parents:
diff changeset
50 ""
3fc39ced158e added audio output for ivtv cards
ben
parents:
diff changeset
51 };
3fc39ced158e added audio output for ivtv cards
ben
parents:
diff changeset
52
3fc39ced158e added audio output for ivtv cards
ben
parents:
diff changeset
53 LIBAO_EXTERN(ivtv)
3fc39ced158e added audio output for ivtv cards
ben
parents:
diff changeset
54
3fc39ced158e added audio output for ivtv cards
ben
parents:
diff changeset
55 /* to set/get/query special features/parameters */
3fc39ced158e added audio output for ivtv cards
ben
parents:
diff changeset
56 static int
3fc39ced158e added audio output for ivtv cards
ben
parents:
diff changeset
57 control (int cmd,void *arg)
3fc39ced158e added audio output for ivtv cards
ben
parents:
diff changeset
58 {
3fc39ced158e added audio output for ivtv cards
ben
parents:
diff changeset
59 return CONTROL_UNKNOWN;
3fc39ced158e added audio output for ivtv cards
ben
parents:
diff changeset
60 }
3fc39ced158e added audio output for ivtv cards
ben
parents:
diff changeset
61
3fc39ced158e added audio output for ivtv cards
ben
parents:
diff changeset
62 /* open & setup audio device */
3fc39ced158e added audio output for ivtv cards
ben
parents:
diff changeset
63 static int
3fc39ced158e added audio output for ivtv cards
ben
parents:
diff changeset
64 init (int rate, int channels, int format, int flags)
3fc39ced158e added audio output for ivtv cards
ben
parents:
diff changeset
65 {
3fc39ced158e added audio output for ivtv cards
ben
parents:
diff changeset
66 extern int ivtv_fd;
3fc39ced158e added audio output for ivtv cards
ben
parents:
diff changeset
67
3fc39ced158e added audio output for ivtv cards
ben
parents:
diff changeset
68 if (ivtv_fd < 0)
3fc39ced158e added audio output for ivtv cards
ben
parents:
diff changeset
69 return 0;
3fc39ced158e added audio output for ivtv cards
ben
parents:
diff changeset
70
3fc39ced158e added audio output for ivtv cards
ben
parents:
diff changeset
71 if (format != AF_FORMAT_MPEG2)
3fc39ced158e added audio output for ivtv cards
ben
parents:
diff changeset
72 {
3fc39ced158e added audio output for ivtv cards
ben
parents:
diff changeset
73 mp_msg (MSGT_AO, MSGL_FATAL,
3fc39ced158e added audio output for ivtv cards
ben
parents:
diff changeset
74 "AO: [ivtv] can only handle MPEG audio streams.\n");
3fc39ced158e added audio output for ivtv cards
ben
parents:
diff changeset
75 return 0;
3fc39ced158e added audio output for ivtv cards
ben
parents:
diff changeset
76 }
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 28823
diff changeset
77
19224
3fc39ced158e added audio output for ivtv cards
ben
parents:
diff changeset
78 ao_data.outburst = 2048;
3fc39ced158e added audio output for ivtv cards
ben
parents:
diff changeset
79 ao_data.samplerate = rate;
3fc39ced158e added audio output for ivtv cards
ben
parents:
diff changeset
80 ao_data.channels = channels;
3fc39ced158e added audio output for ivtv cards
ben
parents:
diff changeset
81 ao_data.format = AF_FORMAT_MPEG2;
3fc39ced158e added audio output for ivtv cards
ben
parents:
diff changeset
82 ao_data.buffersize = 2048;
3fc39ced158e added audio output for ivtv cards
ben
parents:
diff changeset
83 ao_data.bps = rate * 2 * 2;
3fc39ced158e added audio output for ivtv cards
ben
parents:
diff changeset
84 ao_data.pts = 0;
3fc39ced158e added audio output for ivtv cards
ben
parents:
diff changeset
85 freq = rate;
3fc39ced158e added audio output for ivtv cards
ben
parents:
diff changeset
86
3fc39ced158e added audio output for ivtv cards
ben
parents:
diff changeset
87 /* check for supported audio rate */
3fc39ced158e added audio output for ivtv cards
ben
parents:
diff changeset
88 if (rate != 32000 || rate != 41000 || rate != 48000)
3fc39ced158e added audio output for ivtv cards
ben
parents:
diff changeset
89 {
3fc39ced158e added audio output for ivtv cards
ben
parents:
diff changeset
90 mp_msg (MSGT_AO, MSGL_ERR, MSGTR_AO_MPEGPES_UnsupSamplerate, rate);
3fc39ced158e added audio output for ivtv cards
ben
parents:
diff changeset
91 rate = 48000;
3fc39ced158e added audio output for ivtv cards
ben
parents:
diff changeset
92 }
3fc39ced158e added audio output for ivtv cards
ben
parents:
diff changeset
93
3fc39ced158e added audio output for ivtv cards
ben
parents:
diff changeset
94 return 1;
3fc39ced158e added audio output for ivtv cards
ben
parents:
diff changeset
95 }
3fc39ced158e added audio output for ivtv cards
ben
parents:
diff changeset
96
3fc39ced158e added audio output for ivtv cards
ben
parents:
diff changeset
97 /* close audio device */
3fc39ced158e added audio output for ivtv cards
ben
parents:
diff changeset
98 static void
3fc39ced158e added audio output for ivtv cards
ben
parents:
diff changeset
99 uninit (int immed)
3fc39ced158e added audio output for ivtv cards
ben
parents:
diff changeset
100 {
3fc39ced158e added audio output for ivtv cards
ben
parents:
diff changeset
101 /* nothing to do */
3fc39ced158e added audio output for ivtv cards
ben
parents:
diff changeset
102 }
3fc39ced158e added audio output for ivtv cards
ben
parents:
diff changeset
103
3fc39ced158e added audio output for ivtv cards
ben
parents:
diff changeset
104 /* stop playing and empty buffers (for seeking/pause) */
3fc39ced158e added audio output for ivtv cards
ben
parents:
diff changeset
105 static void
3fc39ced158e added audio output for ivtv cards
ben
parents:
diff changeset
106 reset (void)
3fc39ced158e added audio output for ivtv cards
ben
parents:
diff changeset
107 {
3fc39ced158e added audio output for ivtv cards
ben
parents:
diff changeset
108 /* nothing to do */
3fc39ced158e added audio output for ivtv cards
ben
parents:
diff changeset
109 }
3fc39ced158e added audio output for ivtv cards
ben
parents:
diff changeset
110
3fc39ced158e added audio output for ivtv cards
ben
parents:
diff changeset
111 /* stop playing, keep buffers (for pause) */
3fc39ced158e added audio output for ivtv cards
ben
parents:
diff changeset
112 static void
3fc39ced158e added audio output for ivtv cards
ben
parents:
diff changeset
113 audio_pause (void)
3fc39ced158e added audio output for ivtv cards
ben
parents:
diff changeset
114 {
3fc39ced158e added audio output for ivtv cards
ben
parents:
diff changeset
115 reset ();
3fc39ced158e added audio output for ivtv cards
ben
parents:
diff changeset
116 }
3fc39ced158e added audio output for ivtv cards
ben
parents:
diff changeset
117
3fc39ced158e added audio output for ivtv cards
ben
parents:
diff changeset
118 /* resume playing, after audio_pause() */
3fc39ced158e added audio output for ivtv cards
ben
parents:
diff changeset
119 static void
3fc39ced158e added audio output for ivtv cards
ben
parents:
diff changeset
120 audio_resume (void)
3fc39ced158e added audio output for ivtv cards
ben
parents:
diff changeset
121 {
3fc39ced158e added audio output for ivtv cards
ben
parents:
diff changeset
122 /* nothing to do */
3fc39ced158e added audio output for ivtv cards
ben
parents:
diff changeset
123 }
3fc39ced158e added audio output for ivtv cards
ben
parents:
diff changeset
124
3fc39ced158e added audio output for ivtv cards
ben
parents:
diff changeset
125 /* how many bytes can be played without blocking */
3fc39ced158e added audio output for ivtv cards
ben
parents:
diff changeset
126 static int
3fc39ced158e added audio output for ivtv cards
ben
parents:
diff changeset
127 get_space (void)
3fc39ced158e added audio output for ivtv cards
ben
parents:
diff changeset
128 {
3fc39ced158e added audio output for ivtv cards
ben
parents:
diff changeset
129 extern int vo_pts;
3fc39ced158e added audio output for ivtv cards
ben
parents:
diff changeset
130 float x;
3fc39ced158e added audio output for ivtv cards
ben
parents:
diff changeset
131 int y;
3fc39ced158e added audio output for ivtv cards
ben
parents:
diff changeset
132
3fc39ced158e added audio output for ivtv cards
ben
parents:
diff changeset
133 x = (float) (vo_pts - ao_data.pts) / 90000.0;
3fc39ced158e added audio output for ivtv cards
ben
parents:
diff changeset
134 if (x <= 0)
3fc39ced158e added audio output for ivtv cards
ben
parents:
diff changeset
135 return 0;
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 28823
diff changeset
136
19224
3fc39ced158e added audio output for ivtv cards
ben
parents:
diff changeset
137 y = freq * 4 * x;
3fc39ced158e added audio output for ivtv cards
ben
parents:
diff changeset
138 y /= ao_data.outburst;
3fc39ced158e added audio output for ivtv cards
ben
parents:
diff changeset
139 y *= ao_data.outburst;
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 28823
diff changeset
140
19224
3fc39ced158e added audio output for ivtv cards
ben
parents:
diff changeset
141 if (y > 32000)
3fc39ced158e added audio output for ivtv cards
ben
parents:
diff changeset
142 y = 32000;
3fc39ced158e added audio output for ivtv cards
ben
parents:
diff changeset
143
3fc39ced158e added audio output for ivtv cards
ben
parents:
diff changeset
144 return y;
3fc39ced158e added audio output for ivtv cards
ben
parents:
diff changeset
145 }
3fc39ced158e added audio output for ivtv cards
ben
parents:
diff changeset
146
3fc39ced158e added audio output for ivtv cards
ben
parents:
diff changeset
147 /* number of bytes played */
3fc39ced158e added audio output for ivtv cards
ben
parents:
diff changeset
148 static int
3fc39ced158e added audio output for ivtv cards
ben
parents:
diff changeset
149 play (void *data, int len, int flags)
3fc39ced158e added audio output for ivtv cards
ben
parents:
diff changeset
150 {
3fc39ced158e added audio output for ivtv cards
ben
parents:
diff changeset
151 if (ao_data.format != AF_FORMAT_MPEG2)
3fc39ced158e added audio output for ivtv cards
ben
parents:
diff changeset
152 return 0;
3fc39ced158e added audio output for ivtv cards
ben
parents:
diff changeset
153
3fc39ced158e added audio output for ivtv cards
ben
parents:
diff changeset
154 send_mpeg_pes_packet (data, len, MPEG_AUDIO_ID, ao_data.pts, 2, ivtv_write);
3fc39ced158e added audio output for ivtv cards
ben
parents:
diff changeset
155
3fc39ced158e added audio output for ivtv cards
ben
parents:
diff changeset
156 return len;
3fc39ced158e added audio output for ivtv cards
ben
parents:
diff changeset
157 }
3fc39ced158e added audio output for ivtv cards
ben
parents:
diff changeset
158
3fc39ced158e added audio output for ivtv cards
ben
parents:
diff changeset
159 /* delay in seconds between first and last sample in buffer */
3fc39ced158e added audio output for ivtv cards
ben
parents:
diff changeset
160 static float
3fc39ced158e added audio output for ivtv cards
ben
parents:
diff changeset
161 get_delay (void)
3fc39ced158e added audio output for ivtv cards
ben
parents:
diff changeset
162 {
3fc39ced158e added audio output for ivtv cards
ben
parents:
diff changeset
163 return 0.0;
3fc39ced158e added audio output for ivtv cards
ben
parents:
diff changeset
164 }