1 /*
2  * Copyright (c) 2015-2016 Hanspeter Portner (dev@open-music-kontrollers.ch)
3  *
4  * This is free software: you can redistribute it and/or modify
5  * it under the terms of the Artistic License 2.0 as published by
6  * The Perl Foundation.
7  *
8  * This source is distributed in the hope that it will be useful,
9  * but WITHOUT ANY WARRANTY; without even the implied warranty of
10  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11  * Artistic License 2.0 for more details.
12  *
13  * You should have received a copy of the Artistic License 2.0
14  * along the source as a COPYING file. If not, obtain it from
15  * http://www.perlfoundation.org/artistic_license_2_0.
16  */
17 
18 #include <pcmi.h>
19 #include <zita-alsa-pcmi.h>
20 
21 pcmi_t *
pcmi_new(const char * play_name,const char * capt_name,uint32_t srate,uint32_t frsize,uint32_t nfrags,bool twochan,bool debug)22 pcmi_new(const char *play_name, const char *capt_name, uint32_t srate,
23 	uint32_t frsize, uint32_t nfrags, bool twochan, bool debug)
24 {
25 	unsigned int opts = 0;
26 	if(debug)
27 		opts |= Alsa_pcmi::DEBUG_ALL;
28 	if(twochan) // force 2 channels
29 		opts |= Alsa_pcmi::FORCE_2CH;
30 
31 	Alsa_pcmi *_pcmi = new Alsa_pcmi(play_name, capt_name, NULL,
32 		srate, frsize, nfrags, opts);
33 	if(_pcmi->state())
34 	{
35 		delete _pcmi;
36 		return NULL;
37 	}
38 
39 	return (pcmi_t *)_pcmi;
40 }
41 
42 void
pcmi_free(pcmi_t * pcmi)43 pcmi_free(pcmi_t *pcmi)
44 {
45 	Alsa_pcmi *_pcmi = (Alsa_pcmi *)pcmi;
46 
47 	delete _pcmi;
48 }
49 
50 void
pcmi_printinfo(pcmi_t * pcmi)51 pcmi_printinfo(pcmi_t *pcmi)
52 {
53 	Alsa_pcmi *_pcmi = (Alsa_pcmi *)pcmi;
54 
55 	_pcmi->printinfo();
56 }
57 
58 int
pcmi_ncapt(pcmi_t * pcmi)59 pcmi_ncapt(pcmi_t *pcmi)
60 {
61 	Alsa_pcmi *_pcmi = (Alsa_pcmi *)pcmi;
62 
63 	return _pcmi->ncapt();
64 }
65 
66 int
pcmi_nplay(pcmi_t * pcmi)67 pcmi_nplay(pcmi_t *pcmi)
68 {
69 	Alsa_pcmi *_pcmi = (Alsa_pcmi *)pcmi;
70 
71 	return _pcmi->nplay();
72 }
73 
74 void
pcmi_pcm_start(pcmi_t * pcmi)75 pcmi_pcm_start(pcmi_t *pcmi)
76 {
77 	Alsa_pcmi *_pcmi = (Alsa_pcmi *)pcmi;
78 
79 	_pcmi->pcm_start();
80 }
81 
82 int
pcmi_pcm_wait(pcmi_t * pcmi)83 pcmi_pcm_wait(pcmi_t *pcmi)
84 {
85 	Alsa_pcmi *_pcmi = (Alsa_pcmi *)pcmi;
86 
87 	return _pcmi->pcm_wait();
88 }
89 
90 int
pcmi_pcm_idle(pcmi_t * pcmi,uint32_t frsize)91 pcmi_pcm_idle(pcmi_t *pcmi, uint32_t frsize)
92 {
93 	Alsa_pcmi *_pcmi = (Alsa_pcmi *)pcmi;
94 
95 	return _pcmi->pcm_idle(frsize);
96 }
97 
98 void
pcmi_pcm_stop(pcmi_t * pcmi)99 pcmi_pcm_stop(pcmi_t *pcmi)
100 {
101 	Alsa_pcmi *_pcmi = (Alsa_pcmi *)pcmi;
102 
103 	_pcmi->pcm_stop();
104 }
105 
106 void
pcmi_capt_init(pcmi_t * pcmi,uint32_t frsize)107 pcmi_capt_init(pcmi_t *pcmi, uint32_t frsize)
108 {
109 	Alsa_pcmi *_pcmi = (Alsa_pcmi *)pcmi;
110 
111 	_pcmi->capt_init(frsize);
112 }
113 
114 void
pcmi_capt_chan(pcmi_t * pcmi,uint32_t channel,float * dst,uint32_t frsize)115 pcmi_capt_chan(pcmi_t *pcmi, uint32_t channel, float *dst, uint32_t frsize)
116 {
117 	Alsa_pcmi *_pcmi = (Alsa_pcmi *)pcmi;
118 
119 	_pcmi->capt_chan(channel, dst, frsize);
120 }
121 
122 void
pcmi_capt_done(pcmi_t * pcmi,uint32_t frsize)123 pcmi_capt_done(pcmi_t *pcmi, uint32_t frsize)
124 {
125 	Alsa_pcmi *_pcmi = (Alsa_pcmi *)pcmi;
126 
127 	_pcmi->capt_done(frsize);
128 }
129 
130 void
pcmi_play_init(pcmi_t * pcmi,uint32_t frsize)131 pcmi_play_init(pcmi_t *pcmi, uint32_t frsize)
132 {
133 	Alsa_pcmi *_pcmi = (Alsa_pcmi *)pcmi;
134 
135 	_pcmi->play_init(frsize);
136 }
137 
138 void
pcmi_clear_chan(pcmi_t * pcmi,uint32_t channel,uint32_t frsize)139 pcmi_clear_chan(pcmi_t *pcmi, uint32_t channel, uint32_t frsize)
140 {
141 	Alsa_pcmi *_pcmi = (Alsa_pcmi *)pcmi;
142 
143 	_pcmi->clear_chan(channel, frsize);
144 }
145 
146 void
pcmi_play_chan(pcmi_t * pcmi,uint32_t channel,const float * src,uint32_t frsize)147 pcmi_play_chan(pcmi_t *pcmi, uint32_t channel, const float *src, uint32_t frsize)
148 {
149 	Alsa_pcmi *_pcmi = (Alsa_pcmi *)pcmi;
150 
151 	_pcmi->play_chan(channel, src, frsize);
152 }
153 
154 void
pcmi_play_done(pcmi_t * pcmi,uint32_t frsize)155 pcmi_play_done(pcmi_t *pcmi, uint32_t frsize)
156 {
157 	Alsa_pcmi *_pcmi = (Alsa_pcmi *)pcmi;
158 
159 	_pcmi->play_done(frsize);
160 }
161