3 * Copyright (c) by Jaroslav Kysela <perex@perex.cz>
5 * This program is free software; you can redistribute it and/or modify
6 * it under the terms of the GNU General Public License as published by
7 * the Free Software Foundation; either version 2 of the License, or
8 * (at your option) any later version.
10 * This program is distributed in the hope that it will be useful,
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 * GNU General Public License for more details.
15 * You should have received a copy of the GNU General Public License
16 * along with this program; if not, write to the Free Software
17 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
21 #include <linux/init.h>
22 #include <linux/err.h>
23 #include <linux/platform_device.h>
24 #include <linux/jiffies.h>
25 #include <linux/slab.h>
26 #include <linux/time.h>
27 #include <linux/wait.h>
28 #include <linux/hrtimer.h>
29 #include <linux/math64.h>
30 #include <linux/moduleparam.h>
31 #include <sound/core.h>
32 #include <sound/control.h>
33 #include <sound/tlv.h>
34 #include <sound/pcm.h>
35 #include <sound/rawmidi.h>
36 #include <sound/info.h>
37 #include <sound/initval.h>
39 MODULE_AUTHOR("Jaroslav Kysela <perex@perex.cz>");
40 MODULE_DESCRIPTION("Dummy soundcard (/dev/null)");
41 MODULE_LICENSE("GPL");
42 MODULE_SUPPORTED_DEVICE("{{ALSA,Dummy soundcard}}");
44 #define MAX_PCM_DEVICES 4
45 #define MAX_PCM_SUBSTREAMS 128
46 #define MAX_MIDI_DEVICES 2
48 #if 0 /* emu10k1 emulation */
49 #define MAX_BUFFER_SIZE (128 * 1024)
50 static int emu10k1_playback_constraints(struct snd_pcm_runtime
*runtime
)
53 err
= snd_pcm_hw_constraint_integer(runtime
, SNDRV_PCM_HW_PARAM_PERIODS
);
56 err
= snd_pcm_hw_constraint_minmax(runtime
, SNDRV_PCM_HW_PARAM_BUFFER_BYTES
, 256, UINT_MAX
);
61 #define add_playback_constraints emu10k1_playback_constraints
64 #if 0 /* RME9652 emulation */
65 #define MAX_BUFFER_SIZE (26 * 64 * 1024)
66 #define USE_FORMATS SNDRV_PCM_FMTBIT_S32_LE
67 #define USE_CHANNELS_MIN 26
68 #define USE_CHANNELS_MAX 26
69 #define USE_PERIODS_MIN 2
70 #define USE_PERIODS_MAX 2
73 #if 0 /* ICE1712 emulation */
74 #define MAX_BUFFER_SIZE (256 * 1024)
75 #define USE_FORMATS SNDRV_PCM_FMTBIT_S32_LE
76 #define USE_CHANNELS_MIN 10
77 #define USE_CHANNELS_MAX 10
78 #define USE_PERIODS_MIN 1
79 #define USE_PERIODS_MAX 1024
82 #if 0 /* UDA1341 emulation */
83 #define MAX_BUFFER_SIZE (16380)
84 #define USE_FORMATS SNDRV_PCM_FMTBIT_S16_LE
85 #define USE_CHANNELS_MIN 2
86 #define USE_CHANNELS_MAX 2
87 #define USE_PERIODS_MIN 2
88 #define USE_PERIODS_MAX 255
91 #if 0 /* simple AC97 bridge (intel8x0) with 48kHz AC97 only codec */
92 #define USE_FORMATS SNDRV_PCM_FMTBIT_S16_LE
93 #define USE_CHANNELS_MIN 2
94 #define USE_CHANNELS_MAX 2
95 #define USE_RATE SNDRV_PCM_RATE_48000
96 #define USE_RATE_MIN 48000
97 #define USE_RATE_MAX 48000
101 #define USE_FORMATS SNDRV_PCM_FMTBIT_S16_LE
102 #define USE_CHANNELS_MIN 2
103 #define USE_CHANNELS_MAX 2
104 #define USE_RATE (SNDRV_PCM_RATE_48000|SNDRV_PCM_RATE_96000|SNDRV_PCM_RATE_192000)
105 #define USE_RATE_MIN 48000
106 #define USE_RATE_MAX 192000
107 #define MAX_BUFFER_SIZE ((65536-64)*8)
108 #define MAX_PERIOD_SIZE (65536-64)
109 #define USE_PERIODS_MIN 2
110 #define USE_PERIODS_MAX 8
115 #ifndef MAX_BUFFER_SIZE
116 #define MAX_BUFFER_SIZE (64*1024)
118 #ifndef MAX_PERIOD_SIZE
119 #define MAX_PERIOD_SIZE MAX_BUFFER_SIZE
122 #define USE_FORMATS (SNDRV_PCM_FMTBIT_U8 | SNDRV_PCM_FMTBIT_S16_LE)
125 #define USE_RATE SNDRV_PCM_RATE_CONTINUOUS | SNDRV_PCM_RATE_8000_48000
126 #define USE_RATE_MIN 5500
127 #define USE_RATE_MAX 48000
129 #ifndef USE_CHANNELS_MIN
130 #define USE_CHANNELS_MIN 1
132 #ifndef USE_CHANNELS_MAX
133 #define USE_CHANNELS_MAX 2
135 #ifndef USE_PERIODS_MIN
136 #define USE_PERIODS_MIN 1
138 #ifndef USE_PERIODS_MAX
139 #define USE_PERIODS_MAX 1024
141 #ifndef add_playback_constraints
142 #define add_playback_constraints(x) 0
144 #ifndef add_capture_constraints
145 #define add_capture_constraints(x) 0
148 static int index
[SNDRV_CARDS
] = SNDRV_DEFAULT_IDX
; /* Index 0-MAX */
149 static char *id
[SNDRV_CARDS
] = SNDRV_DEFAULT_STR
; /* ID for this card */
150 static int enable
[SNDRV_CARDS
] = {1, [1 ... (SNDRV_CARDS
- 1)] = 0};
151 static int pcm_devs
[SNDRV_CARDS
] = {[0 ... (SNDRV_CARDS
- 1)] = 1};
152 static int pcm_substreams
[SNDRV_CARDS
] = {[0 ... (SNDRV_CARDS
- 1)] = 8};
153 //static int midi_devs[SNDRV_CARDS] = {[0 ... (SNDRV_CARDS - 1)] = 2};
154 #ifdef CONFIG_HIGH_RES_TIMERS
155 static int hrtimer
= 1;
157 static int fake_buffer
= 1;
159 module_param_array(index
, int, NULL
, 0444);
160 MODULE_PARM_DESC(index
, "Index value for dummy soundcard.");
161 module_param_array(id
, charp
, NULL
, 0444);
162 MODULE_PARM_DESC(id
, "ID string for dummy soundcard.");
163 module_param_array(enable
, bool, NULL
, 0444);
164 MODULE_PARM_DESC(enable
, "Enable this dummy soundcard.");
165 module_param_array(pcm_devs
, int, NULL
, 0444);
166 MODULE_PARM_DESC(pcm_devs
, "PCM devices # (0-4) for dummy driver.");
167 module_param_array(pcm_substreams
, int, NULL
, 0444);
168 MODULE_PARM_DESC(pcm_substreams
, "PCM substreams # (1-16) for dummy driver.");
169 //module_param_array(midi_devs, int, NULL, 0444);
170 //MODULE_PARM_DESC(midi_devs, "MIDI devices # (0-2) for dummy driver.");
171 module_param(fake_buffer
, bool, 0444);
172 MODULE_PARM_DESC(fake_buffer
, "Fake buffer allocations.");
173 #ifdef CONFIG_HIGH_RES_TIMERS
174 module_param(hrtimer
, bool, 0644);
175 MODULE_PARM_DESC(hrtimer
, "Use hrtimer as the timer source.");
178 static struct platform_device
*devices
[SNDRV_CARDS
];
180 #define MIXER_ADDR_MASTER 0
181 #define MIXER_ADDR_LINE 1
182 #define MIXER_ADDR_MIC 2
183 #define MIXER_ADDR_SYNTH 3
184 #define MIXER_ADDR_CD 4
185 #define MIXER_ADDR_LAST 4
187 struct dummy_timer_ops
{
188 int (*create
)(struct snd_pcm_substream
*);
189 void (*free
)(struct snd_pcm_substream
*);
190 int (*prepare
)(struct snd_pcm_substream
*);
191 int (*start
)(struct snd_pcm_substream
*);
192 int (*stop
)(struct snd_pcm_substream
*);
193 snd_pcm_uframes_t (*pointer
)(struct snd_pcm_substream
*);
197 struct snd_card
*card
;
199 spinlock_t mixer_lock
;
200 int mixer_volume
[MIXER_ADDR_LAST
+1][2];
201 int capture_source
[MIXER_ADDR_LAST
+1][2];
202 const struct dummy_timer_ops
*timer_ops
;
206 * system timer interface
209 struct dummy_systimer_pcm
{
211 struct timer_list timer
;
212 unsigned long base_time
;
213 unsigned int frac_pos
; /* fractional sample position (based HZ) */
214 unsigned int frac_period_rest
;
215 unsigned int frac_buffer_size
; /* buffer_size * HZ */
216 unsigned int frac_period_size
; /* period_size * HZ */
219 struct snd_pcm_substream
*substream
;
222 static void dummy_systimer_rearm(struct dummy_systimer_pcm
*dpcm
)
224 dpcm
->timer
.expires
= jiffies
+
225 (dpcm
->frac_period_rest
+ dpcm
->rate
- 1) / dpcm
->rate
;
226 add_timer(&dpcm
->timer
);
229 static void dummy_systimer_update(struct dummy_systimer_pcm
*dpcm
)
233 delta
= jiffies
- dpcm
->base_time
;
236 dpcm
->base_time
+= delta
;
238 dpcm
->frac_pos
+= delta
;
239 while (dpcm
->frac_pos
>= dpcm
->frac_buffer_size
)
240 dpcm
->frac_pos
-= dpcm
->frac_buffer_size
;
241 while (dpcm
->frac_period_rest
<= delta
) {
243 dpcm
->frac_period_rest
+= dpcm
->frac_period_size
;
245 dpcm
->frac_period_rest
-= delta
;
248 static int dummy_systimer_start(struct snd_pcm_substream
*substream
)
250 struct dummy_systimer_pcm
*dpcm
= substream
->runtime
->private_data
;
251 spin_lock(&dpcm
->lock
);
252 dpcm
->base_time
= jiffies
;
253 dummy_systimer_rearm(dpcm
);
254 spin_unlock(&dpcm
->lock
);
258 static int dummy_systimer_stop(struct snd_pcm_substream
*substream
)
260 struct dummy_systimer_pcm
*dpcm
= substream
->runtime
->private_data
;
261 spin_lock(&dpcm
->lock
);
262 del_timer(&dpcm
->timer
);
263 spin_unlock(&dpcm
->lock
);
267 static int dummy_systimer_prepare(struct snd_pcm_substream
*substream
)
269 struct snd_pcm_runtime
*runtime
= substream
->runtime
;
270 struct dummy_systimer_pcm
*dpcm
= runtime
->private_data
;
273 dpcm
->rate
= runtime
->rate
;
274 dpcm
->frac_buffer_size
= runtime
->buffer_size
* HZ
;
275 dpcm
->frac_period_size
= runtime
->period_size
* HZ
;
276 dpcm
->frac_period_rest
= dpcm
->frac_period_size
;
282 static void dummy_systimer_callback(unsigned long data
)
284 struct dummy_systimer_pcm
*dpcm
= (struct dummy_systimer_pcm
*)data
;
288 spin_lock_irqsave(&dpcm
->lock
, flags
);
289 dummy_systimer_update(dpcm
);
290 dummy_systimer_rearm(dpcm
);
291 elapsed
= dpcm
->elapsed
;
293 spin_unlock_irqrestore(&dpcm
->lock
, flags
);
295 snd_pcm_period_elapsed(dpcm
->substream
);
298 static snd_pcm_uframes_t
299 dummy_systimer_pointer(struct snd_pcm_substream
*substream
)
301 struct dummy_systimer_pcm
*dpcm
= substream
->runtime
->private_data
;
302 snd_pcm_uframes_t pos
;
304 spin_lock(&dpcm
->lock
);
305 dummy_systimer_update(dpcm
);
306 pos
= dpcm
->frac_pos
/ HZ
;
307 spin_unlock(&dpcm
->lock
);
311 static int dummy_systimer_create(struct snd_pcm_substream
*substream
)
313 struct dummy_systimer_pcm
*dpcm
;
315 dpcm
= kzalloc(sizeof(*dpcm
), GFP_KERNEL
);
318 substream
->runtime
->private_data
= dpcm
;
319 init_timer(&dpcm
->timer
);
320 dpcm
->timer
.data
= (unsigned long) dpcm
;
321 dpcm
->timer
.function
= dummy_systimer_callback
;
322 spin_lock_init(&dpcm
->lock
);
323 dpcm
->substream
= substream
;
327 static void dummy_systimer_free(struct snd_pcm_substream
*substream
)
329 kfree(substream
->runtime
->private_data
);
332 static struct dummy_timer_ops dummy_systimer_ops
= {
333 .create
= dummy_systimer_create
,
334 .free
= dummy_systimer_free
,
335 .prepare
= dummy_systimer_prepare
,
336 .start
= dummy_systimer_start
,
337 .stop
= dummy_systimer_stop
,
338 .pointer
= dummy_systimer_pointer
,
341 #ifdef CONFIG_HIGH_RES_TIMERS
346 struct dummy_hrtimer_pcm
{
350 struct hrtimer timer
;
351 struct tasklet_struct tasklet
;
352 struct snd_pcm_substream
*substream
;
355 static void dummy_hrtimer_pcm_elapsed(unsigned long priv
)
357 struct dummy_hrtimer_pcm
*dpcm
= (struct dummy_hrtimer_pcm
*)priv
;
358 if (atomic_read(&dpcm
->running
))
359 snd_pcm_period_elapsed(dpcm
->substream
);
362 static enum hrtimer_restart
dummy_hrtimer_callback(struct hrtimer
*timer
)
364 struct dummy_hrtimer_pcm
*dpcm
;
366 dpcm
= container_of(timer
, struct dummy_hrtimer_pcm
, timer
);
367 if (!atomic_read(&dpcm
->running
))
368 return HRTIMER_NORESTART
;
369 tasklet_schedule(&dpcm
->tasklet
);
370 hrtimer_forward_now(timer
, dpcm
->period_time
);
371 return HRTIMER_RESTART
;
374 static int dummy_hrtimer_start(struct snd_pcm_substream
*substream
)
376 struct dummy_hrtimer_pcm
*dpcm
= substream
->runtime
->private_data
;
378 dpcm
->base_time
= hrtimer_cb_get_time(&dpcm
->timer
);
379 hrtimer_start(&dpcm
->timer
, dpcm
->period_time
, HRTIMER_MODE_REL
);
380 atomic_set(&dpcm
->running
, 1);
384 static int dummy_hrtimer_stop(struct snd_pcm_substream
*substream
)
386 struct dummy_hrtimer_pcm
*dpcm
= substream
->runtime
->private_data
;
388 atomic_set(&dpcm
->running
, 0);
389 hrtimer_cancel(&dpcm
->timer
);
393 static inline void dummy_hrtimer_sync(struct dummy_hrtimer_pcm
*dpcm
)
395 tasklet_kill(&dpcm
->tasklet
);
398 static snd_pcm_uframes_t
399 dummy_hrtimer_pointer(struct snd_pcm_substream
*substream
)
401 struct snd_pcm_runtime
*runtime
= substream
->runtime
;
402 struct dummy_hrtimer_pcm
*dpcm
= runtime
->private_data
;
406 delta
= ktime_us_delta(hrtimer_cb_get_time(&dpcm
->timer
),
408 delta
= div_u64(delta
* runtime
->rate
+ 999999, 1000000);
409 div_u64_rem(delta
, runtime
->buffer_size
, &pos
);
413 static int dummy_hrtimer_prepare(struct snd_pcm_substream
*substream
)
415 struct snd_pcm_runtime
*runtime
= substream
->runtime
;
416 struct dummy_hrtimer_pcm
*dpcm
= runtime
->private_data
;
417 unsigned int period
, rate
;
421 dummy_hrtimer_sync(dpcm
);
422 period
= runtime
->period_size
;
423 rate
= runtime
->rate
;
426 nsecs
= div_u64((u64
)period
* 1000000000UL + rate
- 1, rate
);
427 dpcm
->period_time
= ktime_set(sec
, nsecs
);
432 static int dummy_hrtimer_create(struct snd_pcm_substream
*substream
)
434 struct dummy_hrtimer_pcm
*dpcm
;
436 dpcm
= kzalloc(sizeof(*dpcm
), GFP_KERNEL
);
439 substream
->runtime
->private_data
= dpcm
;
440 hrtimer_init(&dpcm
->timer
, CLOCK_MONOTONIC
, HRTIMER_MODE_REL
);
441 dpcm
->timer
.function
= dummy_hrtimer_callback
;
442 dpcm
->substream
= substream
;
443 atomic_set(&dpcm
->running
, 0);
444 tasklet_init(&dpcm
->tasklet
, dummy_hrtimer_pcm_elapsed
,
445 (unsigned long)dpcm
);
449 static void dummy_hrtimer_free(struct snd_pcm_substream
*substream
)
451 struct dummy_hrtimer_pcm
*dpcm
= substream
->runtime
->private_data
;
452 dummy_hrtimer_sync(dpcm
);
456 static struct dummy_timer_ops dummy_hrtimer_ops
= {
457 .create
= dummy_hrtimer_create
,
458 .free
= dummy_hrtimer_free
,
459 .prepare
= dummy_hrtimer_prepare
,
460 .start
= dummy_hrtimer_start
,
461 .stop
= dummy_hrtimer_stop
,
462 .pointer
= dummy_hrtimer_pointer
,
465 #endif /* CONFIG_HIGH_RES_TIMERS */
471 static int dummy_pcm_trigger(struct snd_pcm_substream
*substream
, int cmd
)
473 struct snd_dummy
*dummy
= snd_pcm_substream_chip(substream
);
476 case SNDRV_PCM_TRIGGER_START
:
477 case SNDRV_PCM_TRIGGER_RESUME
:
478 return dummy
->timer_ops
->start(substream
);
479 case SNDRV_PCM_TRIGGER_STOP
:
480 case SNDRV_PCM_TRIGGER_SUSPEND
:
481 return dummy
->timer_ops
->stop(substream
);
486 static int dummy_pcm_prepare(struct snd_pcm_substream
*substream
)
488 struct snd_dummy
*dummy
= snd_pcm_substream_chip(substream
);
490 return dummy
->timer_ops
->prepare(substream
);
493 static snd_pcm_uframes_t
dummy_pcm_pointer(struct snd_pcm_substream
*substream
)
495 struct snd_dummy
*dummy
= snd_pcm_substream_chip(substream
);
497 return dummy
->timer_ops
->pointer(substream
);
500 static struct snd_pcm_hardware dummy_pcm_hardware
= {
501 .info
= (SNDRV_PCM_INFO_MMAP
|
502 SNDRV_PCM_INFO_INTERLEAVED
|
503 SNDRV_PCM_INFO_RESUME
|
504 SNDRV_PCM_INFO_MMAP_VALID
),
505 .formats
= USE_FORMATS
,
507 .rate_min
= USE_RATE_MIN
,
508 .rate_max
= USE_RATE_MAX
,
509 .channels_min
= USE_CHANNELS_MIN
,
510 .channels_max
= USE_CHANNELS_MAX
,
511 .buffer_bytes_max
= MAX_BUFFER_SIZE
,
512 .period_bytes_min
= 64,
513 .period_bytes_max
= MAX_PERIOD_SIZE
,
514 .periods_min
= USE_PERIODS_MIN
,
515 .periods_max
= USE_PERIODS_MAX
,
519 static int dummy_pcm_hw_params(struct snd_pcm_substream
*substream
,
520 struct snd_pcm_hw_params
*hw_params
)
523 /* runtime->dma_bytes has to be set manually to allow mmap */
524 substream
->runtime
->dma_bytes
= params_buffer_bytes(hw_params
);
527 return snd_pcm_lib_malloc_pages(substream
,
528 params_buffer_bytes(hw_params
));
531 static int dummy_pcm_hw_free(struct snd_pcm_substream
*substream
)
535 return snd_pcm_lib_free_pages(substream
);
538 static int dummy_pcm_open(struct snd_pcm_substream
*substream
)
540 struct snd_dummy
*dummy
= snd_pcm_substream_chip(substream
);
541 struct snd_pcm_runtime
*runtime
= substream
->runtime
;
544 dummy
->timer_ops
= &dummy_systimer_ops
;
545 #ifdef CONFIG_HIGH_RES_TIMERS
547 dummy
->timer_ops
= &dummy_hrtimer_ops
;
550 err
= dummy
->timer_ops
->create(substream
);
554 runtime
->hw
= dummy_pcm_hardware
;
555 if (substream
->pcm
->device
& 1) {
556 runtime
->hw
.info
&= ~SNDRV_PCM_INFO_INTERLEAVED
;
557 runtime
->hw
.info
|= SNDRV_PCM_INFO_NONINTERLEAVED
;
559 if (substream
->pcm
->device
& 2)
560 runtime
->hw
.info
&= ~(SNDRV_PCM_INFO_MMAP
|
561 SNDRV_PCM_INFO_MMAP_VALID
);
563 if (substream
->stream
== SNDRV_PCM_STREAM_PLAYBACK
)
564 err
= add_playback_constraints(substream
->runtime
);
566 err
= add_capture_constraints(substream
->runtime
);
568 dummy
->timer_ops
->free(substream
);
574 static int dummy_pcm_close(struct snd_pcm_substream
*substream
)
576 struct snd_dummy
*dummy
= snd_pcm_substream_chip(substream
);
577 dummy
->timer_ops
->free(substream
);
582 * dummy buffer handling
585 static void *dummy_page
[2];
587 static void free_fake_buffer(void)
591 for (i
= 0; i
< 2; i
++)
593 free_page((unsigned long)dummy_page
[i
]);
594 dummy_page
[i
] = NULL
;
599 static int alloc_fake_buffer(void)
605 for (i
= 0; i
< 2; i
++) {
606 dummy_page
[i
] = (void *)get_zeroed_page(GFP_KERNEL
);
607 if (!dummy_page
[i
]) {
615 static int dummy_pcm_copy(struct snd_pcm_substream
*substream
,
616 int channel
, snd_pcm_uframes_t pos
,
617 void __user
*dst
, snd_pcm_uframes_t count
)
619 return 0; /* do nothing */
622 static int dummy_pcm_silence(struct snd_pcm_substream
*substream
,
623 int channel
, snd_pcm_uframes_t pos
,
624 snd_pcm_uframes_t count
)
626 return 0; /* do nothing */
629 static struct page
*dummy_pcm_page(struct snd_pcm_substream
*substream
,
630 unsigned long offset
)
632 return virt_to_page(dummy_page
[substream
->stream
]); /* the same page */
635 static struct snd_pcm_ops dummy_pcm_ops
= {
636 .open
= dummy_pcm_open
,
637 .close
= dummy_pcm_close
,
638 .ioctl
= snd_pcm_lib_ioctl
,
639 .hw_params
= dummy_pcm_hw_params
,
640 .hw_free
= dummy_pcm_hw_free
,
641 .prepare
= dummy_pcm_prepare
,
642 .trigger
= dummy_pcm_trigger
,
643 .pointer
= dummy_pcm_pointer
,
646 static struct snd_pcm_ops dummy_pcm_ops_no_buf
= {
647 .open
= dummy_pcm_open
,
648 .close
= dummy_pcm_close
,
649 .ioctl
= snd_pcm_lib_ioctl
,
650 .hw_params
= dummy_pcm_hw_params
,
651 .hw_free
= dummy_pcm_hw_free
,
652 .prepare
= dummy_pcm_prepare
,
653 .trigger
= dummy_pcm_trigger
,
654 .pointer
= dummy_pcm_pointer
,
655 .copy
= dummy_pcm_copy
,
656 .silence
= dummy_pcm_silence
,
657 .page
= dummy_pcm_page
,
660 static int __devinit
snd_card_dummy_pcm(struct snd_dummy
*dummy
, int device
,
664 struct snd_pcm_ops
*ops
;
667 err
= snd_pcm_new(dummy
->card
, "Dummy PCM", device
,
668 substreams
, substreams
, &pcm
);
673 ops
= &dummy_pcm_ops_no_buf
;
675 ops
= &dummy_pcm_ops
;
676 snd_pcm_set_ops(pcm
, SNDRV_PCM_STREAM_PLAYBACK
, ops
);
677 snd_pcm_set_ops(pcm
, SNDRV_PCM_STREAM_CAPTURE
, ops
);
678 pcm
->private_data
= dummy
;
680 strcpy(pcm
->name
, "Dummy PCM");
682 snd_pcm_lib_preallocate_pages_for_all(pcm
,
683 SNDRV_DMA_TYPE_CONTINUOUS
,
684 snd_dma_continuous_data(GFP_KERNEL
),
694 #define DUMMY_VOLUME(xname, xindex, addr) \
695 { .iface = SNDRV_CTL_ELEM_IFACE_MIXER, \
696 .access = SNDRV_CTL_ELEM_ACCESS_READWRITE | SNDRV_CTL_ELEM_ACCESS_TLV_READ, \
697 .name = xname, .index = xindex, \
698 .info = snd_dummy_volume_info, \
699 .get = snd_dummy_volume_get, .put = snd_dummy_volume_put, \
700 .private_value = addr, \
701 .tlv = { .p = db_scale_dummy } }
703 static int snd_dummy_volume_info(struct snd_kcontrol
*kcontrol
,
704 struct snd_ctl_elem_info
*uinfo
)
706 uinfo
->type
= SNDRV_CTL_ELEM_TYPE_INTEGER
;
708 uinfo
->value
.integer
.min
= -50;
709 uinfo
->value
.integer
.max
= 100;
713 static int snd_dummy_volume_get(struct snd_kcontrol
*kcontrol
,
714 struct snd_ctl_elem_value
*ucontrol
)
716 struct snd_dummy
*dummy
= snd_kcontrol_chip(kcontrol
);
717 int addr
= kcontrol
->private_value
;
719 spin_lock_irq(&dummy
->mixer_lock
);
720 ucontrol
->value
.integer
.value
[0] = dummy
->mixer_volume
[addr
][0];
721 ucontrol
->value
.integer
.value
[1] = dummy
->mixer_volume
[addr
][1];
722 spin_unlock_irq(&dummy
->mixer_lock
);
726 static int snd_dummy_volume_put(struct snd_kcontrol
*kcontrol
,
727 struct snd_ctl_elem_value
*ucontrol
)
729 struct snd_dummy
*dummy
= snd_kcontrol_chip(kcontrol
);
730 int change
, addr
= kcontrol
->private_value
;
733 left
= ucontrol
->value
.integer
.value
[0];
738 right
= ucontrol
->value
.integer
.value
[1];
743 spin_lock_irq(&dummy
->mixer_lock
);
744 change
= dummy
->mixer_volume
[addr
][0] != left
||
745 dummy
->mixer_volume
[addr
][1] != right
;
746 dummy
->mixer_volume
[addr
][0] = left
;
747 dummy
->mixer_volume
[addr
][1] = right
;
748 spin_unlock_irq(&dummy
->mixer_lock
);
752 static const DECLARE_TLV_DB_SCALE(db_scale_dummy
, -4500, 30, 0);
754 #define DUMMY_CAPSRC(xname, xindex, addr) \
755 { .iface = SNDRV_CTL_ELEM_IFACE_MIXER, .name = xname, .index = xindex, \
756 .info = snd_dummy_capsrc_info, \
757 .get = snd_dummy_capsrc_get, .put = snd_dummy_capsrc_put, \
758 .private_value = addr }
760 #define snd_dummy_capsrc_info snd_ctl_boolean_stereo_info
762 static int snd_dummy_capsrc_get(struct snd_kcontrol
*kcontrol
,
763 struct snd_ctl_elem_value
*ucontrol
)
765 struct snd_dummy
*dummy
= snd_kcontrol_chip(kcontrol
);
766 int addr
= kcontrol
->private_value
;
768 spin_lock_irq(&dummy
->mixer_lock
);
769 ucontrol
->value
.integer
.value
[0] = dummy
->capture_source
[addr
][0];
770 ucontrol
->value
.integer
.value
[1] = dummy
->capture_source
[addr
][1];
771 spin_unlock_irq(&dummy
->mixer_lock
);
775 static int snd_dummy_capsrc_put(struct snd_kcontrol
*kcontrol
, struct snd_ctl_elem_value
*ucontrol
)
777 struct snd_dummy
*dummy
= snd_kcontrol_chip(kcontrol
);
778 int change
, addr
= kcontrol
->private_value
;
781 left
= ucontrol
->value
.integer
.value
[0] & 1;
782 right
= ucontrol
->value
.integer
.value
[1] & 1;
783 spin_lock_irq(&dummy
->mixer_lock
);
784 change
= dummy
->capture_source
[addr
][0] != left
&&
785 dummy
->capture_source
[addr
][1] != right
;
786 dummy
->capture_source
[addr
][0] = left
;
787 dummy
->capture_source
[addr
][1] = right
;
788 spin_unlock_irq(&dummy
->mixer_lock
);
792 static struct snd_kcontrol_new snd_dummy_controls
[] = {
793 DUMMY_VOLUME("Master Volume", 0, MIXER_ADDR_MASTER
),
794 DUMMY_CAPSRC("Master Capture Switch", 0, MIXER_ADDR_MASTER
),
795 DUMMY_VOLUME("Synth Volume", 0, MIXER_ADDR_SYNTH
),
796 DUMMY_CAPSRC("Synth Capture Switch", 0, MIXER_ADDR_SYNTH
),
797 DUMMY_VOLUME("Line Volume", 0, MIXER_ADDR_LINE
),
798 DUMMY_CAPSRC("Line Capture Switch", 0, MIXER_ADDR_LINE
),
799 DUMMY_VOLUME("Mic Volume", 0, MIXER_ADDR_MIC
),
800 DUMMY_CAPSRC("Mic Capture Switch", 0, MIXER_ADDR_MIC
),
801 DUMMY_VOLUME("CD Volume", 0, MIXER_ADDR_CD
),
802 DUMMY_CAPSRC("CD Capture Switch", 0, MIXER_ADDR_CD
)
805 static int __devinit
snd_card_dummy_new_mixer(struct snd_dummy
*dummy
)
807 struct snd_card
*card
= dummy
->card
;
811 if (snd_BUG_ON(!dummy
))
813 spin_lock_init(&dummy
->mixer_lock
);
814 strcpy(card
->mixername
, "Dummy Mixer");
816 for (idx
= 0; idx
< ARRAY_SIZE(snd_dummy_controls
); idx
++) {
817 err
= snd_ctl_add(card
, snd_ctl_new1(&snd_dummy_controls
[idx
], dummy
));
824 #if defined(CONFIG_SND_DEBUG) && defined(CONFIG_PROC_FS)
828 static void print_formats(struct snd_info_buffer
*buffer
)
832 for (i
= 0; i
< SNDRV_PCM_FORMAT_LAST
; i
++) {
833 if (dummy_pcm_hardware
.formats
& (1ULL << i
))
834 snd_iprintf(buffer
, " %s", snd_pcm_format_name(i
));
838 static void print_rates(struct snd_info_buffer
*buffer
)
840 static int rates
[] = {
841 5512, 8000, 11025, 16000, 22050, 32000, 44100, 48000,
842 64000, 88200, 96000, 176400, 192000,
846 if (dummy_pcm_hardware
.rates
& SNDRV_PCM_RATE_CONTINUOUS
)
847 snd_iprintf(buffer
, " continuous");
848 if (dummy_pcm_hardware
.rates
& SNDRV_PCM_RATE_KNOT
)
849 snd_iprintf(buffer
, " knot");
850 for (i
= 0; i
< ARRAY_SIZE(rates
); i
++)
851 if (dummy_pcm_hardware
.rates
& (1 << i
))
852 snd_iprintf(buffer
, " %d", rates
[i
]);
855 #define get_dummy_int_ptr(ofs) \
856 (unsigned int *)((char *)&dummy_pcm_hardware + (ofs))
857 #define get_dummy_ll_ptr(ofs) \
858 (unsigned long long *)((char *)&dummy_pcm_hardware + (ofs))
860 struct dummy_hw_field
{
866 #define FIELD_ENTRY(item, fmt) { \
869 .offset = offsetof(struct snd_pcm_hardware, item), \
870 .size = sizeof(dummy_pcm_hardware.item) }
872 static struct dummy_hw_field fields
[] = {
873 FIELD_ENTRY(formats
, "%#llx"),
874 FIELD_ENTRY(rates
, "%#x"),
875 FIELD_ENTRY(rate_min
, "%d"),
876 FIELD_ENTRY(rate_max
, "%d"),
877 FIELD_ENTRY(channels_min
, "%d"),
878 FIELD_ENTRY(channels_max
, "%d"),
879 FIELD_ENTRY(buffer_bytes_max
, "%ld"),
880 FIELD_ENTRY(period_bytes_min
, "%ld"),
881 FIELD_ENTRY(period_bytes_max
, "%ld"),
882 FIELD_ENTRY(periods_min
, "%d"),
883 FIELD_ENTRY(periods_max
, "%d"),
886 static void dummy_proc_read(struct snd_info_entry
*entry
,
887 struct snd_info_buffer
*buffer
)
891 for (i
= 0; i
< ARRAY_SIZE(fields
); i
++) {
892 snd_iprintf(buffer
, "%s ", fields
[i
].name
);
893 if (fields
[i
].size
== sizeof(int))
894 snd_iprintf(buffer
, fields
[i
].format
,
895 *get_dummy_int_ptr(fields
[i
].offset
));
897 snd_iprintf(buffer
, fields
[i
].format
,
898 *get_dummy_ll_ptr(fields
[i
].offset
));
899 if (!strcmp(fields
[i
].name
, "formats"))
900 print_formats(buffer
);
901 else if (!strcmp(fields
[i
].name
, "rates"))
903 snd_iprintf(buffer
, "\n");
907 static void dummy_proc_write(struct snd_info_entry
*entry
,
908 struct snd_info_buffer
*buffer
)
912 while (!snd_info_get_line(buffer
, line
, sizeof(line
))) {
915 unsigned long long val
;
918 ptr
= snd_info_get_str(item
, line
, sizeof(item
));
919 for (i
= 0; i
< ARRAY_SIZE(fields
); i
++) {
920 if (!strcmp(item
, fields
[i
].name
))
923 if (i
>= ARRAY_SIZE(fields
))
925 snd_info_get_str(item
, ptr
, sizeof(item
));
926 if (strict_strtoull(item
, 0, &val
))
928 if (fields
[i
].size
== sizeof(int))
929 *get_dummy_int_ptr(fields
[i
].offset
) = val
;
931 *get_dummy_ll_ptr(fields
[i
].offset
) = val
;
935 static void __devinit
dummy_proc_init(struct snd_dummy
*chip
)
937 struct snd_info_entry
*entry
;
939 if (!snd_card_proc_new(chip
->card
, "dummy_pcm", &entry
)) {
940 snd_info_set_text_ops(entry
, chip
, dummy_proc_read
);
941 entry
->c
.text
.write
= dummy_proc_write
;
942 entry
->mode
|= S_IWUSR
;
946 #define dummy_proc_init(x)
947 #endif /* CONFIG_SND_DEBUG && CONFIG_PROC_FS */
949 static int __devinit
snd_dummy_probe(struct platform_device
*devptr
)
951 struct snd_card
*card
;
952 struct snd_dummy
*dummy
;
954 int dev
= devptr
->id
;
956 err
= snd_card_create(index
[dev
], id
[dev
], THIS_MODULE
,
957 sizeof(struct snd_dummy
), &card
);
960 dummy
= card
->private_data
;
962 for (idx
= 0; idx
< MAX_PCM_DEVICES
&& idx
< pcm_devs
[dev
]; idx
++) {
963 if (pcm_substreams
[dev
] < 1)
964 pcm_substreams
[dev
] = 1;
965 if (pcm_substreams
[dev
] > MAX_PCM_SUBSTREAMS
)
966 pcm_substreams
[dev
] = MAX_PCM_SUBSTREAMS
;
967 err
= snd_card_dummy_pcm(dummy
, idx
, pcm_substreams
[dev
]);
971 err
= snd_card_dummy_new_mixer(dummy
);
974 strcpy(card
->driver
, "Dummy");
975 strcpy(card
->shortname
, "Dummy");
976 sprintf(card
->longname
, "Dummy %i", dev
+ 1);
978 dummy_proc_init(dummy
);
980 snd_card_set_dev(card
, &devptr
->dev
);
982 err
= snd_card_register(card
);
984 platform_set_drvdata(devptr
, card
);
992 static int __devexit
snd_dummy_remove(struct platform_device
*devptr
)
994 snd_card_free(platform_get_drvdata(devptr
));
995 platform_set_drvdata(devptr
, NULL
);
1000 static int snd_dummy_suspend(struct platform_device
*pdev
, pm_message_t state
)
1002 struct snd_card
*card
= platform_get_drvdata(pdev
);
1003 struct snd_dummy
*dummy
= card
->private_data
;
1005 snd_power_change_state(card
, SNDRV_CTL_POWER_D3hot
);
1006 snd_pcm_suspend_all(dummy
->pcm
);
1010 static int snd_dummy_resume(struct platform_device
*pdev
)
1012 struct snd_card
*card
= platform_get_drvdata(pdev
);
1014 snd_power_change_state(card
, SNDRV_CTL_POWER_D0
);
1019 #define SND_DUMMY_DRIVER "snd_dummy"
1021 static struct platform_driver snd_dummy_driver
= {
1022 .probe
= snd_dummy_probe
,
1023 .remove
= __devexit_p(snd_dummy_remove
),
1025 .suspend
= snd_dummy_suspend
,
1026 .resume
= snd_dummy_resume
,
1029 .name
= SND_DUMMY_DRIVER
1033 static void snd_dummy_unregister_all(void)
1037 for (i
= 0; i
< ARRAY_SIZE(devices
); ++i
)
1038 platform_device_unregister(devices
[i
]);
1039 platform_driver_unregister(&snd_dummy_driver
);
1043 static int __init
alsa_card_dummy_init(void)
1047 err
= platform_driver_register(&snd_dummy_driver
);
1051 err
= alloc_fake_buffer();
1053 platform_driver_unregister(&snd_dummy_driver
);
1058 for (i
= 0; i
< SNDRV_CARDS
; i
++) {
1059 struct platform_device
*device
;
1062 device
= platform_device_register_simple(SND_DUMMY_DRIVER
,
1066 if (!platform_get_drvdata(device
)) {
1067 platform_device_unregister(device
);
1070 devices
[i
] = device
;
1075 printk(KERN_ERR
"Dummy soundcard not found or device busy\n");
1077 snd_dummy_unregister_all();
1083 static void __exit
alsa_card_dummy_exit(void)
1085 snd_dummy_unregister_all();
1088 module_init(alsa_card_dummy_init
)
1089 module_exit(alsa_card_dummy_exit
)