6.2.3.2. DVB音訊裝置

注意

不要在新驅動程式中使用!請參閱:通用說明

DVB音訊裝置控制DVB硬體的MPEG2音訊解碼器。可以透過/dev/dvb/adapter?/audio?訪問它。可以透過在應用程式中包含linux/dvb/audio.h來訪問資料型別和ioctl定義。

請注意,大多數DVB卡沒有自己的MPEG解碼器,這導致省略音訊和影片裝置。

V4L2也使用這些ioctl來控制在V4L2中實現的MPEG解碼器。為此目的使用這些ioctl已被廢棄,並且已經建立了適當的V4L2 ioctl或控制元件來替換該功能。新驅動程式請使用V4L2 ioctl

6.2.3.2.1. 音訊資料型別

本節描述了與音訊裝置通訊時使用的結構體、資料型別和定義。


6.2.3.2.1.1. audio_stream_source_t

6.2.3.2.1.1.1. 概要

enum audio_stream_source_t
typedef enum {
AUDIO_SOURCE_DEMUX,
AUDIO_SOURCE_MEMORY
} audio_stream_source_t;

6.2.3.2.1.1.2. 常量

AUDIO_SOURCE_DEMUX

選擇多路分解器(由前端或DVR裝置饋送)作為影片流的源。

AUDIO_SOURCE_MEMORY

選擇來自應用程式的流,該流透過write()系統呼叫。

6.2.3.2.1.1.3. 描述

音訊流源透過AUDIO_SELECT_SOURCE呼叫設定,並且可以採用以下值,具體取決於我們是從內部(多路分解器)還是外部(使用者寫入)源重放。

饋送到解碼器的資料也由PID過濾器控制。輸出選擇:dmx_output DMX_OUT_DECODER


6.2.3.2.1.2. audio_play_state_t

6.2.3.2.1.2.1. 概要

enum audio_play_state_t
typedef enum {
    AUDIO_STOPPED,
    AUDIO_PLAYING,
    AUDIO_PAUSED
} audio_play_state_t;

6.2.3.2.1.2.2. 常量

AUDIO_STOPPED

音訊已停止。

AUDIO_PLAYING

音訊當前正在播放。

AUDIO_PAUSE

音訊已凍結。

6.2.3.2.1.2.3. 描述

這些值可以由AUDIO_GET_STATUS呼叫返回,表示音訊播放的狀態。


6.2.3.2.1.3. audio_channel_select_t

6.2.3.2.1.3.1. 概要

enum audio_channel_select_t
typedef enum {
    AUDIO_STEREO,
    AUDIO_MONO_LEFT,
    AUDIO_MONO_RIGHT,
    AUDIO_MONO,
    AUDIO_STEREO_SWAPPED
} audio_channel_select_t;

6.2.3.2.1.3.2. 常量

AUDIO_STEREO

立體聲。

AUDIO_MONO_LEFT

單聲道,選擇左立體聲道作為源。

AUDIO_MONO_RIGHT

單聲道,選擇右立體聲道作為源。

AUDIO_MONO

僅單聲道源。

AUDIO_STEREO_SWAPPED

立體聲,交換L&R。

6.2.3.2.1.3.3. 描述

透過AUDIO_CHANNEL_SELECT選擇的音訊聲道由此值確定。


6.2.3.2.1.4. audio_mixer_t

6.2.3.2.1.4.1. 概要

struct audio_mixer
typedef struct audio_mixer {
    unsigned int volume_left;
    unsigned int volume_right;
} audio_mixer_t;

6.2.3.2.1.4.2. 變數

unsigned int volume_left

左聲道音量。有效範圍:0 ... 255

unsigned int volume_right

右聲道音量。有效範圍:0 ... 255

6.2.3.2.1.4.3. 描述

此結構體由AUDIO_SET_MIXER呼叫用於設定音訊音量。


6.2.3.2.1.5. audio_status

6.2.3.2.1.5.1. 概要

struct audio_status
typedef struct audio_status {
    int AV_sync_state;
    int mute_state;
    audio_play_state_t play_state;
    audio_stream_source_t stream_source;
    audio_channel_select_t channel_select;
    int bypass_mode;
    audio_mixer_t mixer_state;
} audio_status_t;

6.2.3.2.1.5.2. 變數

int AV_sync_state

顯示A/V同步是ON還是OFF。

TRUE(!= 0)

AV同步ON。

FALSE(== 0)

AV同步OFF。

int mute_state

指示音訊是否已靜音。

TRUE(!= 0)

靜音音訊

FALSE(== 0)

取消靜音音訊

audio_play_state_t play_state

當前播放狀態。

audio_stream_source_t stream_source

當前資料來源。

int bypass_mode

是否啟用或停用DVB子系統中當前音訊流的解碼。

TRUE(!= 0)

停用旁路。

FALSE(== 0)

啟用旁路。

audio_mixer_t mixer_state

當前音量設定。

6.2.3.2.1.5.3. 描述

AUDIO_GET_STATUS呼叫返回此結構體作為有關播放操作各種狀態的資訊。


6.2.3.2.1.6. 音訊編碼

6.2.3.2.1.6.1. 概要

#define AUDIO_CAP_DTS    1
#define AUDIO_CAP_LPCM   2
#define AUDIO_CAP_MP1    4
#define AUDIO_CAP_MP2    8
#define AUDIO_CAP_MP3   16
#define AUDIO_CAP_AAC   32
#define AUDIO_CAP_OGG   64
#define AUDIO_CAP_SDDS 128
#define AUDIO_CAP_AC3  256

6.2.3.2.1.6.2. 常量

AUDIO_CAP_DTS

硬體接受DTS音軌。

AUDIO_CAP_LPCM

硬體接受具有線性脈衝編碼調製(LPCM)的未壓縮音訊

AUDIO_CAP_MP1

硬體接受MPEG-1音訊層1。

AUDIO_CAP_MP2

硬體接受MPEG-1音訊層2。也稱為MUSICAM。

AUDIO_CAP_MP3

硬體接受MPEG-1音訊層III。通常稱為.mp3。

AUDIO_CAP_AAC

硬體接受AAC(高階音訊編碼)。

AUDIO_CAP_OGG

硬體接受Vorbis音軌。

AUDIO_CAP_SDDS

硬體接受索尼動態數字聲音(SDDS)。

AUDIO_CAP_AC3

硬體接受杜比數字ATSC A/52音訊。也稱為AC-3。

6.2.3.2.1.6.3. 描述

呼叫AUDIO_GET_CAPABILITIES返回一個無符號整數,其中根據硬體功能設定了以下位。


6.2.3.2.2. 音訊功能呼叫

6.2.3.2.2.1. AUDIO_STOP

6.2.3.2.2.1.1. 概要

AUDIO_STOP
int ioctl(int fd, int request = AUDIO_STOP)

6.2.3.2.2.1.2. 引數

int fd

先前呼叫open()返回的檔案描述符。

int request

對於此命令,等於AUDIO_STOP

6.2.3.2.2.1.3. 描述

注意

不要在新驅動程式中使用!請參閱:通用說明

此ioctl呼叫要求音訊裝置停止播放當前流。

6.2.3.2.2.1.4. 返回值

成功時返回0,出錯時返回-1,並適當設定errno變數。通用錯誤程式碼在通用錯誤程式碼章節中描述。


6.2.3.2.2.2. AUDIO_PLAY

6.2.3.2.2.2.1. 概要

AUDIO_PLAY
int  ioctl(int fd, int request = AUDIO_PLAY)

6.2.3.2.2.2.2. 引數

int fd

先前呼叫open()返回的檔案描述符。

int request

對於此命令,等於AUDIO_PLAY

6.2.3.2.2.2.3. 描述

注意

不要在新驅動程式中使用!請參閱:通用說明

此ioctl呼叫要求音訊裝置開始播放來自所選源的音訊流。

6.2.3.2.2.2.4. 返回值

成功時返回0,出錯時返回-1,並適當設定errno變數。通用錯誤程式碼在通用錯誤程式碼章節中描述。


6.2.3.2.2.3. AUDIO_PAUSE

6.2.3.2.2.3.1. 概要

AUDIO_PAUSE
int  ioctl(int fd, int request = AUDIO_PAUSE)

6.2.3.2.2.3.2. 引數

int fd

先前呼叫open()返回的檔案描述符。

int request

對於此命令,等於AUDIO_PAUSE

6.2.3.2.2.3.3. 描述

注意

不要在新驅動程式中使用!請參閱:通用說明

此ioctl呼叫掛起正在播放的音訊流。解碼和播放已暫停。然後可以使用AUDIO_CONTINUE命令再次重新啟動音訊流的解碼和播放過程。

6.2.3.2.2.3.4. 返回值

成功時返回0,出錯時返回-1,並適當設定errno變數。通用錯誤程式碼在通用錯誤程式碼章節中描述。


6.2.3.2.2.4. AUDIO_CONTINUE

6.2.3.2.2.4.1. 概要

AUDIO_CONTINUE
int  ioctl(int fd, int request = AUDIO_CONTINUE)

6.2.3.2.2.4.2. 引數

int fd

先前呼叫open()返回的檔案描述符。

int request

對於此命令,等於AUDIO_CONTINUE

6.2.3.2.2.4.3. 描述

注意

不要在新驅動程式中使用!請參閱:通用說明

此ioctl重新啟動先前使用AUDIO_PAUSE命令暫停的解碼和播放過程。

6.2.3.2.2.4.4. 返回值

成功時返回0,出錯時返回-1,並適當設定errno變數。通用錯誤程式碼在通用錯誤程式碼章節中描述。


6.2.3.2.2.5. AUDIO_SELECT_SOURCE

6.2.3.2.2.5.1. 概要

AUDIO_SELECT_SOURCE
int ioctl(int fd, int request = AUDIO_SELECT_SOURCE,
audio_stream_source_t source)

6.2.3.2.2.5.2. 引數

int fd

先前呼叫open()返回的檔案描述符。

int request

對於此命令,等於AUDIO_SELECT_SOURCE

audio_stream_source_t source

指示要用於音訊流的源。

6.2.3.2.2.5.3. 描述

注意

不要在新驅動程式中使用!請參閱:通用說明

此ioctl呼叫通知音訊裝置應將哪個源用於輸入資料。可能的來源是多路分解器或記憶體。如果選擇了AUDIO_SOURCE_MEMORY,則透過write命令將資料饋送到音訊裝置。如果選擇了AUDIO_SOURCE_DEMUX,則資料直接從板載多路分解裝置傳輸到解碼器。注意:到目前為止,這僅支援具有一個多路分解器和一個解碼器的DVB裝置。

6.2.3.2.2.5.4. 返回值

成功時返回0,出錯時返回-1,並適當設定errno變數。通用錯誤程式碼在通用錯誤程式碼章節中描述。


6.2.3.2.2.6. AUDIO_SET_MUTE

6.2.3.2.2.6.1. 概要

AUDIO_SET_MUTE
int  ioctl(int fd, int request = AUDIO_SET_MUTE, int state)

6.2.3.2.2.6.2. 引數

int fd

先前呼叫open()返回的檔案描述符。

int request

對於此命令,等於AUDIO_SET_MUTE

int state

指示音訊裝置是否應靜音。

TRUE(!= 0)

靜音音訊

FALSE(== 0)

取消靜音音訊

6.2.3.2.2.6.3. 描述

注意

不要在新驅動程式中使用!請參閱:通用說明

此ioctl僅適用於DVB裝置。要控制V4L2解碼器,請使用V4L2 ioctl VIDIOC_DECODER_CMD, VIDIOC_TRY_DECODER_CMD,並使用V4L2_DEC_CMD_START_MUTE_AUDIO標誌代替。

此ioctl呼叫要求音訊裝置將當前正在播放的流靜音。

6.2.3.2.2.6.4. 返回值

成功時返回0,出錯時返回-1,並適當設定errno變數。通用錯誤程式碼在通用錯誤程式碼章節中描述。


6.2.3.2.2.7. AUDIO_SET_AV_SYNC

6.2.3.2.2.7.1. 概要

AUDIO_SET_AV_SYNC
int  ioctl(int fd, int request = AUDIO_SET_AV_SYNC, int state)

6.2.3.2.2.7.2. 引數

int fd

先前呼叫open()返回的檔案描述符。

int request

對於此命令,等於AUDIO_AV_SYNC

int state

告訴DVB子系統是否應啟用或停用A/V同步。

TRUE(!= 0)

AV同步ON。

FALSE(== 0)

AV同步OFF。

6.2.3.2.2.7.3. 描述

注意

不要在新驅動程式中使用!請參閱:通用說明

此ioctl呼叫要求音訊裝置開啟或關閉A/V同步。

6.2.3.2.2.7.4. 返回值

成功時返回0,出錯時返回-1,並適當設定errno變數。通用錯誤程式碼在通用錯誤程式碼章節中描述。


6.2.3.2.2.8. AUDIO_SET_BYPASS_MODE

6.2.3.2.2.8.1. 概要

AUDIO_SET_BYPASS_MODE
int ioctl(int fd, int request = AUDIO_SET_BYPASS_MODE, int mode)

6.2.3.2.2.8.2. 引數

int fd

先前呼叫open()返回的檔案描述符。

int request

對於此命令,等於AUDIO_SET_BYPASS_MODE

int mode

在DVB子系統中啟用或停用當前音訊流的解碼。

TRUE(!= 0)

停用旁路

FALSE(== 0)

啟用旁路

6.2.3.2.2.8.3. 描述

注意

不要在新驅動程式中使用!請參閱:通用說明

此ioctl呼叫要求音訊裝置繞過音訊解碼器並轉發流而不進行解碼。如果要解碼DVB系統無法處理的流,則應使用此模式。如果硬體可以處理,Dolby DigitalTM流將自動由DVB子系統轉發。

6.2.3.2.2.8.4. 返回值

成功時返回0,出錯時返回-1,並適當設定errno變數。通用錯誤程式碼在通用錯誤程式碼章節中描述。


6.2.3.2.2.9. AUDIO_CHANNEL_SELECT

6.2.3.2.2.9.1. 概要

AUDIO_CHANNEL_SELECT
int ioctl(int fd, int request = AUDIO_CHANNEL_SELECT,
audio_channel_select_t)

6.2.3.2.2.9.2. 引數

int fd

先前呼叫open()返回的檔案描述符。

int request

對於此命令,等於AUDIO_CHANNEL_SELECT

audio_channel_select_t ch

選擇音訊的輸出格式(單聲道左/右,立體聲)。

6.2.3.2.2.9.3. 描述

注意

不要在新驅動程式中使用!請參閱:通用說明

此ioctl僅適用於DVB裝置。要控制V4L2解碼器,請改用V4L2 V4L2_CID_MPEG_AUDIO_DEC_PLAYBACK控制元件。

此ioctl呼叫要求音訊裝置選擇請求的聲道(如果可能)。

6.2.3.2.2.9.4. 返回值

成功時返回0,出錯時返回-1,並適當設定errno變數。通用錯誤程式碼在通用錯誤程式碼章節中描述。


6.2.3.2.2.10. AUDIO_GET_STATUS

6.2.3.2.2.10.1. 概要

AUDIO_GET_STATUS
int ioctl(int fd, int request = AUDIO_GET_STATUS,
struct audio_status *status)

6.2.3.2.2.10.2. 引數

int fd

先前呼叫open()返回的檔案描述符。

int request

對於此命令,等於AUDIO_GET_STATUS。

struct audio_status *status

返回音訊裝置的當前狀態。

6.2.3.2.2.10.3. 描述

注意

不要在新驅動程式中使用!請參閱:通用說明

此ioctl呼叫要求音訊裝置返回音訊裝置的當前狀態。

6.2.3.2.2.10.4. 返回值

成功時返回0,出錯時返回-1,並適當設定errno變數。通用錯誤程式碼在通用錯誤程式碼章節中描述。


6.2.3.2.2.11. AUDIO_GET_CAPABILITIES

6.2.3.2.2.11.1. 概要

AUDIO_GET_CAPABILITIES
int ioctl(int fd, int request = AUDIO_GET_CAPABILITIES,
unsigned int *cap)

6.2.3.2.2.11.2. 引數

int fd

先前呼叫open()返回的檔案描述符。

int request

對於此命令,等於AUDIO_GET_CAPABILITIES

unsigned int *cap

返回支援的聲音格式的位陣列。位在音訊編碼中定義。

6.2.3.2.2.11.3. 描述

注意

不要在新驅動程式中使用!請參閱:通用說明

此ioctl呼叫要求音訊裝置告訴我們音訊硬體的解碼功能。

6.2.3.2.2.11.4. 返回值

成功時返回0,出錯時返回-1,並適當設定errno變數。通用錯誤程式碼在通用錯誤程式碼章節中描述。


6.2.3.2.2.12. AUDIO_CLEAR_BUFFER

6.2.3.2.2.12.1. 概要

AUDIO_CLEAR_BUFFER
int  ioctl(int fd, int request = AUDIO_CLEAR_BUFFER)

6.2.3.2.2.12.2. 引數

int fd

先前呼叫open()返回的檔案描述符。

int request

對於此命令,等於AUDIO_CLEAR_BUFFER

6.2.3.2.2.12.3. 描述

注意

不要在新驅動程式中使用!請參閱:通用說明

此ioctl呼叫要求音訊裝置清除音訊解碼器裝置的所有軟體和硬體緩衝區。

6.2.3.2.2.12.4. 返回值

成功時返回0,出錯時返回-1,並適當設定errno變數。通用錯誤程式碼在通用錯誤程式碼章節中描述。


6.2.3.2.2.13. AUDIO_SET_ID

6.2.3.2.2.13.1. 概要

AUDIO_SET_ID
int  ioctl(int fd, int request = AUDIO_SET_ID, int id)

6.2.3.2.2.13.2. 引數

int fd

先前呼叫open()返回的檔案描述符。

int request

對於此命令,等於AUDIO_SET_ID

int id

音訊子流ID。

6.2.3.2.2.13.3. 描述

注意

不要在新驅動程式中使用!請參閱:通用說明

如果將程式或系統流傳送到影片裝置,則此ioctl選擇要解碼的子流。

如果未設定音訊流型別,則對於MPEG聲音,ID必須在[0xC0,0xDF]範圍內,對於AC3,ID必須在[0x80,0x87]範圍內,對於LPCM,ID必須在[0xA0,0xA7]範圍內。有關更多描述,請參見ITU-T H.222.0 | ISO/IEC 13818-1。

如果使用AUDIO_SET_STREAMTYPE設定了流型別,則ID僅指定音訊流的子流ID,並且僅識別前5位(& 0x1F)。

6.2.3.2.2.13.4. 返回值

成功時返回0,出錯時返回-1,並適當設定errno變數。通用錯誤程式碼在通用錯誤程式碼章節中描述。


6.2.3.2.2.14. AUDIO_SET_MIXER

6.2.3.2.2.14.1. 概要

AUDIO_SET_MIXER
int ioctl(int fd, int request = AUDIO_SET_MIXER, audio_mixer_t *mix)

6.2.3.2.2.14.2. 引數

int fd

先前呼叫open()返回的檔案描述符。

int request

對於此命令,等於AUDIO_SET_MIXER

audio_mixer_t *mix

混音器設定。

6.2.3.2.2.14.3. 描述

注意

不要在新驅動程式中使用!請參閱:通用說明

此ioctl使您可以調整音訊解碼器的混音器設定。

6.2.3.2.2.14.4. 返回值

成功時返回0,出錯時返回-1,並適當設定errno變數。通用錯誤程式碼在通用錯誤程式碼章節中描述。


6.2.3.2.2.15. AUDIO_SET_STREAMTYPE

6.2.3.2.2.15.1. 概要

AUDIO_SET_STREAMTYPE
int  ioctl(fd, int request = AUDIO_SET_STREAMTYPE, int type)

6.2.3.2.2.15.2. 引數

int fd

先前呼叫open()返回的檔案描述符。

int request

對於此命令,等於AUDIO_SET_STREAMTYPE

int type

流型別。

6.2.3.2.2.15.3. 描述

注意

不要在新驅動程式中使用!請參閱:通用說明

此ioctl告訴驅動程式要期望的音訊流的種類。如果流提供多個音訊子流(如LPCM和AC3),這將非常有用。

使用ITU-T H.222.0 | ISO/IEC 13818-1中定義的流型別。

6.2.3.2.2.15.4. 返回值

成功時返回0,出錯時返回-1,並適當設定errno變數。通用錯誤程式碼在通用錯誤程式碼章節中描述。

EINVAL

Type不是有效或支援的流型別。


6.2.3.2.2.16. AUDIO_BILINGUAL_CHANNEL_SELECT

6.2.3.2.2.16.1. 概要

AUDIO_BILINGUAL_CHANNEL_SELECT
int ioctl(int fd, int request = AUDIO_BILINGUAL_CHANNEL_SELECT,
audio_channel_select_t)

6.2.3.2.2.16.2. 引數

int fd

先前呼叫open()返回的檔案描述符。

int request

對於此命令,等於AUDIO_BILINGUAL_CHANNEL_SELECT

audio_channel_select_t ch

選擇音訊的輸出格式(單聲道左/右,立體聲)。

6.2.3.2.2.16.3. 描述

注意

不要在新驅動程式中使用!請參閱:通用說明

此ioctl已被V4L2 V4L2_CID_MPEG_AUDIO_DEC_MULTILINGUAL_PLAYBACK控制元件替換,用於透過V4L2控制的MPEG解碼器。

此ioctl呼叫要求音訊裝置選擇雙語流的請求聲道(如果可能)。

6.2.3.2.2.16.4. 返回值

成功時返回0,出錯時返回-1,並適當設定errno變數。通用錯誤程式碼在通用錯誤程式碼章節中描述。


6.2.3.2.2.17. open()

6.2.3.2.2.17.1. 概要

#include <fcntl.h>
int open(const char *deviceName, int flags)

6.2.3.2.2.17.2. 引數

const char *deviceName

特定音訊裝置的名稱。

int flags

以下標誌的按位OR

O_RDONLY

只讀訪問

O_RDWR

讀/寫訪問

O_NONBLOCK

以非阻塞模式開啟
(阻塞模式為預設模式)

6.2.3.2.2.17.3. 描述

此係統呼叫開啟一個命名的音訊裝置(例如/dev/dvb/adapter0/audio0)供後續使用。當open()呼叫成功後,該裝置將可以使用。阻塞或非阻塞模式的意義在存在差異的函式的文件中描述。它不會影響open()呼叫本身的語義。可以使用fcntl系統呼叫的F_SETFL命令將以阻塞模式開啟的裝置稍後置於非阻塞模式(反之亦然)。這是一個標準系統呼叫,記錄在fcntl的Linux手冊頁中。只有一個使用者可以在O_RDWR模式下開啟音訊裝置。以這種模式開啟裝置的所有其他嘗試都會失敗,並返回錯誤程式碼。如果在O_RDONLY模式下開啟音訊裝置,則可以使用的唯一ioctl呼叫是AUDIO_GET_STATUS。所有其他呼叫都將返回錯誤程式碼。

6.2.3.2.2.17.4. 返回值

ENODEV

裝置驅動程式未載入/不可用。

EBUSY

裝置或資源忙。

EINVAL

無效的引數。


6.2.3.2.2.18. close()

6.2.3.2.2.18.1. 概要

int close(int fd)

6.2.3.2.2.18.2. 引數

int fd

先前呼叫open()返回的檔案描述符。

6.2.3.2.2.18.3. 描述

此係統呼叫關閉先前開啟的音訊裝置。

6.2.3.2.2.18.4. 返回值

EBADF

Fd不是有效的開啟檔案描述符。


6.2.3.2.2.19. write()

6.2.3.2.2.19.1. 概要

size_t write(int fd, const void *buf, size_t count)

6.2.3.2.2.19.2. 引數

int fd

先前呼叫open()返回的檔案描述符。

void *buf

指向包含PES資料的緩衝區的指標。

size_t count

buf的大小。

6.2.3.2.2.19.3. 描述

僅當在ioctl呼叫AUDIO_SELECT_SOURCE中選擇了AUDIO_SOURCE_MEMORY時,才能使用此係統呼叫。提供的資料應為PES格式。如果未指定O_NONBLOCK,則該函式將阻塞,直到緩衝區空間可用。要傳輸的資料量由count隱含。

6.2.3.2.2.19.4. 返回值

EPERM

未選擇模式 AUDIO_SOURCE_MEMORY

ENOMEM

嘗試寫入的資料超過內部緩衝區可以容納的資料量。

EBADF

Fd不是有效的開啟檔案描述符。