blob: b2252cc245d209cb4b2e30ec56f17c53ba211770 [file] [log] [blame]
Vidyakumar Athota2b8db682020-12-10 12:05:54 +01001/* compress_hw.c
2**
3** Copyright (c) 2019, The Linux Foundation. All rights reserved.
4**
5** Redistribution and use in source and binary forms, with or without
6** modification, are permitted provided that the following conditions are
7** met:
8** * Redistributions of source code must retain the above copyright
9** notice, this list of conditions and the following disclaimer.
10** * Redistributions in binary form must reproduce the above
11** copyright notice, this list of conditions and the following
12** disclaimer in the documentation and/or other materials provided
13** with the distribution.
14** * Neither the name of The Linux Foundation nor the names of its
15** contributors may be used to endorse or promote products derived
16** from this software without specific prior written permission.
17**
18** THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED
19** WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
20** MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT
21** ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS
22** BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
23** CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
24** SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
25** BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
26** WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
27** OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
28** IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
29**/
30
31#include <stdio.h>
32#include <stdlib.h>
33#include <fcntl.h>
34#include <stdarg.h>
35#include <string.h>
36#include <stdbool.h>
37#include <errno.h>
38#include <unistd.h>
39#include <poll.h>
40
41#include <sys/ioctl.h>
42#include <linux/ioctl.h>
43#include <sound/asound.h>
44#include "tinycompress/tinycompress.h"
45#include "compress_ops.h"
46
47struct compress_hw_data {
48 unsigned int card;
49 unsigned int device;
50 unsigned int fd;
51};
52
53static int compress_hw_poll(void *data, struct pollfd *fds,
54 nfds_t nfds, int timeout)
55{
56 struct compress_hw_data *hw_data = data;
57
58 fds->fd = hw_data->fd;
59 return poll(fds, nfds, timeout);
60}
61
62static int compress_hw_write(void *data, const void *buf, size_t size)
63{
64 struct compress_hw_data *hw_data = data;
65
66 return write(hw_data->fd, buf, size);
67}
68
69static int compress_hw_read(void *data, void *buf, size_t size)
70{
71 struct compress_hw_data *hw_data = data;
72
73 return read(hw_data->fd, buf, size);
74}
75
76static int compress_hw_ioctl(void *data, unsigned int cmd, ...)
77{
78 struct compress_hw_data *hw_data = data;
79 va_list ap;
80 void *arg;
81
82 va_start(ap, cmd);
83 arg = va_arg(ap, void *);
84 va_end(ap);
85
86 return ioctl(hw_data->fd, cmd, arg);
87}
88
89static void compress_hw_close(void *data)
90{
91 struct compress_hw_data *hw_data = data;
92
93 if (hw_data->fd > 0)
94 close(hw_data->fd);
95
96 free(hw_data);
97}
98
99static int compress_hw_open(unsigned int card, unsigned int device,
100 unsigned int flags, void **data, __unused void *node)
101{
102 struct compress_hw_data *hw_data;
103 char fn[256];
104 int fd;
105
106 hw_data = calloc(1, sizeof(*hw_data));
107 if (!hw_data) {
108 return -ENOMEM;
109 }
110
111 snprintf(fn, sizeof(fn), "/dev/snd/comprC%uD%u", card, device);
112
113 if (flags & COMPRESS_OUT)
114 fd = open(fn, O_RDONLY);
115 else
116 fd = open(fn, O_WRONLY);
117
118 if (fd < 0) {
119 return fd;
120 }
121
122 hw_data->card = card;
123 hw_data->device = device;
124 hw_data->fd = fd;
125
126 *data = hw_data;
127
128 return fd;
129}
130
131struct compress_ops compr_hw_ops = {
132 .open = compress_hw_open,
133 .close = compress_hw_close,
134 .ioctl = compress_hw_ioctl,
135 .read = compress_hw_read,
136 .write = compress_hw_write,
137 .poll = compress_hw_poll,
138};