.. -*- coding: utf-8; mode: rst -*-

file: audio.h
=============

.. code-block:: c

    /*
     * audio.h
     *
     * Copyright (C) 2000 Ralph  Metzler <ralph@convergence.de>
     *                  & Marcus Metzler <marcus@convergence.de>
     *                    for convergence integrated media GmbH
     *
     * This program is free software; you can redistribute it and/or
     * modify it under the terms of the GNU General Lesser Public License
     * as published by the Free Software Foundation; either version 2.1
     * of the License, or (at your option) any later version.
     *
     * This program is distributed in the hope that it will be useful,
     * but WITHOUT ANY WARRANTY; without even the implied warranty of
     * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
     * GNU General Public License for more details.
     *
     * You should have received a copy of the GNU Lesser General Public License
     * along with this program; if not, write to the Free Software
     * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
     *
     */

    #ifndef _DVBAUDIO_H_
    #define _DVBAUDIO_H_

    #include <linux/types.h>

    typedef enum {
	    AUDIO_SOURCE_DEMUX, /* Select the demux as the main source */
	    AUDIO_SOURCE_MEMORY /* Select internal memory as the main source */
    } audio_stream_source_t;


    typedef enum {
	    AUDIO_STOPPED,      /* Device is stopped */
	    AUDIO_PLAYING,      /* Device is currently playing */
	    AUDIO_PAUSED        /* Device is paused */
    } audio_play_state_t;


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


    typedef struct audio_mixer {
	    unsigned int volume_left;
	    unsigned int volume_right;
      // what else do we need? bass, pass-through, ...
    } audio_mixer_t;


    typedef struct audio_status {
	    int                    AV_sync_state;  /* sync audio and video? */
	    int                    mute_state;     /* audio is muted */
	    audio_play_state_t     play_state;     /* current playback state */
	    audio_stream_source_t  stream_source;  /* current stream source */
	    audio_channel_select_t channel_select; /* currently selected channel */
	    int                    bypass_mode;    /* pass on audio data to */
	    audio_mixer_t          mixer_state;    /* current mixer state */
    } audio_status_t;                              /* separate decoder hardware */


    typedef
    struct audio_karaoke {  /* if Vocal1 or Vocal2 are non-zero, they get mixed  */
	    int vocal1;    /* into left and right t at 70% each */
	    int vocal2;    /* if both, Vocal1 and Vocal2 are non-zero, Vocal1 gets*/
	    int melody;    /* mixed into the left channel and */
			   /* Vocal2 into the right channel at 100% each. */
			   /* if Melody is non-zero, the melody channel gets mixed*/
    } audio_karaoke_t;     /* into left and right  */


    typedef __u16 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) */


    /* for GET_CAPABILITIES and SET_FORMAT, the latter should only set one bit */
    #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

    #define AUDIO_STOP                 _IO('o', 1)
    #define AUDIO_PLAY                 _IO('o', 2)
    #define AUDIO_PAUSE                _IO('o', 3)
    #define AUDIO_CONTINUE             _IO('o', 4)
    #define AUDIO_SELECT_SOURCE        _IO('o', 5)
    #define AUDIO_SET_MUTE             _IO('o', 6)
    #define AUDIO_SET_AV_SYNC          _IO('o', 7)
    #define AUDIO_SET_BYPASS_MODE      _IO('o', 8)
    #define AUDIO_CHANNEL_SELECT       _IO('o', 9)
    #define AUDIO_GET_STATUS           _IOR('o', 10, audio_status_t)

    #define AUDIO_GET_CAPABILITIES     _IOR('o', 11, unsigned int)
    #define AUDIO_CLEAR_BUFFER         _IO('o',  12)
    #define AUDIO_SET_ID               _IO('o', 13)
    #define AUDIO_SET_MIXER            _IOW('o', 14, audio_mixer_t)
    #define AUDIO_SET_STREAMTYPE       _IO('o', 15)
    #define AUDIO_SET_EXT_ID           _IO('o', 16)
    #define AUDIO_SET_ATTRIBUTES       _IOW('o', 17, audio_attributes_t)
    #define AUDIO_SET_KARAOKE          _IOW('o', 18, audio_karaoke_t)

    /**
     * AUDIO_GET_PTS
     *
     * Read the 33 bit presentation time stamp as defined
     * in ITU T-REC-H.222.0 / ISO/IEC 13818-1.
     *
     * The PTS should belong to the currently played
     * frame if possible, but may also be a value close to it
     * like the PTS of the last decoded frame or the last PTS
     * extracted by the PES parser.
     */
    #define AUDIO_GET_PTS              _IOR('o', 19, __u64)
    #define AUDIO_BILINGUAL_CHANNEL_SELECT _IO('o', 20)

    #endif /* _DVBAUDIO_H_ */
