summaryrefslogtreecommitdiff
path: root/axfer/container.h
blob: 71017a6e23ef59c6e3e63f98bf2ea13ddcd1d90c (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
// SPDX-License-Identifier: GPL-2.0
//
// container.h - an interface of parser/builder for formatted files.
//
// Copyright (c) 2018 Takashi Sakamoto <o-takashi@sakamocchi.jp>
//
// Licensed under the terms of the GNU General Public License, version 2.

#ifndef __ALSA_UTILS_AXFER_CONTAINER__H_
#define __ALSA_UTILS_AXFER_CONTAINER__H_

#define _LARGEFILE64_SOURCE
#include <sys/types.h>

#include <stdbool.h>
#include <stdint.h>

#include <alsa/asoundlib.h>

enum container_type {
	CONTAINER_TYPE_PARSER = 0,
	CONTAINER_TYPE_BUILDER,
	CONTAINER_TYPE_COUNT,
};

enum container_format {
	CONTAINER_FORMAT_RIFF_WAVE = 0,
	CONTAINER_FORMAT_AU,
	CONTAINER_FORMAT_VOC,
	CONTAINER_FORMAT_RAW,
	CONTAINER_FORMAT_COUNT,
};

struct container_ops;

struct container_context {
	enum container_type type;
	int fd;
	int (*process_bytes)(struct container_context *cntr,
			     void *buffer, unsigned int byte_count);
	bool magic_handled;
	bool eof;
	bool interrupted;
	bool stdio;

	enum container_format format;
	uint64_t max_size;
	char magic[4];
	const struct container_ops *ops;
	void *private_data;

	// Available after pre-process.
	unsigned int bytes_per_sample;
	unsigned int samples_per_frame;
	unsigned int frames_per_second;

	unsigned int verbose;
	uint64_t handled_byte_count;
};

const char *const container_suffix_from_format(enum container_format format);
enum container_format container_format_from_path(const char *path);
int container_parser_init(struct container_context *cntr, int fd,
			  unsigned int verbose);
int container_builder_init(struct container_context *cntr, int fd,
			   enum container_format format, unsigned int verbose);
void container_context_destroy(struct container_context *cntr);
int container_context_pre_process(struct container_context *cntr,
				  snd_pcm_format_t *format,
				  unsigned int *samples_per_frame,
				  unsigned int *frames_per_second,
				  uint64_t *frame_count);
int container_context_process_frames(struct container_context *cntr,
				     void *frame_buffer,
				     unsigned int *frame_count);
int container_context_post_process(struct container_context *cntr,
				   uint64_t *frame_count);

// For internal use in 'container' module.

struct container_ops {
	int (*pre_process)(struct container_context *cntr,
			   snd_pcm_format_t *format,
			   unsigned int *samples_per_frame,
			   unsigned int *frames_per_second,
			   uint64_t *byte_count);
	int (*post_process)(struct container_context *cntr,
			    uint64_t handled_byte_count);
};
struct container_parser {
	enum container_format format;
	const char *const magic;
	uint64_t max_size;
	struct container_ops ops;
	unsigned int private_size;
};

struct container_builder {
	enum container_format format;
	const char *const suffix;
	uint64_t max_size;
	struct container_ops ops;
	unsigned int private_size;
};

int container_recursive_read(struct container_context *cntr, void *buf,
			     unsigned int byte_count);
int container_recursive_write(struct container_context *cntr, void *buf,
			      unsigned int byte_count);
int container_seek_offset(struct container_context *cntr, off64_t offset);

extern const struct container_parser container_parser_riff_wave;
extern const struct container_builder container_builder_riff_wave;

extern const struct container_parser container_parser_au;
extern const struct container_builder container_builder_au;

extern const struct container_parser container_parser_voc;
extern const struct container_builder container_builder_voc;

extern const struct container_parser container_parser_raw;
extern const struct container_builder container_builder_raw;

#endif