14765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev/*
24765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev** Copyright 2010, The Android Open-Source Project
34765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev** Copyright (c) 2011-2012, Code Aurora Forum. All rights reserved.
44765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev**
54765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev** Licensed under the Apache License, Version 2.0 (the "License");
64765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev** you may not use this file except in compliance with the License.
74765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev** You may obtain a copy of the License at
84765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev**
94765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev**     http://www.apache.org/licenses/LICENSE-2.0
104765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev**
114765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev** Unless required by applicable law or agreed to in writing, software
124765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev** distributed under the License is distributed on an "AS IS" BASIS,
134765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
144765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev** See the License for the specific language governing permissions and
154765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev** limitations under the License.
164765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev*/
174765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev
184765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev#ifndef _AUDIO_H_
194765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev#define _AUDIO_H_
204765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev
214765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev#include <sound/asound.h>
224765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev#define PCM_ERROR_MAX 128
234765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev
244765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchevstruct pcm {
254765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev    int fd;
264765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev    int timer_fd;
274765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev    unsigned rate;
284765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev    unsigned channels;
294765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev    unsigned flags;
304765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev    unsigned format;
314765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev    unsigned running:1;
324765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev    int underruns;
334765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev    unsigned buffer_size;
344765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev    unsigned period_size;
354765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev    unsigned period_cnt;
364765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev    char error[PCM_ERROR_MAX];
374765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev    struct snd_pcm_hw_params *hw_p;
384765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev    struct snd_pcm_sw_params *sw_p;
394765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev    struct snd_pcm_sync_ptr *sync_ptr;
404765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev    struct snd_pcm_channel_info ch[2];
414765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev    void *addr;
424765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev    int card_no;
434765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev    int device_no;
444765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev    int start;
454765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev};
464765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev
474765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchevenum decoder_alias {
484765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev    FORMAT_MP3,
494765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev    FORMAT_AC3_PASS_THROUGH = 2,
504765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev};
514765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev
524765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev#define FORMAT(v) SNDRV_PCM_FORMAT_##v
534765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev
544765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev#define PCM_OUT        0x00000000
554765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev#define PCM_IN         0x10000000
564765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev
574765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev#define PCM_STEREO     0x00000000
584765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev#define PCM_MONO       0x01000000
594765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev#define PCM_QUAD       0x02000000
604765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev#define PCM_5POINT1    0x04000000
614765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev
624765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev#define PCM_44100HZ    0x00000000
634765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev#define PCM_48000HZ    0x00100000
644765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev#define PCM_8000HZ     0x00200000
654765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev#define PCM_RATE_MASK  0x00F00000
664765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev
674765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev#define PCM_MMAP       0x00010000
684765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev#define PCM_NMMAP      0x00000000
694765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev
704765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev#define DEBUG_ON       0x00000001
714765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev#define DEBUG_OFF      0x00000000
724765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev
734765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev#define PCM_PERIOD_CNT_MIN 2
744765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev#define PCM_PERIOD_CNT_SHIFT 16
754765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev#define PCM_PERIOD_CNT_MASK (0xF << PCM_PERIOD_CNT_SHIFT)
764765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev#define PCM_PERIOD_SZ_MIN 128
774765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev#define PCM_PERIOD_SZ_SHIFT 12
784765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev#define PCM_PERIOD_SZ_MASK (0xF << PCM_PERIOD_SZ_SHIFT)
794765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev
804765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev#define TIMEOUT_INFINITE  -1
814765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev
824765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev/* Acquire/release a pcm channel.
834765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev * Returns non-zero on error
844765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev */
854765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev
864765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchevstruct mixer_ctl {
874765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev    struct mixer *mixer;
884765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev    struct snd_ctl_elem_info *info;
894765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev    char **ename;
904765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev};
914765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev
924765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev#define __snd_alloca(ptr,type) do { *ptr = (type *) alloca(sizeof(type)); memset(*ptr, 0, sizeof(type)); } while (0)
934765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev#define snd_ctl_elem_id_alloca(ptr) __snd_alloca(ptr, snd_ctl_elem_id)
944765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev#define snd_ctl_card_info_alloca(ptr) __snd_alloca(ptr, snd_ctl_card_info)
954765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev#define snd_ctl_event_alloca(ptr) __snd_alloca(ptr, snd_ctl_event)
964765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev#define snd_ctl_elem_list_alloca(ptr) __snd_alloca(ptr, snd_ctl_elem_list)
974765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev#define snd_ctl_elem_info_alloca(ptr) __snd_alloca(ptr, snd_ctl_elem_info)
984765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev#define snd_ctl_elem_value_alloca(ptr) __snd_alloca(ptr, snd_ctl_elem_value)
994765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev
1004765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev
1014765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchevenum snd_pcm_stream_t {
1024765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev        /** Playback stream */
1034765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev        SND_PCM_STREAM_PLAYBACK = 0,
1044765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev        /** Capture stream */
1054765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev        SND_PCM_STREAM_CAPTURE,
1064765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev        SND_PCM_STREAM_LAST = SND_PCM_STREAM_CAPTURE
1074765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev};
1084765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev
1094765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchevenum _snd_ctl_elem_iface {
1104765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev        /** Card level */
1114765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev        SND_CTL_ELEM_IFACE_CARD = 0,
1124765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev        /** Hardware dependent device */
1134765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev        SND_CTL_ELEM_IFACE_HWDEP,
1144765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev        /** Mixer */
1154765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev        SND_CTL_ELEM_IFACE_MIXER,
1164765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev        /** PCM */
1174765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev        SND_CTL_ELEM_IFACE_PCM,
1184765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev        /** RawMidi */
1194765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev        SND_CTL_ELEM_IFACE_RAWMIDI,
1204765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev        /** Timer */
1214765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev        SND_CTL_ELEM_IFACE_TIMER,
1224765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev        /** Sequencer */
1234765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev        SND_CTL_ELEM_IFACE_SEQUENCER,
1244765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev        SND_CTL_ELEM_IFACE_LAST = SND_CTL_ELEM_IFACE_SEQUENCER
1254765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev};
1264765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev
1274765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchevstruct mixer {
1284765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev    int fd;
1294765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev    struct snd_ctl_elem_info *info;
1304765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev    struct mixer_ctl *ctl;
1314765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev    unsigned count;
1324765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev};
1334765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev
1344765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchevint get_format(const char* name);
1354765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchevconst char *get_format_name(int format);
1364765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchevconst char *get_format_desc(int format);
1374765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchevstruct pcm *pcm_open(unsigned flags, char *device);
1384765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchevint pcm_close(struct pcm *pcm);
1394765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchevint pcm_ready(struct pcm *pcm);
1404765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchevint mmap_buffer(struct pcm *pcm);
1414765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchevu_int8_t *dst_address(struct pcm *pcm);
1424765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchevint sync_ptr(struct pcm *pcm);
1434765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev
1444765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchevvoid param_init(struct snd_pcm_hw_params *p);
1454765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchevvoid param_set_mask(struct snd_pcm_hw_params *p, int n, unsigned bit);
1464765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchevvoid param_set_min(struct snd_pcm_hw_params *p, int n, unsigned val);
1474765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchevvoid param_set_int(struct snd_pcm_hw_params *p, int n, unsigned val);
1484765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchevvoid param_set_max(struct snd_pcm_hw_params *p, int n, unsigned val);
1494765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchevint param_set_hw_refine(struct pcm *pcm, struct snd_pcm_hw_params *params);
1504765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchevint param_set_hw_params(struct pcm *pcm, struct snd_pcm_hw_params *params);
1514765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchevint param_set_sw_params(struct pcm *pcm, struct snd_pcm_sw_params *sparams);
1524765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchevvoid param_dump(struct snd_pcm_hw_params *p);
1534765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchevint pcm_prepare(struct pcm *pcm);
1544765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchevlong pcm_avail(struct pcm *pcm);
1554765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev
1564765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev/* Returns a human readable reason for the last error. */
1574765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchevconst char *pcm_error(struct pcm *pcm);
1584765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev
1594765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev/* Returns the buffer size (int bytes) that should be used for pcm_write.
1604765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev * This will be 1/2 of the actual fifo size.
1614765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev */
1624765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchevint pcm_buffer_size(struct snd_pcm_hw_params *params);
1634765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchevint pcm_period_size(struct snd_pcm_hw_params *params);
1644765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev
1654765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev/* Write data to the fifo.
1664765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev * Will start playback on the first write or on a write that
1674765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev * occurs after a fifo underrun.
1684765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev */
1694765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchevint pcm_write(struct pcm *pcm, void *data, unsigned count);
1704765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchevint pcm_read(struct pcm *pcm, void *data, unsigned count);
1714765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev
1724765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchevstruct mixer;
1734765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchevstruct mixer_ctl;
1744765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev
1754765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchevstruct mixer *mixer_open(const char *device);
1764765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchevvoid mixer_close(struct mixer *mixer);
1774765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchevvoid mixer_dump(struct mixer *mixer);
1784765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev
1794765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchevstruct mixer_ctl *mixer_get_control(struct mixer *mixer,
1804765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev                                    const char *name, unsigned index);
1814765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchevstruct mixer_ctl *mixer_get_nth_control(struct mixer *mixer, unsigned n);
1824765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev
1834765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchevint mixer_ctl_set(struct mixer_ctl *ctl, unsigned percent);
1844765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchevint mixer_ctl_select(struct mixer_ctl *ctl, const char *value);
1854765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchevvoid mixer_ctl_get(struct mixer_ctl *ctl, unsigned *value);
1864765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchevint mixer_ctl_set_value(struct mixer_ctl *ctl, int count, char ** argv);
1874765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev
1884765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev
1894765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev#define MAX_NUM_CODECS 32
1904765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev
1914765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev/* compressed audio support */
1929746c4758b161e26eec92b1ef1ff1bf0ba0bd268Ajay Dudani#ifdef QCOM_COMPRESSED_AUDIO_ENABLED
1934765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchevstruct snd_compr_caps {
1944765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev        __u32 num_codecs;
1954765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev        __u32 min_fragment_size;
1964765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev        __u32 max_fragment_size;
1974765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev        __u32 min_fragments;
1984765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev        __u32 max_fragments;
1994765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev        __u32 codecs[MAX_NUM_CODECS];
2004765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev        __u32 reserved[11];
2014765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev};
2024765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev
2034765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchevstruct snd_enc_wma {
2044765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev        __u32 super_block_align; /* WMA Type-specific data */
2054765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev	__u32 bits_per_sample;
2064765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev	__u32 channelmask;
2074765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev	__u32 encodeopt;
2084765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev};
2094765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev
2104765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchevstruct snd_enc_vorbis {
2114765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev        int quality;
2124765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev        __u32 managed;
2134765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev        __u32 max_bit_rate;
2144765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev        __u32 min_bit_rate;
2154765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev        __u32 downmix;
2164765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev};
2174765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev
2184765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchevstruct snd_enc_real {
2194765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev        __u32 quant_bits;
2204765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev        __u32 start_region;
2214765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev        __u32 num_regions;
2224765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev};
2234765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev
2244765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchevstruct snd_enc_flac {
2254765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev        __u32 num;
2264765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev        __u32 gain;
2274765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev};
2284765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev
2294765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchevstruct snd_enc_generic {
2304765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev        __u32 bw;       /* encoder bandwidth */
2314765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev        int reserved[15];
2324765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev};
2334765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev
2344765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchevunion snd_codec_options {
2354765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev        struct snd_enc_wma wma;
2364765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev        struct snd_enc_vorbis vorbis;
2374765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev        struct snd_enc_real real;
2384765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev        struct snd_enc_flac flac;
2394765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev        struct snd_enc_generic generic;
2404765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev};
2414765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev
2424765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchevstruct snd_codec {
2434765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev        __u32 id;
2444765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev        __u32 ch_in;
2454765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev        __u32 ch_out;
2464765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev        __u32 sample_rate;
2474765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev        __u32 bit_rate;
2484765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev        __u32 rate_control;
2494765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev        __u32 profile;
2504765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev        __u32 level;
2514765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev        __u32 ch_mode;
2524765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev        __u32 format;
2534765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev        __u32 align;
2544765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev        union snd_codec_options options;
2554765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev        __u32 reserved[3];
2564765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev};
2574765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev
2584765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchevstruct snd_compressed_buffer {
2594765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev        size_t fragment_size;
2604765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev        int fragments;
2614765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev};
2624765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev
2634765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev/* */
2644765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchevstruct snd_compr_params {
2654765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev        struct snd_compressed_buffer buffer;
2664765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev        struct snd_codec codec;
2674765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev};
2684765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev
2694765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchevstruct snd_compr_tstamp {
2704765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev        size_t copied_bytes;
2714765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev        size_t copied_total;
2724765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev        size_t decoded;
2734765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev        size_t rendered;
2744765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev        __u32 sampling_rate;
2754765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev        uint64_t timestamp;
2764765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev};
2774765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev
2784765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev#define SNDRV_COMPRESS_GET_CAPS         _IOWR('C', 0x00, struct snd_compr_caps *)
2794765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev#define SNDRV_COMPRESS_GET_CODEC_CAPS   _IOWR('C', 0x01, struct snd_compr_codec_caps *)
2804765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev#define SNDRV_COMPRESS_SET_PARAMS       _IOW('C', 0x02, struct snd_compr_params *)
2814765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev#define SNDRV_COMPRESS_GET_PARAMS       _IOR('C', 0x03, struct snd_compr_params *)
2824765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev#define SNDRV_COMPRESS_TSTAMP           _IOR('C', 0x10, struct snd_compr_tstamp *)
2834765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev#define SNDRV_COMPRESS_AVAIL            _IOR('C', 0x11, struct snd_compr_avail *)
2844765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev#define SNDRV_COMPRESS_PAUSE            _IO('C', 0x20)
2854765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev#define SNDRV_COMPRESS_RESUME           _IO('C', 0x21)
2864765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev#define SNDRV_COMPRESS_START            _IO('C', 0x22)
2874765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev#define SNDRV_COMPRESS_STOP             _IO('C', 0x23)
2884765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev#define SNDRV_COMPRESS_DRAIN            _IO('C', 0x24)
2899746c4758b161e26eec92b1ef1ff1bf0ba0bd268Ajay Dudani#endif
2904765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev
2914765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev#endif
292