Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
awilliam
GitHub Repository: awilliam/linux-vfio
Path: blob/master/sound/usb/caiaq/audio.c
10817 views
1
/*
2
* Copyright (c) 2006-2008 Daniel Mack, Karsten Wiese
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 2 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, write to the Free Software
16
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
17
*/
18
19
#include <linux/spinlock.h>
20
#include <linux/slab.h>
21
#include <linux/init.h>
22
#include <linux/usb.h>
23
#include <sound/core.h>
24
#include <sound/pcm.h>
25
26
#include "device.h"
27
#include "audio.h"
28
29
#define N_URBS 32
30
#define CLOCK_DRIFT_TOLERANCE 5
31
#define FRAMES_PER_URB 8
32
#define BYTES_PER_FRAME 512
33
#define CHANNELS_PER_STREAM 2
34
#define BYTES_PER_SAMPLE 3
35
#define BYTES_PER_SAMPLE_USB 4
36
#define MAX_BUFFER_SIZE (128*1024)
37
#define MAX_ENDPOINT_SIZE 512
38
39
#define ENDPOINT_CAPTURE 2
40
#define ENDPOINT_PLAYBACK 6
41
42
#define MAKE_CHECKBYTE(dev,stream,i) \
43
(stream << 1) | (~(i / (dev->n_streams * BYTES_PER_SAMPLE_USB)) & 1)
44
45
static struct snd_pcm_hardware snd_usb_caiaq_pcm_hardware = {
46
.info = (SNDRV_PCM_INFO_MMAP | SNDRV_PCM_INFO_INTERLEAVED |
47
SNDRV_PCM_INFO_BLOCK_TRANSFER),
48
.formats = SNDRV_PCM_FMTBIT_S24_3BE,
49
.rates = (SNDRV_PCM_RATE_44100 | SNDRV_PCM_RATE_48000 |
50
SNDRV_PCM_RATE_96000),
51
.rate_min = 44100,
52
.rate_max = 0, /* will overwrite later */
53
.channels_min = CHANNELS_PER_STREAM,
54
.channels_max = CHANNELS_PER_STREAM,
55
.buffer_bytes_max = MAX_BUFFER_SIZE,
56
.period_bytes_min = 128,
57
.period_bytes_max = MAX_BUFFER_SIZE,
58
.periods_min = 1,
59
.periods_max = 1024,
60
};
61
62
static void
63
activate_substream(struct snd_usb_caiaqdev *dev,
64
struct snd_pcm_substream *sub)
65
{
66
spin_lock(&dev->spinlock);
67
68
if (sub->stream == SNDRV_PCM_STREAM_PLAYBACK)
69
dev->sub_playback[sub->number] = sub;
70
else
71
dev->sub_capture[sub->number] = sub;
72
73
spin_unlock(&dev->spinlock);
74
}
75
76
static void
77
deactivate_substream(struct snd_usb_caiaqdev *dev,
78
struct snd_pcm_substream *sub)
79
{
80
unsigned long flags;
81
spin_lock_irqsave(&dev->spinlock, flags);
82
83
if (sub->stream == SNDRV_PCM_STREAM_PLAYBACK)
84
dev->sub_playback[sub->number] = NULL;
85
else
86
dev->sub_capture[sub->number] = NULL;
87
88
spin_unlock_irqrestore(&dev->spinlock, flags);
89
}
90
91
static int
92
all_substreams_zero(struct snd_pcm_substream **subs)
93
{
94
int i;
95
for (i = 0; i < MAX_STREAMS; i++)
96
if (subs[i] != NULL)
97
return 0;
98
return 1;
99
}
100
101
static int stream_start(struct snd_usb_caiaqdev *dev)
102
{
103
int i, ret;
104
105
debug("%s(%p)\n", __func__, dev);
106
107
if (dev->streaming)
108
return -EINVAL;
109
110
memset(dev->sub_playback, 0, sizeof(dev->sub_playback));
111
memset(dev->sub_capture, 0, sizeof(dev->sub_capture));
112
dev->input_panic = 0;
113
dev->output_panic = 0;
114
dev->first_packet = 4;
115
dev->streaming = 1;
116
dev->warned = 0;
117
118
for (i = 0; i < N_URBS; i++) {
119
ret = usb_submit_urb(dev->data_urbs_in[i], GFP_ATOMIC);
120
if (ret) {
121
log("unable to trigger read #%d! (ret %d)\n", i, ret);
122
dev->streaming = 0;
123
return -EPIPE;
124
}
125
}
126
127
return 0;
128
}
129
130
static void stream_stop(struct snd_usb_caiaqdev *dev)
131
{
132
int i;
133
134
debug("%s(%p)\n", __func__, dev);
135
if (!dev->streaming)
136
return;
137
138
dev->streaming = 0;
139
140
for (i = 0; i < N_URBS; i++) {
141
usb_kill_urb(dev->data_urbs_in[i]);
142
usb_kill_urb(dev->data_urbs_out[i]);
143
}
144
}
145
146
static int snd_usb_caiaq_substream_open(struct snd_pcm_substream *substream)
147
{
148
struct snd_usb_caiaqdev *dev = snd_pcm_substream_chip(substream);
149
debug("%s(%p)\n", __func__, substream);
150
substream->runtime->hw = dev->pcm_info;
151
snd_pcm_limit_hw_rates(substream->runtime);
152
return 0;
153
}
154
155
static int snd_usb_caiaq_substream_close(struct snd_pcm_substream *substream)
156
{
157
struct snd_usb_caiaqdev *dev = snd_pcm_substream_chip(substream);
158
159
debug("%s(%p)\n", __func__, substream);
160
if (all_substreams_zero(dev->sub_playback) &&
161
all_substreams_zero(dev->sub_capture)) {
162
/* when the last client has stopped streaming,
163
* all sample rates are allowed again */
164
stream_stop(dev);
165
dev->pcm_info.rates = dev->samplerates;
166
}
167
168
return 0;
169
}
170
171
static int snd_usb_caiaq_pcm_hw_params(struct snd_pcm_substream *sub,
172
struct snd_pcm_hw_params *hw_params)
173
{
174
debug("%s(%p)\n", __func__, sub);
175
return snd_pcm_lib_malloc_pages(sub, params_buffer_bytes(hw_params));
176
}
177
178
static int snd_usb_caiaq_pcm_hw_free(struct snd_pcm_substream *sub)
179
{
180
struct snd_usb_caiaqdev *dev = snd_pcm_substream_chip(sub);
181
debug("%s(%p)\n", __func__, sub);
182
deactivate_substream(dev, sub);
183
return snd_pcm_lib_free_pages(sub);
184
}
185
186
/* this should probably go upstream */
187
#if SNDRV_PCM_RATE_5512 != 1 << 0 || SNDRV_PCM_RATE_192000 != 1 << 12
188
#error "Change this table"
189
#endif
190
191
static unsigned int rates[] = { 5512, 8000, 11025, 16000, 22050, 32000, 44100,
192
48000, 64000, 88200, 96000, 176400, 192000 };
193
194
static int snd_usb_caiaq_pcm_prepare(struct snd_pcm_substream *substream)
195
{
196
int bytes_per_sample, bpp, ret, i;
197
int index = substream->number;
198
struct snd_usb_caiaqdev *dev = snd_pcm_substream_chip(substream);
199
struct snd_pcm_runtime *runtime = substream->runtime;
200
201
debug("%s(%p)\n", __func__, substream);
202
203
if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK) {
204
int out_pos;
205
206
switch (dev->spec.data_alignment) {
207
case 0:
208
case 2:
209
out_pos = BYTES_PER_SAMPLE + 1;
210
break;
211
case 3:
212
default:
213
out_pos = 0;
214
break;
215
}
216
217
dev->period_out_count[index] = out_pos;
218
dev->audio_out_buf_pos[index] = out_pos;
219
} else {
220
int in_pos;
221
222
switch (dev->spec.data_alignment) {
223
case 0:
224
in_pos = BYTES_PER_SAMPLE + 2;
225
break;
226
case 2:
227
in_pos = BYTES_PER_SAMPLE;
228
break;
229
case 3:
230
default:
231
in_pos = 0;
232
break;
233
}
234
235
dev->period_in_count[index] = in_pos;
236
dev->audio_in_buf_pos[index] = in_pos;
237
}
238
239
if (dev->streaming)
240
return 0;
241
242
/* the first client that opens a stream defines the sample rate
243
* setting for all subsequent calls, until the last client closed. */
244
for (i=0; i < ARRAY_SIZE(rates); i++)
245
if (runtime->rate == rates[i])
246
dev->pcm_info.rates = 1 << i;
247
248
snd_pcm_limit_hw_rates(runtime);
249
250
bytes_per_sample = BYTES_PER_SAMPLE;
251
if (dev->spec.data_alignment >= 2)
252
bytes_per_sample++;
253
254
bpp = ((runtime->rate / 8000) + CLOCK_DRIFT_TOLERANCE)
255
* bytes_per_sample * CHANNELS_PER_STREAM * dev->n_streams;
256
257
if (bpp > MAX_ENDPOINT_SIZE)
258
bpp = MAX_ENDPOINT_SIZE;
259
260
ret = snd_usb_caiaq_set_audio_params(dev, runtime->rate,
261
runtime->sample_bits, bpp);
262
if (ret)
263
return ret;
264
265
ret = stream_start(dev);
266
if (ret)
267
return ret;
268
269
dev->output_running = 0;
270
wait_event_timeout(dev->prepare_wait_queue, dev->output_running, HZ);
271
if (!dev->output_running) {
272
stream_stop(dev);
273
return -EPIPE;
274
}
275
276
return 0;
277
}
278
279
static int snd_usb_caiaq_pcm_trigger(struct snd_pcm_substream *sub, int cmd)
280
{
281
struct snd_usb_caiaqdev *dev = snd_pcm_substream_chip(sub);
282
283
debug("%s(%p) cmd %d\n", __func__, sub, cmd);
284
285
switch (cmd) {
286
case SNDRV_PCM_TRIGGER_START:
287
case SNDRV_PCM_TRIGGER_PAUSE_RELEASE:
288
activate_substream(dev, sub);
289
break;
290
case SNDRV_PCM_TRIGGER_STOP:
291
case SNDRV_PCM_TRIGGER_PAUSE_PUSH:
292
deactivate_substream(dev, sub);
293
break;
294
default:
295
return -EINVAL;
296
}
297
298
return 0;
299
}
300
301
static snd_pcm_uframes_t
302
snd_usb_caiaq_pcm_pointer(struct snd_pcm_substream *sub)
303
{
304
int index = sub->number;
305
struct snd_usb_caiaqdev *dev = snd_pcm_substream_chip(sub);
306
snd_pcm_uframes_t ptr;
307
308
spin_lock(&dev->spinlock);
309
310
if (dev->input_panic || dev->output_panic)
311
ptr = SNDRV_PCM_POS_XRUN;
312
313
if (sub->stream == SNDRV_PCM_STREAM_PLAYBACK)
314
ptr = bytes_to_frames(sub->runtime,
315
dev->audio_out_buf_pos[index]);
316
else
317
ptr = bytes_to_frames(sub->runtime,
318
dev->audio_in_buf_pos[index]);
319
320
spin_unlock(&dev->spinlock);
321
return ptr;
322
}
323
324
/* operators for both playback and capture */
325
static struct snd_pcm_ops snd_usb_caiaq_ops = {
326
.open = snd_usb_caiaq_substream_open,
327
.close = snd_usb_caiaq_substream_close,
328
.ioctl = snd_pcm_lib_ioctl,
329
.hw_params = snd_usb_caiaq_pcm_hw_params,
330
.hw_free = snd_usb_caiaq_pcm_hw_free,
331
.prepare = snd_usb_caiaq_pcm_prepare,
332
.trigger = snd_usb_caiaq_pcm_trigger,
333
.pointer = snd_usb_caiaq_pcm_pointer
334
};
335
336
static void check_for_elapsed_periods(struct snd_usb_caiaqdev *dev,
337
struct snd_pcm_substream **subs)
338
{
339
int stream, pb, *cnt;
340
struct snd_pcm_substream *sub;
341
342
for (stream = 0; stream < dev->n_streams; stream++) {
343
sub = subs[stream];
344
if (!sub)
345
continue;
346
347
pb = snd_pcm_lib_period_bytes(sub);
348
cnt = (sub->stream == SNDRV_PCM_STREAM_PLAYBACK) ?
349
&dev->period_out_count[stream] :
350
&dev->period_in_count[stream];
351
352
if (*cnt >= pb) {
353
snd_pcm_period_elapsed(sub);
354
*cnt %= pb;
355
}
356
}
357
}
358
359
static void read_in_urb_mode0(struct snd_usb_caiaqdev *dev,
360
const struct urb *urb,
361
const struct usb_iso_packet_descriptor *iso)
362
{
363
unsigned char *usb_buf = urb->transfer_buffer + iso->offset;
364
struct snd_pcm_substream *sub;
365
int stream, i;
366
367
if (all_substreams_zero(dev->sub_capture))
368
return;
369
370
for (i = 0; i < iso->actual_length;) {
371
for (stream = 0; stream < dev->n_streams; stream++, i++) {
372
sub = dev->sub_capture[stream];
373
if (sub) {
374
struct snd_pcm_runtime *rt = sub->runtime;
375
char *audio_buf = rt->dma_area;
376
int sz = frames_to_bytes(rt, rt->buffer_size);
377
audio_buf[dev->audio_in_buf_pos[stream]++]
378
= usb_buf[i];
379
dev->period_in_count[stream]++;
380
if (dev->audio_in_buf_pos[stream] == sz)
381
dev->audio_in_buf_pos[stream] = 0;
382
}
383
}
384
}
385
}
386
387
static void read_in_urb_mode2(struct snd_usb_caiaqdev *dev,
388
const struct urb *urb,
389
const struct usb_iso_packet_descriptor *iso)
390
{
391
unsigned char *usb_buf = urb->transfer_buffer + iso->offset;
392
unsigned char check_byte;
393
struct snd_pcm_substream *sub;
394
int stream, i;
395
396
for (i = 0; i < iso->actual_length;) {
397
if (i % (dev->n_streams * BYTES_PER_SAMPLE_USB) == 0) {
398
for (stream = 0;
399
stream < dev->n_streams;
400
stream++, i++) {
401
if (dev->first_packet)
402
continue;
403
404
check_byte = MAKE_CHECKBYTE(dev, stream, i);
405
406
if ((usb_buf[i] & 0x3f) != check_byte)
407
dev->input_panic = 1;
408
409
if (usb_buf[i] & 0x80)
410
dev->output_panic = 1;
411
}
412
}
413
dev->first_packet = 0;
414
415
for (stream = 0; stream < dev->n_streams; stream++, i++) {
416
sub = dev->sub_capture[stream];
417
if (dev->input_panic)
418
usb_buf[i] = 0;
419
420
if (sub) {
421
struct snd_pcm_runtime *rt = sub->runtime;
422
char *audio_buf = rt->dma_area;
423
int sz = frames_to_bytes(rt, rt->buffer_size);
424
audio_buf[dev->audio_in_buf_pos[stream]++] =
425
usb_buf[i];
426
dev->period_in_count[stream]++;
427
if (dev->audio_in_buf_pos[stream] == sz)
428
dev->audio_in_buf_pos[stream] = 0;
429
}
430
}
431
}
432
}
433
434
static void read_in_urb_mode3(struct snd_usb_caiaqdev *dev,
435
const struct urb *urb,
436
const struct usb_iso_packet_descriptor *iso)
437
{
438
unsigned char *usb_buf = urb->transfer_buffer + iso->offset;
439
int stream, i;
440
441
/* paranoia check */
442
if (iso->actual_length % (BYTES_PER_SAMPLE_USB * CHANNELS_PER_STREAM))
443
return;
444
445
for (i = 0; i < iso->actual_length;) {
446
for (stream = 0; stream < dev->n_streams; stream++) {
447
struct snd_pcm_substream *sub = dev->sub_capture[stream];
448
char *audio_buf = NULL;
449
int c, n, sz = 0;
450
451
if (sub && !dev->input_panic) {
452
struct snd_pcm_runtime *rt = sub->runtime;
453
audio_buf = rt->dma_area;
454
sz = frames_to_bytes(rt, rt->buffer_size);
455
}
456
457
for (c = 0; c < CHANNELS_PER_STREAM; c++) {
458
/* 3 audio data bytes, followed by 1 check byte */
459
if (audio_buf) {
460
for (n = 0; n < BYTES_PER_SAMPLE; n++) {
461
audio_buf[dev->audio_in_buf_pos[stream]++] = usb_buf[i+n];
462
463
if (dev->audio_in_buf_pos[stream] == sz)
464
dev->audio_in_buf_pos[stream] = 0;
465
}
466
467
dev->period_in_count[stream] += BYTES_PER_SAMPLE;
468
}
469
470
i += BYTES_PER_SAMPLE;
471
472
if (usb_buf[i] != ((stream << 1) | c) &&
473
!dev->first_packet) {
474
if (!dev->input_panic)
475
printk(" EXPECTED: %02x got %02x, c %d, stream %d, i %d\n",
476
((stream << 1) | c), usb_buf[i], c, stream, i);
477
dev->input_panic = 1;
478
}
479
480
i++;
481
}
482
}
483
}
484
485
if (dev->first_packet > 0)
486
dev->first_packet--;
487
}
488
489
static void read_in_urb(struct snd_usb_caiaqdev *dev,
490
const struct urb *urb,
491
const struct usb_iso_packet_descriptor *iso)
492
{
493
if (!dev->streaming)
494
return;
495
496
if (iso->actual_length < dev->bpp)
497
return;
498
499
switch (dev->spec.data_alignment) {
500
case 0:
501
read_in_urb_mode0(dev, urb, iso);
502
break;
503
case 2:
504
read_in_urb_mode2(dev, urb, iso);
505
break;
506
case 3:
507
read_in_urb_mode3(dev, urb, iso);
508
break;
509
}
510
511
if ((dev->input_panic || dev->output_panic) && !dev->warned) {
512
debug("streaming error detected %s %s\n",
513
dev->input_panic ? "(input)" : "",
514
dev->output_panic ? "(output)" : "");
515
dev->warned = 1;
516
}
517
}
518
519
static void fill_out_urb_mode_0(struct snd_usb_caiaqdev *dev,
520
struct urb *urb,
521
const struct usb_iso_packet_descriptor *iso)
522
{
523
unsigned char *usb_buf = urb->transfer_buffer + iso->offset;
524
struct snd_pcm_substream *sub;
525
int stream, i;
526
527
for (i = 0; i < iso->length;) {
528
for (stream = 0; stream < dev->n_streams; stream++, i++) {
529
sub = dev->sub_playback[stream];
530
if (sub) {
531
struct snd_pcm_runtime *rt = sub->runtime;
532
char *audio_buf = rt->dma_area;
533
int sz = frames_to_bytes(rt, rt->buffer_size);
534
usb_buf[i] =
535
audio_buf[dev->audio_out_buf_pos[stream]];
536
dev->period_out_count[stream]++;
537
dev->audio_out_buf_pos[stream]++;
538
if (dev->audio_out_buf_pos[stream] == sz)
539
dev->audio_out_buf_pos[stream] = 0;
540
} else
541
usb_buf[i] = 0;
542
}
543
544
/* fill in the check bytes */
545
if (dev->spec.data_alignment == 2 &&
546
i % (dev->n_streams * BYTES_PER_SAMPLE_USB) ==
547
(dev->n_streams * CHANNELS_PER_STREAM))
548
for (stream = 0; stream < dev->n_streams; stream++, i++)
549
usb_buf[i] = MAKE_CHECKBYTE(dev, stream, i);
550
}
551
}
552
553
static void fill_out_urb_mode_3(struct snd_usb_caiaqdev *dev,
554
struct urb *urb,
555
const struct usb_iso_packet_descriptor *iso)
556
{
557
unsigned char *usb_buf = urb->transfer_buffer + iso->offset;
558
int stream, i;
559
560
for (i = 0; i < iso->length;) {
561
for (stream = 0; stream < dev->n_streams; stream++) {
562
struct snd_pcm_substream *sub = dev->sub_playback[stream];
563
char *audio_buf = NULL;
564
int c, n, sz = 0;
565
566
if (sub) {
567
struct snd_pcm_runtime *rt = sub->runtime;
568
audio_buf = rt->dma_area;
569
sz = frames_to_bytes(rt, rt->buffer_size);
570
}
571
572
for (c = 0; c < CHANNELS_PER_STREAM; c++) {
573
for (n = 0; n < BYTES_PER_SAMPLE; n++) {
574
if (audio_buf) {
575
usb_buf[i+n] = audio_buf[dev->audio_out_buf_pos[stream]++];
576
577
if (dev->audio_out_buf_pos[stream] == sz)
578
dev->audio_out_buf_pos[stream] = 0;
579
} else {
580
usb_buf[i+n] = 0;
581
}
582
}
583
584
if (audio_buf)
585
dev->period_out_count[stream] += BYTES_PER_SAMPLE;
586
587
i += BYTES_PER_SAMPLE;
588
589
/* fill in the check byte pattern */
590
usb_buf[i++] = (stream << 1) | c;
591
}
592
}
593
}
594
}
595
596
static inline void fill_out_urb(struct snd_usb_caiaqdev *dev,
597
struct urb *urb,
598
const struct usb_iso_packet_descriptor *iso)
599
{
600
switch (dev->spec.data_alignment) {
601
case 0:
602
case 2:
603
fill_out_urb_mode_0(dev, urb, iso);
604
break;
605
case 3:
606
fill_out_urb_mode_3(dev, urb, iso);
607
break;
608
}
609
}
610
611
static void read_completed(struct urb *urb)
612
{
613
struct snd_usb_caiaq_cb_info *info = urb->context;
614
struct snd_usb_caiaqdev *dev;
615
struct urb *out;
616
int frame, len, send_it = 0, outframe = 0;
617
618
if (urb->status || !info)
619
return;
620
621
dev = info->dev;
622
623
if (!dev->streaming)
624
return;
625
626
out = dev->data_urbs_out[info->index];
627
628
/* read the recently received packet and send back one which has
629
* the same layout */
630
for (frame = 0; frame < FRAMES_PER_URB; frame++) {
631
if (urb->iso_frame_desc[frame].status)
632
continue;
633
634
len = urb->iso_frame_desc[outframe].actual_length;
635
out->iso_frame_desc[outframe].length = len;
636
out->iso_frame_desc[outframe].actual_length = 0;
637
out->iso_frame_desc[outframe].offset = BYTES_PER_FRAME * frame;
638
639
if (len > 0) {
640
spin_lock(&dev->spinlock);
641
fill_out_urb(dev, out, &out->iso_frame_desc[outframe]);
642
read_in_urb(dev, urb, &urb->iso_frame_desc[frame]);
643
spin_unlock(&dev->spinlock);
644
check_for_elapsed_periods(dev, dev->sub_playback);
645
check_for_elapsed_periods(dev, dev->sub_capture);
646
send_it = 1;
647
}
648
649
outframe++;
650
}
651
652
if (send_it) {
653
out->number_of_packets = FRAMES_PER_URB;
654
out->transfer_flags = URB_ISO_ASAP;
655
usb_submit_urb(out, GFP_ATOMIC);
656
}
657
658
/* re-submit inbound urb */
659
for (frame = 0; frame < FRAMES_PER_URB; frame++) {
660
urb->iso_frame_desc[frame].offset = BYTES_PER_FRAME * frame;
661
urb->iso_frame_desc[frame].length = BYTES_PER_FRAME;
662
urb->iso_frame_desc[frame].actual_length = 0;
663
}
664
665
urb->number_of_packets = FRAMES_PER_URB;
666
urb->transfer_flags = URB_ISO_ASAP;
667
usb_submit_urb(urb, GFP_ATOMIC);
668
}
669
670
static void write_completed(struct urb *urb)
671
{
672
struct snd_usb_caiaq_cb_info *info = urb->context;
673
struct snd_usb_caiaqdev *dev = info->dev;
674
675
if (!dev->output_running) {
676
dev->output_running = 1;
677
wake_up(&dev->prepare_wait_queue);
678
}
679
}
680
681
static struct urb **alloc_urbs(struct snd_usb_caiaqdev *dev, int dir, int *ret)
682
{
683
int i, frame;
684
struct urb **urbs;
685
struct usb_device *usb_dev = dev->chip.dev;
686
unsigned int pipe;
687
688
pipe = (dir == SNDRV_PCM_STREAM_PLAYBACK) ?
689
usb_sndisocpipe(usb_dev, ENDPOINT_PLAYBACK) :
690
usb_rcvisocpipe(usb_dev, ENDPOINT_CAPTURE);
691
692
urbs = kmalloc(N_URBS * sizeof(*urbs), GFP_KERNEL);
693
if (!urbs) {
694
log("unable to kmalloc() urbs, OOM!?\n");
695
*ret = -ENOMEM;
696
return NULL;
697
}
698
699
for (i = 0; i < N_URBS; i++) {
700
urbs[i] = usb_alloc_urb(FRAMES_PER_URB, GFP_KERNEL);
701
if (!urbs[i]) {
702
log("unable to usb_alloc_urb(), OOM!?\n");
703
*ret = -ENOMEM;
704
return urbs;
705
}
706
707
urbs[i]->transfer_buffer =
708
kmalloc(FRAMES_PER_URB * BYTES_PER_FRAME, GFP_KERNEL);
709
if (!urbs[i]->transfer_buffer) {
710
log("unable to kmalloc() transfer buffer, OOM!?\n");
711
*ret = -ENOMEM;
712
return urbs;
713
}
714
715
for (frame = 0; frame < FRAMES_PER_URB; frame++) {
716
struct usb_iso_packet_descriptor *iso =
717
&urbs[i]->iso_frame_desc[frame];
718
719
iso->offset = BYTES_PER_FRAME * frame;
720
iso->length = BYTES_PER_FRAME;
721
}
722
723
urbs[i]->dev = usb_dev;
724
urbs[i]->pipe = pipe;
725
urbs[i]->transfer_buffer_length = FRAMES_PER_URB
726
* BYTES_PER_FRAME;
727
urbs[i]->context = &dev->data_cb_info[i];
728
urbs[i]->interval = 1;
729
urbs[i]->transfer_flags = URB_ISO_ASAP;
730
urbs[i]->number_of_packets = FRAMES_PER_URB;
731
urbs[i]->complete = (dir == SNDRV_PCM_STREAM_CAPTURE) ?
732
read_completed : write_completed;
733
}
734
735
*ret = 0;
736
return urbs;
737
}
738
739
static void free_urbs(struct urb **urbs)
740
{
741
int i;
742
743
if (!urbs)
744
return;
745
746
for (i = 0; i < N_URBS; i++) {
747
if (!urbs[i])
748
continue;
749
750
usb_kill_urb(urbs[i]);
751
kfree(urbs[i]->transfer_buffer);
752
usb_free_urb(urbs[i]);
753
}
754
755
kfree(urbs);
756
}
757
758
int snd_usb_caiaq_audio_init(struct snd_usb_caiaqdev *dev)
759
{
760
int i, ret;
761
762
dev->n_audio_in = max(dev->spec.num_analog_audio_in,
763
dev->spec.num_digital_audio_in) /
764
CHANNELS_PER_STREAM;
765
dev->n_audio_out = max(dev->spec.num_analog_audio_out,
766
dev->spec.num_digital_audio_out) /
767
CHANNELS_PER_STREAM;
768
dev->n_streams = max(dev->n_audio_in, dev->n_audio_out);
769
770
debug("dev->n_audio_in = %d\n", dev->n_audio_in);
771
debug("dev->n_audio_out = %d\n", dev->n_audio_out);
772
debug("dev->n_streams = %d\n", dev->n_streams);
773
774
if (dev->n_streams > MAX_STREAMS) {
775
log("unable to initialize device, too many streams.\n");
776
return -EINVAL;
777
}
778
779
ret = snd_pcm_new(dev->chip.card, dev->product_name, 0,
780
dev->n_audio_out, dev->n_audio_in, &dev->pcm);
781
782
if (ret < 0) {
783
log("snd_pcm_new() returned %d\n", ret);
784
return ret;
785
}
786
787
dev->pcm->private_data = dev;
788
strlcpy(dev->pcm->name, dev->product_name, sizeof(dev->pcm->name));
789
790
memset(dev->sub_playback, 0, sizeof(dev->sub_playback));
791
memset(dev->sub_capture, 0, sizeof(dev->sub_capture));
792
793
memcpy(&dev->pcm_info, &snd_usb_caiaq_pcm_hardware,
794
sizeof(snd_usb_caiaq_pcm_hardware));
795
796
/* setup samplerates */
797
dev->samplerates = dev->pcm_info.rates;
798
switch (dev->chip.usb_id) {
799
case USB_ID(USB_VID_NATIVEINSTRUMENTS, USB_PID_AK1):
800
case USB_ID(USB_VID_NATIVEINSTRUMENTS, USB_PID_RIGKONTROL3):
801
case USB_ID(USB_VID_NATIVEINSTRUMENTS, USB_PID_SESSIONIO):
802
case USB_ID(USB_VID_NATIVEINSTRUMENTS, USB_PID_GUITARRIGMOBILE):
803
dev->samplerates |= SNDRV_PCM_RATE_192000;
804
/* fall thru */
805
case USB_ID(USB_VID_NATIVEINSTRUMENTS, USB_PID_AUDIO2DJ):
806
case USB_ID(USB_VID_NATIVEINSTRUMENTS, USB_PID_AUDIO4DJ):
807
case USB_ID(USB_VID_NATIVEINSTRUMENTS, USB_PID_AUDIO8DJ):
808
case USB_ID(USB_VID_NATIVEINSTRUMENTS, USB_PID_TRAKTORAUDIO2):
809
dev->samplerates |= SNDRV_PCM_RATE_88200;
810
break;
811
}
812
813
snd_pcm_set_ops(dev->pcm, SNDRV_PCM_STREAM_PLAYBACK,
814
&snd_usb_caiaq_ops);
815
snd_pcm_set_ops(dev->pcm, SNDRV_PCM_STREAM_CAPTURE,
816
&snd_usb_caiaq_ops);
817
818
snd_pcm_lib_preallocate_pages_for_all(dev->pcm,
819
SNDRV_DMA_TYPE_CONTINUOUS,
820
snd_dma_continuous_data(GFP_KERNEL),
821
MAX_BUFFER_SIZE, MAX_BUFFER_SIZE);
822
823
dev->data_cb_info =
824
kmalloc(sizeof(struct snd_usb_caiaq_cb_info) * N_URBS,
825
GFP_KERNEL);
826
827
if (!dev->data_cb_info)
828
return -ENOMEM;
829
830
for (i = 0; i < N_URBS; i++) {
831
dev->data_cb_info[i].dev = dev;
832
dev->data_cb_info[i].index = i;
833
}
834
835
dev->data_urbs_in = alloc_urbs(dev, SNDRV_PCM_STREAM_CAPTURE, &ret);
836
if (ret < 0) {
837
kfree(dev->data_cb_info);
838
free_urbs(dev->data_urbs_in);
839
return ret;
840
}
841
842
dev->data_urbs_out = alloc_urbs(dev, SNDRV_PCM_STREAM_PLAYBACK, &ret);
843
if (ret < 0) {
844
kfree(dev->data_cb_info);
845
free_urbs(dev->data_urbs_in);
846
free_urbs(dev->data_urbs_out);
847
return ret;
848
}
849
850
return 0;
851
}
852
853
void snd_usb_caiaq_audio_free(struct snd_usb_caiaqdev *dev)
854
{
855
debug("%s(%p)\n", __func__, dev);
856
stream_stop(dev);
857
free_urbs(dev->data_urbs_in);
858
free_urbs(dev->data_urbs_out);
859
kfree(dev->data_cb_info);
860
}
861
862
863