annotate libmpdemux/tvi_v4l.c @ 4559:5dc383bb1c82

added mga_top_reserved module parameter to skip a configurable amount of space at the top of video memory. this is needed to prevent corruption of the kernel's console font when using the "fastfont" option with matroxfb.
author rfelker
date Thu, 07 Feb 2002 02:07:29 +0000
parents 622a9ade4517
children 942d497875b4
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
2802
09d5c9834580 tv update
alex
parents: 2790
diff changeset
1 /*
3284
702e399a4b3e update (audio support is coming:)
alex
parents: 3243
diff changeset
2 Video 4 Linux input
2802
09d5c9834580 tv update
alex
parents: 2790
diff changeset
3
09d5c9834580 tv update
alex
parents: 2790
diff changeset
4 (C) Alex Beregszaszi <alex@naxine.org>
09d5c9834580 tv update
alex
parents: 2790
diff changeset
5
09d5c9834580 tv update
alex
parents: 2790
diff changeset
6 Some ideas are based on xawtv/libng's grab-v4l.c written by
09d5c9834580 tv update
alex
parents: 2790
diff changeset
7 Gerd Knorr <kraxel@bytesex.org>
09d5c9834580 tv update
alex
parents: 2790
diff changeset
8
09d5c9834580 tv update
alex
parents: 2790
diff changeset
9 CODE IS UNDER DEVELOPMENT, NO FEATURE REQUESTS PLEASE!
09d5c9834580 tv update
alex
parents: 2790
diff changeset
10 */
09d5c9834580 tv update
alex
parents: 2790
diff changeset
11
2790
98769cea155c added tv subsystem
alex
parents:
diff changeset
12 #include "config.h"
98769cea155c added tv subsystem
alex
parents:
diff changeset
13
3243
3bd16d4a94e2 updated for support detection by configure
alex
parents: 3220
diff changeset
14 #if defined(USE_TV) && defined(HAVE_TV_V4L)
2790
98769cea155c added tv subsystem
alex
parents:
diff changeset
15
98769cea155c added tv subsystem
alex
parents:
diff changeset
16 #include <stdio.h>
98769cea155c added tv subsystem
alex
parents:
diff changeset
17 #include <errno.h>
98769cea155c added tv subsystem
alex
parents:
diff changeset
18 #include <fcntl.h>
2802
09d5c9834580 tv update
alex
parents: 2790
diff changeset
19 #include <signal.h>
2790
98769cea155c added tv subsystem
alex
parents:
diff changeset
20 #include <sys/ioctl.h>
98769cea155c added tv subsystem
alex
parents:
diff changeset
21 #include <sys/types.h>
98769cea155c added tv subsystem
alex
parents:
diff changeset
22 #include <linux/videodev.h>
3815
622a9ade4517 updated
alex
parents: 3711
diff changeset
23 #include <linux/soundcard.h>
2790
98769cea155c added tv subsystem
alex
parents:
diff changeset
24 #include <unistd.h>
98769cea155c added tv subsystem
alex
parents:
diff changeset
25 #include <sys/mman.h>
2931
bce9c945b29c tv interface update
alex
parents: 2841
diff changeset
26 #include <stdlib.h>
bce9c945b29c tv interface update
alex
parents: 2841
diff changeset
27 #include <string.h>
2790
98769cea155c added tv subsystem
alex
parents:
diff changeset
28
2830
596a6ba3520f never include files from public headers...
arpi
parents: 2819
diff changeset
29 #include "mp_msg.h"
596a6ba3520f never include files from public headers...
arpi
parents: 2819
diff changeset
30 #include "../libao2/afmt.h"
596a6ba3520f never include files from public headers...
arpi
parents: 2819
diff changeset
31 #include "../libvo/img_format.h"
596a6ba3520f never include files from public headers...
arpi
parents: 2819
diff changeset
32 #include "../libvo/fastmemcpy.h"
596a6ba3520f never include files from public headers...
arpi
parents: 2819
diff changeset
33
2790
98769cea155c added tv subsystem
alex
parents:
diff changeset
34 #include "tv.h"
98769cea155c added tv subsystem
alex
parents:
diff changeset
35
98769cea155c added tv subsystem
alex
parents:
diff changeset
36 static tvi_info_t info = {
3815
622a9ade4517 updated
alex
parents: 3711
diff changeset
37 "Video 4 Linux input",
2790
98769cea155c added tv subsystem
alex
parents:
diff changeset
38 "v4l",
2802
09d5c9834580 tv update
alex
parents: 2790
diff changeset
39 "Alex Beregszaszi <alex@naxine.org>",
09d5c9834580 tv update
alex
parents: 2790
diff changeset
40 "under development"
09d5c9834580 tv update
alex
parents: 2790
diff changeset
41 };
09d5c9834580 tv update
alex
parents: 2790
diff changeset
42
3815
622a9ade4517 updated
alex
parents: 3711
diff changeset
43 #define MAX_AUDIO_CHANNELS 10
622a9ade4517 updated
alex
parents: 3711
diff changeset
44
2790
98769cea155c added tv subsystem
alex
parents:
diff changeset
45 typedef struct {
2802
09d5c9834580 tv update
alex
parents: 2790
diff changeset
46 /* general */
2790
98769cea155c added tv subsystem
alex
parents:
diff changeset
47 char *video_device;
3815
622a9ade4517 updated
alex
parents: 3711
diff changeset
48 int video_fd;
2790
98769cea155c added tv subsystem
alex
parents:
diff changeset
49 struct video_capability capability;
98769cea155c added tv subsystem
alex
parents:
diff changeset
50 struct video_channel *channels;
2841
7ff47d6ae6e9 updated audio and tuner checking
alex
parents: 2837
diff changeset
51 int act_channel;
2790
98769cea155c added tv subsystem
alex
parents:
diff changeset
52 struct video_tuner tuner;
2802
09d5c9834580 tv update
alex
parents: 2790
diff changeset
53
09d5c9834580 tv update
alex
parents: 2790
diff changeset
54 /* video */
2790
98769cea155c added tv subsystem
alex
parents:
diff changeset
55 struct video_picture picture;
2802
09d5c9834580 tv update
alex
parents: 2790
diff changeset
56 int format; /* output format */
2790
98769cea155c added tv subsystem
alex
parents:
diff changeset
57 int width;
98769cea155c added tv subsystem
alex
parents:
diff changeset
58 int height;
2802
09d5c9834580 tv update
alex
parents: 2790
diff changeset
59 int bytesperline;
09d5c9834580 tv update
alex
parents: 2790
diff changeset
60
09d5c9834580 tv update
alex
parents: 2790
diff changeset
61 struct video_mbuf mbuf;
09d5c9834580 tv update
alex
parents: 2790
diff changeset
62 unsigned char *mmap;
09d5c9834580 tv update
alex
parents: 2790
diff changeset
63 struct video_mmap *buf;
09d5c9834580 tv update
alex
parents: 2790
diff changeset
64 int nbuf;
09d5c9834580 tv update
alex
parents: 2790
diff changeset
65 int queue;
09d5c9834580 tv update
alex
parents: 2790
diff changeset
66
09d5c9834580 tv update
alex
parents: 2790
diff changeset
67 /* audio */
3815
622a9ade4517 updated
alex
parents: 3711
diff changeset
68 int audio_id;
622a9ade4517 updated
alex
parents: 3711
diff changeset
69 char *audio_device;
622a9ade4517 updated
alex
parents: 3711
diff changeset
70 struct video_audio audio[MAX_AUDIO_CHANNELS];
622a9ade4517 updated
alex
parents: 3711
diff changeset
71 int audio_fd;
622a9ade4517 updated
alex
parents: 3711
diff changeset
72 int audio_channels[MAX_AUDIO_CHANNELS];
622a9ade4517 updated
alex
parents: 3711
diff changeset
73 int audio_format[MAX_AUDIO_CHANNELS];
622a9ade4517 updated
alex
parents: 3711
diff changeset
74 int audio_samplesize[MAX_AUDIO_CHANNELS];
622a9ade4517 updated
alex
parents: 3711
diff changeset
75 int audio_samplerate[MAX_AUDIO_CHANNELS];
622a9ade4517 updated
alex
parents: 3711
diff changeset
76 int audio_blocksize;
2790
98769cea155c added tv subsystem
alex
parents:
diff changeset
77 } priv_t;
98769cea155c added tv subsystem
alex
parents:
diff changeset
78
98769cea155c added tv subsystem
alex
parents:
diff changeset
79 #include "tvi_def.h"
98769cea155c added tv subsystem
alex
parents:
diff changeset
80
2841
7ff47d6ae6e9 updated audio and tuner checking
alex
parents: 2837
diff changeset
81 static const char *device_cap2name[] = {
2790
98769cea155c added tv subsystem
alex
parents:
diff changeset
82 "capture", "tuner", "teletext", "overlay", "chromakey", "clipping",
2802
09d5c9834580 tv update
alex
parents: 2790
diff changeset
83 "frameram", "scales", "monochrome", "subcapture", "mpeg-decoder",
09d5c9834580 tv update
alex
parents: 2790
diff changeset
84 "mpeg-encoder", "mjpeg-decoder", "mjpeg-encoder", NULL
09d5c9834580 tv update
alex
parents: 2790
diff changeset
85 };
09d5c9834580 tv update
alex
parents: 2790
diff changeset
86
2841
7ff47d6ae6e9 updated audio and tuner checking
alex
parents: 2837
diff changeset
87 static const char *device_palette2name[] = {
2802
09d5c9834580 tv update
alex
parents: 2790
diff changeset
88 "-", "grey", "hi240", "rgb16", "rgb24", "rgb32", "rgb15", "yuv422",
09d5c9834580 tv update
alex
parents: 2790
diff changeset
89 "yuyv", "uyvy", "yuv420", "yuv411", "raw", "yuv422p", "yuv411p",
09d5c9834580 tv update
alex
parents: 2790
diff changeset
90 "yuv420p", "yuv410p", NULL
09d5c9834580 tv update
alex
parents: 2790
diff changeset
91 };
09d5c9834580 tv update
alex
parents: 2790
diff changeset
92 #define PALETTE(x) ((x < sizeof(device_pal)/sizeof(char*)) ? device_pal[x] : "UNKNOWN")
09d5c9834580 tv update
alex
parents: 2790
diff changeset
93
2841
7ff47d6ae6e9 updated audio and tuner checking
alex
parents: 2837
diff changeset
94 static const char *audio_mode2name[] = {
7ff47d6ae6e9 updated audio and tuner checking
alex
parents: 2837
diff changeset
95 "unknown", "mono", "stereo", "language1", "language2", NULL
7ff47d6ae6e9 updated audio and tuner checking
alex
parents: 2837
diff changeset
96 };
7ff47d6ae6e9 updated audio and tuner checking
alex
parents: 2837
diff changeset
97
2802
09d5c9834580 tv update
alex
parents: 2790
diff changeset
98 static int palette2depth(int palette)
09d5c9834580 tv update
alex
parents: 2790
diff changeset
99 {
2810
1f0bcdb49910 tv update
alex
parents: 2802
diff changeset
100 switch(palette)
1f0bcdb49910 tv update
alex
parents: 2802
diff changeset
101 {
3220
alex
parents: 2937
diff changeset
102 /* component */
2810
1f0bcdb49910 tv update
alex
parents: 2802
diff changeset
103 case VIDEO_PALETTE_RGB555:
1f0bcdb49910 tv update
alex
parents: 2802
diff changeset
104 return(15);
1f0bcdb49910 tv update
alex
parents: 2802
diff changeset
105 case VIDEO_PALETTE_RGB565:
1f0bcdb49910 tv update
alex
parents: 2802
diff changeset
106 return(16);
1f0bcdb49910 tv update
alex
parents: 2802
diff changeset
107 case VIDEO_PALETTE_RGB24:
1f0bcdb49910 tv update
alex
parents: 2802
diff changeset
108 return(24);
1f0bcdb49910 tv update
alex
parents: 2802
diff changeset
109 case VIDEO_PALETTE_RGB32:
1f0bcdb49910 tv update
alex
parents: 2802
diff changeset
110 return(32);
3220
alex
parents: 2937
diff changeset
111 /* planar */
alex
parents: 2937
diff changeset
112 case VIDEO_PALETTE_YUV411P:
2810
1f0bcdb49910 tv update
alex
parents: 2802
diff changeset
113 case VIDEO_PALETTE_YUV420P:
3220
alex
parents: 2937
diff changeset
114 case VIDEO_PALETTE_YUV410P:
2810
1f0bcdb49910 tv update
alex
parents: 2802
diff changeset
115 return(12);
3220
alex
parents: 2937
diff changeset
116 /* packed */
3815
622a9ade4517 updated
alex
parents: 3711
diff changeset
117 case VIDEO_PALETTE_YUV422P:
2810
1f0bcdb49910 tv update
alex
parents: 2802
diff changeset
118 case VIDEO_PALETTE_YUV422:
3220
alex
parents: 2937
diff changeset
119 case VIDEO_PALETTE_YUYV:
2810
1f0bcdb49910 tv update
alex
parents: 2802
diff changeset
120 case VIDEO_PALETTE_UYVY:
3220
alex
parents: 2937
diff changeset
121 case VIDEO_PALETTE_YUV420:
alex
parents: 2937
diff changeset
122 case VIDEO_PALETTE_YUV411:
2810
1f0bcdb49910 tv update
alex
parents: 2802
diff changeset
123 return(16);
1f0bcdb49910 tv update
alex
parents: 2802
diff changeset
124 }
1f0bcdb49910 tv update
alex
parents: 2802
diff changeset
125 return(-1);
2802
09d5c9834580 tv update
alex
parents: 2790
diff changeset
126 }
09d5c9834580 tv update
alex
parents: 2790
diff changeset
127
09d5c9834580 tv update
alex
parents: 2790
diff changeset
128 static int format2palette(int format)
09d5c9834580 tv update
alex
parents: 2790
diff changeset
129 {
2810
1f0bcdb49910 tv update
alex
parents: 2802
diff changeset
130 switch(format)
1f0bcdb49910 tv update
alex
parents: 2802
diff changeset
131 {
1f0bcdb49910 tv update
alex
parents: 2802
diff changeset
132 case IMGFMT_RGB15:
1f0bcdb49910 tv update
alex
parents: 2802
diff changeset
133 return(VIDEO_PALETTE_RGB555);
1f0bcdb49910 tv update
alex
parents: 2802
diff changeset
134 case IMGFMT_RGB16:
1f0bcdb49910 tv update
alex
parents: 2802
diff changeset
135 return(VIDEO_PALETTE_RGB565);
1f0bcdb49910 tv update
alex
parents: 2802
diff changeset
136 case IMGFMT_RGB24:
1f0bcdb49910 tv update
alex
parents: 2802
diff changeset
137 return(VIDEO_PALETTE_RGB24);
1f0bcdb49910 tv update
alex
parents: 2802
diff changeset
138 case IMGFMT_RGB32:
1f0bcdb49910 tv update
alex
parents: 2802
diff changeset
139 return(VIDEO_PALETTE_RGB32);
1f0bcdb49910 tv update
alex
parents: 2802
diff changeset
140 case IMGFMT_YV12:
3703
3717145636b5 i420 support
alex
parents: 3611
diff changeset
141 case IMGFMT_I420:
2810
1f0bcdb49910 tv update
alex
parents: 2802
diff changeset
142 return(VIDEO_PALETTE_YUV420P);
1f0bcdb49910 tv update
alex
parents: 2802
diff changeset
143 case IMGFMT_UYVY:
1f0bcdb49910 tv update
alex
parents: 2802
diff changeset
144 return(VIDEO_PALETTE_YUV422);
3815
622a9ade4517 updated
alex
parents: 3711
diff changeset
145 case IMGFMT_YUY2:
622a9ade4517 updated
alex
parents: 3711
diff changeset
146 return(VIDEO_PALETTE_YUYV);
2810
1f0bcdb49910 tv update
alex
parents: 2802
diff changeset
147 }
1f0bcdb49910 tv update
alex
parents: 2802
diff changeset
148 return(-1);
2802
09d5c9834580 tv update
alex
parents: 2790
diff changeset
149 }
09d5c9834580 tv update
alex
parents: 2790
diff changeset
150
09d5c9834580 tv update
alex
parents: 2790
diff changeset
151 static int one = 1, zero = 0;
09d5c9834580 tv update
alex
parents: 2790
diff changeset
152
2790
98769cea155c added tv subsystem
alex
parents:
diff changeset
153 tvi_handle_t *tvi_init_v4l(char *device)
98769cea155c added tv subsystem
alex
parents:
diff changeset
154 {
98769cea155c added tv subsystem
alex
parents:
diff changeset
155 tvi_handle_t *h;
98769cea155c added tv subsystem
alex
parents:
diff changeset
156 priv_t *priv;
98769cea155c added tv subsystem
alex
parents:
diff changeset
157
98769cea155c added tv subsystem
alex
parents:
diff changeset
158 h = new_handle();
98769cea155c added tv subsystem
alex
parents:
diff changeset
159 if (!h)
98769cea155c added tv subsystem
alex
parents:
diff changeset
160 return(NULL);
98769cea155c added tv subsystem
alex
parents:
diff changeset
161
98769cea155c added tv subsystem
alex
parents:
diff changeset
162 priv = h->priv;
98769cea155c added tv subsystem
alex
parents:
diff changeset
163
2802
09d5c9834580 tv update
alex
parents: 2790
diff changeset
164 /* set video device name */
2790
98769cea155c added tv subsystem
alex
parents:
diff changeset
165 if (!device)
3611
178c562948ff checkings for malloc results (potential memleaks)
pl
parents: 3284
diff changeset
166 priv->video_device = strdup("/dev/video0");
2790
98769cea155c added tv subsystem
alex
parents:
diff changeset
167 else
3611
178c562948ff checkings for malloc results (potential memleaks)
pl
parents: 3284
diff changeset
168 priv->video_device = strdup(device);
178c562948ff checkings for malloc results (potential memleaks)
pl
parents: 3284
diff changeset
169
178c562948ff checkings for malloc results (potential memleaks)
pl
parents: 3284
diff changeset
170 /* allocation failed */
178c562948ff checkings for malloc results (potential memleaks)
pl
parents: 3284
diff changeset
171 if (!priv->video_device) {
178c562948ff checkings for malloc results (potential memleaks)
pl
parents: 3284
diff changeset
172 free_handle(h);
178c562948ff checkings for malloc results (potential memleaks)
pl
parents: 3284
diff changeset
173 return(NULL);
2790
98769cea155c added tv subsystem
alex
parents:
diff changeset
174 }
98769cea155c added tv subsystem
alex
parents:
diff changeset
175
3815
622a9ade4517 updated
alex
parents: 3711
diff changeset
176 /* set audio device name */
622a9ade4517 updated
alex
parents: 3711
diff changeset
177 priv->audio_device = strdup("/dev/dsp");
622a9ade4517 updated
alex
parents: 3711
diff changeset
178
2790
98769cea155c added tv subsystem
alex
parents:
diff changeset
179 return(h);
98769cea155c added tv subsystem
alex
parents:
diff changeset
180 }
98769cea155c added tv subsystem
alex
parents:
diff changeset
181
3815
622a9ade4517 updated
alex
parents: 3711
diff changeset
182 static int init(priv_t *priv)
2790
98769cea155c added tv subsystem
alex
parents:
diff changeset
183 {
98769cea155c added tv subsystem
alex
parents:
diff changeset
184 int i;
98769cea155c added tv subsystem
alex
parents:
diff changeset
185
3815
622a9ade4517 updated
alex
parents: 3711
diff changeset
186 priv->video_fd = open(priv->video_device, O_RDWR);
622a9ade4517 updated
alex
parents: 3711
diff changeset
187 if (priv->video_fd == -1)
2790
98769cea155c added tv subsystem
alex
parents:
diff changeset
188 {
2818
9f68d309f8cb printf's changed into mp_msg
alex
parents: 2814
diff changeset
189 mp_msg(MSGT_TV, MSGL_ERR, "unable to open '%s': %s\n",
2802
09d5c9834580 tv update
alex
parents: 2790
diff changeset
190 priv->video_device, strerror(errno));
2790
98769cea155c added tv subsystem
alex
parents:
diff changeset
191 goto err;
98769cea155c added tv subsystem
alex
parents:
diff changeset
192 }
98769cea155c added tv subsystem
alex
parents:
diff changeset
193
3815
622a9ade4517 updated
alex
parents: 3711
diff changeset
194 mp_msg(MSGT_TV, MSGL_V, "Video fd: %d\n", priv->video_fd);
2790
98769cea155c added tv subsystem
alex
parents:
diff changeset
195
2802
09d5c9834580 tv update
alex
parents: 2790
diff changeset
196 /* get capabilities (priv->capability is needed!) */
3815
622a9ade4517 updated
alex
parents: 3711
diff changeset
197 if (ioctl(priv->video_fd, VIDIOCGCAP, &priv->capability) == -1)
2790
98769cea155c added tv subsystem
alex
parents:
diff changeset
198 {
2818
9f68d309f8cb printf's changed into mp_msg
alex
parents: 2814
diff changeset
199 mp_msg(MSGT_TV, MSGL_ERR, "ioctl get capabilites failed: %s\n", strerror(errno));
2790
98769cea155c added tv subsystem
alex
parents:
diff changeset
200 goto err;
98769cea155c added tv subsystem
alex
parents:
diff changeset
201 }
98769cea155c added tv subsystem
alex
parents:
diff changeset
202
3815
622a9ade4517 updated
alex
parents: 3711
diff changeset
203 fcntl(priv->video_fd, F_SETFD, FD_CLOEXEC);
2802
09d5c9834580 tv update
alex
parents: 2790
diff changeset
204
2818
9f68d309f8cb printf's changed into mp_msg
alex
parents: 2814
diff changeset
205 mp_msg(MSGT_TV, MSGL_INFO, "Selected device: %s\n", priv->capability.name);
9f68d309f8cb printf's changed into mp_msg
alex
parents: 2814
diff changeset
206 mp_msg(MSGT_TV, MSGL_INFO, " Capabilites: ");
2841
7ff47d6ae6e9 updated audio and tuner checking
alex
parents: 2837
diff changeset
207 for (i = 0; device_cap2name[i] != NULL; i++)
2790
98769cea155c added tv subsystem
alex
parents:
diff changeset
208 if (priv->capability.type & (1 << i))
2841
7ff47d6ae6e9 updated audio and tuner checking
alex
parents: 2837
diff changeset
209 mp_msg(MSGT_TV, MSGL_INFO, "%s ", device_cap2name[i]);
2818
9f68d309f8cb printf's changed into mp_msg
alex
parents: 2814
diff changeset
210 mp_msg(MSGT_TV, MSGL_INFO, "\n");
9f68d309f8cb printf's changed into mp_msg
alex
parents: 2814
diff changeset
211 mp_msg(MSGT_TV, MSGL_INFO, " Device type: %d\n", priv->capability.type);
9f68d309f8cb printf's changed into mp_msg
alex
parents: 2814
diff changeset
212 mp_msg(MSGT_TV, MSGL_INFO, " Supported sizes: %dx%d => %dx%d\n",
2790
98769cea155c added tv subsystem
alex
parents:
diff changeset
213 priv->capability.minwidth, priv->capability.minheight,
98769cea155c added tv subsystem
alex
parents:
diff changeset
214 priv->capability.maxwidth, priv->capability.maxheight);
98769cea155c added tv subsystem
alex
parents:
diff changeset
215 priv->width = priv->capability.minwidth;
98769cea155c added tv subsystem
alex
parents:
diff changeset
216 priv->height = priv->capability.minheight;
2818
9f68d309f8cb printf's changed into mp_msg
alex
parents: 2814
diff changeset
217 mp_msg(MSGT_TV, MSGL_INFO, " Inputs: %d\n", priv->capability.channels);
2790
98769cea155c added tv subsystem
alex
parents:
diff changeset
218
2819
2e58962dc9fe cleaned up some warnings, and tv_param_on moved out from #ifdef USE_TV
alex
parents: 2818
diff changeset
219 priv->channels = (struct video_channel *)malloc(sizeof(struct video_channel)*priv->capability.channels);
3611
178c562948ff checkings for malloc results (potential memleaks)
pl
parents: 3284
diff changeset
220 if (!priv->channels)
178c562948ff checkings for malloc results (potential memleaks)
pl
parents: 3284
diff changeset
221 goto malloc_failed;
2790
98769cea155c added tv subsystem
alex
parents:
diff changeset
222 memset(priv->channels, 0, sizeof(struct video_channel)*priv->capability.channels);
98769cea155c added tv subsystem
alex
parents:
diff changeset
223 for (i = 0; i < priv->capability.channels; i++)
98769cea155c added tv subsystem
alex
parents:
diff changeset
224 {
98769cea155c added tv subsystem
alex
parents:
diff changeset
225 priv->channels[i].channel = i;
3815
622a9ade4517 updated
alex
parents: 3711
diff changeset
226 if (ioctl(priv->video_fd, VIDIOCGCHAN, &priv->channels[i]) == -1)
2841
7ff47d6ae6e9 updated audio and tuner checking
alex
parents: 2837
diff changeset
227 {
7ff47d6ae6e9 updated audio and tuner checking
alex
parents: 2837
diff changeset
228 mp_msg(MSGT_TV, MSGL_ERR, "ioctl get channel failed: %s\n", strerror(errno));
7ff47d6ae6e9 updated audio and tuner checking
alex
parents: 2837
diff changeset
229 break;
7ff47d6ae6e9 updated audio and tuner checking
alex
parents: 2837
diff changeset
230 }
2818
9f68d309f8cb printf's changed into mp_msg
alex
parents: 2814
diff changeset
231 mp_msg(MSGT_TV, MSGL_INFO, " %d: %s: %s%s%s%s (tuner:%d, norm:%d)\n", i,
2790
98769cea155c added tv subsystem
alex
parents:
diff changeset
232 priv->channels[i].name,
98769cea155c added tv subsystem
alex
parents:
diff changeset
233 (priv->channels[i].flags & VIDEO_VC_TUNER) ? "tuner " : "",
98769cea155c added tv subsystem
alex
parents:
diff changeset
234 (priv->channels[i].flags & VIDEO_VC_AUDIO) ? "audio " : "",
98769cea155c added tv subsystem
alex
parents:
diff changeset
235 (priv->channels[i].flags & VIDEO_TYPE_TV) ? "tv " : "",
2802
09d5c9834580 tv update
alex
parents: 2790
diff changeset
236 (priv->channels[i].flags & VIDEO_TYPE_CAMERA) ? "camera " : "",
09d5c9834580 tv update
alex
parents: 2790
diff changeset
237 priv->channels[i].tuners,
09d5c9834580 tv update
alex
parents: 2790
diff changeset
238 priv->channels[i].norm);
09d5c9834580 tv update
alex
parents: 2790
diff changeset
239 }
09d5c9834580 tv update
alex
parents: 2790
diff changeset
240
3815
622a9ade4517 updated
alex
parents: 3711
diff changeset
241 /* audio chanlist */
2841
7ff47d6ae6e9 updated audio and tuner checking
alex
parents: 2837
diff changeset
242 if (priv->capability.audios)
7ff47d6ae6e9 updated audio and tuner checking
alex
parents: 2837
diff changeset
243 {
7ff47d6ae6e9 updated audio and tuner checking
alex
parents: 2837
diff changeset
244 mp_msg(MSGT_TV, MSGL_INFO, " Audio devices: %d\n", priv->capability.audios);
7ff47d6ae6e9 updated audio and tuner checking
alex
parents: 2837
diff changeset
245
7ff47d6ae6e9 updated audio and tuner checking
alex
parents: 2837
diff changeset
246 for (i = 0; i < priv->capability.audios; i++)
7ff47d6ae6e9 updated audio and tuner checking
alex
parents: 2837
diff changeset
247 {
3815
622a9ade4517 updated
alex
parents: 3711
diff changeset
248 if (i >= MAX_AUDIO_CHANNELS)
622a9ade4517 updated
alex
parents: 3711
diff changeset
249 {
622a9ade4517 updated
alex
parents: 3711
diff changeset
250 mp_msg(MSGT_TV, MSGL_ERR, "no space for more audio channels (incrase in source!) (%d > %d)\n",
622a9ade4517 updated
alex
parents: 3711
diff changeset
251 i, MAX_AUDIO_CHANNELS);
622a9ade4517 updated
alex
parents: 3711
diff changeset
252 i = priv->capability.audios;
622a9ade4517 updated
alex
parents: 3711
diff changeset
253 break;
622a9ade4517 updated
alex
parents: 3711
diff changeset
254 }
622a9ade4517 updated
alex
parents: 3711
diff changeset
255
3284
702e399a4b3e update (audio support is coming:)
alex
parents: 3243
diff changeset
256 priv->audio[i].audio = i;
3815
622a9ade4517 updated
alex
parents: 3711
diff changeset
257 if (ioctl(priv->video_fd, VIDIOCGAUDIO, &priv->audio[i]) == -1)
2841
7ff47d6ae6e9 updated audio and tuner checking
alex
parents: 2837
diff changeset
258 {
7ff47d6ae6e9 updated audio and tuner checking
alex
parents: 2837
diff changeset
259 mp_msg(MSGT_TV, MSGL_ERR, "ioctl get audio failed: %s\n", strerror(errno));
7ff47d6ae6e9 updated audio and tuner checking
alex
parents: 2837
diff changeset
260 break;
7ff47d6ae6e9 updated audio and tuner checking
alex
parents: 2837
diff changeset
261 }
7ff47d6ae6e9 updated audio and tuner checking
alex
parents: 2837
diff changeset
262
3815
622a9ade4517 updated
alex
parents: 3711
diff changeset
263 if (priv->audio[i].volume <= 0)
622a9ade4517 updated
alex
parents: 3711
diff changeset
264 priv->audio[i].volume = 100;
622a9ade4517 updated
alex
parents: 3711
diff changeset
265 priv->audio[i].flags &= ~VIDEO_AUDIO_MUTE;
622a9ade4517 updated
alex
parents: 3711
diff changeset
266 ioctl(priv->video_fd, VIDIOCSAUDIO, &priv->audio[i]);
622a9ade4517 updated
alex
parents: 3711
diff changeset
267
622a9ade4517 updated
alex
parents: 3711
diff changeset
268 switch(priv->audio[i].mode)
622a9ade4517 updated
alex
parents: 3711
diff changeset
269 {
622a9ade4517 updated
alex
parents: 3711
diff changeset
270 case VIDEO_SOUND_MONO:
622a9ade4517 updated
alex
parents: 3711
diff changeset
271 case VIDEO_SOUND_LANG1:
622a9ade4517 updated
alex
parents: 3711
diff changeset
272 case VIDEO_SOUND_LANG2:
622a9ade4517 updated
alex
parents: 3711
diff changeset
273 priv->audio_channels[i] = 1;
622a9ade4517 updated
alex
parents: 3711
diff changeset
274 break;
622a9ade4517 updated
alex
parents: 3711
diff changeset
275 case VIDEO_SOUND_STEREO:
622a9ade4517 updated
alex
parents: 3711
diff changeset
276 priv->audio_channels[i] = 2;
622a9ade4517 updated
alex
parents: 3711
diff changeset
277 break;
622a9ade4517 updated
alex
parents: 3711
diff changeset
278 }
622a9ade4517 updated
alex
parents: 3711
diff changeset
279
622a9ade4517 updated
alex
parents: 3711
diff changeset
280 priv->audio_format[i] = AFMT_S16_LE;
622a9ade4517 updated
alex
parents: 3711
diff changeset
281 priv->audio_samplerate[i] = 44100;
622a9ade4517 updated
alex
parents: 3711
diff changeset
282 priv->audio_samplesize[i] = /*76000*/priv->audio_channels[i]*
622a9ade4517 updated
alex
parents: 3711
diff changeset
283 16*priv->audio_samplerate[i]/8;
622a9ade4517 updated
alex
parents: 3711
diff changeset
284
622a9ade4517 updated
alex
parents: 3711
diff changeset
285 /* display stuff */
3284
702e399a4b3e update (audio support is coming:)
alex
parents: 3243
diff changeset
286 mp_msg(MSGT_TV, MSGL_V, " %d: %s: ", priv->audio[i].audio,
702e399a4b3e update (audio support is coming:)
alex
parents: 3243
diff changeset
287 priv->audio[i].name);
702e399a4b3e update (audio support is coming:)
alex
parents: 3243
diff changeset
288 if (priv->audio[i].flags & VIDEO_AUDIO_MUTABLE)
2841
7ff47d6ae6e9 updated audio and tuner checking
alex
parents: 2837
diff changeset
289 mp_msg(MSGT_TV, MSGL_V, "muted=%s ",
3284
702e399a4b3e update (audio support is coming:)
alex
parents: 3243
diff changeset
290 (priv->audio[i].flags & VIDEO_AUDIO_MUTE) ? "yes" : "no");
2841
7ff47d6ae6e9 updated audio and tuner checking
alex
parents: 2837
diff changeset
291 mp_msg(MSGT_TV, MSGL_V, "volume=%d bass=%d treble=%d balance=%d mode=%s\n",
3284
702e399a4b3e update (audio support is coming:)
alex
parents: 3243
diff changeset
292 priv->audio[i].volume, priv->audio[i].bass, priv->audio[i].treble,
702e399a4b3e update (audio support is coming:)
alex
parents: 3243
diff changeset
293 priv->audio[i].balance, audio_mode2name[priv->audio[i].mode]);
3815
622a9ade4517 updated
alex
parents: 3711
diff changeset
294 mp_msg(MSGT_TV, MSGL_V, " channels: %d, samplerate: %d, samplesize: %d, format: %s\n",
622a9ade4517 updated
alex
parents: 3711
diff changeset
295 priv->audio_channels[i], priv->audio_samplerate[i], priv->audio_samplesize[i],
622a9ade4517 updated
alex
parents: 3711
diff changeset
296 audio_out_format_name(priv->audio_format[i]));
2841
7ff47d6ae6e9 updated audio and tuner checking
alex
parents: 2837
diff changeset
297 }
7ff47d6ae6e9 updated audio and tuner checking
alex
parents: 2837
diff changeset
298 }
7ff47d6ae6e9 updated audio and tuner checking
alex
parents: 2837
diff changeset
299
2802
09d5c9834580 tv update
alex
parents: 2790
diff changeset
300 if (!(priv->capability.type & VID_TYPE_CAPTURE))
09d5c9834580 tv update
alex
parents: 2790
diff changeset
301 {
2818
9f68d309f8cb printf's changed into mp_msg
alex
parents: 2814
diff changeset
302 mp_msg(MSGT_TV, MSGL_ERR, "Only grabbing supported (for overlay use another program)\n");
2802
09d5c9834580 tv update
alex
parents: 2790
diff changeset
303 goto err;
09d5c9834580 tv update
alex
parents: 2790
diff changeset
304 }
09d5c9834580 tv update
alex
parents: 2790
diff changeset
305
09d5c9834580 tv update
alex
parents: 2790
diff changeset
306 /* map grab buffer */
3815
622a9ade4517 updated
alex
parents: 3711
diff changeset
307 if (ioctl(priv->video_fd, VIDIOCGMBUF, &priv->mbuf) == -1)
2802
09d5c9834580 tv update
alex
parents: 2790
diff changeset
308 {
2818
9f68d309f8cb printf's changed into mp_msg
alex
parents: 2814
diff changeset
309 mp_msg(MSGT_TV, MSGL_ERR, "ioctl get mbuf failed: %s\n", strerror(errno));
2802
09d5c9834580 tv update
alex
parents: 2790
diff changeset
310 goto err;
2790
98769cea155c added tv subsystem
alex
parents:
diff changeset
311 }
98769cea155c added tv subsystem
alex
parents:
diff changeset
312
2818
9f68d309f8cb printf's changed into mp_msg
alex
parents: 2814
diff changeset
313 mp_msg(MSGT_TV, MSGL_V, "mbuf: size=%d, frames=%d\n",
2802
09d5c9834580 tv update
alex
parents: 2790
diff changeset
314 priv->mbuf.size, priv->mbuf.frames);
09d5c9834580 tv update
alex
parents: 2790
diff changeset
315 priv->mmap = mmap(0, priv->mbuf.size, PROT_READ|PROT_WRITE,
3815
622a9ade4517 updated
alex
parents: 3711
diff changeset
316 MAP_SHARED, priv->video_fd, 0);
2819
2e58962dc9fe cleaned up some warnings, and tv_param_on moved out from #ifdef USE_TV
alex
parents: 2818
diff changeset
317 if (priv->mmap == (unsigned char *)-1)
2802
09d5c9834580 tv update
alex
parents: 2790
diff changeset
318 {
3815
622a9ade4517 updated
alex
parents: 3711
diff changeset
319 mp_msg(MSGT_TV, MSGL_ERR, "Unable to map memory for buffers: %s\n", strerror(errno));
2802
09d5c9834580 tv update
alex
parents: 2790
diff changeset
320 goto err;
09d5c9834580 tv update
alex
parents: 2790
diff changeset
321 }
2818
9f68d309f8cb printf's changed into mp_msg
alex
parents: 2814
diff changeset
322 mp_msg(MSGT_TV, MSGL_DBG2, "our buffer: %p\n", priv->mmap);
2790
98769cea155c added tv subsystem
alex
parents:
diff changeset
323
2802
09d5c9834580 tv update
alex
parents: 2790
diff changeset
324 /* num of buffers */
09d5c9834580 tv update
alex
parents: 2790
diff changeset
325 priv->nbuf = priv->mbuf.frames;
2790
98769cea155c added tv subsystem
alex
parents:
diff changeset
326
2802
09d5c9834580 tv update
alex
parents: 2790
diff changeset
327 /* video buffers */
2819
2e58962dc9fe cleaned up some warnings, and tv_param_on moved out from #ifdef USE_TV
alex
parents: 2818
diff changeset
328 priv->buf = (struct video_mmap *)malloc(priv->nbuf * sizeof(struct video_mmap));
3611
178c562948ff checkings for malloc results (potential memleaks)
pl
parents: 3284
diff changeset
329 if (!priv->buf)
178c562948ff checkings for malloc results (potential memleaks)
pl
parents: 3284
diff changeset
330 goto malloc_failed;
2802
09d5c9834580 tv update
alex
parents: 2790
diff changeset
331 memset(priv->buf, 0, priv->nbuf * sizeof(struct video_mmap));
2790
98769cea155c added tv subsystem
alex
parents:
diff changeset
332
3815
622a9ade4517 updated
alex
parents: 3711
diff changeset
333 /* audio init */
622a9ade4517 updated
alex
parents: 3711
diff changeset
334 #if 0
622a9ade4517 updated
alex
parents: 3711
diff changeset
335 priv->audio_fd = open(priv->audio_device, O_RDONLY);
622a9ade4517 updated
alex
parents: 3711
diff changeset
336 if (priv->audio_fd < 0)
622a9ade4517 updated
alex
parents: 3711
diff changeset
337 {
622a9ade4517 updated
alex
parents: 3711
diff changeset
338 mp_msg(MSGT_TV, MSGL_ERR, "unable to open '%s': %s\n",
622a9ade4517 updated
alex
parents: 3711
diff changeset
339 priv->audio_device, strerror(errno));
622a9ade4517 updated
alex
parents: 3711
diff changeset
340 }
622a9ade4517 updated
alex
parents: 3711
diff changeset
341 else
622a9ade4517 updated
alex
parents: 3711
diff changeset
342 {
622a9ade4517 updated
alex
parents: 3711
diff changeset
343 int ioctl_param;
622a9ade4517 updated
alex
parents: 3711
diff changeset
344
622a9ade4517 updated
alex
parents: 3711
diff changeset
345 fcntl(priv->audio_fd, F_SETFL, O_NONBLOCK);
622a9ade4517 updated
alex
parents: 3711
diff changeset
346
622a9ade4517 updated
alex
parents: 3711
diff changeset
347 #if 0
622a9ade4517 updated
alex
parents: 3711
diff changeset
348 ioctl_param = 0x7fff000d; /* 8k */
622a9ade4517 updated
alex
parents: 3711
diff changeset
349 printf("ioctl dsp setfragment: %d\n",
622a9ade4517 updated
alex
parents: 3711
diff changeset
350 ioctl(priv->audio_fd, SNDCTL_DSP_SETFRAGMENT, &ioctl_param));
622a9ade4517 updated
alex
parents: 3711
diff changeset
351 #endif
622a9ade4517 updated
alex
parents: 3711
diff changeset
352
622a9ade4517 updated
alex
parents: 3711
diff changeset
353 ioctl_param = 0 ;
622a9ade4517 updated
alex
parents: 3711
diff changeset
354 printf("ioctl dsp getfmt: %d\n",
622a9ade4517 updated
alex
parents: 3711
diff changeset
355 ioctl(priv->audio_fd, SNDCTL_DSP_GETFMTS, &ioctl_param));
622a9ade4517 updated
alex
parents: 3711
diff changeset
356
622a9ade4517 updated
alex
parents: 3711
diff changeset
357 printf("Supported formats: %x\n", ioctl_param);
622a9ade4517 updated
alex
parents: 3711
diff changeset
358 if (!(ioctl_param & priv->audio_format[priv->audio_id]))
622a9ade4517 updated
alex
parents: 3711
diff changeset
359 printf("notsupported format\n");
622a9ade4517 updated
alex
parents: 3711
diff changeset
360
622a9ade4517 updated
alex
parents: 3711
diff changeset
361 ioctl_param = priv->audio_format[priv->audio_id];
622a9ade4517 updated
alex
parents: 3711
diff changeset
362 printf("ioctl dsp setfmt: %d\n",
622a9ade4517 updated
alex
parents: 3711
diff changeset
363 ioctl(priv->audio_fd, SNDCTL_DSP_SETFMT, &ioctl_param));
622a9ade4517 updated
alex
parents: 3711
diff changeset
364
622a9ade4517 updated
alex
parents: 3711
diff changeset
365 // ioctl(priv->audio_fd, SNDCTL_DSP_GETISPACE, &ioctl_param);
622a9ade4517 updated
alex
parents: 3711
diff changeset
366 // printf("getispace: %d\n", ioctl_param);
622a9ade4517 updated
alex
parents: 3711
diff changeset
367
622a9ade4517 updated
alex
parents: 3711
diff changeset
368 if (priv->audio_channels[priv->audio_id] > 2)
622a9ade4517 updated
alex
parents: 3711
diff changeset
369 {
622a9ade4517 updated
alex
parents: 3711
diff changeset
370 ioctl_param = priv->audio_channels[priv->audio_id];
622a9ade4517 updated
alex
parents: 3711
diff changeset
371 printf("ioctl dsp channels: %d\n",
622a9ade4517 updated
alex
parents: 3711
diff changeset
372 ioctl(priv->audio_fd, SNDCTL_DSP_CHANNELS, &ioctl_param));
622a9ade4517 updated
alex
parents: 3711
diff changeset
373 }
622a9ade4517 updated
alex
parents: 3711
diff changeset
374 else
622a9ade4517 updated
alex
parents: 3711
diff changeset
375 {
622a9ade4517 updated
alex
parents: 3711
diff changeset
376 // if (priv->audio_channels[priv->audio_id] == 2)
622a9ade4517 updated
alex
parents: 3711
diff changeset
377 // ioctl_param = 1;
622a9ade4517 updated
alex
parents: 3711
diff changeset
378 // else
622a9ade4517 updated
alex
parents: 3711
diff changeset
379 // ioctl_param = 0;
622a9ade4517 updated
alex
parents: 3711
diff changeset
380
622a9ade4517 updated
alex
parents: 3711
diff changeset
381 ioctl_param = (priv->audio_channels[priv->audio_id] == 2);
622a9ade4517 updated
alex
parents: 3711
diff changeset
382 printf("ioctl dsp stereo: %d (req: %d)\n",
622a9ade4517 updated
alex
parents: 3711
diff changeset
383 ioctl(priv->audio_fd, SNDCTL_DSP_STEREO, &ioctl_param),
622a9ade4517 updated
alex
parents: 3711
diff changeset
384 ioctl_param);
622a9ade4517 updated
alex
parents: 3711
diff changeset
385 }
622a9ade4517 updated
alex
parents: 3711
diff changeset
386
622a9ade4517 updated
alex
parents: 3711
diff changeset
387 ioctl_param = priv->audio_samplerate[priv->audio_id];
622a9ade4517 updated
alex
parents: 3711
diff changeset
388 printf("ioctl dsp speed: %d\n",
622a9ade4517 updated
alex
parents: 3711
diff changeset
389 ioctl(priv->audio_fd, SNDCTL_DSP_SPEED, &ioctl_param));
622a9ade4517 updated
alex
parents: 3711
diff changeset
390
622a9ade4517 updated
alex
parents: 3711
diff changeset
391 #if 0
622a9ade4517 updated
alex
parents: 3711
diff changeset
392 ioctl_param = 0;
622a9ade4517 updated
alex
parents: 3711
diff changeset
393 ioctl_param = ~PCM_ENABLE_INPUT;
622a9ade4517 updated
alex
parents: 3711
diff changeset
394 printf("ioctl dsp trigger: %d\n",
622a9ade4517 updated
alex
parents: 3711
diff changeset
395 ioctl(priv->audio_fd, SNDCTL_DSP_SETTRIGGER, &ioctl_param));
622a9ade4517 updated
alex
parents: 3711
diff changeset
396 ioctl_param = PCM_ENABLE_INPUT;
622a9ade4517 updated
alex
parents: 3711
diff changeset
397 printf("ioctl dsp trigger: %d\n",
622a9ade4517 updated
alex
parents: 3711
diff changeset
398 ioctl(priv->audio_fd, SNDCTL_DSP_SETTRIGGER, &ioctl_param));
622a9ade4517 updated
alex
parents: 3711
diff changeset
399 #endif
622a9ade4517 updated
alex
parents: 3711
diff changeset
400
622a9ade4517 updated
alex
parents: 3711
diff changeset
401 printf("ioctl dsp trigger: %d\n",
622a9ade4517 updated
alex
parents: 3711
diff changeset
402 ioctl(priv->audio_fd, SNDCTL_DSP_GETTRIGGER, &ioctl_param));
622a9ade4517 updated
alex
parents: 3711
diff changeset
403 printf("trigger: %x\n", ioctl_param);
622a9ade4517 updated
alex
parents: 3711
diff changeset
404 ioctl_param = PCM_ENABLE_INPUT;
622a9ade4517 updated
alex
parents: 3711
diff changeset
405 printf("ioctl dsp trigger: %d\n",
622a9ade4517 updated
alex
parents: 3711
diff changeset
406 ioctl(priv->audio_fd, SNDCTL_DSP_SETTRIGGER, &ioctl_param));
622a9ade4517 updated
alex
parents: 3711
diff changeset
407
622a9ade4517 updated
alex
parents: 3711
diff changeset
408 printf("ioctl dsp getblocksize: %d\n",
622a9ade4517 updated
alex
parents: 3711
diff changeset
409 ioctl(priv->audio_fd, SNDCTL_DSP_GETBLKSIZE, &priv->audio_blocksize));
622a9ade4517 updated
alex
parents: 3711
diff changeset
410 printf("blocksize: %d\n", priv->audio_blocksize);
622a9ade4517 updated
alex
parents: 3711
diff changeset
411 }
622a9ade4517 updated
alex
parents: 3711
diff changeset
412 #endif
2790
98769cea155c added tv subsystem
alex
parents:
diff changeset
413 return(1);
98769cea155c added tv subsystem
alex
parents:
diff changeset
414
3611
178c562948ff checkings for malloc results (potential memleaks)
pl
parents: 3284
diff changeset
415
178c562948ff checkings for malloc results (potential memleaks)
pl
parents: 3284
diff changeset
416 malloc_failed:
178c562948ff checkings for malloc results (potential memleaks)
pl
parents: 3284
diff changeset
417 if (priv->channels)
178c562948ff checkings for malloc results (potential memleaks)
pl
parents: 3284
diff changeset
418 free(priv->channels);
178c562948ff checkings for malloc results (potential memleaks)
pl
parents: 3284
diff changeset
419 if (priv->buf)
178c562948ff checkings for malloc results (potential memleaks)
pl
parents: 3284
diff changeset
420 free(priv->buf);
2790
98769cea155c added tv subsystem
alex
parents:
diff changeset
421 err:
3815
622a9ade4517 updated
alex
parents: 3711
diff changeset
422 if (priv->video_fd != -1)
622a9ade4517 updated
alex
parents: 3711
diff changeset
423 close(priv->video_fd);
2790
98769cea155c added tv subsystem
alex
parents:
diff changeset
424 return(0);
98769cea155c added tv subsystem
alex
parents:
diff changeset
425 }
98769cea155c added tv subsystem
alex
parents:
diff changeset
426
2802
09d5c9834580 tv update
alex
parents: 2790
diff changeset
427 static int uninit(priv_t *priv)
2790
98769cea155c added tv subsystem
alex
parents:
diff changeset
428 {
3815
622a9ade4517 updated
alex
parents: 3711
diff changeset
429 close(priv->video_fd);
622a9ade4517 updated
alex
parents: 3711
diff changeset
430
622a9ade4517 updated
alex
parents: 3711
diff changeset
431 priv->audio[priv->audio_id].volume = 0;
622a9ade4517 updated
alex
parents: 3711
diff changeset
432 priv->audio[priv->audio_id].flags |= VIDEO_AUDIO_MUTE;
622a9ade4517 updated
alex
parents: 3711
diff changeset
433 ioctl(priv->video_fd, VIDIOCSAUDIO, &priv->audio[priv->audio_id]);
622a9ade4517 updated
alex
parents: 3711
diff changeset
434 close(priv->audio_fd);
2802
09d5c9834580 tv update
alex
parents: 2790
diff changeset
435 #warning "Implement uninit!"
2931
bce9c945b29c tv interface update
alex
parents: 2841
diff changeset
436
bce9c945b29c tv interface update
alex
parents: 2841
diff changeset
437 return(1);
2790
98769cea155c added tv subsystem
alex
parents:
diff changeset
438 }
98769cea155c added tv subsystem
alex
parents:
diff changeset
439
2802
09d5c9834580 tv update
alex
parents: 2790
diff changeset
440 static int start(priv_t *priv)
2790
98769cea155c added tv subsystem
alex
parents:
diff changeset
441 {
2802
09d5c9834580 tv update
alex
parents: 2790
diff changeset
442 int i;
09d5c9834580 tv update
alex
parents: 2790
diff changeset
443
09d5c9834580 tv update
alex
parents: 2790
diff changeset
444
3815
622a9ade4517 updated
alex
parents: 3711
diff changeset
445 if (ioctl(priv->video_fd, VIDIOCGPICT, &priv->picture) == -1)
2790
98769cea155c added tv subsystem
alex
parents:
diff changeset
446 {
2818
9f68d309f8cb printf's changed into mp_msg
alex
parents: 2814
diff changeset
447 mp_msg(MSGT_TV, MSGL_ERR, "ioctl get picture failed: %s\n", strerror(errno));
2802
09d5c9834580 tv update
alex
parents: 2790
diff changeset
448 return(0);
2790
98769cea155c added tv subsystem
alex
parents:
diff changeset
449 }
98769cea155c added tv subsystem
alex
parents:
diff changeset
450
2802
09d5c9834580 tv update
alex
parents: 2790
diff changeset
451 priv->picture.palette = format2palette(priv->format);
09d5c9834580 tv update
alex
parents: 2790
diff changeset
452 priv->picture.depth = palette2depth(priv->picture.palette);
09d5c9834580 tv update
alex
parents: 2790
diff changeset
453 priv->bytesperline = priv->width * priv->picture.depth / 8;
3815
622a9ade4517 updated
alex
parents: 3711
diff changeset
454 // if (IMGFMT_IS_BGR(priv->format) || IMGFMT_IS_RGB(priv->format))
622a9ade4517 updated
alex
parents: 3711
diff changeset
455 // priv->bytesperline = priv->width * priv->picture.depth / 8;
622a9ade4517 updated
alex
parents: 3711
diff changeset
456 // if ((priv->format == IMGFMT_YV12) || (priv->format == IMGFMT_I420) || (priv->format == IMGFMT_IYUV))
622a9ade4517 updated
alex
parents: 3711
diff changeset
457 // priv->bytesperline = priv->width * 3 / 2;
622a9ade4517 updated
alex
parents: 3711
diff changeset
458
622a9ade4517 updated
alex
parents: 3711
diff changeset
459 printf("palette: %d, depth: %d, bytesperline: %d\n",
622a9ade4517 updated
alex
parents: 3711
diff changeset
460 priv->picture.palette, priv->picture.depth, priv->bytesperline);
622a9ade4517 updated
alex
parents: 3711
diff changeset
461
2818
9f68d309f8cb printf's changed into mp_msg
alex
parents: 2814
diff changeset
462 mp_msg(MSGT_TV, MSGL_INFO, "Picture values:\n");
9f68d309f8cb printf's changed into mp_msg
alex
parents: 2814
diff changeset
463 mp_msg(MSGT_TV, MSGL_INFO, " Depth: %d, Palette: %d (Format: %s)\n", priv->picture.depth,
2802
09d5c9834580 tv update
alex
parents: 2790
diff changeset
464 priv->picture.palette, vo_format_name(priv->format));
2818
9f68d309f8cb printf's changed into mp_msg
alex
parents: 2814
diff changeset
465 mp_msg(MSGT_TV, MSGL_INFO, " Brightness: %d, Hue: %d, Colour: %d, Contrast: %d\n",
2802
09d5c9834580 tv update
alex
parents: 2790
diff changeset
466 priv->picture.brightness, priv->picture.hue,
09d5c9834580 tv update
alex
parents: 2790
diff changeset
467 priv->picture.colour, priv->picture.contrast);
09d5c9834580 tv update
alex
parents: 2790
diff changeset
468
09d5c9834580 tv update
alex
parents: 2790
diff changeset
469
3815
622a9ade4517 updated
alex
parents: 3711
diff changeset
470 if (ioctl(priv->video_fd, VIDIOCSPICT, &priv->picture) == -1)
2790
98769cea155c added tv subsystem
alex
parents:
diff changeset
471 {
2818
9f68d309f8cb printf's changed into mp_msg
alex
parents: 2814
diff changeset
472 mp_msg(MSGT_TV, MSGL_ERR, "ioctl set picture failed: %s\n", strerror(errno));
2802
09d5c9834580 tv update
alex
parents: 2790
diff changeset
473 return(0);
2790
98769cea155c added tv subsystem
alex
parents:
diff changeset
474 }
98769cea155c added tv subsystem
alex
parents:
diff changeset
475
2802
09d5c9834580 tv update
alex
parents: 2790
diff changeset
476 priv->nbuf = priv->mbuf.frames;
09d5c9834580 tv update
alex
parents: 2790
diff changeset
477 for (i=0; i < priv->nbuf; i++)
09d5c9834580 tv update
alex
parents: 2790
diff changeset
478 {
09d5c9834580 tv update
alex
parents: 2790
diff changeset
479 priv->buf[i].format = priv->picture.palette;
09d5c9834580 tv update
alex
parents: 2790
diff changeset
480 priv->buf[i].frame = i;
09d5c9834580 tv update
alex
parents: 2790
diff changeset
481 priv->buf[i].width = priv->width;
09d5c9834580 tv update
alex
parents: 2790
diff changeset
482 priv->buf[i].height = priv->height;
2818
9f68d309f8cb printf's changed into mp_msg
alex
parents: 2814
diff changeset
483 mp_msg(MSGT_TV, MSGL_DBG2, "buffer: %d => %p\n", i, &priv->buf[i]);
2802
09d5c9834580 tv update
alex
parents: 2790
diff changeset
484 }
2837
c63562f5f56f tuning worx (can set frequency)
alex
parents: 2830
diff changeset
485
2931
bce9c945b29c tv interface update
alex
parents: 2841
diff changeset
486 #if 0
bce9c945b29c tv interface update
alex
parents: 2841
diff changeset
487 {
bce9c945b29c tv interface update
alex
parents: 2841
diff changeset
488 struct video_play_mode pmode;
bce9c945b29c tv interface update
alex
parents: 2841
diff changeset
489
bce9c945b29c tv interface update
alex
parents: 2841
diff changeset
490 pmode.mode = VID_PLAY_NORMAL;
bce9c945b29c tv interface update
alex
parents: 2841
diff changeset
491 pmode.p1 = 1;
bce9c945b29c tv interface update
alex
parents: 2841
diff changeset
492 pmode.p2 = 0;
3815
622a9ade4517 updated
alex
parents: 3711
diff changeset
493 if (ioctl(priv->video_fd, VIDIOCSPLAYMODE, &pmode) == -1)
2931
bce9c945b29c tv interface update
alex
parents: 2841
diff changeset
494 {
bce9c945b29c tv interface update
alex
parents: 2841
diff changeset
495 mp_msg(MSGT_TV, MSGL_ERR, "ioctl set play mode failed: %s\n", strerror(errno));
bce9c945b29c tv interface update
alex
parents: 2841
diff changeset
496 // return(0);
bce9c945b29c tv interface update
alex
parents: 2841
diff changeset
497 }
bce9c945b29c tv interface update
alex
parents: 2841
diff changeset
498 }
bce9c945b29c tv interface update
alex
parents: 2841
diff changeset
499 #endif
2837
c63562f5f56f tuning worx (can set frequency)
alex
parents: 2830
diff changeset
500
c63562f5f56f tuning worx (can set frequency)
alex
parents: 2830
diff changeset
501 #if 0
c63562f5f56f tuning worx (can set frequency)
alex
parents: 2830
diff changeset
502 {
c63562f5f56f tuning worx (can set frequency)
alex
parents: 2830
diff changeset
503 struct video_window win;
c63562f5f56f tuning worx (can set frequency)
alex
parents: 2830
diff changeset
504
c63562f5f56f tuning worx (can set frequency)
alex
parents: 2830
diff changeset
505 win.x = 0;
c63562f5f56f tuning worx (can set frequency)
alex
parents: 2830
diff changeset
506 win.y = 0;
c63562f5f56f tuning worx (can set frequency)
alex
parents: 2830
diff changeset
507 win.width = priv->width;
c63562f5f56f tuning worx (can set frequency)
alex
parents: 2830
diff changeset
508 win.height = priv->height;
c63562f5f56f tuning worx (can set frequency)
alex
parents: 2830
diff changeset
509 win.chromakey = -1;
c63562f5f56f tuning worx (can set frequency)
alex
parents: 2830
diff changeset
510 win.flags = 0;
c63562f5f56f tuning worx (can set frequency)
alex
parents: 2830
diff changeset
511
3815
622a9ade4517 updated
alex
parents: 3711
diff changeset
512 ioctl(priv->video_fd, VIDIOCSWIN, &win);
2837
c63562f5f56f tuning worx (can set frequency)
alex
parents: 2830
diff changeset
513 }
c63562f5f56f tuning worx (can set frequency)
alex
parents: 2830
diff changeset
514
2802
09d5c9834580 tv update
alex
parents: 2790
diff changeset
515 /* start capture */
3815
622a9ade4517 updated
alex
parents: 3711
diff changeset
516 if (ioctl(priv->video_fd, VIDIOCCAPTURE, &one) == -1)
2802
09d5c9834580 tv update
alex
parents: 2790
diff changeset
517 {
2818
9f68d309f8cb printf's changed into mp_msg
alex
parents: 2814
diff changeset
518 mp_msg(MSGT_TV, MSGL_ERR, "ioctl capture failed: %s\n", strerror(errno));
2802
09d5c9834580 tv update
alex
parents: 2790
diff changeset
519 return(0);
09d5c9834580 tv update
alex
parents: 2790
diff changeset
520 }
2837
c63562f5f56f tuning worx (can set frequency)
alex
parents: 2830
diff changeset
521 #endif
c63562f5f56f tuning worx (can set frequency)
alex
parents: 2830
diff changeset
522
c63562f5f56f tuning worx (can set frequency)
alex
parents: 2830
diff changeset
523 return(1);
2790
98769cea155c added tv subsystem
alex
parents:
diff changeset
524 }
98769cea155c added tv subsystem
alex
parents:
diff changeset
525
98769cea155c added tv subsystem
alex
parents:
diff changeset
526 static int control(priv_t *priv, int cmd, void *arg)
98769cea155c added tv subsystem
alex
parents:
diff changeset
527 {
2818
9f68d309f8cb printf's changed into mp_msg
alex
parents: 2814
diff changeset
528 mp_msg(MSGT_TV, MSGL_DBG2, "debug: control(priv=%p, cmd=%d, arg=%p)\n",
2802
09d5c9834580 tv update
alex
parents: 2790
diff changeset
529 priv, cmd, arg);
2790
98769cea155c added tv subsystem
alex
parents:
diff changeset
530 switch(cmd)
98769cea155c added tv subsystem
alex
parents:
diff changeset
531 {
2802
09d5c9834580 tv update
alex
parents: 2790
diff changeset
532 /* ========== GENERIC controls =========== */
09d5c9834580 tv update
alex
parents: 2790
diff changeset
533 case TVI_CONTROL_IS_VIDEO:
09d5c9834580 tv update
alex
parents: 2790
diff changeset
534 {
09d5c9834580 tv update
alex
parents: 2790
diff changeset
535 if (priv->capability.type & VID_TYPE_CAPTURE)
09d5c9834580 tv update
alex
parents: 2790
diff changeset
536 return(TVI_CONTROL_TRUE);
09d5c9834580 tv update
alex
parents: 2790
diff changeset
537 return(TVI_CONTROL_FALSE);
09d5c9834580 tv update
alex
parents: 2790
diff changeset
538 }
09d5c9834580 tv update
alex
parents: 2790
diff changeset
539 case TVI_CONTROL_IS_AUDIO:
3815
622a9ade4517 updated
alex
parents: 3711
diff changeset
540 return(TVI_CONTROL_FALSE);
622a9ade4517 updated
alex
parents: 3711
diff changeset
541 /* also disable audio for as it's not working! */
2841
7ff47d6ae6e9 updated audio and tuner checking
alex
parents: 2837
diff changeset
542 if (priv->channels[priv->act_channel].flags & VIDEO_VC_AUDIO)
3815
622a9ade4517 updated
alex
parents: 3711
diff changeset
543 {
622a9ade4517 updated
alex
parents: 3711
diff changeset
544 // printf("yeah, audio csennel!!");
2841
7ff47d6ae6e9 updated audio and tuner checking
alex
parents: 2837
diff changeset
545 return(TVI_CONTROL_TRUE);
3815
622a9ade4517 updated
alex
parents: 3711
diff changeset
546 }
622a9ade4517 updated
alex
parents: 3711
diff changeset
547 return(TVI_CONTROL_TRUE);
2802
09d5c9834580 tv update
alex
parents: 2790
diff changeset
548 case TVI_CONTROL_IS_TUNER:
09d5c9834580 tv update
alex
parents: 2790
diff changeset
549 {
2841
7ff47d6ae6e9 updated audio and tuner checking
alex
parents: 2837
diff changeset
550 // if (priv->capability.type & VID_TYPE_TUNER)
7ff47d6ae6e9 updated audio and tuner checking
alex
parents: 2837
diff changeset
551 if (priv->channels[priv->act_channel].flags & VIDEO_VC_TUNER)
2802
09d5c9834580 tv update
alex
parents: 2790
diff changeset
552 return(TVI_CONTROL_TRUE);
09d5c9834580 tv update
alex
parents: 2790
diff changeset
553 return(TVI_CONTROL_FALSE);
09d5c9834580 tv update
alex
parents: 2790
diff changeset
554 }
09d5c9834580 tv update
alex
parents: 2790
diff changeset
555
09d5c9834580 tv update
alex
parents: 2790
diff changeset
556 /* ========== VIDEO controls =========== */
2790
98769cea155c added tv subsystem
alex
parents:
diff changeset
557 case TVI_CONTROL_VID_GET_FORMAT:
2802
09d5c9834580 tv update
alex
parents: 2790
diff changeset
558 {
09d5c9834580 tv update
alex
parents: 2790
diff changeset
559 int output_fmt = -1;
09d5c9834580 tv update
alex
parents: 2790
diff changeset
560
09d5c9834580 tv update
alex
parents: 2790
diff changeset
561 output_fmt = priv->format;
09d5c9834580 tv update
alex
parents: 2790
diff changeset
562 (int)*(void **)arg = output_fmt;
2818
9f68d309f8cb printf's changed into mp_msg
alex
parents: 2814
diff changeset
563 mp_msg(MSGT_TV, MSGL_INFO, "Output format: %s\n", vo_format_name(output_fmt));
2802
09d5c9834580 tv update
alex
parents: 2790
diff changeset
564 return(TVI_CONTROL_TRUE);
09d5c9834580 tv update
alex
parents: 2790
diff changeset
565 }
09d5c9834580 tv update
alex
parents: 2790
diff changeset
566 case TVI_CONTROL_VID_SET_FORMAT:
09d5c9834580 tv update
alex
parents: 2790
diff changeset
567 priv->format = (int)*(void **)arg;
2790
98769cea155c added tv subsystem
alex
parents:
diff changeset
568 return(TVI_CONTROL_TRUE);
98769cea155c added tv subsystem
alex
parents:
diff changeset
569 case TVI_CONTROL_VID_GET_PLANES:
3220
alex
parents: 2937
diff changeset
570 (int)*(void **)arg = 1; /* FIXME, also not needed at this time */
2790
98769cea155c added tv subsystem
alex
parents:
diff changeset
571 return(TVI_CONTROL_TRUE);
98769cea155c added tv subsystem
alex
parents:
diff changeset
572 case TVI_CONTROL_VID_GET_BITS:
2810
1f0bcdb49910 tv update
alex
parents: 2802
diff changeset
573 (int)*(void **)arg = palette2depth(format2palette(priv->format));
2790
98769cea155c added tv subsystem
alex
parents:
diff changeset
574 return(TVI_CONTROL_TRUE);
98769cea155c added tv subsystem
alex
parents:
diff changeset
575 case TVI_CONTROL_VID_GET_WIDTH:
98769cea155c added tv subsystem
alex
parents:
diff changeset
576 (int)*(void **)arg = priv->width;
98769cea155c added tv subsystem
alex
parents:
diff changeset
577 return(TVI_CONTROL_TRUE);
98769cea155c added tv subsystem
alex
parents:
diff changeset
578 case TVI_CONTROL_VID_CHK_WIDTH:
98769cea155c added tv subsystem
alex
parents:
diff changeset
579 {
98769cea155c added tv subsystem
alex
parents:
diff changeset
580 int req_width = (int)*(void **)arg;
98769cea155c added tv subsystem
alex
parents:
diff changeset
581
2818
9f68d309f8cb printf's changed into mp_msg
alex
parents: 2814
diff changeset
582 mp_msg(MSGT_TV, MSGL_INFO, "Requested width: %d\n", req_width);
2810
1f0bcdb49910 tv update
alex
parents: 2802
diff changeset
583 if ((req_width >= priv->capability.minwidth) &&
1f0bcdb49910 tv update
alex
parents: 2802
diff changeset
584 (req_width <= priv->capability.maxwidth))
2790
98769cea155c added tv subsystem
alex
parents:
diff changeset
585 return(TVI_CONTROL_TRUE);
98769cea155c added tv subsystem
alex
parents:
diff changeset
586 return(TVI_CONTROL_FALSE);
98769cea155c added tv subsystem
alex
parents:
diff changeset
587 }
98769cea155c added tv subsystem
alex
parents:
diff changeset
588 case TVI_CONTROL_VID_SET_WIDTH:
98769cea155c added tv subsystem
alex
parents:
diff changeset
589 priv->width = (int)*(void **)arg;
98769cea155c added tv subsystem
alex
parents:
diff changeset
590 return(TVI_CONTROL_TRUE);
98769cea155c added tv subsystem
alex
parents:
diff changeset
591 case TVI_CONTROL_VID_GET_HEIGHT:
98769cea155c added tv subsystem
alex
parents:
diff changeset
592 (int)*(void **)arg = priv->height;
98769cea155c added tv subsystem
alex
parents:
diff changeset
593 return(TVI_CONTROL_TRUE);
98769cea155c added tv subsystem
alex
parents:
diff changeset
594 case TVI_CONTROL_VID_CHK_HEIGHT:
98769cea155c added tv subsystem
alex
parents:
diff changeset
595 {
98769cea155c added tv subsystem
alex
parents:
diff changeset
596 int req_height = (int)*(void **)arg;
98769cea155c added tv subsystem
alex
parents:
diff changeset
597
2818
9f68d309f8cb printf's changed into mp_msg
alex
parents: 2814
diff changeset
598 mp_msg(MSGT_TV, MSGL_INFO, "Requested height: %d\n", req_height);
2810
1f0bcdb49910 tv update
alex
parents: 2802
diff changeset
599 if ((req_height >= priv->capability.minheight) &&
1f0bcdb49910 tv update
alex
parents: 2802
diff changeset
600 (req_height <= priv->capability.maxheight))
2790
98769cea155c added tv subsystem
alex
parents:
diff changeset
601 return(TVI_CONTROL_TRUE);
98769cea155c added tv subsystem
alex
parents:
diff changeset
602 return(TVI_CONTROL_FALSE);
98769cea155c added tv subsystem
alex
parents:
diff changeset
603 }
98769cea155c added tv subsystem
alex
parents:
diff changeset
604 case TVI_CONTROL_VID_SET_HEIGHT:
98769cea155c added tv subsystem
alex
parents:
diff changeset
605 priv->height = (int)*(void **)arg;
98769cea155c added tv subsystem
alex
parents:
diff changeset
606 return(TVI_CONTROL_TRUE);
2937
4307478ad922 added support for setting color values
alex
parents: 2931
diff changeset
607 case TVI_CONTROL_VID_GET_PICTURE:
3815
622a9ade4517 updated
alex
parents: 3711
diff changeset
608 if (ioctl(priv->video_fd, VIDIOCGPICT, &priv->picture) == -1)
2937
4307478ad922 added support for setting color values
alex
parents: 2931
diff changeset
609 {
4307478ad922 added support for setting color values
alex
parents: 2931
diff changeset
610 mp_msg(MSGT_TV, MSGL_ERR, "ioctl get picture failed: %s\n", strerror(errno));
4307478ad922 added support for setting color values
alex
parents: 2931
diff changeset
611 return(TVI_CONTROL_FALSE);
4307478ad922 added support for setting color values
alex
parents: 2931
diff changeset
612 }
4307478ad922 added support for setting color values
alex
parents: 2931
diff changeset
613 return(TVI_CONTROL_TRUE);
4307478ad922 added support for setting color values
alex
parents: 2931
diff changeset
614 case TVI_CONTROL_VID_SET_PICTURE:
3815
622a9ade4517 updated
alex
parents: 3711
diff changeset
615 if (ioctl(priv->video_fd, VIDIOCSPICT, &priv->picture) == -1)
2937
4307478ad922 added support for setting color values
alex
parents: 2931
diff changeset
616 {
4307478ad922 added support for setting color values
alex
parents: 2931
diff changeset
617 mp_msg(MSGT_TV, MSGL_ERR, "ioctl get picture failed: %s\n", strerror(errno));
4307478ad922 added support for setting color values
alex
parents: 2931
diff changeset
618 return(TVI_CONTROL_FALSE);
4307478ad922 added support for setting color values
alex
parents: 2931
diff changeset
619 }
4307478ad922 added support for setting color values
alex
parents: 2931
diff changeset
620 return(TVI_CONTROL_TRUE);
4307478ad922 added support for setting color values
alex
parents: 2931
diff changeset
621 case TVI_CONTROL_VID_SET_BRIGHTNESS:
4307478ad922 added support for setting color values
alex
parents: 2931
diff changeset
622 priv->picture.brightness = (int)*(void **)arg;
4307478ad922 added support for setting color values
alex
parents: 2931
diff changeset
623 control(priv, TVI_CONTROL_VID_SET_PICTURE, 0);
4307478ad922 added support for setting color values
alex
parents: 2931
diff changeset
624 return(TVI_CONTROL_TRUE);
4307478ad922 added support for setting color values
alex
parents: 2931
diff changeset
625 case TVI_CONTROL_VID_SET_HUE:
4307478ad922 added support for setting color values
alex
parents: 2931
diff changeset
626 priv->picture.hue = (int)*(void **)arg;
4307478ad922 added support for setting color values
alex
parents: 2931
diff changeset
627 control(priv, TVI_CONTROL_VID_SET_PICTURE, 0);
4307478ad922 added support for setting color values
alex
parents: 2931
diff changeset
628 return(TVI_CONTROL_TRUE);
4307478ad922 added support for setting color values
alex
parents: 2931
diff changeset
629 case TVI_CONTROL_VID_SET_SATURATION:
4307478ad922 added support for setting color values
alex
parents: 2931
diff changeset
630 priv->picture.colour = (int)*(void **)arg;
4307478ad922 added support for setting color values
alex
parents: 2931
diff changeset
631 control(priv, TVI_CONTROL_VID_SET_PICTURE, 0);
4307478ad922 added support for setting color values
alex
parents: 2931
diff changeset
632 return(TVI_CONTROL_TRUE);
4307478ad922 added support for setting color values
alex
parents: 2931
diff changeset
633 case TVI_CONTROL_VID_SET_CONTRAST:
4307478ad922 added support for setting color values
alex
parents: 2931
diff changeset
634 priv->picture.contrast = (int)*(void **)arg;
4307478ad922 added support for setting color values
alex
parents: 2931
diff changeset
635 control(priv, TVI_CONTROL_VID_SET_PICTURE, 0);
4307478ad922 added support for setting color values
alex
parents: 2931
diff changeset
636 return(TVI_CONTROL_TRUE);
2790
98769cea155c added tv subsystem
alex
parents:
diff changeset
637
2802
09d5c9834580 tv update
alex
parents: 2790
diff changeset
638 /* ========== TUNER controls =========== */
09d5c9834580 tv update
alex
parents: 2790
diff changeset
639 case TVI_CONTROL_TUN_GET_FREQ:
09d5c9834580 tv update
alex
parents: 2790
diff changeset
640 {
09d5c9834580 tv update
alex
parents: 2790
diff changeset
641 unsigned long freq;
09d5c9834580 tv update
alex
parents: 2790
diff changeset
642
3815
622a9ade4517 updated
alex
parents: 3711
diff changeset
643 if (ioctl(priv->video_fd, VIDIOCGFREQ, &freq) == -1)
2802
09d5c9834580 tv update
alex
parents: 2790
diff changeset
644 {
2818
9f68d309f8cb printf's changed into mp_msg
alex
parents: 2814
diff changeset
645 mp_msg(MSGT_TV, MSGL_ERR, "ioctl get freq failed: %s\n", strerror(errno));
2802
09d5c9834580 tv update
alex
parents: 2790
diff changeset
646 return(TVI_CONTROL_FALSE);
09d5c9834580 tv update
alex
parents: 2790
diff changeset
647 }
09d5c9834580 tv update
alex
parents: 2790
diff changeset
648
09d5c9834580 tv update
alex
parents: 2790
diff changeset
649 /* tuner uses khz not mhz ! */
2837
c63562f5f56f tuning worx (can set frequency)
alex
parents: 2830
diff changeset
650 // if (priv->tuner.flags & VIDEO_TUNER_LOW)
c63562f5f56f tuning worx (can set frequency)
alex
parents: 2830
diff changeset
651 // freq /= 1000;
2802
09d5c9834580 tv update
alex
parents: 2790
diff changeset
652 (unsigned long)*(void **)arg = freq;
09d5c9834580 tv update
alex
parents: 2790
diff changeset
653 return(TVI_CONTROL_TRUE);
09d5c9834580 tv update
alex
parents: 2790
diff changeset
654 }
2790
98769cea155c added tv subsystem
alex
parents:
diff changeset
655 case TVI_CONTROL_TUN_SET_FREQ:
98769cea155c added tv subsystem
alex
parents:
diff changeset
656 {
2802
09d5c9834580 tv update
alex
parents: 2790
diff changeset
657 /* argument is in MHz ! */
09d5c9834580 tv update
alex
parents: 2790
diff changeset
658 unsigned long freq = (unsigned long)*(void **)arg;
09d5c9834580 tv update
alex
parents: 2790
diff changeset
659
2837
c63562f5f56f tuning worx (can set frequency)
alex
parents: 2830
diff changeset
660 mp_msg(MSGT_TV, MSGL_V, "requested frequency: %.3f\n", (float)freq/16);
2802
09d5c9834580 tv update
alex
parents: 2790
diff changeset
661
09d5c9834580 tv update
alex
parents: 2790
diff changeset
662 /* tuner uses khz not mhz ! */
2837
c63562f5f56f tuning worx (can set frequency)
alex
parents: 2830
diff changeset
663 // if (priv->tuner.flags & VIDEO_TUNER_LOW)
c63562f5f56f tuning worx (can set frequency)
alex
parents: 2830
diff changeset
664 // freq *= 1000;
c63562f5f56f tuning worx (can set frequency)
alex
parents: 2830
diff changeset
665 // mp_msg(MSGT_TV, MSGL_V, " requesting from driver: freq=%.3f\n", (float)freq/16);
3815
622a9ade4517 updated
alex
parents: 3711
diff changeset
666 if (ioctl(priv->video_fd, VIDIOCSFREQ, &freq) == -1)
2802
09d5c9834580 tv update
alex
parents: 2790
diff changeset
667 {
2818
9f68d309f8cb printf's changed into mp_msg
alex
parents: 2814
diff changeset
668 mp_msg(MSGT_TV, MSGL_ERR, "ioctl set freq failed: %s\n", strerror(errno));
2802
09d5c9834580 tv update
alex
parents: 2790
diff changeset
669 return(TVI_CONTROL_FALSE);
09d5c9834580 tv update
alex
parents: 2790
diff changeset
670 }
09d5c9834580 tv update
alex
parents: 2790
diff changeset
671 return(TVI_CONTROL_TRUE);
09d5c9834580 tv update
alex
parents: 2790
diff changeset
672 }
09d5c9834580 tv update
alex
parents: 2790
diff changeset
673 case TVI_CONTROL_TUN_GET_TUNER:
09d5c9834580 tv update
alex
parents: 2790
diff changeset
674 {
3815
622a9ade4517 updated
alex
parents: 3711
diff changeset
675 if (ioctl(priv->video_fd, VIDIOCGTUNER, &priv->tuner) == -1)
2802
09d5c9834580 tv update
alex
parents: 2790
diff changeset
676 {
2818
9f68d309f8cb printf's changed into mp_msg
alex
parents: 2814
diff changeset
677 mp_msg(MSGT_TV, MSGL_ERR, "ioctl get tuner failed: %s\n", strerror(errno));
2802
09d5c9834580 tv update
alex
parents: 2790
diff changeset
678 return(TVI_CONTROL_FALSE);
09d5c9834580 tv update
alex
parents: 2790
diff changeset
679 }
09d5c9834580 tv update
alex
parents: 2790
diff changeset
680
2818
9f68d309f8cb printf's changed into mp_msg
alex
parents: 2814
diff changeset
681 mp_msg(MSGT_TV, MSGL_INFO, "Tuner (%s) range: %lu -> %lu\n", priv->tuner.name,
2802
09d5c9834580 tv update
alex
parents: 2790
diff changeset
682 priv->tuner.rangelow, priv->tuner.rangehigh);
09d5c9834580 tv update
alex
parents: 2790
diff changeset
683 return(TVI_CONTROL_TRUE);
09d5c9834580 tv update
alex
parents: 2790
diff changeset
684 }
09d5c9834580 tv update
alex
parents: 2790
diff changeset
685 case TVI_CONTROL_TUN_SET_TUNER:
09d5c9834580 tv update
alex
parents: 2790
diff changeset
686 {
3815
622a9ade4517 updated
alex
parents: 3711
diff changeset
687 if (ioctl(priv->video_fd, VIDIOCSTUNER, &priv->tuner) == -1)
2802
09d5c9834580 tv update
alex
parents: 2790
diff changeset
688 {
2818
9f68d309f8cb printf's changed into mp_msg
alex
parents: 2814
diff changeset
689 mp_msg(MSGT_TV, MSGL_ERR, "ioctl get tuner failed: %s\n", strerror(errno));
2802
09d5c9834580 tv update
alex
parents: 2790
diff changeset
690 return(TVI_CONTROL_FALSE);
09d5c9834580 tv update
alex
parents: 2790
diff changeset
691 }
09d5c9834580 tv update
alex
parents: 2790
diff changeset
692 return(TVI_CONTROL_TRUE);
09d5c9834580 tv update
alex
parents: 2790
diff changeset
693 }
09d5c9834580 tv update
alex
parents: 2790
diff changeset
694 case TVI_CONTROL_TUN_SET_NORM:
09d5c9834580 tv update
alex
parents: 2790
diff changeset
695 {
09d5c9834580 tv update
alex
parents: 2790
diff changeset
696 int req_mode = (int)*(void **)arg;
09d5c9834580 tv update
alex
parents: 2790
diff changeset
697
09d5c9834580 tv update
alex
parents: 2790
diff changeset
698 if ((!(priv->tuner.flags & VIDEO_TUNER_NORM)) ||
09d5c9834580 tv update
alex
parents: 2790
diff changeset
699 ((req_mode == VIDEO_MODE_PAL) && !(priv->tuner.flags & VIDEO_TUNER_PAL)) ||
09d5c9834580 tv update
alex
parents: 2790
diff changeset
700 ((req_mode == VIDEO_MODE_NTSC) && !(priv->tuner.flags & VIDEO_TUNER_NTSC)) ||
09d5c9834580 tv update
alex
parents: 2790
diff changeset
701 ((req_mode == VIDEO_MODE_SECAM) && !(priv->tuner.flags & VIDEO_TUNER_SECAM)))
09d5c9834580 tv update
alex
parents: 2790
diff changeset
702 {
2818
9f68d309f8cb printf's changed into mp_msg
alex
parents: 2814
diff changeset
703 mp_msg(MSGT_TV, MSGL_ERR, "Tuner isn't capable to set norm!\n");
2802
09d5c9834580 tv update
alex
parents: 2790
diff changeset
704 return(TVI_CONTROL_FALSE);
09d5c9834580 tv update
alex
parents: 2790
diff changeset
705 }
09d5c9834580 tv update
alex
parents: 2790
diff changeset
706
09d5c9834580 tv update
alex
parents: 2790
diff changeset
707 priv->tuner.mode = req_mode;
2790
98769cea155c added tv subsystem
alex
parents:
diff changeset
708
3815
622a9ade4517 updated
alex
parents: 3711
diff changeset
709 if (control(priv->video_fd, TVI_CONTROL_TUN_SET_TUNER, &priv->tuner) != TVI_CONTROL_TRUE)
2802
09d5c9834580 tv update
alex
parents: 2790
diff changeset
710 return(TVI_CONTROL_FALSE);
09d5c9834580 tv update
alex
parents: 2790
diff changeset
711 return(TVI_CONTROL_TRUE);
09d5c9834580 tv update
alex
parents: 2790
diff changeset
712 }
09d5c9834580 tv update
alex
parents: 2790
diff changeset
713 case TVI_CONTROL_TUN_GET_NORM:
09d5c9834580 tv update
alex
parents: 2790
diff changeset
714 {
09d5c9834580 tv update
alex
parents: 2790
diff changeset
715 (int)*(void **)arg = priv->tuner.mode;
09d5c9834580 tv update
alex
parents: 2790
diff changeset
716
09d5c9834580 tv update
alex
parents: 2790
diff changeset
717 return(TVI_CONTROL_TRUE);
09d5c9834580 tv update
alex
parents: 2790
diff changeset
718 }
09d5c9834580 tv update
alex
parents: 2790
diff changeset
719
09d5c9834580 tv update
alex
parents: 2790
diff changeset
720 /* ========== AUDIO controls =========== */
09d5c9834580 tv update
alex
parents: 2790
diff changeset
721 case TVI_CONTROL_AUD_GET_FORMAT:
09d5c9834580 tv update
alex
parents: 2790
diff changeset
722 {
3815
622a9ade4517 updated
alex
parents: 3711
diff changeset
723 (int)*(void **)arg = priv->audio_format[priv->audio_id];
2802
09d5c9834580 tv update
alex
parents: 2790
diff changeset
724 return(TVI_CONTROL_TRUE);
09d5c9834580 tv update
alex
parents: 2790
diff changeset
725 }
09d5c9834580 tv update
alex
parents: 2790
diff changeset
726 case TVI_CONTROL_AUD_GET_CHANNELS:
09d5c9834580 tv update
alex
parents: 2790
diff changeset
727 {
3815
622a9ade4517 updated
alex
parents: 3711
diff changeset
728 (int)*(void **)arg = priv->audio_channels[priv->audio_id];
2802
09d5c9834580 tv update
alex
parents: 2790
diff changeset
729 return(TVI_CONTROL_TRUE);
09d5c9834580 tv update
alex
parents: 2790
diff changeset
730 }
09d5c9834580 tv update
alex
parents: 2790
diff changeset
731 case TVI_CONTROL_AUD_GET_SAMPLERATE:
09d5c9834580 tv update
alex
parents: 2790
diff changeset
732 {
3815
622a9ade4517 updated
alex
parents: 3711
diff changeset
733 (int)*(void **)arg = priv->audio_samplerate[priv->audio_id];
2802
09d5c9834580 tv update
alex
parents: 2790
diff changeset
734 return(TVI_CONTROL_TRUE);
09d5c9834580 tv update
alex
parents: 2790
diff changeset
735 }
09d5c9834580 tv update
alex
parents: 2790
diff changeset
736 case TVI_CONTROL_AUD_GET_SAMPLESIZE:
09d5c9834580 tv update
alex
parents: 2790
diff changeset
737 {
3815
622a9ade4517 updated
alex
parents: 3711
diff changeset
738 (int)*(void **)arg = priv->audio_samplesize[priv->audio_id];
2802
09d5c9834580 tv update
alex
parents: 2790
diff changeset
739 return(TVI_CONTROL_TRUE);
09d5c9834580 tv update
alex
parents: 2790
diff changeset
740 }
09d5c9834580 tv update
alex
parents: 2790
diff changeset
741
09d5c9834580 tv update
alex
parents: 2790
diff changeset
742 /* ========== SPECIFIC controls =========== */
09d5c9834580 tv update
alex
parents: 2790
diff changeset
743 case TVI_CONTROL_SPC_GET_INPUT:
09d5c9834580 tv update
alex
parents: 2790
diff changeset
744 {
09d5c9834580 tv update
alex
parents: 2790
diff changeset
745 int req_chan = (int)*(void **)arg;
09d5c9834580 tv update
alex
parents: 2790
diff changeset
746 int i;
09d5c9834580 tv update
alex
parents: 2790
diff changeset
747
09d5c9834580 tv update
alex
parents: 2790
diff changeset
748 for (i = 0; i < priv->capability.channels; i++)
09d5c9834580 tv update
alex
parents: 2790
diff changeset
749 {
09d5c9834580 tv update
alex
parents: 2790
diff changeset
750 if (priv->channels[i].channel == req_chan)
09d5c9834580 tv update
alex
parents: 2790
diff changeset
751 break;
09d5c9834580 tv update
alex
parents: 2790
diff changeset
752 }
2841
7ff47d6ae6e9 updated audio and tuner checking
alex
parents: 2837
diff changeset
753
7ff47d6ae6e9 updated audio and tuner checking
alex
parents: 2837
diff changeset
754 priv->act_channel = i;
2802
09d5c9834580 tv update
alex
parents: 2790
diff changeset
755
3815
622a9ade4517 updated
alex
parents: 3711
diff changeset
756 if (ioctl(priv->video_fd, VIDIOCGCHAN, &priv->channels[i]) == -1)
2802
09d5c9834580 tv update
alex
parents: 2790
diff changeset
757 {
2818
9f68d309f8cb printf's changed into mp_msg
alex
parents: 2814
diff changeset
758 mp_msg(MSGT_TV, MSGL_ERR, "ioctl get channel failed: %s\n", strerror(errno));
2802
09d5c9834580 tv update
alex
parents: 2790
diff changeset
759 return(TVI_CONTROL_FALSE);
09d5c9834580 tv update
alex
parents: 2790
diff changeset
760 }
09d5c9834580 tv update
alex
parents: 2790
diff changeset
761 return(TVI_CONTROL_TRUE);
09d5c9834580 tv update
alex
parents: 2790
diff changeset
762 }
09d5c9834580 tv update
alex
parents: 2790
diff changeset
763
09d5c9834580 tv update
alex
parents: 2790
diff changeset
764 case TVI_CONTROL_SPC_SET_INPUT:
09d5c9834580 tv update
alex
parents: 2790
diff changeset
765 {
09d5c9834580 tv update
alex
parents: 2790
diff changeset
766 struct video_channel chan;
09d5c9834580 tv update
alex
parents: 2790
diff changeset
767 int req_chan = (int)*(void **)arg;
09d5c9834580 tv update
alex
parents: 2790
diff changeset
768 int i;
09d5c9834580 tv update
alex
parents: 2790
diff changeset
769
09d5c9834580 tv update
alex
parents: 2790
diff changeset
770 if (req_chan >= priv->capability.channels)
09d5c9834580 tv update
alex
parents: 2790
diff changeset
771 {
2818
9f68d309f8cb printf's changed into mp_msg
alex
parents: 2814
diff changeset
772 mp_msg(MSGT_TV, MSGL_ERR, "Invalid input requested: %d, valid: 0-%d\n",
2802
09d5c9834580 tv update
alex
parents: 2790
diff changeset
773 req_chan, priv->capability.channels);
09d5c9834580 tv update
alex
parents: 2790
diff changeset
774 return(TVI_CONTROL_FALSE);
09d5c9834580 tv update
alex
parents: 2790
diff changeset
775 }
09d5c9834580 tv update
alex
parents: 2790
diff changeset
776
09d5c9834580 tv update
alex
parents: 2790
diff changeset
777 for (i = 0; i < priv->capability.channels; i++)
09d5c9834580 tv update
alex
parents: 2790
diff changeset
778 {
09d5c9834580 tv update
alex
parents: 2790
diff changeset
779 if (priv->channels[i].channel == req_chan)
09d5c9834580 tv update
alex
parents: 2790
diff changeset
780 chan = priv->channels[i];
09d5c9834580 tv update
alex
parents: 2790
diff changeset
781 }
09d5c9834580 tv update
alex
parents: 2790
diff changeset
782
3815
622a9ade4517 updated
alex
parents: 3711
diff changeset
783 if (ioctl(priv->video_fd, VIDIOCSCHAN, &chan) == -1)
2802
09d5c9834580 tv update
alex
parents: 2790
diff changeset
784 {
2818
9f68d309f8cb printf's changed into mp_msg
alex
parents: 2814
diff changeset
785 mp_msg(MSGT_TV, MSGL_ERR, "ioctl set chan failed: %s\n", strerror(errno));
2802
09d5c9834580 tv update
alex
parents: 2790
diff changeset
786 return(TVI_CONTROL_FALSE);
09d5c9834580 tv update
alex
parents: 2790
diff changeset
787 }
2818
9f68d309f8cb printf's changed into mp_msg
alex
parents: 2814
diff changeset
788 mp_msg(MSGT_TV, MSGL_INFO, "Using input '%s'\n", chan.name);
2802
09d5c9834580 tv update
alex
parents: 2790
diff changeset
789
2841
7ff47d6ae6e9 updated audio and tuner checking
alex
parents: 2837
diff changeset
790 priv->act_channel = i;
7ff47d6ae6e9 updated audio and tuner checking
alex
parents: 2837
diff changeset
791
2802
09d5c9834580 tv update
alex
parents: 2790
diff changeset
792 /* update tuner state */
2841
7ff47d6ae6e9 updated audio and tuner checking
alex
parents: 2837
diff changeset
793 // if (priv->capability.type & VID_TYPE_TUNER)
7ff47d6ae6e9 updated audio and tuner checking
alex
parents: 2837
diff changeset
794 if (priv->channels[priv->act_channel].flags & VIDEO_VC_TUNER)
2802
09d5c9834580 tv update
alex
parents: 2790
diff changeset
795 control(priv, TVI_CONTROL_TUN_GET_TUNER, 0);
09d5c9834580 tv update
alex
parents: 2790
diff changeset
796
09d5c9834580 tv update
alex
parents: 2790
diff changeset
797 /* update local channel list */
09d5c9834580 tv update
alex
parents: 2790
diff changeset
798 control(priv, TVI_CONTROL_SPC_GET_INPUT, &req_chan);
09d5c9834580 tv update
alex
parents: 2790
diff changeset
799 return(TVI_CONTROL_TRUE);
2790
98769cea155c added tv subsystem
alex
parents:
diff changeset
800 }
98769cea155c added tv subsystem
alex
parents:
diff changeset
801 }
98769cea155c added tv subsystem
alex
parents:
diff changeset
802
98769cea155c added tv subsystem
alex
parents:
diff changeset
803 return(TVI_CONTROL_UNKNOWN);
98769cea155c added tv subsystem
alex
parents:
diff changeset
804 }
98769cea155c added tv subsystem
alex
parents:
diff changeset
805
98769cea155c added tv subsystem
alex
parents:
diff changeset
806 static int grab_video_frame(priv_t *priv, char *buffer, int len)
98769cea155c added tv subsystem
alex
parents:
diff changeset
807 {
2802
09d5c9834580 tv update
alex
parents: 2790
diff changeset
808 int frame = priv->queue % priv->nbuf;
2814
37fc45a05082 doublebuffeing SYNC fixed
arpi
parents: 2810
diff changeset
809 int nextframe = (priv->queue+1) % priv->nbuf;
2802
09d5c9834580 tv update
alex
parents: 2790
diff changeset
810
3284
702e399a4b3e update (audio support is coming:)
alex
parents: 3243
diff changeset
811 mp_dbg(MSGT_TV, MSGL_DBG2, "grab_video_frame(priv=%p, buffer=%p, len=%d)\n",
2802
09d5c9834580 tv update
alex
parents: 2790
diff changeset
812 priv, buffer, len);
09d5c9834580 tv update
alex
parents: 2790
diff changeset
813
2931
bce9c945b29c tv interface update
alex
parents: 2841
diff changeset
814 mp_dbg(MSGT_TV, MSGL_DBG3, "buf: %p + frame: %d => %p\n",
2814
37fc45a05082 doublebuffeing SYNC fixed
arpi
parents: 2810
diff changeset
815 priv->buf, nextframe, &priv->buf[nextframe]);
3815
622a9ade4517 updated
alex
parents: 3711
diff changeset
816 if (ioctl(priv->video_fd, VIDIOCMCAPTURE, &priv->buf[nextframe]) == -1)
2790
98769cea155c added tv subsystem
alex
parents:
diff changeset
817 {
2818
9f68d309f8cb printf's changed into mp_msg
alex
parents: 2814
diff changeset
818 mp_msg(MSGT_TV, MSGL_ERR, "ioctl mcapture failed: %s\n", strerror(errno));
2802
09d5c9834580 tv update
alex
parents: 2790
diff changeset
819 return(0);
2790
98769cea155c added tv subsystem
alex
parents:
diff changeset
820 }
3711
5fa7eb90e2ec fixed video syncing
alex
parents: 3703
diff changeset
821
3815
622a9ade4517 updated
alex
parents: 3711
diff changeset
822 while (ioctl(priv->video_fd, VIDIOCSYNC, &priv->buf[frame].frame) < 0 &&
3711
5fa7eb90e2ec fixed video syncing
alex
parents: 3703
diff changeset
823 (errno == EAGAIN || errno == EINTR));
5fa7eb90e2ec fixed video syncing
alex
parents: 3703
diff changeset
824 mp_dbg(MSGT_TV, MSGL_DBG3, "picture sync failed\n");
5fa7eb90e2ec fixed video syncing
alex
parents: 3703
diff changeset
825
2802
09d5c9834580 tv update
alex
parents: 2790
diff changeset
826 priv->queue++;
09d5c9834580 tv update
alex
parents: 2790
diff changeset
827
2931
bce9c945b29c tv interface update
alex
parents: 2841
diff changeset
828 mp_dbg(MSGT_TV, MSGL_DBG3, "mmap: %p + offset: %d => %p\n",
2802
09d5c9834580 tv update
alex
parents: 2790
diff changeset
829 priv->mmap, priv->mbuf.offsets[frame],
09d5c9834580 tv update
alex
parents: 2790
diff changeset
830 priv->mmap+priv->mbuf.offsets[frame]);
2931
bce9c945b29c tv interface update
alex
parents: 2841
diff changeset
831
bce9c945b29c tv interface update
alex
parents: 2841
diff changeset
832 /* XXX also directrendering would be nicer! */
bce9c945b29c tv interface update
alex
parents: 2841
diff changeset
833 /* 3 times copying the same picture to other buffer :( */
bce9c945b29c tv interface update
alex
parents: 2841
diff changeset
834
bce9c945b29c tv interface update
alex
parents: 2841
diff changeset
835 /* copy the actual frame */
2802
09d5c9834580 tv update
alex
parents: 2790
diff changeset
836 memcpy(buffer, priv->mmap+priv->mbuf.offsets[frame], len);
09d5c9834580 tv update
alex
parents: 2790
diff changeset
837
09d5c9834580 tv update
alex
parents: 2790
diff changeset
838 return(len);
2790
98769cea155c added tv subsystem
alex
parents:
diff changeset
839 }
98769cea155c added tv subsystem
alex
parents:
diff changeset
840
98769cea155c added tv subsystem
alex
parents:
diff changeset
841 static int get_video_framesize(priv_t *priv)
98769cea155c added tv subsystem
alex
parents:
diff changeset
842 {
2931
bce9c945b29c tv interface update
alex
parents: 2841
diff changeset
843 return(priv->bytesperline * priv->height);
2790
98769cea155c added tv subsystem
alex
parents:
diff changeset
844 }
98769cea155c added tv subsystem
alex
parents:
diff changeset
845
98769cea155c added tv subsystem
alex
parents:
diff changeset
846 static int grab_audio_frame(priv_t *priv, char *buffer, int len)
98769cea155c added tv subsystem
alex
parents:
diff changeset
847 {
3815
622a9ade4517 updated
alex
parents: 3711
diff changeset
848 int in_len = 0;
622a9ade4517 updated
alex
parents: 3711
diff changeset
849
622a9ade4517 updated
alex
parents: 3711
diff changeset
850 /* DBG2 !! */
622a9ade4517 updated
alex
parents: 3711
diff changeset
851 mp_dbg(MSGT_TV, MSGL_V, "grab_audio_frame(priv=%p, buffer=%p, len=%d)\n",
622a9ade4517 updated
alex
parents: 3711
diff changeset
852 priv, buffer, len);
622a9ade4517 updated
alex
parents: 3711
diff changeset
853
622a9ade4517 updated
alex
parents: 3711
diff changeset
854 for (;;)
622a9ade4517 updated
alex
parents: 3711
diff changeset
855 {
622a9ade4517 updated
alex
parents: 3711
diff changeset
856 in_len = read(priv->audio_fd, buffer, len);
622a9ade4517 updated
alex
parents: 3711
diff changeset
857 // printf("in_len: %d\n", in_len);
622a9ade4517 updated
alex
parents: 3711
diff changeset
858 // fflush(NULL);
622a9ade4517 updated
alex
parents: 3711
diff changeset
859
622a9ade4517 updated
alex
parents: 3711
diff changeset
860 if (in_len > 0)
622a9ade4517 updated
alex
parents: 3711
diff changeset
861 break;
622a9ade4517 updated
alex
parents: 3711
diff changeset
862 if (!((in_len == 0) || (in_len == -1 && (errno == EAGAIN || errno == EINTR))))
622a9ade4517 updated
alex
parents: 3711
diff changeset
863 {
622a9ade4517 updated
alex
parents: 3711
diff changeset
864 in_len = 0; /* -EIO */
622a9ade4517 updated
alex
parents: 3711
diff changeset
865 break;
622a9ade4517 updated
alex
parents: 3711
diff changeset
866 }
622a9ade4517 updated
alex
parents: 3711
diff changeset
867 }
622a9ade4517 updated
alex
parents: 3711
diff changeset
868
622a9ade4517 updated
alex
parents: 3711
diff changeset
869 return(in_len);
2790
98769cea155c added tv subsystem
alex
parents:
diff changeset
870 }
98769cea155c added tv subsystem
alex
parents:
diff changeset
871
98769cea155c added tv subsystem
alex
parents:
diff changeset
872 static int get_audio_framesize(priv_t *priv)
98769cea155c added tv subsystem
alex
parents:
diff changeset
873 {
3815
622a9ade4517 updated
alex
parents: 3711
diff changeset
874 return(priv->audio_blocksize);
622a9ade4517 updated
alex
parents: 3711
diff changeset
875 // return(priv->audio_samplesize[priv->audio_id]);
2790
98769cea155c added tv subsystem
alex
parents:
diff changeset
876 }
98769cea155c added tv subsystem
alex
parents:
diff changeset
877
98769cea155c added tv subsystem
alex
parents:
diff changeset
878 #endif /* USE_TV */