|
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
|