Blame axfer/container.h

Packit Service a9274b
// SPDX-License-Identifier: GPL-2.0
Packit Service a9274b
//
Packit Service a9274b
// container.h - an interface of parser/builder for formatted files.
Packit Service a9274b
//
Packit Service a9274b
// Copyright (c) 2018 Takashi Sakamoto <o-takashi@sakamocchi.jp>
Packit Service a9274b
//
Packit Service a9274b
// Licensed under the terms of the GNU General Public License, version 2.
Packit Service a9274b
Packit Service a9274b
#ifndef __ALSA_UTILS_AXFER_CONTAINER__H_
Packit Service a9274b
#define __ALSA_UTILS_AXFER_CONTAINER__H_
Packit Service a9274b
Packit Service a9274b
#define _LARGEFILE64_SOURCE
Packit Service a9274b
#include <sys/types.h>
Packit Service a9274b
#include <unistd.h>
Packit Service a9274b
Packit Service a9274b
#include <stdbool.h>
Packit Service a9274b
#include <stdint.h>
Packit Service a9274b
Packit Service a9274b
#include <alsa/asoundlib.h>
Packit Service a9274b
Packit Service a9274b
enum container_type {
Packit Service a9274b
	CONTAINER_TYPE_PARSER = 0,
Packit Service a9274b
	CONTAINER_TYPE_BUILDER,
Packit Service a9274b
	CONTAINER_TYPE_COUNT,
Packit Service a9274b
};
Packit Service a9274b
Packit Service a9274b
enum container_format {
Packit Service a9274b
	CONTAINER_FORMAT_RIFF_WAVE = 0,
Packit Service a9274b
	CONTAINER_FORMAT_AU,
Packit Service a9274b
	CONTAINER_FORMAT_VOC,
Packit Service a9274b
	CONTAINER_FORMAT_RAW,
Packit Service a9274b
	CONTAINER_FORMAT_COUNT,
Packit Service a9274b
};
Packit Service a9274b
Packit Service a9274b
struct container_ops;
Packit Service a9274b
Packit Service a9274b
struct container_context {
Packit Service a9274b
	enum container_type type;
Packit Service a9274b
	int fd;
Packit Service a9274b
	int (*process_bytes)(struct container_context *cntr,
Packit Service a9274b
			     void *buffer, unsigned int byte_count);
Packit Service a9274b
	bool magic_handled;
Packit Service a9274b
	bool eof;
Packit Service a9274b
	bool interrupted;
Packit Service a9274b
	bool stdio;
Packit Service a9274b
Packit Service a9274b
	enum container_format format;
Packit Service a9274b
	uint64_t max_size;
Packit Service a9274b
	char magic[4];
Packit Service a9274b
	const struct container_ops *ops;
Packit Service a9274b
	void *private_data;
Packit Service a9274b
Packit Service a9274b
	// Available after pre-process.
Packit Service a9274b
	unsigned int bytes_per_sample;
Packit Service a9274b
	unsigned int samples_per_frame;
Packit Service a9274b
	unsigned int frames_per_second;
Packit Service a9274b
Packit Service a9274b
	unsigned int verbose;
Packit Service a9274b
	uint64_t handled_byte_count;
Packit Service a9274b
};
Packit Service a9274b
Packit Service a9274b
const char *const container_suffix_from_format(enum container_format format);
Packit Service a9274b
enum container_format container_format_from_path(const char *path);
Packit Service a9274b
int container_parser_init(struct container_context *cntr,
Packit Service a9274b
			  const char *const path, unsigned int verbose);
Packit Service a9274b
int container_builder_init(struct container_context *cntr,
Packit Service a9274b
			   const char *const path, enum container_format format,
Packit Service a9274b
			   unsigned int verbose);
Packit Service a9274b
void container_context_destroy(struct container_context *cntr);
Packit Service a9274b
int container_context_pre_process(struct container_context *cntr,
Packit Service a9274b
				  snd_pcm_format_t *format,
Packit Service a9274b
				  unsigned int *samples_per_frame,
Packit Service a9274b
				  unsigned int *frames_per_second,
Packit Service a9274b
				  uint64_t *frame_count);
Packit Service a9274b
int container_context_process_frames(struct container_context *cntr,
Packit Service a9274b
				     void *frame_buffer,
Packit Service a9274b
				     unsigned int *frame_count);
Packit Service a9274b
int container_context_post_process(struct container_context *cntr,
Packit Service a9274b
				   uint64_t *frame_count);
Packit Service a9274b
Packit Service a9274b
// For internal use in 'container' module.
Packit Service a9274b
Packit Service a9274b
struct container_ops {
Packit Service a9274b
	int (*pre_process)(struct container_context *cntr,
Packit Service a9274b
			   snd_pcm_format_t *format,
Packit Service a9274b
			   unsigned int *samples_per_frame,
Packit Service a9274b
			   unsigned int *frames_per_second,
Packit Service a9274b
			   uint64_t *byte_count);
Packit Service a9274b
	int (*post_process)(struct container_context *cntr,
Packit Service a9274b
			    uint64_t handled_byte_count);
Packit Service a9274b
};
Packit Service a9274b
struct container_parser {
Packit Service a9274b
	enum container_format format;
Packit Service a9274b
	const char *const magic;
Packit Service a9274b
	uint64_t max_size;
Packit Service a9274b
	struct container_ops ops;
Packit Service a9274b
	unsigned int private_size;
Packit Service a9274b
};
Packit Service a9274b
Packit Service a9274b
struct container_builder {
Packit Service a9274b
	enum container_format format;
Packit Service a9274b
	const char *const suffix;
Packit Service a9274b
	uint64_t max_size;
Packit Service a9274b
	struct container_ops ops;
Packit Service a9274b
	unsigned int private_size;
Packit Service a9274b
};
Packit Service a9274b
Packit Service a9274b
int container_recursive_read(struct container_context *cntr, void *buf,
Packit Service a9274b
			     unsigned int byte_count);
Packit Service a9274b
int container_recursive_write(struct container_context *cntr, void *buf,
Packit Service a9274b
			      unsigned int byte_count);
Packit Service a9274b
int container_seek_offset(struct container_context *cntr, off64_t offset);
Packit Service a9274b
Packit Service a9274b
extern const struct container_parser container_parser_riff_wave;
Packit Service a9274b
extern const struct container_builder container_builder_riff_wave;
Packit Service a9274b
Packit Service a9274b
extern const struct container_parser container_parser_au;
Packit Service a9274b
extern const struct container_builder container_builder_au;
Packit Service a9274b
Packit Service a9274b
extern const struct container_parser container_parser_voc;
Packit Service a9274b
extern const struct container_builder container_builder_voc;
Packit Service a9274b
Packit Service a9274b
extern const struct container_parser container_parser_raw;
Packit Service a9274b
extern const struct container_builder container_builder_raw;
Packit Service a9274b
Packit Service a9274b
#endif