Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
torvalds
GitHub Repository: torvalds/linux
Path: blob/master/sound/drivers/aloop.c
50360 views
1
// SPDX-License-Identifier: GPL-2.0-or-later
2
/*
3
* Loopback soundcard
4
*
5
* Original code:
6
* Copyright (c) by Jaroslav Kysela <[email protected]>
7
*
8
* More accurate positioning and full-duplex support:
9
* Copyright (c) Ahmet İnan <ainan at mathematik.uni-freiburg.de>
10
*
11
* Major (almost complete) rewrite:
12
* Copyright (c) by Takashi Iwai <[email protected]>
13
*
14
* A next major update in 2010 (separate timers for playback and capture):
15
* Copyright (c) Jaroslav Kysela <[email protected]>
16
*/
17
18
#include <linux/init.h>
19
#include <linux/jiffies.h>
20
#include <linux/slab.h>
21
#include <linux/string.h>
22
#include <linux/time.h>
23
#include <linux/wait.h>
24
#include <linux/module.h>
25
#include <linux/platform_device.h>
26
#include <sound/core.h>
27
#include <sound/control.h>
28
#include <sound/pcm.h>
29
#include <sound/pcm_params.h>
30
#include <sound/info.h>
31
#include <sound/initval.h>
32
#include <sound/timer.h>
33
34
MODULE_AUTHOR("Jaroslav Kysela <[email protected]>");
35
MODULE_DESCRIPTION("A loopback soundcard");
36
MODULE_LICENSE("GPL");
37
38
#define MAX_PCM_SUBSTREAMS 8
39
40
static int index[SNDRV_CARDS] = SNDRV_DEFAULT_IDX; /* Index 0-MAX */
41
static char *id[SNDRV_CARDS] = SNDRV_DEFAULT_STR; /* ID for this card */
42
static bool enable[SNDRV_CARDS] = {1, [1 ... (SNDRV_CARDS - 1)] = 0};
43
static int pcm_substreams[SNDRV_CARDS] = {[0 ... (SNDRV_CARDS - 1)] = 8};
44
static int pcm_notify[SNDRV_CARDS];
45
static char *timer_source[SNDRV_CARDS];
46
47
module_param_array(index, int, NULL, 0444);
48
MODULE_PARM_DESC(index, "Index value for loopback soundcard.");
49
module_param_array(id, charp, NULL, 0444);
50
MODULE_PARM_DESC(id, "ID string for loopback soundcard.");
51
module_param_array(enable, bool, NULL, 0444);
52
MODULE_PARM_DESC(enable, "Enable this loopback soundcard.");
53
module_param_array(pcm_substreams, int, NULL, 0444);
54
MODULE_PARM_DESC(pcm_substreams, "PCM substreams # (1-8) for loopback driver.");
55
module_param_array(pcm_notify, int, NULL, 0444);
56
MODULE_PARM_DESC(pcm_notify, "Break capture when PCM format/rate/channels changes.");
57
module_param_array(timer_source, charp, NULL, 0444);
58
MODULE_PARM_DESC(timer_source, "Sound card name or number and device/subdevice number of timer to be used. Empty string for jiffies timer [default].");
59
60
#define NO_PITCH 100000
61
62
#define CABLE_VALID_PLAYBACK BIT(SNDRV_PCM_STREAM_PLAYBACK)
63
#define CABLE_VALID_CAPTURE BIT(SNDRV_PCM_STREAM_CAPTURE)
64
#define CABLE_VALID_BOTH (CABLE_VALID_PLAYBACK | CABLE_VALID_CAPTURE)
65
66
struct loopback_cable;
67
struct loopback_pcm;
68
69
struct loopback_ops {
70
/* optional
71
* call in loopback->cable_lock
72
*/
73
int (*open)(struct loopback_pcm *dpcm);
74
/* required
75
* call in cable->lock
76
*/
77
int (*start)(struct loopback_pcm *dpcm);
78
/* required
79
* call in cable->lock
80
*/
81
int (*stop)(struct loopback_pcm *dpcm);
82
/* optional */
83
int (*stop_sync)(struct loopback_pcm *dpcm);
84
/* optional */
85
int (*close_substream)(struct loopback_pcm *dpcm);
86
/* optional
87
* call in loopback->cable_lock
88
*/
89
int (*close_cable)(struct loopback_pcm *dpcm);
90
/* optional
91
* call in cable->lock
92
*/
93
unsigned int (*pos_update)(struct loopback_cable *cable);
94
/* optional */
95
void (*dpcm_info)(struct loopback_pcm *dpcm,
96
struct snd_info_buffer *buffer);
97
};
98
99
struct loopback_cable {
100
spinlock_t lock;
101
struct loopback_pcm *streams[2];
102
struct snd_pcm_hardware hw;
103
/* flags */
104
unsigned int valid;
105
unsigned int running;
106
unsigned int pause;
107
/* timer specific */
108
const struct loopback_ops *ops;
109
/* If sound timer is used */
110
struct {
111
int stream;
112
struct snd_timer_id id;
113
struct work_struct event_work;
114
struct snd_timer_instance *instance;
115
} snd_timer;
116
};
117
118
struct loopback_setup {
119
unsigned int notify: 1;
120
unsigned int rate_shift;
121
snd_pcm_format_t format;
122
unsigned int rate;
123
snd_pcm_access_t access;
124
unsigned int channels;
125
struct snd_ctl_elem_id active_id;
126
struct snd_ctl_elem_id format_id;
127
struct snd_ctl_elem_id rate_id;
128
struct snd_ctl_elem_id channels_id;
129
struct snd_ctl_elem_id access_id;
130
};
131
132
struct loopback {
133
struct snd_card *card;
134
struct mutex cable_lock;
135
struct loopback_cable *cables[MAX_PCM_SUBSTREAMS][2];
136
struct snd_pcm *pcm[2];
137
struct loopback_setup setup[MAX_PCM_SUBSTREAMS][2];
138
const char *timer_source;
139
};
140
141
struct loopback_pcm {
142
struct loopback *loopback;
143
struct snd_pcm_substream *substream;
144
struct loopback_cable *cable;
145
unsigned int pcm_buffer_size;
146
unsigned int buf_pos; /* position in buffer */
147
unsigned int silent_size;
148
/* PCM parameters */
149
unsigned int pcm_period_size;
150
unsigned int pcm_bps; /* bytes per second */
151
unsigned int pcm_salign; /* bytes per sample * channels */
152
unsigned int pcm_rate_shift; /* rate shift value */
153
/* flags */
154
unsigned int period_update_pending :1;
155
/* timer stuff */
156
unsigned int irq_pos; /* fractional IRQ position in jiffies
157
* ticks
158
*/
159
unsigned int period_size_frac; /* period size in jiffies ticks */
160
unsigned int last_drift;
161
unsigned long last_jiffies;
162
/* If jiffies timer is used */
163
struct timer_list timer;
164
165
/* size of per channel buffer in case of non-interleaved access */
166
unsigned int channel_buf_n;
167
};
168
169
static struct platform_device *devices[SNDRV_CARDS];
170
171
static inline unsigned int byte_pos(struct loopback_pcm *dpcm, unsigned int x)
172
{
173
if (dpcm->pcm_rate_shift == NO_PITCH) {
174
x /= HZ;
175
} else {
176
x = div_u64(NO_PITCH * (unsigned long long)x,
177
HZ * (unsigned long long)dpcm->pcm_rate_shift);
178
}
179
return x - (x % dpcm->pcm_salign);
180
}
181
182
static inline unsigned int frac_pos(struct loopback_pcm *dpcm, unsigned int x)
183
{
184
if (dpcm->pcm_rate_shift == NO_PITCH) { /* no pitch */
185
return x * HZ;
186
} else {
187
x = div_u64(dpcm->pcm_rate_shift * (unsigned long long)x * HZ,
188
NO_PITCH);
189
}
190
return x;
191
}
192
193
static inline struct loopback_setup *get_setup(struct loopback_pcm *dpcm)
194
{
195
int device = dpcm->substream->pstr->pcm->device;
196
197
if (dpcm->substream->stream == SNDRV_PCM_STREAM_PLAYBACK)
198
device ^= 1;
199
return &dpcm->loopback->setup[dpcm->substream->number][device];
200
}
201
202
static inline unsigned int get_notify(struct loopback_pcm *dpcm)
203
{
204
return get_setup(dpcm)->notify;
205
}
206
207
static inline unsigned int get_rate_shift(struct loopback_pcm *dpcm)
208
{
209
return get_setup(dpcm)->rate_shift;
210
}
211
212
/* call in cable->lock */
213
static int loopback_jiffies_timer_start(struct loopback_pcm *dpcm)
214
{
215
unsigned long tick;
216
unsigned int rate_shift = get_rate_shift(dpcm);
217
218
if (rate_shift != dpcm->pcm_rate_shift) {
219
dpcm->pcm_rate_shift = rate_shift;
220
dpcm->period_size_frac = frac_pos(dpcm, dpcm->pcm_period_size);
221
}
222
if (dpcm->period_size_frac <= dpcm->irq_pos) {
223
dpcm->irq_pos %= dpcm->period_size_frac;
224
dpcm->period_update_pending = 1;
225
}
226
tick = dpcm->period_size_frac - dpcm->irq_pos;
227
tick = DIV_ROUND_UP(tick, dpcm->pcm_bps);
228
mod_timer(&dpcm->timer, jiffies + tick);
229
230
return 0;
231
}
232
233
/* call in cable->lock */
234
static int loopback_snd_timer_start(struct loopback_pcm *dpcm)
235
{
236
struct loopback_cable *cable = dpcm->cable;
237
int err;
238
239
/* Loopback device has to use same period as timer card. Therefore
240
* wake up for each snd_pcm_period_elapsed() call of timer card.
241
*/
242
err = snd_timer_start(cable->snd_timer.instance, 1);
243
if (err < 0) {
244
/* do not report error if trying to start but already
245
* running. For example called by opposite substream
246
* of the same cable
247
*/
248
if (err == -EBUSY)
249
return 0;
250
251
pcm_err(dpcm->substream->pcm,
252
"snd_timer_start(%d,%d,%d) failed with %d",
253
cable->snd_timer.id.card,
254
cable->snd_timer.id.device,
255
cable->snd_timer.id.subdevice,
256
err);
257
}
258
259
return err;
260
}
261
262
/* call in cable->lock */
263
static inline int loopback_jiffies_timer_stop(struct loopback_pcm *dpcm)
264
{
265
timer_delete(&dpcm->timer);
266
dpcm->timer.expires = 0;
267
268
return 0;
269
}
270
271
/* call in cable->lock */
272
static int loopback_snd_timer_stop(struct loopback_pcm *dpcm)
273
{
274
struct loopback_cable *cable = dpcm->cable;
275
int err;
276
277
/* only stop if both devices (playback and capture) are not running */
278
if (cable->running ^ cable->pause)
279
return 0;
280
281
err = snd_timer_stop(cable->snd_timer.instance);
282
if (err < 0) {
283
pcm_err(dpcm->substream->pcm,
284
"snd_timer_stop(%d,%d,%d) failed with %d",
285
cable->snd_timer.id.card,
286
cable->snd_timer.id.device,
287
cable->snd_timer.id.subdevice,
288
err);
289
}
290
291
return err;
292
}
293
294
static inline int loopback_jiffies_timer_stop_sync(struct loopback_pcm *dpcm)
295
{
296
timer_delete_sync(&dpcm->timer);
297
298
return 0;
299
}
300
301
/* call in loopback->cable_lock */
302
static int loopback_snd_timer_close_cable(struct loopback_pcm *dpcm)
303
{
304
struct loopback_cable *cable = dpcm->cable;
305
306
/* snd_timer was not opened */
307
if (!cable->snd_timer.instance)
308
return 0;
309
310
/* will only be called from free_cable() when other stream was
311
* already closed. Other stream cannot be reopened as long as
312
* loopback->cable_lock is locked. Therefore no need to lock
313
* cable->lock;
314
*/
315
snd_timer_close(cable->snd_timer.instance);
316
317
/* wait till drain work has finished if requested */
318
cancel_work_sync(&cable->snd_timer.event_work);
319
320
snd_timer_instance_free(cable->snd_timer.instance);
321
memset(&cable->snd_timer, 0, sizeof(cable->snd_timer));
322
323
return 0;
324
}
325
326
static bool is_access_interleaved(snd_pcm_access_t access)
327
{
328
switch (access) {
329
case SNDRV_PCM_ACCESS_MMAP_INTERLEAVED:
330
case SNDRV_PCM_ACCESS_RW_INTERLEAVED:
331
return true;
332
default:
333
return false;
334
}
335
};
336
337
static int loopback_check_format(struct loopback_cable *cable, int stream)
338
{
339
struct loopback_pcm *dpcm_play, *dpcm_capt;
340
struct snd_pcm_runtime *runtime, *cruntime;
341
struct loopback_setup *setup;
342
struct snd_card *card;
343
bool stop_capture = false;
344
int check;
345
346
scoped_guard(spinlock_irqsave, &cable->lock) {
347
dpcm_play = cable->streams[SNDRV_PCM_STREAM_PLAYBACK];
348
dpcm_capt = cable->streams[SNDRV_PCM_STREAM_CAPTURE];
349
350
if (cable->valid != CABLE_VALID_BOTH) {
351
if (stream == SNDRV_PCM_STREAM_CAPTURE || !dpcm_play)
352
return 0;
353
} else {
354
if (!dpcm_play || !dpcm_capt)
355
return -EIO;
356
runtime = dpcm_play->substream->runtime;
357
cruntime = dpcm_capt->substream->runtime;
358
if (!runtime || !cruntime)
359
return -EIO;
360
check = runtime->format != cruntime->format ||
361
runtime->rate != cruntime->rate ||
362
runtime->channels != cruntime->channels ||
363
is_access_interleaved(runtime->access) !=
364
is_access_interleaved(cruntime->access);
365
if (!check)
366
return 0;
367
if (stream == SNDRV_PCM_STREAM_CAPTURE)
368
return -EIO;
369
else if (cruntime->state == SNDRV_PCM_STATE_RUNNING)
370
stop_capture = true;
371
}
372
373
setup = get_setup(dpcm_play);
374
card = dpcm_play->loopback->card;
375
runtime = dpcm_play->substream->runtime;
376
if (setup->format != runtime->format) {
377
snd_ctl_notify(card, SNDRV_CTL_EVENT_MASK_VALUE,
378
&setup->format_id);
379
setup->format = runtime->format;
380
}
381
if (setup->rate != runtime->rate) {
382
snd_ctl_notify(card, SNDRV_CTL_EVENT_MASK_VALUE,
383
&setup->rate_id);
384
setup->rate = runtime->rate;
385
}
386
if (setup->channels != runtime->channels) {
387
snd_ctl_notify(card, SNDRV_CTL_EVENT_MASK_VALUE,
388
&setup->channels_id);
389
setup->channels = runtime->channels;
390
}
391
if (is_access_interleaved(setup->access) !=
392
is_access_interleaved(runtime->access)) {
393
snd_ctl_notify(card, SNDRV_CTL_EVENT_MASK_VALUE,
394
&setup->access_id);
395
setup->access = runtime->access;
396
}
397
}
398
399
if (stop_capture)
400
snd_pcm_stop(dpcm_capt->substream, SNDRV_PCM_STATE_DRAINING);
401
402
return 0;
403
}
404
405
static void loopback_active_notify(struct loopback_pcm *dpcm)
406
{
407
snd_ctl_notify(dpcm->loopback->card,
408
SNDRV_CTL_EVENT_MASK_VALUE,
409
&get_setup(dpcm)->active_id);
410
}
411
412
static int loopback_trigger(struct snd_pcm_substream *substream, int cmd)
413
{
414
struct snd_pcm_runtime *runtime = substream->runtime;
415
struct loopback_pcm *dpcm = runtime->private_data;
416
struct loopback_cable *cable = dpcm->cable;
417
int err = 0, stream = 1 << substream->stream;
418
419
switch (cmd) {
420
case SNDRV_PCM_TRIGGER_START:
421
err = loopback_check_format(cable, substream->stream);
422
if (err < 0)
423
return err;
424
dpcm->last_jiffies = jiffies;
425
dpcm->pcm_rate_shift = 0;
426
dpcm->last_drift = 0;
427
scoped_guard(spinlock, &cable->lock) {
428
cable->running |= stream;
429
cable->pause &= ~stream;
430
err = cable->ops->start(dpcm);
431
}
432
if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK)
433
loopback_active_notify(dpcm);
434
break;
435
case SNDRV_PCM_TRIGGER_STOP:
436
scoped_guard(spinlock, &cable->lock) {
437
cable->running &= ~stream;
438
cable->pause &= ~stream;
439
err = cable->ops->stop(dpcm);
440
}
441
if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK)
442
loopback_active_notify(dpcm);
443
break;
444
case SNDRV_PCM_TRIGGER_PAUSE_PUSH:
445
case SNDRV_PCM_TRIGGER_SUSPEND:
446
scoped_guard(spinlock, &cable->lock) {
447
cable->pause |= stream;
448
err = cable->ops->stop(dpcm);
449
}
450
if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK)
451
loopback_active_notify(dpcm);
452
break;
453
case SNDRV_PCM_TRIGGER_PAUSE_RELEASE:
454
case SNDRV_PCM_TRIGGER_RESUME:
455
scoped_guard(spinlock, &cable->lock) {
456
dpcm->last_jiffies = jiffies;
457
cable->pause &= ~stream;
458
err = cable->ops->start(dpcm);
459
}
460
if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK)
461
loopback_active_notify(dpcm);
462
break;
463
default:
464
return -EINVAL;
465
}
466
return err;
467
}
468
469
static void params_change(struct snd_pcm_substream *substream)
470
{
471
struct snd_pcm_runtime *runtime = substream->runtime;
472
struct loopback_pcm *dpcm = runtime->private_data;
473
struct loopback_cable *cable = dpcm->cable;
474
475
cable->hw.formats = pcm_format_to_bits(runtime->format);
476
cable->hw.rate_min = runtime->rate;
477
cable->hw.rate_max = runtime->rate;
478
cable->hw.channels_min = runtime->channels;
479
cable->hw.channels_max = runtime->channels;
480
481
if (cable->snd_timer.instance) {
482
cable->hw.period_bytes_min =
483
frames_to_bytes(runtime, runtime->period_size);
484
cable->hw.period_bytes_max = cable->hw.period_bytes_min;
485
}
486
487
}
488
489
static int loopback_prepare(struct snd_pcm_substream *substream)
490
{
491
struct snd_pcm_runtime *runtime = substream->runtime;
492
struct loopback_pcm *dpcm = runtime->private_data;
493
struct loopback_cable *cable = dpcm->cable;
494
int err, bps, salign;
495
496
if (cable->ops->stop_sync) {
497
err = cable->ops->stop_sync(dpcm);
498
if (err < 0)
499
return err;
500
}
501
502
salign = (snd_pcm_format_physical_width(runtime->format) *
503
runtime->channels) / 8;
504
bps = salign * runtime->rate;
505
if (bps <= 0 || salign <= 0)
506
return -EINVAL;
507
508
dpcm->buf_pos = 0;
509
dpcm->pcm_buffer_size = frames_to_bytes(runtime, runtime->buffer_size);
510
dpcm->channel_buf_n = dpcm->pcm_buffer_size / runtime->channels;
511
if (substream->stream == SNDRV_PCM_STREAM_CAPTURE) {
512
/* clear capture buffer */
513
dpcm->silent_size = dpcm->pcm_buffer_size;
514
snd_pcm_format_set_silence(runtime->format, runtime->dma_area,
515
runtime->buffer_size * runtime->channels);
516
}
517
518
dpcm->irq_pos = 0;
519
dpcm->period_update_pending = 0;
520
dpcm->pcm_bps = bps;
521
dpcm->pcm_salign = salign;
522
dpcm->pcm_period_size = frames_to_bytes(runtime, runtime->period_size);
523
524
guard(mutex)(&dpcm->loopback->cable_lock);
525
if (!(cable->valid & ~(1 << substream->stream)) ||
526
(get_setup(dpcm)->notify &&
527
substream->stream == SNDRV_PCM_STREAM_PLAYBACK))
528
params_change(substream);
529
cable->valid |= 1 << substream->stream;
530
531
return 0;
532
}
533
534
static void clear_capture_buf(struct loopback_pcm *dpcm, unsigned int bytes)
535
{
536
struct snd_pcm_runtime *runtime = dpcm->substream->runtime;
537
char *dst = runtime->dma_area;
538
unsigned int dst_off = dpcm->buf_pos;
539
540
if (dpcm->silent_size >= dpcm->pcm_buffer_size)
541
return;
542
if (dpcm->silent_size + bytes > dpcm->pcm_buffer_size)
543
bytes = dpcm->pcm_buffer_size - dpcm->silent_size;
544
545
for (;;) {
546
unsigned int size = bytes;
547
if (dst_off + size > dpcm->pcm_buffer_size)
548
size = dpcm->pcm_buffer_size - dst_off;
549
snd_pcm_format_set_silence(runtime->format, dst + dst_off,
550
bytes_to_frames(runtime, size) *
551
runtime->channels);
552
dpcm->silent_size += size;
553
bytes -= size;
554
if (!bytes)
555
break;
556
dst_off = 0;
557
}
558
}
559
560
static void copy_play_buf_part_n(struct loopback_pcm *play, struct loopback_pcm *capt,
561
unsigned int size, unsigned int src_off, unsigned int dst_off)
562
{
563
unsigned int channels = capt->substream->runtime->channels;
564
unsigned int size_p_ch = size / channels;
565
unsigned int src_off_ch = src_off / channels;
566
unsigned int dst_off_ch = dst_off / channels;
567
int i;
568
569
for (i = 0; i < channels; i++) {
570
memcpy(capt->substream->runtime->dma_area + capt->channel_buf_n * i + dst_off_ch,
571
play->substream->runtime->dma_area + play->channel_buf_n * i + src_off_ch,
572
size_p_ch);
573
}
574
}
575
576
static void copy_play_buf(struct loopback_pcm *play,
577
struct loopback_pcm *capt,
578
unsigned int bytes)
579
{
580
struct snd_pcm_runtime *runtime = play->substream->runtime;
581
char *src = runtime->dma_area;
582
char *dst = capt->substream->runtime->dma_area;
583
unsigned int src_off = play->buf_pos;
584
unsigned int dst_off = capt->buf_pos;
585
unsigned int clear_bytes = 0;
586
587
/* check if playback is draining, trim the capture copy size
588
* when our pointer is at the end of playback ring buffer */
589
if (runtime->state == SNDRV_PCM_STATE_DRAINING &&
590
snd_pcm_playback_hw_avail(runtime) < runtime->buffer_size) {
591
snd_pcm_uframes_t appl_ptr, appl_ptr1, diff;
592
appl_ptr = appl_ptr1 = runtime->control->appl_ptr;
593
appl_ptr1 -= appl_ptr1 % runtime->buffer_size;
594
appl_ptr1 += play->buf_pos / play->pcm_salign;
595
if (appl_ptr < appl_ptr1)
596
appl_ptr1 -= runtime->buffer_size;
597
diff = (appl_ptr - appl_ptr1) * play->pcm_salign;
598
if (diff < bytes) {
599
clear_bytes = bytes - diff;
600
bytes = diff;
601
}
602
}
603
604
for (;;) {
605
unsigned int size = bytes;
606
if (src_off + size > play->pcm_buffer_size)
607
size = play->pcm_buffer_size - src_off;
608
if (dst_off + size > capt->pcm_buffer_size)
609
size = capt->pcm_buffer_size - dst_off;
610
if (!is_access_interleaved(runtime->access))
611
copy_play_buf_part_n(play, capt, size, src_off, dst_off);
612
else
613
memcpy(dst + dst_off, src + src_off, size);
614
capt->silent_size = 0;
615
bytes -= size;
616
if (!bytes)
617
break;
618
src_off = (src_off + size) % play->pcm_buffer_size;
619
dst_off = (dst_off + size) % capt->pcm_buffer_size;
620
}
621
622
if (clear_bytes > 0) {
623
clear_capture_buf(capt, clear_bytes);
624
capt->silent_size = 0;
625
}
626
}
627
628
static inline unsigned int bytepos_delta(struct loopback_pcm *dpcm,
629
unsigned int jiffies_delta)
630
{
631
unsigned long last_pos;
632
unsigned int delta;
633
634
last_pos = byte_pos(dpcm, dpcm->irq_pos);
635
dpcm->irq_pos += jiffies_delta * dpcm->pcm_bps;
636
delta = byte_pos(dpcm, dpcm->irq_pos) - last_pos;
637
if (delta >= dpcm->last_drift)
638
delta -= dpcm->last_drift;
639
dpcm->last_drift = 0;
640
if (dpcm->irq_pos >= dpcm->period_size_frac) {
641
dpcm->irq_pos %= dpcm->period_size_frac;
642
dpcm->period_update_pending = 1;
643
}
644
return delta;
645
}
646
647
static inline void bytepos_finish(struct loopback_pcm *dpcm,
648
unsigned int delta)
649
{
650
dpcm->buf_pos += delta;
651
dpcm->buf_pos %= dpcm->pcm_buffer_size;
652
}
653
654
/* call in cable->lock */
655
static unsigned int loopback_jiffies_timer_pos_update
656
(struct loopback_cable *cable)
657
{
658
struct loopback_pcm *dpcm_play =
659
cable->streams[SNDRV_PCM_STREAM_PLAYBACK];
660
struct loopback_pcm *dpcm_capt =
661
cable->streams[SNDRV_PCM_STREAM_CAPTURE];
662
unsigned long delta_play = 0, delta_capt = 0, cur_jiffies;
663
unsigned int running, count1, count2;
664
665
cur_jiffies = jiffies;
666
running = cable->running ^ cable->pause;
667
if (running & (1 << SNDRV_PCM_STREAM_PLAYBACK)) {
668
delta_play = cur_jiffies - dpcm_play->last_jiffies;
669
dpcm_play->last_jiffies += delta_play;
670
}
671
672
if (running & (1 << SNDRV_PCM_STREAM_CAPTURE)) {
673
delta_capt = cur_jiffies - dpcm_capt->last_jiffies;
674
dpcm_capt->last_jiffies += delta_capt;
675
}
676
677
if (delta_play == 0 && delta_capt == 0)
678
goto unlock;
679
680
if (delta_play > delta_capt) {
681
count1 = bytepos_delta(dpcm_play, delta_play - delta_capt);
682
bytepos_finish(dpcm_play, count1);
683
delta_play = delta_capt;
684
} else if (delta_play < delta_capt) {
685
count1 = bytepos_delta(dpcm_capt, delta_capt - delta_play);
686
clear_capture_buf(dpcm_capt, count1);
687
bytepos_finish(dpcm_capt, count1);
688
delta_capt = delta_play;
689
}
690
691
if (delta_play == 0 && delta_capt == 0)
692
goto unlock;
693
694
/* note delta_capt == delta_play at this moment */
695
count1 = bytepos_delta(dpcm_play, delta_play);
696
count2 = bytepos_delta(dpcm_capt, delta_capt);
697
if (count1 < count2) {
698
dpcm_capt->last_drift = count2 - count1;
699
count1 = count2;
700
} else if (count1 > count2) {
701
dpcm_play->last_drift = count1 - count2;
702
}
703
copy_play_buf(dpcm_play, dpcm_capt, count1);
704
bytepos_finish(dpcm_play, count1);
705
bytepos_finish(dpcm_capt, count1);
706
unlock:
707
return running;
708
}
709
710
static void loopback_jiffies_timer_function(struct timer_list *t)
711
{
712
struct loopback_pcm *dpcm = timer_container_of(dpcm, t, timer);
713
bool period_elapsed = false;
714
715
scoped_guard(spinlock_irqsave, &dpcm->cable->lock) {
716
if (loopback_jiffies_timer_pos_update(dpcm->cable) &
717
(1 << dpcm->substream->stream)) {
718
loopback_jiffies_timer_start(dpcm);
719
if (dpcm->period_update_pending) {
720
dpcm->period_update_pending = 0;
721
period_elapsed = true;
722
break;
723
}
724
}
725
}
726
727
if (period_elapsed)
728
snd_pcm_period_elapsed(dpcm->substream);
729
}
730
731
/* call in cable->lock */
732
static int loopback_snd_timer_check_resolution(struct snd_pcm_runtime *runtime,
733
unsigned long resolution)
734
{
735
if (resolution != runtime->timer_resolution) {
736
struct loopback_pcm *dpcm = runtime->private_data;
737
struct loopback_cable *cable = dpcm->cable;
738
/* Worst case estimation of possible values for resolution
739
* resolution <= (512 * 1024) frames / 8kHz in nsec
740
* resolution <= 65.536.000.000 nsec
741
*
742
* period_size <= 65.536.000.000 nsec / 1000nsec/usec * 192kHz +
743
* 500.000
744
* period_size <= 12.582.912.000.000 <64bit
745
* / 1.000.000 usec/sec
746
*/
747
snd_pcm_uframes_t period_size_usec =
748
resolution / 1000 * runtime->rate;
749
/* round to nearest sample rate */
750
snd_pcm_uframes_t period_size =
751
(period_size_usec + 500 * 1000) / (1000 * 1000);
752
753
pcm_err(dpcm->substream->pcm,
754
"Period size (%lu frames) of loopback device is not corresponding to timer resolution (%lu nsec = %lu frames) of card timer %d,%d,%d. Use period size of %lu frames for loopback device.",
755
runtime->period_size, resolution, period_size,
756
cable->snd_timer.id.card,
757
cable->snd_timer.id.device,
758
cable->snd_timer.id.subdevice,
759
period_size);
760
return -EINVAL;
761
}
762
return 0;
763
}
764
765
static void loopback_snd_timer_period_elapsed(struct loopback_cable *cable,
766
int event,
767
unsigned long resolution)
768
{
769
struct loopback_pcm *dpcm_play, *dpcm_capt;
770
struct snd_pcm_substream *substream_play, *substream_capt;
771
struct snd_pcm_runtime *valid_runtime;
772
unsigned int running, elapsed_bytes;
773
bool xrun = false;
774
775
scoped_guard(spinlock_irqsave, &cable->lock) {
776
running = cable->running ^ cable->pause;
777
/* no need to do anything if no stream is running */
778
if (!running)
779
return;
780
781
dpcm_play = cable->streams[SNDRV_PCM_STREAM_PLAYBACK];
782
dpcm_capt = cable->streams[SNDRV_PCM_STREAM_CAPTURE];
783
784
if (event == SNDRV_TIMER_EVENT_MSTOP) {
785
if (!dpcm_play ||
786
dpcm_play->substream->runtime->state !=
787
SNDRV_PCM_STATE_DRAINING)
788
return;
789
}
790
791
substream_play = (running & (1 << SNDRV_PCM_STREAM_PLAYBACK)) ?
792
dpcm_play->substream : NULL;
793
substream_capt = (running & (1 << SNDRV_PCM_STREAM_CAPTURE)) ?
794
dpcm_capt->substream : NULL;
795
valid_runtime = (running & (1 << SNDRV_PCM_STREAM_PLAYBACK)) ?
796
dpcm_play->substream->runtime :
797
dpcm_capt->substream->runtime;
798
799
/* resolution is only valid for SNDRV_TIMER_EVENT_TICK events */
800
if (event == SNDRV_TIMER_EVENT_TICK) {
801
/* The hardware rules guarantee that playback and capture period
802
* are the same. Therefore only one device has to be checked
803
* here.
804
*/
805
if (loopback_snd_timer_check_resolution(valid_runtime,
806
resolution) < 0) {
807
xrun = true;
808
break;
809
}
810
}
811
812
elapsed_bytes = frames_to_bytes(valid_runtime,
813
valid_runtime->period_size);
814
/* The same timer interrupt is used for playback and capture device */
815
if ((running & (1 << SNDRV_PCM_STREAM_PLAYBACK)) &&
816
(running & (1 << SNDRV_PCM_STREAM_CAPTURE))) {
817
copy_play_buf(dpcm_play, dpcm_capt, elapsed_bytes);
818
bytepos_finish(dpcm_play, elapsed_bytes);
819
bytepos_finish(dpcm_capt, elapsed_bytes);
820
} else if (running & (1 << SNDRV_PCM_STREAM_PLAYBACK)) {
821
bytepos_finish(dpcm_play, elapsed_bytes);
822
} else if (running & (1 << SNDRV_PCM_STREAM_CAPTURE)) {
823
clear_capture_buf(dpcm_capt, elapsed_bytes);
824
bytepos_finish(dpcm_capt, elapsed_bytes);
825
}
826
}
827
828
if (xrun) {
829
if (substream_play)
830
snd_pcm_stop_xrun(substream_play);
831
if (substream_capt)
832
snd_pcm_stop_xrun(substream_capt);
833
return;
834
}
835
836
if (substream_play)
837
snd_pcm_period_elapsed(substream_play);
838
if (substream_capt)
839
snd_pcm_period_elapsed(substream_capt);
840
}
841
842
static void loopback_snd_timer_function(struct snd_timer_instance *timeri,
843
unsigned long resolution,
844
unsigned long ticks)
845
{
846
struct loopback_cable *cable = timeri->callback_data;
847
848
loopback_snd_timer_period_elapsed(cable, SNDRV_TIMER_EVENT_TICK,
849
resolution);
850
}
851
852
static void loopback_snd_timer_work(struct work_struct *work)
853
{
854
struct loopback_cable *cable;
855
856
cable = container_of(work, struct loopback_cable, snd_timer.event_work);
857
loopback_snd_timer_period_elapsed(cable, SNDRV_TIMER_EVENT_MSTOP, 0);
858
}
859
860
static void loopback_snd_timer_event(struct snd_timer_instance *timeri,
861
int event,
862
struct timespec64 *tstamp,
863
unsigned long resolution)
864
{
865
/* Do not lock cable->lock here because timer->lock is already hold.
866
* There are other functions which first lock cable->lock and than
867
* timer->lock e.g.
868
* loopback_trigger()
869
* spin_lock(&cable->lock)
870
* loopback_snd_timer_start()
871
* snd_timer_start()
872
* spin_lock(&timer->lock)
873
* Therefore when using the oposit order of locks here it could result
874
* in a deadlock.
875
*/
876
877
if (event == SNDRV_TIMER_EVENT_MSTOP) {
878
struct loopback_cable *cable = timeri->callback_data;
879
880
/* sound card of the timer was stopped. Therefore there will not
881
* be any further timer callbacks. Due to this forward audio
882
* data from here if in draining state. When still in running
883
* state the streaming will be aborted by the usual timeout. It
884
* should not be aborted here because may be the timer sound
885
* card does only a recovery and the timer is back soon.
886
* This work triggers loopback_snd_timer_work()
887
*/
888
schedule_work(&cable->snd_timer.event_work);
889
}
890
}
891
892
static void loopback_jiffies_timer_dpcm_info(struct loopback_pcm *dpcm,
893
struct snd_info_buffer *buffer)
894
{
895
snd_iprintf(buffer, " update_pending:\t%u\n",
896
dpcm->period_update_pending);
897
snd_iprintf(buffer, " irq_pos:\t\t%u\n", dpcm->irq_pos);
898
snd_iprintf(buffer, " period_frac:\t%u\n", dpcm->period_size_frac);
899
snd_iprintf(buffer, " last_jiffies:\t%lu (%lu)\n",
900
dpcm->last_jiffies, jiffies);
901
snd_iprintf(buffer, " timer_expires:\t%lu\n", dpcm->timer.expires);
902
}
903
904
static void loopback_snd_timer_dpcm_info(struct loopback_pcm *dpcm,
905
struct snd_info_buffer *buffer)
906
{
907
struct loopback_cable *cable = dpcm->cable;
908
909
snd_iprintf(buffer, " sound timer:\thw:%d,%d,%d\n",
910
cable->snd_timer.id.card,
911
cable->snd_timer.id.device,
912
cable->snd_timer.id.subdevice);
913
snd_iprintf(buffer, " timer open:\t\t%s\n",
914
snd_pcm_direction_name(cable->snd_timer.stream));
915
}
916
917
static snd_pcm_uframes_t loopback_pointer(struct snd_pcm_substream *substream)
918
{
919
struct snd_pcm_runtime *runtime = substream->runtime;
920
struct loopback_pcm *dpcm = runtime->private_data;
921
snd_pcm_uframes_t pos;
922
923
guard(spinlock)(&dpcm->cable->lock);
924
if (dpcm->cable->ops->pos_update)
925
dpcm->cable->ops->pos_update(dpcm->cable);
926
pos = dpcm->buf_pos;
927
return bytes_to_frames(runtime, pos);
928
}
929
930
static const struct snd_pcm_hardware loopback_pcm_hardware =
931
{
932
.info = (SNDRV_PCM_INFO_INTERLEAVED | SNDRV_PCM_INFO_MMAP |
933
SNDRV_PCM_INFO_MMAP_VALID | SNDRV_PCM_INFO_PAUSE |
934
SNDRV_PCM_INFO_RESUME | SNDRV_PCM_INFO_NONINTERLEAVED),
935
.formats = (SNDRV_PCM_FMTBIT_S16_LE | SNDRV_PCM_FMTBIT_S16_BE |
936
SNDRV_PCM_FMTBIT_S24_LE | SNDRV_PCM_FMTBIT_S24_BE |
937
SNDRV_PCM_FMTBIT_S24_3LE | SNDRV_PCM_FMTBIT_S24_3BE |
938
SNDRV_PCM_FMTBIT_S32_LE | SNDRV_PCM_FMTBIT_S32_BE |
939
SNDRV_PCM_FMTBIT_FLOAT_LE | SNDRV_PCM_FMTBIT_FLOAT_BE |
940
SNDRV_PCM_FMTBIT_DSD_U8 |
941
SNDRV_PCM_FMTBIT_DSD_U16_LE | SNDRV_PCM_FMTBIT_DSD_U16_BE |
942
SNDRV_PCM_FMTBIT_DSD_U32_LE | SNDRV_PCM_FMTBIT_DSD_U32_BE),
943
.rates = SNDRV_PCM_RATE_CONTINUOUS | SNDRV_PCM_RATE_8000_768000,
944
.rate_min = 8000,
945
.rate_max = 768000,
946
.channels_min = 1,
947
.channels_max = 32,
948
.buffer_bytes_max = 2 * 1024 * 1024,
949
.period_bytes_min = 64,
950
/* note check overflow in frac_pos() using pcm_rate_shift before
951
changing period_bytes_max value */
952
.period_bytes_max = 1024 * 1024,
953
.periods_min = 1,
954
.periods_max = 1024,
955
.fifo_size = 0,
956
};
957
958
static void loopback_runtime_free(struct snd_pcm_runtime *runtime)
959
{
960
struct loopback_pcm *dpcm = runtime->private_data;
961
kfree(dpcm);
962
}
963
964
static int loopback_hw_free(struct snd_pcm_substream *substream)
965
{
966
struct snd_pcm_runtime *runtime = substream->runtime;
967
struct loopback_pcm *dpcm = runtime->private_data;
968
struct loopback_cable *cable = dpcm->cable;
969
970
guard(mutex)(&dpcm->loopback->cable_lock);
971
cable->valid &= ~(1 << substream->stream);
972
return 0;
973
}
974
975
static unsigned int get_cable_index(struct snd_pcm_substream *substream)
976
{
977
if (!substream->pcm->device)
978
return substream->stream;
979
else
980
return !substream->stream;
981
}
982
983
static int rule_format(struct snd_pcm_hw_params *params,
984
struct snd_pcm_hw_rule *rule)
985
{
986
struct loopback_pcm *dpcm = rule->private;
987
struct loopback_cable *cable = dpcm->cable;
988
struct snd_mask m;
989
990
snd_mask_none(&m);
991
scoped_guard(mutex, &dpcm->loopback->cable_lock) {
992
m.bits[0] = (u_int32_t)cable->hw.formats;
993
m.bits[1] = (u_int32_t)(cable->hw.formats >> 32);
994
}
995
return snd_mask_refine(hw_param_mask(params, rule->var), &m);
996
}
997
998
static int rule_rate(struct snd_pcm_hw_params *params,
999
struct snd_pcm_hw_rule *rule)
1000
{
1001
struct loopback_pcm *dpcm = rule->private;
1002
struct loopback_cable *cable = dpcm->cable;
1003
struct snd_interval t;
1004
1005
scoped_guard(mutex, &dpcm->loopback->cable_lock) {
1006
t.min = cable->hw.rate_min;
1007
t.max = cable->hw.rate_max;
1008
}
1009
t.openmin = t.openmax = 0;
1010
t.integer = 0;
1011
return snd_interval_refine(hw_param_interval(params, rule->var), &t);
1012
}
1013
1014
static int rule_channels(struct snd_pcm_hw_params *params,
1015
struct snd_pcm_hw_rule *rule)
1016
{
1017
struct loopback_pcm *dpcm = rule->private;
1018
struct loopback_cable *cable = dpcm->cable;
1019
struct snd_interval t;
1020
1021
scoped_guard(mutex, &dpcm->loopback->cable_lock) {
1022
t.min = cable->hw.channels_min;
1023
t.max = cable->hw.channels_max;
1024
}
1025
t.openmin = t.openmax = 0;
1026
t.integer = 0;
1027
return snd_interval_refine(hw_param_interval(params, rule->var), &t);
1028
}
1029
1030
static int rule_period_bytes(struct snd_pcm_hw_params *params,
1031
struct snd_pcm_hw_rule *rule)
1032
{
1033
struct loopback_pcm *dpcm = rule->private;
1034
struct loopback_cable *cable = dpcm->cable;
1035
struct snd_interval t;
1036
1037
scoped_guard(mutex, &dpcm->loopback->cable_lock) {
1038
t.min = cable->hw.period_bytes_min;
1039
t.max = cable->hw.period_bytes_max;
1040
}
1041
t.openmin = 0;
1042
t.openmax = 0;
1043
t.integer = 0;
1044
return snd_interval_refine(hw_param_interval(params, rule->var), &t);
1045
}
1046
1047
static void free_cable(struct snd_pcm_substream *substream)
1048
{
1049
struct loopback *loopback = substream->private_data;
1050
int dev = get_cable_index(substream);
1051
struct loopback_cable *cable;
1052
1053
cable = loopback->cables[substream->number][dev];
1054
if (!cable)
1055
return;
1056
if (cable->streams[!substream->stream]) {
1057
/* other stream is still alive */
1058
guard(spinlock_irq)(&cable->lock);
1059
cable->streams[substream->stream] = NULL;
1060
} else {
1061
struct loopback_pcm *dpcm = substream->runtime->private_data;
1062
1063
if (cable->ops && cable->ops->close_cable && dpcm)
1064
cable->ops->close_cable(dpcm);
1065
/* free the cable */
1066
loopback->cables[substream->number][dev] = NULL;
1067
kfree(cable);
1068
}
1069
}
1070
1071
static int loopback_jiffies_timer_open(struct loopback_pcm *dpcm)
1072
{
1073
timer_setup(&dpcm->timer, loopback_jiffies_timer_function, 0);
1074
1075
return 0;
1076
}
1077
1078
static const struct loopback_ops loopback_jiffies_timer_ops = {
1079
.open = loopback_jiffies_timer_open,
1080
.start = loopback_jiffies_timer_start,
1081
.stop = loopback_jiffies_timer_stop,
1082
.stop_sync = loopback_jiffies_timer_stop_sync,
1083
.close_substream = loopback_jiffies_timer_stop_sync,
1084
.pos_update = loopback_jiffies_timer_pos_update,
1085
.dpcm_info = loopback_jiffies_timer_dpcm_info,
1086
};
1087
1088
static int loopback_parse_timer_id(const char *str,
1089
struct snd_timer_id *tid)
1090
{
1091
/* [<pref>:](<card name>|<card idx>)[{.,}<dev idx>[{.,}<subdev idx>]] */
1092
const char * const sep_dev = ".,";
1093
const char * const sep_pref = ":";
1094
const char *name = str;
1095
char *sep, save = '\0';
1096
int card_idx = 0, dev = 0, subdev = 0;
1097
int err;
1098
1099
sep = strpbrk(str, sep_pref);
1100
if (sep)
1101
name = sep + 1;
1102
sep = strpbrk(name, sep_dev);
1103
if (sep) {
1104
save = *sep;
1105
*sep = '\0';
1106
}
1107
err = kstrtoint(name, 0, &card_idx);
1108
if (err == -EINVAL) {
1109
/* Must be the name, not number */
1110
for (card_idx = 0; card_idx < snd_ecards_limit; card_idx++) {
1111
struct snd_card *card = snd_card_ref(card_idx);
1112
1113
if (card) {
1114
if (!strcmp(card->id, name))
1115
err = 0;
1116
snd_card_unref(card);
1117
}
1118
if (!err)
1119
break;
1120
}
1121
}
1122
if (sep) {
1123
*sep = save;
1124
if (!err) {
1125
char *sep2, save2 = '\0';
1126
1127
sep2 = strpbrk(sep + 1, sep_dev);
1128
if (sep2) {
1129
save2 = *sep2;
1130
*sep2 = '\0';
1131
}
1132
err = kstrtoint(sep + 1, 0, &dev);
1133
if (sep2) {
1134
*sep2 = save2;
1135
if (!err)
1136
err = kstrtoint(sep2 + 1, 0, &subdev);
1137
}
1138
}
1139
}
1140
if (card_idx == -1)
1141
tid->dev_class = SNDRV_TIMER_CLASS_GLOBAL;
1142
if (!err && tid) {
1143
tid->card = card_idx;
1144
tid->device = dev;
1145
tid->subdevice = subdev;
1146
}
1147
return err;
1148
}
1149
1150
/* call in loopback->cable_lock */
1151
static int loopback_snd_timer_open(struct loopback_pcm *dpcm)
1152
{
1153
int err = 0;
1154
struct snd_timer_id tid = {
1155
.dev_class = SNDRV_TIMER_CLASS_PCM,
1156
.dev_sclass = SNDRV_TIMER_SCLASS_APPLICATION,
1157
};
1158
struct snd_timer_instance *timeri;
1159
struct loopback_cable *cable = dpcm->cable;
1160
1161
/* check if timer was already opened. It is only opened once
1162
* per playback and capture subdevice (aka cable).
1163
*/
1164
if (cable->snd_timer.instance)
1165
goto exit;
1166
1167
err = loopback_parse_timer_id(dpcm->loopback->timer_source, &tid);
1168
if (err < 0) {
1169
pcm_err(dpcm->substream->pcm,
1170
"Parsing timer source \'%s\' failed with %d",
1171
dpcm->loopback->timer_source, err);
1172
goto exit;
1173
}
1174
1175
cable->snd_timer.stream = dpcm->substream->stream;
1176
cable->snd_timer.id = tid;
1177
1178
timeri = snd_timer_instance_new(dpcm->loopback->card->id);
1179
if (!timeri) {
1180
err = -ENOMEM;
1181
goto exit;
1182
}
1183
/* The callback has to be called from another work. If
1184
* SNDRV_TIMER_IFLG_FAST is specified it will be called from the
1185
* snd_pcm_period_elapsed() call of the selected sound card.
1186
* snd_pcm_period_elapsed() helds snd_pcm_stream_lock_irqsave().
1187
* Due to our callback loopback_snd_timer_function() also calls
1188
* snd_pcm_period_elapsed() which calls snd_pcm_stream_lock_irqsave().
1189
* This would end up in a dead lock.
1190
*/
1191
timeri->flags |= SNDRV_TIMER_IFLG_AUTO;
1192
timeri->callback = loopback_snd_timer_function;
1193
timeri->callback_data = (void *)cable;
1194
timeri->ccallback = loopback_snd_timer_event;
1195
1196
/* initialise a work used for draining */
1197
INIT_WORK(&cable->snd_timer.event_work, loopback_snd_timer_work);
1198
1199
/* The mutex loopback->cable_lock is kept locked.
1200
* Therefore snd_timer_open() cannot be called a second time
1201
* by the other device of the same cable.
1202
* Therefore the following issue cannot happen:
1203
* [proc1] Call loopback_timer_open() ->
1204
* Unlock cable->lock for snd_timer_close/open() call
1205
* [proc2] Call loopback_timer_open() -> snd_timer_open(),
1206
* snd_timer_start()
1207
* [proc1] Call snd_timer_open() and overwrite running timer
1208
* instance
1209
*/
1210
err = snd_timer_open(timeri, &cable->snd_timer.id, current->pid);
1211
if (err < 0) {
1212
pcm_err(dpcm->substream->pcm,
1213
"snd_timer_open (%d,%d,%d) failed with %d",
1214
cable->snd_timer.id.card,
1215
cable->snd_timer.id.device,
1216
cable->snd_timer.id.subdevice,
1217
err);
1218
snd_timer_instance_free(timeri);
1219
goto exit;
1220
}
1221
1222
cable->snd_timer.instance = timeri;
1223
1224
exit:
1225
return err;
1226
}
1227
1228
/* stop_sync() is not required for sound timer because it does not need to be
1229
* restarted in loopback_prepare() on Xrun recovery
1230
*/
1231
static const struct loopback_ops loopback_snd_timer_ops = {
1232
.open = loopback_snd_timer_open,
1233
.start = loopback_snd_timer_start,
1234
.stop = loopback_snd_timer_stop,
1235
.close_cable = loopback_snd_timer_close_cable,
1236
.dpcm_info = loopback_snd_timer_dpcm_info,
1237
};
1238
1239
static int loopback_open(struct snd_pcm_substream *substream)
1240
{
1241
struct snd_pcm_runtime *runtime = substream->runtime;
1242
struct loopback *loopback = substream->private_data;
1243
struct loopback_pcm *dpcm;
1244
struct loopback_cable *cable = NULL;
1245
int err = 0;
1246
int dev = get_cable_index(substream);
1247
1248
guard(mutex)(&loopback->cable_lock);
1249
dpcm = kzalloc(sizeof(*dpcm), GFP_KERNEL);
1250
if (!dpcm)
1251
return -ENOMEM;
1252
dpcm->loopback = loopback;
1253
dpcm->substream = substream;
1254
1255
cable = loopback->cables[substream->number][dev];
1256
if (!cable) {
1257
cable = kzalloc(sizeof(*cable), GFP_KERNEL);
1258
if (!cable) {
1259
err = -ENOMEM;
1260
goto unlock;
1261
}
1262
spin_lock_init(&cable->lock);
1263
cable->hw = loopback_pcm_hardware;
1264
if (loopback->timer_source)
1265
cable->ops = &loopback_snd_timer_ops;
1266
else
1267
cable->ops = &loopback_jiffies_timer_ops;
1268
loopback->cables[substream->number][dev] = cable;
1269
}
1270
dpcm->cable = cable;
1271
runtime->private_data = dpcm;
1272
1273
if (cable->ops->open) {
1274
err = cable->ops->open(dpcm);
1275
if (err < 0)
1276
goto unlock;
1277
}
1278
1279
snd_pcm_hw_constraint_integer(runtime, SNDRV_PCM_HW_PARAM_PERIODS);
1280
1281
/* use dynamic rules based on actual runtime->hw values */
1282
/* note that the default rules created in the PCM midlevel code */
1283
/* are cached -> they do not reflect the actual state */
1284
err = snd_pcm_hw_rule_add(runtime, 0,
1285
SNDRV_PCM_HW_PARAM_FORMAT,
1286
rule_format, dpcm,
1287
SNDRV_PCM_HW_PARAM_FORMAT, -1);
1288
if (err < 0)
1289
goto unlock;
1290
err = snd_pcm_hw_rule_add(runtime, 0,
1291
SNDRV_PCM_HW_PARAM_RATE,
1292
rule_rate, dpcm,
1293
SNDRV_PCM_HW_PARAM_RATE, -1);
1294
if (err < 0)
1295
goto unlock;
1296
err = snd_pcm_hw_rule_add(runtime, 0,
1297
SNDRV_PCM_HW_PARAM_CHANNELS,
1298
rule_channels, dpcm,
1299
SNDRV_PCM_HW_PARAM_CHANNELS, -1);
1300
if (err < 0)
1301
goto unlock;
1302
1303
/* In case of sound timer the period time of both devices of the same
1304
* loop has to be the same.
1305
* This rule only takes effect if a sound timer was chosen
1306
*/
1307
if (cable->snd_timer.instance) {
1308
err = snd_pcm_hw_rule_add(runtime, 0,
1309
SNDRV_PCM_HW_PARAM_PERIOD_BYTES,
1310
rule_period_bytes, dpcm,
1311
SNDRV_PCM_HW_PARAM_PERIOD_BYTES, -1);
1312
if (err < 0)
1313
goto unlock;
1314
}
1315
1316
/* loopback_runtime_free() has not to be called if kfree(dpcm) was
1317
* already called here. Otherwise it will end up with a double free.
1318
*/
1319
runtime->private_free = loopback_runtime_free;
1320
if (get_notify(dpcm))
1321
runtime->hw = loopback_pcm_hardware;
1322
else
1323
runtime->hw = cable->hw;
1324
1325
scoped_guard(spinlock_irq, &cable->lock) {
1326
cable->streams[substream->stream] = dpcm;
1327
}
1328
1329
unlock:
1330
if (err < 0) {
1331
free_cable(substream);
1332
kfree(dpcm);
1333
}
1334
return err;
1335
}
1336
1337
static int loopback_close(struct snd_pcm_substream *substream)
1338
{
1339
struct loopback *loopback = substream->private_data;
1340
struct loopback_pcm *dpcm = substream->runtime->private_data;
1341
int err = 0;
1342
1343
if (dpcm->cable->ops->close_substream)
1344
err = dpcm->cable->ops->close_substream(dpcm);
1345
guard(mutex)(&loopback->cable_lock);
1346
free_cable(substream);
1347
return err;
1348
}
1349
1350
static const struct snd_pcm_ops loopback_pcm_ops = {
1351
.open = loopback_open,
1352
.close = loopback_close,
1353
.hw_free = loopback_hw_free,
1354
.prepare = loopback_prepare,
1355
.trigger = loopback_trigger,
1356
.pointer = loopback_pointer,
1357
};
1358
1359
static int loopback_pcm_new(struct loopback *loopback,
1360
int device, int substreams)
1361
{
1362
struct snd_pcm *pcm;
1363
int err;
1364
1365
err = snd_pcm_new(loopback->card, "Loopback PCM", device,
1366
substreams, substreams, &pcm);
1367
if (err < 0)
1368
return err;
1369
snd_pcm_set_ops(pcm, SNDRV_PCM_STREAM_PLAYBACK, &loopback_pcm_ops);
1370
snd_pcm_set_ops(pcm, SNDRV_PCM_STREAM_CAPTURE, &loopback_pcm_ops);
1371
snd_pcm_set_managed_buffer_all(pcm, SNDRV_DMA_TYPE_VMALLOC, NULL, 0, 0);
1372
1373
pcm->private_data = loopback;
1374
pcm->info_flags = 0;
1375
strscpy(pcm->name, "Loopback PCM");
1376
1377
loopback->pcm[device] = pcm;
1378
return 0;
1379
}
1380
1381
static int loopback_rate_shift_info(struct snd_kcontrol *kcontrol,
1382
struct snd_ctl_elem_info *uinfo)
1383
{
1384
uinfo->type = SNDRV_CTL_ELEM_TYPE_INTEGER;
1385
uinfo->count = 1;
1386
uinfo->value.integer.min = 80000;
1387
uinfo->value.integer.max = 120000;
1388
uinfo->value.integer.step = 1;
1389
return 0;
1390
}
1391
1392
static int loopback_rate_shift_get(struct snd_kcontrol *kcontrol,
1393
struct snd_ctl_elem_value *ucontrol)
1394
{
1395
struct loopback *loopback = snd_kcontrol_chip(kcontrol);
1396
1397
guard(mutex)(&loopback->cable_lock);
1398
ucontrol->value.integer.value[0] =
1399
loopback->setup[kcontrol->id.subdevice]
1400
[kcontrol->id.device].rate_shift;
1401
return 0;
1402
}
1403
1404
static int loopback_rate_shift_put(struct snd_kcontrol *kcontrol,
1405
struct snd_ctl_elem_value *ucontrol)
1406
{
1407
struct loopback *loopback = snd_kcontrol_chip(kcontrol);
1408
unsigned int val;
1409
int change = 0;
1410
1411
val = ucontrol->value.integer.value[0];
1412
if (val < 80000)
1413
val = 80000;
1414
if (val > 120000)
1415
val = 120000;
1416
guard(mutex)(&loopback->cable_lock);
1417
if (val != loopback->setup[kcontrol->id.subdevice]
1418
[kcontrol->id.device].rate_shift) {
1419
loopback->setup[kcontrol->id.subdevice]
1420
[kcontrol->id.device].rate_shift = val;
1421
change = 1;
1422
}
1423
return change;
1424
}
1425
1426
static int loopback_notify_get(struct snd_kcontrol *kcontrol,
1427
struct snd_ctl_elem_value *ucontrol)
1428
{
1429
struct loopback *loopback = snd_kcontrol_chip(kcontrol);
1430
1431
guard(mutex)(&loopback->cable_lock);
1432
ucontrol->value.integer.value[0] =
1433
loopback->setup[kcontrol->id.subdevice]
1434
[kcontrol->id.device].notify;
1435
return 0;
1436
}
1437
1438
static int loopback_notify_put(struct snd_kcontrol *kcontrol,
1439
struct snd_ctl_elem_value *ucontrol)
1440
{
1441
struct loopback *loopback = snd_kcontrol_chip(kcontrol);
1442
unsigned int val;
1443
int change = 0;
1444
1445
val = ucontrol->value.integer.value[0] ? 1 : 0;
1446
guard(mutex)(&loopback->cable_lock);
1447
if (val != loopback->setup[kcontrol->id.subdevice]
1448
[kcontrol->id.device].notify) {
1449
loopback->setup[kcontrol->id.subdevice]
1450
[kcontrol->id.device].notify = val;
1451
change = 1;
1452
}
1453
return change;
1454
}
1455
1456
static int loopback_active_get(struct snd_kcontrol *kcontrol,
1457
struct snd_ctl_elem_value *ucontrol)
1458
{
1459
struct loopback *loopback = snd_kcontrol_chip(kcontrol);
1460
struct loopback_cable *cable;
1461
1462
unsigned int val = 0;
1463
1464
guard(mutex)(&loopback->cable_lock);
1465
cable = loopback->cables[kcontrol->id.subdevice][kcontrol->id.device ^ 1];
1466
if (cable != NULL) {
1467
unsigned int running = cable->running ^ cable->pause;
1468
1469
val = (running & (1 << SNDRV_PCM_STREAM_PLAYBACK)) ? 1 : 0;
1470
}
1471
ucontrol->value.integer.value[0] = val;
1472
return 0;
1473
}
1474
1475
static int loopback_format_info(struct snd_kcontrol *kcontrol,
1476
struct snd_ctl_elem_info *uinfo)
1477
{
1478
uinfo->type = SNDRV_CTL_ELEM_TYPE_INTEGER;
1479
uinfo->count = 1;
1480
uinfo->value.integer.min = 0;
1481
uinfo->value.integer.max = (__force int)SNDRV_PCM_FORMAT_LAST;
1482
uinfo->value.integer.step = 1;
1483
return 0;
1484
}
1485
1486
static int loopback_format_get(struct snd_kcontrol *kcontrol,
1487
struct snd_ctl_elem_value *ucontrol)
1488
{
1489
struct loopback *loopback = snd_kcontrol_chip(kcontrol);
1490
1491
ucontrol->value.integer.value[0] =
1492
(__force int)loopback->setup[kcontrol->id.subdevice]
1493
[kcontrol->id.device].format;
1494
return 0;
1495
}
1496
1497
static int loopback_rate_info(struct snd_kcontrol *kcontrol,
1498
struct snd_ctl_elem_info *uinfo)
1499
{
1500
uinfo->type = SNDRV_CTL_ELEM_TYPE_INTEGER;
1501
uinfo->count = 1;
1502
uinfo->value.integer.min = 0;
1503
uinfo->value.integer.max = 192000;
1504
uinfo->value.integer.step = 1;
1505
return 0;
1506
}
1507
1508
static int loopback_rate_get(struct snd_kcontrol *kcontrol,
1509
struct snd_ctl_elem_value *ucontrol)
1510
{
1511
struct loopback *loopback = snd_kcontrol_chip(kcontrol);
1512
1513
guard(mutex)(&loopback->cable_lock);
1514
ucontrol->value.integer.value[0] =
1515
loopback->setup[kcontrol->id.subdevice]
1516
[kcontrol->id.device].rate;
1517
return 0;
1518
}
1519
1520
static int loopback_channels_info(struct snd_kcontrol *kcontrol,
1521
struct snd_ctl_elem_info *uinfo)
1522
{
1523
uinfo->type = SNDRV_CTL_ELEM_TYPE_INTEGER;
1524
uinfo->count = 1;
1525
uinfo->value.integer.min = 1;
1526
uinfo->value.integer.max = 1024;
1527
uinfo->value.integer.step = 1;
1528
return 0;
1529
}
1530
1531
static int loopback_channels_get(struct snd_kcontrol *kcontrol,
1532
struct snd_ctl_elem_value *ucontrol)
1533
{
1534
struct loopback *loopback = snd_kcontrol_chip(kcontrol);
1535
1536
guard(mutex)(&loopback->cable_lock);
1537
ucontrol->value.integer.value[0] =
1538
loopback->setup[kcontrol->id.subdevice]
1539
[kcontrol->id.device].channels;
1540
return 0;
1541
}
1542
1543
static int loopback_access_info(struct snd_kcontrol *kcontrol,
1544
struct snd_ctl_elem_info *uinfo)
1545
{
1546
const char * const texts[] = {"Interleaved", "Non-interleaved"};
1547
1548
return snd_ctl_enum_info(uinfo, 1, ARRAY_SIZE(texts), texts);
1549
}
1550
1551
static int loopback_access_get(struct snd_kcontrol *kcontrol,
1552
struct snd_ctl_elem_value *ucontrol)
1553
{
1554
struct loopback *loopback = snd_kcontrol_chip(kcontrol);
1555
snd_pcm_access_t access;
1556
1557
guard(mutex)(&loopback->cable_lock);
1558
access = loopback->setup[kcontrol->id.subdevice][kcontrol->id.device].access;
1559
1560
ucontrol->value.enumerated.item[0] = !is_access_interleaved(access);
1561
1562
return 0;
1563
}
1564
1565
static const struct snd_kcontrol_new loopback_controls[] = {
1566
{
1567
.iface = SNDRV_CTL_ELEM_IFACE_PCM,
1568
.name = "PCM Rate Shift 100000",
1569
.info = loopback_rate_shift_info,
1570
.get = loopback_rate_shift_get,
1571
.put = loopback_rate_shift_put,
1572
},
1573
{
1574
.iface = SNDRV_CTL_ELEM_IFACE_PCM,
1575
.name = "PCM Notify",
1576
.info = snd_ctl_boolean_mono_info,
1577
.get = loopback_notify_get,
1578
.put = loopback_notify_put,
1579
},
1580
#define ACTIVE_IDX 2
1581
{
1582
.access = SNDRV_CTL_ELEM_ACCESS_READ,
1583
.iface = SNDRV_CTL_ELEM_IFACE_PCM,
1584
.name = "PCM Slave Active",
1585
.info = snd_ctl_boolean_mono_info,
1586
.get = loopback_active_get,
1587
},
1588
#define FORMAT_IDX 3
1589
{
1590
.access = SNDRV_CTL_ELEM_ACCESS_READ,
1591
.iface = SNDRV_CTL_ELEM_IFACE_PCM,
1592
.name = "PCM Slave Format",
1593
.info = loopback_format_info,
1594
.get = loopback_format_get
1595
},
1596
#define RATE_IDX 4
1597
{
1598
.access = SNDRV_CTL_ELEM_ACCESS_READ,
1599
.iface = SNDRV_CTL_ELEM_IFACE_PCM,
1600
.name = "PCM Slave Rate",
1601
.info = loopback_rate_info,
1602
.get = loopback_rate_get
1603
},
1604
#define CHANNELS_IDX 5
1605
{
1606
.access = SNDRV_CTL_ELEM_ACCESS_READ,
1607
.iface = SNDRV_CTL_ELEM_IFACE_PCM,
1608
.name = "PCM Slave Channels",
1609
.info = loopback_channels_info,
1610
.get = loopback_channels_get
1611
},
1612
#define ACCESS_IDX 6
1613
{
1614
.access = SNDRV_CTL_ELEM_ACCESS_READ,
1615
.iface = SNDRV_CTL_ELEM_IFACE_PCM,
1616
.name = "PCM Slave Access Mode",
1617
.info = loopback_access_info,
1618
.get = loopback_access_get,
1619
},
1620
};
1621
1622
static int loopback_mixer_new(struct loopback *loopback, int notify)
1623
{
1624
struct snd_card *card = loopback->card;
1625
struct snd_pcm *pcm;
1626
struct snd_kcontrol *kctl;
1627
struct loopback_setup *setup;
1628
int err, dev, substr, substr_count, idx;
1629
1630
strscpy(card->mixername, "Loopback Mixer");
1631
for (dev = 0; dev < 2; dev++) {
1632
pcm = loopback->pcm[dev];
1633
substr_count =
1634
pcm->streams[SNDRV_PCM_STREAM_CAPTURE].substream_count;
1635
for (substr = 0; substr < substr_count; substr++) {
1636
setup = &loopback->setup[substr][dev];
1637
setup->notify = notify;
1638
setup->rate_shift = NO_PITCH;
1639
setup->format = SNDRV_PCM_FORMAT_S16_LE;
1640
setup->access = SNDRV_PCM_ACCESS_RW_INTERLEAVED;
1641
setup->rate = 48000;
1642
setup->channels = 2;
1643
for (idx = 0; idx < ARRAY_SIZE(loopback_controls);
1644
idx++) {
1645
kctl = snd_ctl_new1(&loopback_controls[idx],
1646
loopback);
1647
if (!kctl)
1648
return -ENOMEM;
1649
kctl->id.device = dev;
1650
kctl->id.subdevice = substr;
1651
1652
/* Add the control before copying the id so that
1653
* the numid field of the id is set in the copy.
1654
*/
1655
err = snd_ctl_add(card, kctl);
1656
if (err < 0)
1657
return err;
1658
1659
switch (idx) {
1660
case ACTIVE_IDX:
1661
setup->active_id = kctl->id;
1662
break;
1663
case FORMAT_IDX:
1664
setup->format_id = kctl->id;
1665
break;
1666
case RATE_IDX:
1667
setup->rate_id = kctl->id;
1668
break;
1669
case CHANNELS_IDX:
1670
setup->channels_id = kctl->id;
1671
break;
1672
case ACCESS_IDX:
1673
setup->access_id = kctl->id;
1674
break;
1675
default:
1676
break;
1677
}
1678
}
1679
}
1680
}
1681
return 0;
1682
}
1683
1684
static void print_dpcm_info(struct snd_info_buffer *buffer,
1685
struct loopback_pcm *dpcm,
1686
const char *id)
1687
{
1688
snd_iprintf(buffer, " %s\n", id);
1689
if (dpcm == NULL) {
1690
snd_iprintf(buffer, " inactive\n");
1691
return;
1692
}
1693
snd_iprintf(buffer, " buffer_size:\t%u\n", dpcm->pcm_buffer_size);
1694
snd_iprintf(buffer, " buffer_pos:\t\t%u\n", dpcm->buf_pos);
1695
snd_iprintf(buffer, " silent_size:\t%u\n", dpcm->silent_size);
1696
snd_iprintf(buffer, " period_size:\t%u\n", dpcm->pcm_period_size);
1697
snd_iprintf(buffer, " bytes_per_sec:\t%u\n", dpcm->pcm_bps);
1698
snd_iprintf(buffer, " sample_align:\t%u\n", dpcm->pcm_salign);
1699
snd_iprintf(buffer, " rate_shift:\t\t%u\n", dpcm->pcm_rate_shift);
1700
if (dpcm->cable->ops->dpcm_info)
1701
dpcm->cable->ops->dpcm_info(dpcm, buffer);
1702
}
1703
1704
static void print_substream_info(struct snd_info_buffer *buffer,
1705
struct loopback *loopback,
1706
int sub,
1707
int num)
1708
{
1709
struct loopback_cable *cable = loopback->cables[sub][num];
1710
1711
snd_iprintf(buffer, "Cable %i substream %i:\n", num, sub);
1712
if (cable == NULL) {
1713
snd_iprintf(buffer, " inactive\n");
1714
return;
1715
}
1716
snd_iprintf(buffer, " valid: %u\n", cable->valid);
1717
snd_iprintf(buffer, " running: %u\n", cable->running);
1718
snd_iprintf(buffer, " pause: %u\n", cable->pause);
1719
print_dpcm_info(buffer, cable->streams[0], "Playback");
1720
print_dpcm_info(buffer, cable->streams[1], "Capture");
1721
}
1722
1723
static void print_cable_info(struct snd_info_entry *entry,
1724
struct snd_info_buffer *buffer)
1725
{
1726
struct loopback *loopback = entry->private_data;
1727
int sub, num;
1728
1729
guard(mutex)(&loopback->cable_lock);
1730
num = entry->name[strlen(entry->name)-1];
1731
num = num == '0' ? 0 : 1;
1732
for (sub = 0; sub < MAX_PCM_SUBSTREAMS; sub++)
1733
print_substream_info(buffer, loopback, sub, num);
1734
}
1735
1736
static int loopback_cable_proc_new(struct loopback *loopback, int cidx)
1737
{
1738
char name[32];
1739
1740
snprintf(name, sizeof(name), "cable#%d", cidx);
1741
return snd_card_ro_proc_new(loopback->card, name, loopback,
1742
print_cable_info);
1743
}
1744
1745
static void loopback_set_timer_source(struct loopback *loopback,
1746
const char *value)
1747
{
1748
if (loopback->timer_source) {
1749
devm_kfree(loopback->card->dev, loopback->timer_source);
1750
loopback->timer_source = NULL;
1751
}
1752
if (value && *value)
1753
loopback->timer_source = devm_kstrdup(loopback->card->dev,
1754
value, GFP_KERNEL);
1755
}
1756
1757
static void print_timer_source_info(struct snd_info_entry *entry,
1758
struct snd_info_buffer *buffer)
1759
{
1760
struct loopback *loopback = entry->private_data;
1761
1762
guard(mutex)(&loopback->cable_lock);
1763
snd_iprintf(buffer, "%s\n",
1764
loopback->timer_source ? loopback->timer_source : "");
1765
}
1766
1767
static void change_timer_source_info(struct snd_info_entry *entry,
1768
struct snd_info_buffer *buffer)
1769
{
1770
struct loopback *loopback = entry->private_data;
1771
char line[64];
1772
1773
guard(mutex)(&loopback->cable_lock);
1774
if (!snd_info_get_line(buffer, line, sizeof(line)))
1775
loopback_set_timer_source(loopback, strim(line));
1776
}
1777
1778
static int loopback_timer_source_proc_new(struct loopback *loopback)
1779
{
1780
return snd_card_rw_proc_new(loopback->card, "timer_source", loopback,
1781
print_timer_source_info,
1782
change_timer_source_info);
1783
}
1784
1785
static int loopback_probe(struct platform_device *devptr)
1786
{
1787
struct snd_card *card;
1788
struct loopback *loopback;
1789
int dev = devptr->id;
1790
int err;
1791
1792
err = snd_devm_card_new(&devptr->dev, index[dev], id[dev], THIS_MODULE,
1793
sizeof(struct loopback), &card);
1794
if (err < 0)
1795
return err;
1796
loopback = card->private_data;
1797
1798
if (pcm_substreams[dev] < 1)
1799
pcm_substreams[dev] = 1;
1800
if (pcm_substreams[dev] > MAX_PCM_SUBSTREAMS)
1801
pcm_substreams[dev] = MAX_PCM_SUBSTREAMS;
1802
1803
loopback->card = card;
1804
loopback_set_timer_source(loopback, timer_source[dev]);
1805
1806
mutex_init(&loopback->cable_lock);
1807
1808
err = loopback_pcm_new(loopback, 0, pcm_substreams[dev]);
1809
if (err < 0)
1810
return err;
1811
err = loopback_pcm_new(loopback, 1, pcm_substreams[dev]);
1812
if (err < 0)
1813
return err;
1814
err = loopback_mixer_new(loopback, pcm_notify[dev] ? 1 : 0);
1815
if (err < 0)
1816
return err;
1817
loopback_cable_proc_new(loopback, 0);
1818
loopback_cable_proc_new(loopback, 1);
1819
loopback_timer_source_proc_new(loopback);
1820
strscpy(card->driver, "Loopback");
1821
strscpy(card->shortname, "Loopback");
1822
sprintf(card->longname, "Loopback %i", dev + 1);
1823
err = snd_card_register(card);
1824
if (err < 0)
1825
return err;
1826
platform_set_drvdata(devptr, card);
1827
return 0;
1828
}
1829
1830
static int loopback_suspend(struct device *pdev)
1831
{
1832
struct snd_card *card = dev_get_drvdata(pdev);
1833
1834
snd_power_change_state(card, SNDRV_CTL_POWER_D3hot);
1835
return 0;
1836
}
1837
1838
static int loopback_resume(struct device *pdev)
1839
{
1840
struct snd_card *card = dev_get_drvdata(pdev);
1841
1842
snd_power_change_state(card, SNDRV_CTL_POWER_D0);
1843
return 0;
1844
}
1845
1846
static DEFINE_SIMPLE_DEV_PM_OPS(loopback_pm, loopback_suspend, loopback_resume);
1847
1848
#define SND_LOOPBACK_DRIVER "snd_aloop"
1849
1850
static struct platform_driver loopback_driver = {
1851
.probe = loopback_probe,
1852
.driver = {
1853
.name = SND_LOOPBACK_DRIVER,
1854
.pm = &loopback_pm,
1855
},
1856
};
1857
1858
static void loopback_unregister_all(void)
1859
{
1860
int i;
1861
1862
for (i = 0; i < ARRAY_SIZE(devices); ++i)
1863
platform_device_unregister(devices[i]);
1864
platform_driver_unregister(&loopback_driver);
1865
}
1866
1867
static int __init alsa_card_loopback_init(void)
1868
{
1869
int i, err, cards;
1870
1871
err = platform_driver_register(&loopback_driver);
1872
if (err < 0)
1873
return err;
1874
1875
1876
cards = 0;
1877
for (i = 0; i < SNDRV_CARDS; i++) {
1878
struct platform_device *device;
1879
if (!enable[i])
1880
continue;
1881
device = platform_device_register_simple(SND_LOOPBACK_DRIVER,
1882
i, NULL, 0);
1883
if (IS_ERR(device))
1884
continue;
1885
if (!platform_get_drvdata(device)) {
1886
platform_device_unregister(device);
1887
continue;
1888
}
1889
devices[i] = device;
1890
cards++;
1891
}
1892
if (!cards) {
1893
#ifdef MODULE
1894
pr_err("aloop: No loopback enabled\n");
1895
#endif
1896
loopback_unregister_all();
1897
return -ENODEV;
1898
}
1899
return 0;
1900
}
1901
1902
static void __exit alsa_card_loopback_exit(void)
1903
{
1904
loopback_unregister_all();
1905
}
1906
1907
module_init(alsa_card_loopback_init)
1908
module_exit(alsa_card_loopback_exit)
1909
1910