blob: e9bdf03e90679abbc7bcdc9c725d9e8ac8842a36 [file] [log] [blame]
/*
* tegra_avp_audio.h - Shared interface between AVP and kernel audio avp driver
*
* Copyright (c) 2013-2014, NVIDIA CORPORATION. All rights reserved.
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License
* version 2 as published by the Free Software Foundation.
*
* 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.
*/
#ifndef _TEGRA_AVP_AUDIO_H
#define _TEGRA_AVP_AUDIO_H
#define USE_IRAM_DEVICE_BUFFER 1
/* Runtime profiling options */
#define PROFILE_RENDER_PROCESSING 0x00000001
#define PROFILE_RENDER_OVERALL_PROCESSING \
(0x00000002 | PROFILE_RENDER_PROCESSING)
#define PROFILE_RENDER_MEMORY 0x00000004
#define DEVICE_BUFFER_SIZE (0x1000)
#define RENDERSW_MAX_LOOPBACK_STREAMS 1
#define RENDERSW_MAX_RENDER_STREAMS 4
#define RENDERSW_MAX_STREAMS \
(RENDERSW_MAX_LOOPBACK_STREAMS + RENDERSW_MAX_RENDER_STREAMS)
#define RENDERSW_MAX_CHANNELS 2
#define AAC_PAYLOAD_RAW 0
#define AAC_PAYLOAD_ADTS 1
#define AAC_PAYLOAD_ADIF 2
#define AAC_PAYLOAD_LOAS 3
enum KSSTATE {
KSSTATE_STOP,
KSSTATE_ACQUIRE,
KSSTATE_PAUSE,
KSSTATE_RUN,
KSSTATE_Force32 = 0x7fffffff
};
enum audio_format {
FORMAT_PCM,
FORMAT_MP3,
FORMAT_AAC,
FORMAT_WMA,
FORMAT_NUM,
};
enum {
CODEC_PCM = 0,
CODEC_MP3 = 1,
CODEC_AAC = 2,
CODEC_WMA = 3,
NUM_CODECS,
};
enum avp_audio_stream_id {
loopback_stream_id = 0,
pcm_stream_id,
pcm2_stream_id,
decode_stream_id,
decode2_stream_id,
max_stream_id
};
enum tegra_arch {
NV_TEGRA_T20 = 0x20,
NV_TEGRA_T30 = 0x30,
NV_TEGRA_T114 = 0x35,
NV_TEGRA_T148 = 0x14,
NV_TEGRA_T124 = 0x40,
NV_TEGRA_Force32 = 0x7FFFFFFF
};
enum aac_profile {
AAC_PROFILE_MAIN,
AAC_PROFILE_LC,
AAC_PROFILE_SSR,
};
enum ucode_desc_params {
UCODE_DESC_OFFSET,
UCODE_DESC_SIZE,
UCODE_DESC_NUM,
};
struct audio_params {
unsigned int rate;
unsigned int channels;
unsigned int bits_per_sample;
};
struct stream_data {
/* Writeable by mixer */
enum KSSTATE stream_state_current;
unsigned int halted;
unsigned int source_buffer_read_position;
unsigned int source_buffer_read_position_fraction;
unsigned int source_buffer_presentation_position;
unsigned int source_buffer_linear_position;
unsigned int source_buffer_frames_decoded;
unsigned int stream_notification_offset;
unsigned int stream_notification_request;
unsigned int stream_buffer_samples_consumed;
unsigned long long stream_buffer_read_time_us;
/* Read-only for mixer */
unsigned int stream_allocated;
enum KSSTATE stream_state_target;
unsigned long long source_buffer_system;
unsigned int source_buffer_avp;
unsigned int source_buffer_size;
unsigned int source_buffer_write_position;
unsigned int source_buffer_write_count;
unsigned int stream_notification_interval;
int stream_notification_enable;
unsigned int fragment_size;
unsigned int fragment_byte_offset;
unsigned int fragments_elapsed;
struct audio_params stream_params;
enum audio_format stream_format;
int stream_volume[RENDERSW_MAX_CHANNELS];
union {
/* AAC Specific Data */
struct {
unsigned int payload_type;
unsigned int audio_profile;
unsigned int sampling_freq_index;
unsigned int sampling_freq;
unsigned int channel_configuration;
unsigned int extension_sampling_freq_index;
unsigned int extension_sampling_freq;
} aac;
} u;
};
struct audio_engine_data {
unsigned int apb_channel_handle;
unsigned long long device_buffer_system;
unsigned int device_buffer_avp;
unsigned int track_audio_latency;
unsigned int hw_write_time;
unsigned int codec_ucode_base_address;
unsigned int codec_ucode_desc[NUM_CODECS][UCODE_DESC_NUM];
/* [codec][offset,size] */
enum KSSTATE device_state_target;
unsigned int profile_state;
struct audio_params device_format;
enum KSSTATE device_state_current;
unsigned int device_buffer_write_position;
unsigned int device_buffer_read_position;
unsigned long long device_buffer_read_time_us;
unsigned int chip_id;
unsigned int only_loopback_flag;
unsigned int starvation_count;
unsigned int starvation_frames;
struct stream_data stream[RENDERSW_MAX_STREAMS];
};
#endif