Initial commit: Yamaha MC1N2 Audio library
[yamaha-mc1n2-audio.git] / yamaha-mc1n2-audio.c
1 /*
2  * Copyright (C) 2012 Paul Kocialkowski <contact@paulk.fr>
3  *
4  * This program is free software: you can redistribute it and/or modify
5  * it under the terms of the GNU General Public License as published by
6  * the Free Software Foundation, either version 3 of the License, or
7  * (at your option) any later version.
8  *
9  * This program is distributed in the hope that it will be useful,
10  * but WITHOUT ANY WARRANTY; without even the implied warranty of
11  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
12  * GNU General Public License for more details.
13  *
14  * You should have received a copy of the GNU General Public License
15  * along with this program.  If not, see <http://www.gnu.org/licenses/>.
16  */
17
18 #include <stdio.h>
19 #include <stdlib.h>
20 #include <unistd.h>
21
22 #include <sys/types.h>
23 #include <sys/stat.h>
24 #include <fcntl.h>
25
26 #include <linux/ioctl.h>
27
28 #define LOG_TAG "YAMAHA-MC1N2-AUDIO"
29 #include <cutils/log.h>
30
31 #include <yamaha-mc1n2-audio.h>
32
33 /*
34  * IOCTL
35  */
36
37 int yamaha_mc1n2_audio_ioctl(struct yamaha_mc1n2_audio_pdata *pdata,
38         int command, struct mc1n2_ctrl_args *hw_ctrl)
39 {
40         char *hw_node = NULL;
41         int hw_fd = -1;
42         int rc = -1;
43
44         if(pdata == NULL)
45                 return -1;
46
47         hw_node = yamaha_mc1n2_audio_get_hw_node(pdata);
48         if(hw_node == NULL) {
49                 LOGE("%s: error, missing hw_node!", __func__);
50                 return -1;
51         }
52
53         hw_fd = open(hw_node, O_RDWR);
54         if(hw_fd < 0) {
55                 LOGE("%s: error, unable to open hw_node (fd is %d)!", __func__, hw_fd);
56                 return -1;
57         }
58
59         rc = ioctl(hw_fd, command, &hw_ctrl);
60         if(rc < 0) {
61                 LOGE("%s: error, ioctl on hw_node failed (rc is %d)!", __func__, rc);
62                 return -1;
63         }
64
65         return rc;
66 }
67
68 int yamaha_mc1n2_audio_ioctl_set_ctrl(struct yamaha_mc1n2_audio_pdata *pdata,
69         unsigned long command, void *data, unsigned long update_info)
70 {
71         struct mc1n2_ctrl_args hw_ctrl;
72
73         if(pdata == NULL)
74                 return -1;
75
76         memset(&hw_ctrl, 0, sizeof(hw_ctrl));
77         hw_ctrl.dCmd = command;
78         hw_ctrl.pvPrm = data;
79         hw_ctrl.dPrm = update_info;
80
81         return yamaha_mc1n2_audio_ioctl(pdata, MC1N2_IOCTL_SET_CTRL, &hw_ctrl);
82 }
83
84 int yamaha_mc1n2_audio_ioctl_notify(struct yamaha_mc1n2_audio_pdata *pdata,
85         unsigned long command)
86 {
87         struct mc1n2_ctrl_args hw_ctrl;
88
89         if(pdata == NULL)
90                 return -1;
91
92         memset(&hw_ctrl, 0, sizeof(hw_ctrl));
93         hw_ctrl.dCmd = command;
94
95         return yamaha_mc1n2_audio_ioctl(pdata, MC1N2_IOCTL_NOTIFY, &hw_ctrl);
96 }
97
98 /*
99  * Values configuration
100  */
101
102 int yamaha_mc1n2_audio_set_hw_node(struct yamaha_mc1n2_audio_pdata *pdata, char *node)
103 {
104         if(pdata == NULL || node == NULL)
105                 return -1;
106
107         if(pdata->hw_node != NULL) {
108                 LOGD("%s: previous node was: %s", __func__, pdata->hw_node);
109                 free(pdata->hw_node);
110         }
111
112         pdata->hw_node = strdup(node);
113
114         LOGD("%s: setting node to: %s", __func__, pdata->hw_node);
115
116         return 0;
117 }
118
119 char *yamaha_mc1n2_audio_get_hw_node(struct yamaha_mc1n2_audio_pdata *pdata)
120 {
121         if(pdata == NULL)
122                 return NULL;
123
124         return pdata->hw_node;
125 }
126
127 /*
128  * Init/Deinit
129  */
130
131 int yamaha_mc1n2_audio_init(struct yamaha_mc1n2_audio_pdata **pdata_p)
132 {
133         struct yamaha_mc1n2_audio_pdata *pdata = NULL;
134
135         if(pdata_p == NULL)
136                 return -1;
137
138         pdata = calloc(1, sizeof(struct yamaha_mc1n2_audio_pdata));
139
140         yamaha_mc1n2_audio_set_hw_node(pdata, HW_NODE_DEFAULT);
141
142         return 0;
143 }
144
145 int yamaha_mc1n2_audio_deinit(struct yamaha_mc1n2_audio_pdata *pdata)
146 {
147         if(pdata == NULL)
148                 return -1;
149
150         if(pdata->hw_node)
151                 free(pdata->hw_node);
152
153         memset(pdata, 0, sizeof(struct yamaha_mc1n2_audio_pdata));
154
155         free(pdata);
156
157         return 0;
158 }