1.5. 音訊輸入和輸出¶
音訊輸入和輸出是裝置的物理聯結器。影片採集裝置有輸入,輸出裝置有輸出,每個裝置零個或多個。無線電裝置沒有音訊輸入或輸出。它們只有一個調諧器,實際上是一個音訊源,但此 API 僅將調諧器與影片輸入或輸出相關聯,而無線電裝置沒有這些。[1] 電視卡上將接收到的音訊訊號環回到音效卡的聯結器不被視為音訊輸出。
音訊和影片輸入和輸出是關聯的。選擇影片源也會選擇音訊源。當影片和音訊源是調諧器時,這一點最為明顯。進一步的音訊聯結器可以與多個影片輸入或輸出組合。假設存在兩個複合影片輸入和兩個音訊輸入,則最多可以有四個有效的組合。影片和音訊聯結器的關係在相應的 struct v4l2_input 或 struct v4l2_output 的 audioset 欄位中定義,其中每一位代表一個音訊輸入或輸出的索引號,從零開始。
要了解可用輸入和輸出的數量和屬性,應用程式可以使用 ioctl VIDIOC_ENUMAUDIO 和 VIDIOC_ENUMAUDOUT ioctl 分別列舉它們。 ioctl VIDIOC_ENUMAUDIO ioctl 返回的 struct v4l2_audio 也包含在查詢當前音訊輸入時適用的訊號狀態資訊。
VIDIOC_G_AUDIO 和 VIDIOC_G_AUDOUT ioctl 分別報告當前的音訊輸入和輸出。
注意
請注意,與 VIDIOC_G_INPUT 和 VIDIOC_G_OUTPUT 不同,這些 ioctl 返回一個結構,如 ioctl VIDIOC_ENUMAUDIO 和 VIDIOC_ENUMAUDOUT 一樣,而不僅僅是一個索引。
要選擇一個音訊輸入並更改其屬性,應用程式呼叫 VIDIOC_S_AUDIO ioctl。 要選擇一個音訊輸出(目前沒有可更改的屬性),應用程式呼叫 VIDIOC_S_AUDOUT ioctl。
當裝置有多個可選擇的音訊輸入時,驅動程式必須實現所有音訊輸入 ioctl,當裝置有多個可選擇的音訊輸出時,必須實現所有音訊輸出 ioctl。 當裝置有任何音訊輸入或輸出時,驅動程式必須在 ioctl VIDIOC_QUERYCAP ioctl 返回的 struct v4l2_capability 中設定 V4L2_CAP_AUDIO 標誌。
1.5.1. 示例:有關當前音訊輸入的資訊¶
struct v4l2_audio audio;
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.5.2. 示例:切換到第一個音訊輸入¶
struct v4l2_audio audio;
memset(&audio, 0, sizeof(audio)); /* clear audio.mode, audio.reserved */
audio.index = 0;
if (-1 == ioctl(fd, VIDIOC_S_AUDIO, &audio)) {
perror("VIDIOC_S_AUDIO");
exit(EXIT_FAILURE);
}