Blame axfer/container.h

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