147{
149 const char **ports;
150 int i;
151 char *client_name;
152 const char *source_name = NULL;
153
154 client_name = alloca(
MAX(strlen(PACKAGE_NAME), strlen(cfg)) + 1);
155 strcpy(client_name, PACKAGE_NAME);
156
158 if(!s) {
160 return NULL;
161 }
165 free(s);
166 return NULL;
167 }
168
169 char *dup = strdup(cfg);
170 assert(dup != NULL);
171 char *
tmp = dup, *
item, *save_ptr;
172 while ((
item = strtok_r(
tmp,
":", &save_ptr)) != NULL) {
173 if (strcmp(
item,
"help") == 0) {
175 free(dup);
176 free(s);
178 }
else if (strstr(
item,
"first_channel=") ==
item) {
179 char *endptr;
180 char *
val =
item + strlen(
"first_channel=");
181 errno = 0;
183 if (errno == ERANGE || *endptr !=
'\0' || s->
first_channel < 0) {
186 }
187 }
else if (strstr(
item,
"name=") ==
item) {
188 strcpy(client_name,
item + strlen(
"name="));
189 } else {
190 source_name = cfg + (
item - dup);
191 break;
192 }
193
195 }
196 free(dup);
197 dup = NULL;
198
200 if(
status & JackFailure) {
203 }
204
206 if(ports == NULL) {
208 goto release_client;
209 }
210
211 i = 0;
212 while(ports[i]) i++;
213
215 if (i < s->
frame.ch_count) {
218 goto release_client;
219
220 }
221
225 }
229
231
233
235
238 goto release_client;
239 }
240
243 goto release_client;
244 }
245
246 if (s->libjack->activate(s->client)) {
248 goto release_client;
249 }
250
251 {
252 int port;
254
255 for(port = 0; port < s->frame.ch_count; port++) {
256 snprintf(
name, 32,
"capture_%02u", port);
257 s->input_ports[port] = s->libjack->port_register(s->client,
name, JACK_DEFAULT_AUDIO_TYPE, JackPortIsInput, 0);
258
259 if (s->libjack->connect(s->client, ports[port], s->libjack->port_name(s->input_ports[port]))) {
261 }
262 }
263 }
264
265 free(ports);
267
268 s->can_process = true;
269
270 return s;
271
272release_client:
273 s->libjack->client_close(s->client);
276 free(dup);
277 free(s);
278 return NULL;
279}
struct video_frame * frame
static void audio_cap_jack_help(const char *client_name)
static int jack_process_callback(jack_nframes_t nframes, void *arg)
static int jack_samplerate_changed_callback(jack_nframes_t nframes, void *arg)
void log_msg(int level, const char *format,...)
#define LOG_LEVEL_ERROR
general errors
#define LOG_LEVEL_WARNING
less severe errors
void register_should_exit_callback(struct module *mod, void(*callback)(void *), void *udata)
unsigned int audio_capture_sample_rate
unsigned int audio_capture_channels
#define DEFAULT_AUDIO_CAPTURE_CHANNELS
static struct libjack_connection * open_libjack(void)
struct ring_buffer * ring_buffer_init(int size)
jack_set_sample_rate_callback_t set_sample_rate_callback
jack_get_sample_rate_t get_sample_rate
jack_client_open_t client_open
jack_get_ports_t get_ports