[alsa-devel] [PATCH 4/6] compress: add API header and driver header files

Nallasellan, Singaravelan singaravelan.nallasellan at intel.com
Fri Dec 2 16:39:42 CET 2011


> +struct snd_compr_runtime {
> +	snd_pcm_state_t state;
> +	struct snd_compr_ops *ops;
> +	void *buffer;
> +	size_t buffer_size;
> +	size_t fragment_size;
> +	unsigned int fragments;
> +	size_t hw_pointer;
> +	size_t app_pointer;
> +	size_t bytes_written;
Is it the bytes written to the ring buffer? 

> +	size_t bytes_copied;
Is it the bytes copied by the DSP from ring buffer?

> +	wait_queue_head_t sleep;
> +};
> +
> +/**
> +mandatory  */ struct snd_compr_ops {
> +	int (*open)(struct snd_compr_stream *stream);
> +	int (*free)(struct snd_compr_stream *stream);
> +	int (*set_params)(struct snd_compr_stream *stream,
> +			struct snd_compr_params *params);
> +	int (*get_params)(struct snd_compr_stream *stream,
> +			struct snd_compr_params *params);
> +	int (*trigger)(struct snd_compr_stream *stream, int cmd);
> +	int (*pointer)(struct snd_compr_stream *stream,
> +			struct snd_compr_tstamp *tstamp);
> +	int (*copy)(struct snd_compr_stream *stream, const char __user *buf,
> +		       size_t count);
> +	int (*mmap)(struct snd_compr_stream *stream,
> +			struct vm_area_struct *vma);
> +	int (*ack)(struct snd_compr_stream *stream, size_t bytes);
> +	int (*get_caps) (struct snd_compr_stream *stream,
> +			struct snd_compr_caps *caps);
> +	int (*get_codec_caps) (struct snd_compr_stream *stream,
> +			struct snd_compr_codec_caps *codec); };

Documentation (PATCH 1/6) talks about  get_codecs which is missing? 
Fix the documentation or add the API?

> + */
> +struct snd_compr {
> +	const char *name;
> +	unsigned int pb;
> +	unsigned int cap;

Can we use a single variable if it just 

> +	struct device *dev;
> +	struct snd_compr_ops *ops;
> +	void *private_data;
> +	struct snd_card *card;
> +	struct mutex lock;
> +	int device;
> +};
> +
> + * For recording: we may want to know when a frame is available or when
> + * at least one frame is available for userspace, a different
> + * snd_compress_frame_elapsed() callback should be used  */ void
> +snd_compr_fragment_elapsed(struct snd_compr_stream *stream); void
> +snd_compr_frame_elapsed(struct snd_compr_stream *stream);

What is the use of this API? DSP could send only fragment elapsed.
Not sure we need to received interrupt for every frame. The system will be flooded
with interrupts.

> +/**
> + * struct snd_compr_tstamp: timestamp descriptor
> + * @copied_bytes: Number of bytes offset in ring buffer to DSP
> + * @copied_total: Total number of bytes copied from ring buffer to DSP
> + * @decoded: Frames decoded by DSP
> + * @rendered: Frames rendered by DSP into a mixer or an audio output
> + * @sampling_rate: sampling rate of audio  */ struct snd_compr_tstamp {
> +	size_t copied_bytes;
> +	size_t copied_total;
> +	size_t decoded;
> +	size_t rendered;
> +	__u32 sampling_rate;

Is it possible to track the rendering sampling rate in the driver itself? 

> +struct snd_compr_caps {
> +	__u32 num_codecs;
> +	__u32 min_fragment_size;
> +	__u32 max_fragment_size;
> +	__u32 min_fragments;
> +	__u32 max_fragments;
> +	__u32 codecs[MAX_NUM_CODECS];
> +	__u32 reserved[11];

Can we add number of compress streams supported in DSP?

> +};
> +
> +/**
> + * struct snd_compr_codec_caps: query capability of codec
> + * @codec: codec for which capability is queried
> + * @num_descriptors: number of codec descriptors
> + * @descriptor: array of codec capability descriptor  */ struct
> +snd_compr_codec_caps {
> +	__u32 codec;
> +	__u32 num_descriptors;
> +	struct snd_codec_desc descriptor[MAX_NUM_CODEC_DESCRIPTORS];
> +};
> +


More information about the Alsa-devel mailing list