?? audio.tex
字號(hào):
\devsec{DVB Audio Device}The DVB audio device controls the MPEG2 audio decoder of the DVB hardware.It can be accessed through \texttt{/dev/dvb/adapter0/audio0}.Data types and and ioctl definitions can be accessed by including\texttt{linux/dvb/video.h} in your application.Please note that some DVB cards don't have their ownMPEG decoder, which results in the omission of the audio and videodevice.\devsubsec{Audio Data Types}This section describes the structures, data types and defines used when talking to the audio device.\devsubsubsec{audio\_stream\_source\_t}\label{audiostreamsource}The audio stream source is set through the AUDIO\_SELECT\_SOURCEcall and can take the following values, depending on whether we arereplaying from an internal (demux) or external (user write) source.\begin{verbatim}typedef enum { AUDIO_SOURCE_DEMUX, AUDIO_SOURCE_MEMORY } audio_stream_source_t;\end{verbatim}AUDIO\_SOURCE\_DEMUX selects the demultiplexer (fedeither by the frontend or the DVR device) as the source of the video stream.If AUDIO\_SOURCE\_MEMORY is selected the stream comes from the application through the \texttt{write()} system call.\devsubsubsec{audio\_play\_state\_t}The following values can be returned by the AUDIO\_GET\_STATUS callrepresenting the state of audio playback.\label{audioplaystate}\begin{verbatim}typedef enum { AUDIO_STOPPED, AUDIO_PLAYING, AUDIO_PAUSED } audio_play_state_t;\end{verbatim}\devsubsubsec{audio\_channel\_select\_t}\label{audiochannelselect}The audio channel selected via AUDIO\_CHANNEL\_SELECT is determined bythe following values.\begin{verbatim}typedef enum { AUDIO_STEREO, AUDIO_MONO_LEFT, AUDIO_MONO_RIGHT, } audio_channel_select_t;\end{verbatim}\devsubsubsec{struct audio\_status}\label{audiostatus}The AUDIO\_GET\_STATUS call returns the following structure informingabout various states of the playback operation.\begin{verbatim}typedef struct audio_status { boolean AV_sync_state; boolean mute_state; audio_play_state_t play_state; audio_stream_source_t stream_source; audio_channel_select_t channel_select; boolean bypass_mode;} audio_status_t;\end{verbatim}\devsubsubsec{struct audio\_mixer}\label{audiomixer}The following structure is used by the AUDIO\_SET\_MIXER call to setthe audio volume.\begin{verbatim}typedef struct audio_mixer { unsigned int volume_left; unsigned int volume_right;} audio_mixer_t;\end{verbatim}\devsubsubsec{audio encodings}\label{audiotypes}A call to AUDIO\_GET\_CAPABILITIES returns an unsigned integer withthe following bits set according to the hardwares capabilities.\begin{verbatim}#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\end{verbatim}\devsubsubsec{struct audio\_karaoke}\label{audiokaraoke}The ioctl AUDIO\_SET\_KARAOKE uses the following format:\begin{verbatim}typedefstruct audio_karaoke{ int vocal1; int vocal2; int melody; } audio_karaoke_t;\end{verbatim}If Vocal1 or Vocal2 are non-zero, they get mixedinto left and right t at 70\% each.If both, Vocal1 and Vocal2 are non-zero, Vocal1 getsmixed into the left channel andVocal2 into the right channel at 100\% each.Ff Melody is non-zero, the melody channel gets mixedinto left and right.\devsubsubsec{audio attributes}\label{aattrib}The following attributes can be set by a call to AUDIO\_SET\_ATTRIBUTES:\begin{verbatim}typedef uint16_t audio_attributes_t;/* bits: descr. *//* 15-13 audio coding mode (0=ac3, 2=mpeg1, 3=mpeg2ext, 4=LPCM, 6=DTS, *//* 12 multichannel extension *//* 11-10 audio type (0=not spec, 1=language included) *//* 9- 8 audio application mode (0=not spec, 1=karaoke, 2=surround) *//* 7- 6 Quantization / DRC (mpeg audio: 1=DRC exists)(lpcm: 0=16bit, *//* 5- 4 Sample frequency fs (0=48kHz, 1=96kHz) *//* 2- 0 number of audio channels (n+1 channels) */\end{verbatim}\clearpage\devsubsec{Audio Function Calls}\function{open()}{ int open(const char *deviceName, int flags);}{ This system call opens a named audio device (e.g. /dev/dvb/adapter0/audio0) for subsequent use. When an open() call has succeeded, the device will be ready for use. The significance of blocking or non-blocking mode is described in the documentation for functions where there is a difference. It does not affect the semantics of the open() call itself. A device opened in blocking mode can later be put into non-blocking mode (and vice versa) using the F\_SETFL command of the fcntl system call. This is a standard system call, documented in the Linux manual page for fcntl. Only one user can open the Audio Device in O\_RDWR mode. All other attempts to open the device in this mode will fail, and an error code will be returned. If the Audio Device is opened in O\_RDONLY mode, the only ioctl call that can be used is AUDIO\_GET\_STATUS. All other call will return with an error code. }{ const char *deviceName & Name of specific audio device.\\ int flags & A bit-wise OR of the following flags:\\ & \hspace{1em} O\_RDONLY read-only access\\ & \hspace{1em} O\_RDWR read/write access\\ & \hspace{1em} O\_NONBLOCK open in non-blocking mode \\ & \hspace{1em} (blocking mode is the default)\\ }{ ENODEV & Device driver not loaded/available.\\ EINTERNAL & Internal error.\\ EBUSY & Device or resource busy.\\ EINVAL & Invalid argument.\\}\function{close()}{ int close(int fd);}{ This system call closes a previously opened audio device. }{ int fd & File descriptor returned by a previous call to open().\\ }{ EBADF & fd is not a valid open file descriptor.\\}\function{write()}{ size\_t write(int fd, const void *buf, size\_t count);}{ This system call can only be used if AUDIO\_SOURCE\_MEMORY is selected in the ioctl call AUDIO\_SELECT\_SOURCE. The data provided shall be in PES format. If O\_NONBLOCK is not specified the function will block until buffer space is available. The amount of data to be transferred is implied by count. }{ int fd & File descriptor returned by a previous call to open().\\ void *buf & Pointer to the buffer containing the PES data.\\ size\_t count& Size of buf.\\ }{ EPERM& Mode AUDIO\_SOURCE\_MEMORY not selected.\\ ENOMEM& Attempted to write more data than the internal buffer can hold.\\ EBADF& fd is not a valid open file descriptor.\\}\ifunction{AUDIO\_STOP}{ int ioctl(int fd, int request = AUDIO\_STOP);}{ This ioctl call asks the Audio Device to stop playing the current stream. }{ int fd & File descriptor returned by a previous call to open().\\ int request& Equals AUDIO\_STOP for this command. }{ EBADF& fd is not a valid open file descriptor \\ EINTERNAL & Internal error.}\ifunction{AUDIO\_PLAY}{ int ioctl(int fd, int request = AUDIO\_PLAY);}{ This ioctl call asks the Audio Device to start playing an audio stream from the selected source. }{ int fd & File descriptor returned by a previous call to open().\\ int request& Equals AUDIO\_PLAY for this command. }{ EBADF& fd is not a valid open file descriptor \\ EINTERNAL & Internal error.}\ifunction{AUDIO\_PAUSE}{ int ioctl(int fd, int request = AUDIO\_PAUSE);}{ This ioctl call suspends the audio stream being played. Decoding and playing are paused. It is then possible to restart again decoding and playing process of the audio stream using AUDIO\_CONTINUE command.\\ If AUDIO\_SOURCE\_MEMORY is selected in the ioctl call AUDIO\_SELECT\_SOURCE, the DVB-subsystem will not decode (consume) any more data until the ioctl call
?? 快捷鍵說(shuō)明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號(hào)
Ctrl + =
減小字號(hào)
Ctrl + -