分类: LINUX
2010-04-09 15:55:14
1.5 音频输入或输出
音频输入和输出是一个设备的物理连接体。每一个视频捕获设备有零或若干个输入端,每一个输出设备有零或若干个输入端。广播设备没有音频输入或输出。他们只有一个实际上是音频源的调谐器,但是这个API仅将这些调谐器与视频输入或输出连接,而无线电设备没有这些。电视卡中能够将收到的音频信号回送至音频卡的连接器,我们不认为是是一种视频输出。
音频和视频的输出和输入是关联的。在选择了一个视频源的同时也选择了一个音频源。当视、音频源是一个调谐器时这一点显示的最明显。更多的音频连接器能够连接不止一个的视频输入或输出。假设存在两个混合的视频输入和两个音频输入,这里可能最多有4个有效的结合体。视频和音频连接器的关系定义在各自结构体v
可以通过分别使用VIDIOC_ENUMAUDIO和VIDIOC_ENUMAUDOUT的ioctl来获得可见的输入和输出应用的数目和属性。当当前的音频输入被询问时,由VIDIOC_ENUMAUDIO的ioctl返回的结构体v
通过使用参数是VIDIOC_G_AUDIO和VIDIOC_G_AUDOUT的ioctl可以分别得到当前的音频输入和输出信息。请注意,像VIDIOC_ENUMAUDIO和VIDIOC_ENUMAUDOUT这样的ioctl返回一个结构体,而并不像VIDIOC_G_INPUT和VIDIOC_G_OUTPUT那样,只返回一个索引号。
应用程序通过调用参数是VIDIOC_S_AUDIO的ioctl来选择一个音频输入并更改它的属性。同样的,应用程序通过调用参数是VIDIOC_S_AUDOUT的ioctl来选择一个音频输出(当前还没有可更改的属性)。
当设备具有一个或更多的输入时,驱动程序必须执行所有控制输入的ioctl;与此相类似,当设备具有一个或更多的输出时,驱动程序必须执行所有控制输出的ioctl。当设备没有音频输入或输出时,驱动程序必须设定结构体v
例1-3 获取当前音频输入的信息
struct v
memset (&audio, 0, sizeof (audio));
if (-1 == ioctl (fd, VIDIOC_G_AUDIO, &audio)) {
perror ("VIDIOC_G_AUDIO");
exit (EXIT_FAILURE);
}
printf ("Current input: %s\n", audio.name);
例1-4 切换到第一个音频输入
struct v
memset (&audio, 0, sizeof (audio)); /* 清除audio.mode, audio.reserved */
audio.index = 0;
if (-1 == ioctl (fd, VIDIOC_S_AUDIO, &audio)) {
perror ("VIDIOC_S_AUDIO");
exit (EXIT_FAILURE);
}