1 // SPDX-License-Identifier: GPL-2.0
3 // mapper.c - an interface of muxer/demuxer between buffer with data frames and
6 // Copyright (c) 2018 Takashi Sakamoto <o-takashi@sakamocchi.jp>
8 // Licensed under the terms of the GNU General Public License, version 2.
15 static const char *const mapper_type_labels[] = {
16 [MAPPER_TYPE_MUXER] = "muxer",
17 [MAPPER_TYPE_DEMUXER] = "demuxer",
20 static const char *const mapper_target_labels[] = {
21 [MAPPER_TARGET_SINGLE] = "single",
22 [MAPPER_TARGET_MULTIPLE] = "multiple",
25 int mapper_context_init(struct mapper_context *mapper,
26 enum mapper_type type, unsigned int cntr_count,
29 const struct mapper_data *data = NULL;
32 assert(cntr_count > 0);
34 // Detect forgotten to destruct.
35 assert(mapper->private_data == NULL);
37 memset(mapper, 0, sizeof(*mapper));
39 if (type == MAPPER_TYPE_MUXER) {
40 if (cntr_count == 1) {
41 data = &mapper_muxer_single;
42 mapper->target = MAPPER_TARGET_SINGLE;
44 data = &mapper_muxer_multiple;
45 mapper->target = MAPPER_TARGET_MULTIPLE;
48 if (cntr_count == 1) {
49 data = &mapper_demuxer_single;
50 mapper->target = MAPPER_TARGET_SINGLE;
52 data = &mapper_demuxer_multiple;
53 mapper->target = MAPPER_TARGET_MULTIPLE;
57 mapper->ops = &data->ops;
60 mapper->private_data = malloc(data->private_size);
61 if (mapper->private_data == NULL)
63 memset(mapper->private_data, 0, data->private_size);
65 mapper->cntr_count = cntr_count;
66 mapper->verbose = verbose;
71 int mapper_context_pre_process(struct mapper_context *mapper,
72 snd_pcm_access_t access,
73 unsigned int bytes_per_sample,
74 unsigned int samples_per_frame,
75 unsigned int frames_per_buffer,
76 struct container_context *cntrs)
81 assert(access >= SND_PCM_ACCESS_MMAP_INTERLEAVED);
82 assert(access <= SND_PCM_ACCESS_RW_NONINTERLEAVED);
83 assert(bytes_per_sample > 0);
84 assert(samples_per_frame > 0);
87 // The purpose of multiple target is to mux/demux each channels to/from
89 if (mapper->target == MAPPER_TARGET_MULTIPLE &&
90 samples_per_frame != mapper->cntr_count)
93 mapper->access = access;
94 mapper->bytes_per_sample = bytes_per_sample;
95 mapper->samples_per_frame = samples_per_frame;
96 mapper->frames_per_buffer = frames_per_buffer;
98 err = mapper->ops->pre_process(mapper, cntrs, mapper->cntr_count);
102 if (mapper->verbose > 0) {
103 fprintf(stderr, "Mapper: %s\n",
104 mapper_type_labels[mapper->type]);
105 fprintf(stderr, " target: %s\n",
106 mapper_target_labels[mapper->target]);
107 fprintf(stderr, " access: %s\n",
108 snd_pcm_access_name(mapper->access));
109 fprintf(stderr, " bytes/sample: %u\n",
110 mapper->bytes_per_sample);
111 fprintf(stderr, " samples/frame: %u\n",
112 mapper->samples_per_frame);
113 fprintf(stderr, " frames/buffer: %lu\n",
114 mapper->frames_per_buffer);
120 int mapper_context_process_frames(struct mapper_context *mapper,
122 unsigned int *frame_count,
123 struct container_context *cntrs)
126 assert(frame_buffer);
128 assert(*frame_count <= mapper->frames_per_buffer);
131 return mapper->ops->process_frames(mapper, frame_buffer, frame_count,
132 cntrs, mapper->cntr_count);
135 void mapper_context_post_process(struct mapper_context *mapper)
139 if (mapper->ops && mapper->ops->post_process)
140 mapper->ops->post_process(mapper);
143 void mapper_context_destroy(struct mapper_context *mapper)
147 if (mapper->private_data)
148 free(mapper->private_data);
149 mapper->private_data = NULL;