PageRenderTime 53ms CodeModel.GetById 9ms app.highlight 35ms RepoModel.GetById 1ms app.codeStats 0ms

/sound/core/pcm.c

https://bitbucket.org/abioy/linux
C | 1153 lines | 988 code | 106 blank | 59 comment | 171 complexity | 879cd627fbac18bff5de1b0ebd34b5d6 MD5 | raw file
Possible License(s): CC-BY-SA-3.0, GPL-2.0, LGPL-2.0, AGPL-1.0
   1/*
   2 *  Digital Audio (PCM) abstract layer
   3 *  Copyright (c) by Jaroslav Kysela <perex@perex.cz>
   4 *
   5 *
   6 *   This program is free software; you can redistribute it and/or modify
   7 *   it under the terms of the GNU General Public License as published by
   8 *   the Free Software Foundation; either version 2 of the License, or
   9 *   (at your option) any later version.
  10 *
  11 *   This program is distributed in the hope that it will be useful,
  12 *   but WITHOUT ANY WARRANTY; without even the implied warranty of
  13 *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  14 *   GNU General Public License for more details.
  15 *
  16 *   You should have received a copy of the GNU General Public License
  17 *   along with this program; if not, write to the Free Software
  18 *   Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA
  19 *
  20 */
  21
  22#include <linux/init.h>
  23#include <linux/slab.h>
  24#include <linux/time.h>
  25#include <linux/mutex.h>
  26#include <sound/core.h>
  27#include <sound/minors.h>
  28#include <sound/pcm.h>
  29#include <sound/control.h>
  30#include <sound/info.h>
  31
  32MODULE_AUTHOR("Jaroslav Kysela <perex@perex.cz>, Abramo Bagnara <abramo@alsa-project.org>");
  33MODULE_DESCRIPTION("Midlevel PCM code for ALSA.");
  34MODULE_LICENSE("GPL");
  35
  36static LIST_HEAD(snd_pcm_devices);
  37static LIST_HEAD(snd_pcm_notify_list);
  38static DEFINE_MUTEX(register_mutex);
  39
  40static int snd_pcm_free(struct snd_pcm *pcm);
  41static int snd_pcm_dev_free(struct snd_device *device);
  42static int snd_pcm_dev_register(struct snd_device *device);
  43static int snd_pcm_dev_disconnect(struct snd_device *device);
  44
  45static struct snd_pcm *snd_pcm_get(struct snd_card *card, int device)
  46{
  47	struct snd_pcm *pcm;
  48
  49	list_for_each_entry(pcm, &snd_pcm_devices, list) {
  50		if (pcm->card == card && pcm->device == device)
  51			return pcm;
  52	}
  53	return NULL;
  54}
  55
  56static int snd_pcm_next(struct snd_card *card, int device)
  57{
  58	struct snd_pcm *pcm;
  59
  60	list_for_each_entry(pcm, &snd_pcm_devices, list) {
  61		if (pcm->card == card && pcm->device > device)
  62			return pcm->device;
  63		else if (pcm->card->number > card->number)
  64			return -1;
  65	}
  66	return -1;
  67}
  68
  69static int snd_pcm_add(struct snd_pcm *newpcm)
  70{
  71	struct snd_pcm *pcm;
  72
  73	list_for_each_entry(pcm, &snd_pcm_devices, list) {
  74		if (pcm->card == newpcm->card && pcm->device == newpcm->device)
  75			return -EBUSY;
  76		if (pcm->card->number > newpcm->card->number ||
  77				(pcm->card == newpcm->card &&
  78				pcm->device > newpcm->device)) {
  79			list_add(&newpcm->list, pcm->list.prev);
  80			return 0;
  81		}
  82	}
  83	list_add_tail(&newpcm->list, &snd_pcm_devices);
  84	return 0;
  85}
  86
  87static int snd_pcm_control_ioctl(struct snd_card *card,
  88				 struct snd_ctl_file *control,
  89				 unsigned int cmd, unsigned long arg)
  90{
  91	switch (cmd) {
  92	case SNDRV_CTL_IOCTL_PCM_NEXT_DEVICE:
  93		{
  94			int device;
  95
  96			if (get_user(device, (int __user *)arg))
  97				return -EFAULT;
  98			mutex_lock(&register_mutex);
  99			device = snd_pcm_next(card, device);
 100			mutex_unlock(&register_mutex);
 101			if (put_user(device, (int __user *)arg))
 102				return -EFAULT;
 103			return 0;
 104		}
 105	case SNDRV_CTL_IOCTL_PCM_INFO:
 106		{
 107			struct snd_pcm_info __user *info;
 108			unsigned int device, subdevice;
 109			int stream;
 110			struct snd_pcm *pcm;
 111			struct snd_pcm_str *pstr;
 112			struct snd_pcm_substream *substream;
 113			int err;
 114
 115			info = (struct snd_pcm_info __user *)arg;
 116			if (get_user(device, &info->device))
 117				return -EFAULT;
 118			if (get_user(stream, &info->stream))
 119				return -EFAULT;
 120			if (stream < 0 || stream > 1)
 121				return -EINVAL;
 122			if (get_user(subdevice, &info->subdevice))
 123				return -EFAULT;
 124			mutex_lock(&register_mutex);
 125			pcm = snd_pcm_get(card, device);
 126			if (pcm == NULL) {
 127				err = -ENXIO;
 128				goto _error;
 129			}
 130			pstr = &pcm->streams[stream];
 131			if (pstr->substream_count == 0) {
 132				err = -ENOENT;
 133				goto _error;
 134			}
 135			if (subdevice >= pstr->substream_count) {
 136				err = -ENXIO;
 137				goto _error;
 138			}
 139			for (substream = pstr->substream; substream;
 140			     substream = substream->next)
 141				if (substream->number == (int)subdevice)
 142					break;
 143			if (substream == NULL) {
 144				err = -ENXIO;
 145				goto _error;
 146			}
 147			err = snd_pcm_info_user(substream, info);
 148		_error:
 149			mutex_unlock(&register_mutex);
 150			return err;
 151		}
 152	case SNDRV_CTL_IOCTL_PCM_PREFER_SUBDEVICE:
 153		{
 154			int val;
 155			
 156			if (get_user(val, (int __user *)arg))
 157				return -EFAULT;
 158			control->prefer_pcm_subdevice = val;
 159			return 0;
 160		}
 161	}
 162	return -ENOIOCTLCMD;
 163}
 164
 165#define FORMAT(v) [SNDRV_PCM_FORMAT_##v] = #v
 166
 167static char *snd_pcm_format_names[] = {
 168	FORMAT(S8),
 169	FORMAT(U8),
 170	FORMAT(S16_LE),
 171	FORMAT(S16_BE),
 172	FORMAT(U16_LE),
 173	FORMAT(U16_BE),
 174	FORMAT(S24_LE),
 175	FORMAT(S24_BE),
 176	FORMAT(U24_LE),
 177	FORMAT(U24_BE),
 178	FORMAT(S32_LE),
 179	FORMAT(S32_BE),
 180	FORMAT(U32_LE),
 181	FORMAT(U32_BE),
 182	FORMAT(FLOAT_LE),
 183	FORMAT(FLOAT_BE),
 184	FORMAT(FLOAT64_LE),
 185	FORMAT(FLOAT64_BE),
 186	FORMAT(IEC958_SUBFRAME_LE),
 187	FORMAT(IEC958_SUBFRAME_BE),
 188	FORMAT(MU_LAW),
 189	FORMAT(A_LAW),
 190	FORMAT(IMA_ADPCM),
 191	FORMAT(MPEG),
 192	FORMAT(GSM),
 193	FORMAT(SPECIAL),
 194	FORMAT(S24_3LE),
 195	FORMAT(S24_3BE),
 196	FORMAT(U24_3LE),
 197	FORMAT(U24_3BE),
 198	FORMAT(S20_3LE),
 199	FORMAT(S20_3BE),
 200	FORMAT(U20_3LE),
 201	FORMAT(U20_3BE),
 202	FORMAT(S18_3LE),
 203	FORMAT(S18_3BE),
 204	FORMAT(U18_3LE),
 205	FORMAT(U18_3BE),
 206};
 207
 208const char *snd_pcm_format_name(snd_pcm_format_t format)
 209{
 210	return snd_pcm_format_names[format];
 211}
 212EXPORT_SYMBOL_GPL(snd_pcm_format_name);
 213
 214#ifdef CONFIG_SND_VERBOSE_PROCFS
 215
 216#define STATE(v) [SNDRV_PCM_STATE_##v] = #v
 217#define STREAM(v) [SNDRV_PCM_STREAM_##v] = #v
 218#define READY(v) [SNDRV_PCM_READY_##v] = #v
 219#define XRUN(v) [SNDRV_PCM_XRUN_##v] = #v
 220#define SILENCE(v) [SNDRV_PCM_SILENCE_##v] = #v
 221#define TSTAMP(v) [SNDRV_PCM_TSTAMP_##v] = #v
 222#define ACCESS(v) [SNDRV_PCM_ACCESS_##v] = #v
 223#define START(v) [SNDRV_PCM_START_##v] = #v
 224#define SUBFORMAT(v) [SNDRV_PCM_SUBFORMAT_##v] = #v 
 225
 226static char *snd_pcm_stream_names[] = {
 227	STREAM(PLAYBACK),
 228	STREAM(CAPTURE),
 229};
 230
 231static char *snd_pcm_state_names[] = {
 232	STATE(OPEN),
 233	STATE(SETUP),
 234	STATE(PREPARED),
 235	STATE(RUNNING),
 236	STATE(XRUN),
 237	STATE(DRAINING),
 238	STATE(PAUSED),
 239	STATE(SUSPENDED),
 240};
 241
 242static char *snd_pcm_access_names[] = {
 243	ACCESS(MMAP_INTERLEAVED), 
 244	ACCESS(MMAP_NONINTERLEAVED),
 245	ACCESS(MMAP_COMPLEX),
 246	ACCESS(RW_INTERLEAVED),
 247	ACCESS(RW_NONINTERLEAVED),
 248};
 249
 250static char *snd_pcm_subformat_names[] = {
 251	SUBFORMAT(STD), 
 252};
 253
 254static char *snd_pcm_tstamp_mode_names[] = {
 255	TSTAMP(NONE),
 256	TSTAMP(ENABLE),
 257};
 258
 259static const char *snd_pcm_stream_name(int stream)
 260{
 261	return snd_pcm_stream_names[stream];
 262}
 263
 264static const char *snd_pcm_access_name(snd_pcm_access_t access)
 265{
 266	return snd_pcm_access_names[access];
 267}
 268
 269static const char *snd_pcm_subformat_name(snd_pcm_subformat_t subformat)
 270{
 271	return snd_pcm_subformat_names[subformat];
 272}
 273
 274static const char *snd_pcm_tstamp_mode_name(int mode)
 275{
 276	return snd_pcm_tstamp_mode_names[mode];
 277}
 278
 279static const char *snd_pcm_state_name(snd_pcm_state_t state)
 280{
 281	return snd_pcm_state_names[state];
 282}
 283
 284#if defined(CONFIG_SND_PCM_OSS) || defined(CONFIG_SND_PCM_OSS_MODULE)
 285#include <linux/soundcard.h>
 286
 287static const char *snd_pcm_oss_format_name(int format)
 288{
 289	switch (format) {
 290	case AFMT_MU_LAW:
 291		return "MU_LAW";
 292	case AFMT_A_LAW:
 293		return "A_LAW";
 294	case AFMT_IMA_ADPCM:
 295		return "IMA_ADPCM";
 296	case AFMT_U8:
 297		return "U8";
 298	case AFMT_S16_LE:
 299		return "S16_LE";
 300	case AFMT_S16_BE:
 301		return "S16_BE";
 302	case AFMT_S8:
 303		return "S8";
 304	case AFMT_U16_LE:
 305		return "U16_LE";
 306	case AFMT_U16_BE:
 307		return "U16_BE";
 308	case AFMT_MPEG:
 309		return "MPEG";
 310	default:
 311		return "unknown";
 312	}
 313}
 314#endif
 315
 316static void snd_pcm_proc_info_read(struct snd_pcm_substream *substream,
 317				   struct snd_info_buffer *buffer)
 318{
 319	struct snd_pcm_info *info;
 320	int err;
 321
 322	if (! substream)
 323		return;
 324
 325	info = kmalloc(sizeof(*info), GFP_KERNEL);
 326	if (! info) {
 327		printk(KERN_DEBUG "snd_pcm_proc_info_read: cannot malloc\n");
 328		return;
 329	}
 330
 331	err = snd_pcm_info(substream, info);
 332	if (err < 0) {
 333		snd_iprintf(buffer, "error %d\n", err);
 334		kfree(info);
 335		return;
 336	}
 337	snd_iprintf(buffer, "card: %d\n", info->card);
 338	snd_iprintf(buffer, "device: %d\n", info->device);
 339	snd_iprintf(buffer, "subdevice: %d\n", info->subdevice);
 340	snd_iprintf(buffer, "stream: %s\n", snd_pcm_stream_name(info->stream));
 341	snd_iprintf(buffer, "id: %s\n", info->id);
 342	snd_iprintf(buffer, "name: %s\n", info->name);
 343	snd_iprintf(buffer, "subname: %s\n", info->subname);
 344	snd_iprintf(buffer, "class: %d\n", info->dev_class);
 345	snd_iprintf(buffer, "subclass: %d\n", info->dev_subclass);
 346	snd_iprintf(buffer, "subdevices_count: %d\n", info->subdevices_count);
 347	snd_iprintf(buffer, "subdevices_avail: %d\n", info->subdevices_avail);
 348	kfree(info);
 349}
 350
 351static void snd_pcm_stream_proc_info_read(struct snd_info_entry *entry,
 352					  struct snd_info_buffer *buffer)
 353{
 354	snd_pcm_proc_info_read(((struct snd_pcm_str *)entry->private_data)->substream,
 355			       buffer);
 356}
 357
 358static void snd_pcm_substream_proc_info_read(struct snd_info_entry *entry,
 359					     struct snd_info_buffer *buffer)
 360{
 361	snd_pcm_proc_info_read((struct snd_pcm_substream *)entry->private_data,
 362			       buffer);
 363}
 364
 365static void snd_pcm_substream_proc_hw_params_read(struct snd_info_entry *entry,
 366						  struct snd_info_buffer *buffer)
 367{
 368	struct snd_pcm_substream *substream = entry->private_data;
 369	struct snd_pcm_runtime *runtime = substream->runtime;
 370	if (!runtime) {
 371		snd_iprintf(buffer, "closed\n");
 372		return;
 373	}
 374	if (runtime->status->state == SNDRV_PCM_STATE_OPEN) {
 375		snd_iprintf(buffer, "no setup\n");
 376		return;
 377	}
 378	snd_iprintf(buffer, "access: %s\n", snd_pcm_access_name(runtime->access));
 379	snd_iprintf(buffer, "format: %s\n", snd_pcm_format_name(runtime->format));
 380	snd_iprintf(buffer, "subformat: %s\n", snd_pcm_subformat_name(runtime->subformat));
 381	snd_iprintf(buffer, "channels: %u\n", runtime->channels);	
 382	snd_iprintf(buffer, "rate: %u (%u/%u)\n", runtime->rate, runtime->rate_num, runtime->rate_den);	
 383	snd_iprintf(buffer, "period_size: %lu\n", runtime->period_size);	
 384	snd_iprintf(buffer, "buffer_size: %lu\n", runtime->buffer_size);	
 385#if defined(CONFIG_SND_PCM_OSS) || defined(CONFIG_SND_PCM_OSS_MODULE)
 386	if (substream->oss.oss) {
 387		snd_iprintf(buffer, "OSS format: %s\n", snd_pcm_oss_format_name(runtime->oss.format));
 388		snd_iprintf(buffer, "OSS channels: %u\n", runtime->oss.channels);	
 389		snd_iprintf(buffer, "OSS rate: %u\n", runtime->oss.rate);
 390		snd_iprintf(buffer, "OSS period bytes: %lu\n", (unsigned long)runtime->oss.period_bytes);
 391		snd_iprintf(buffer, "OSS periods: %u\n", runtime->oss.periods);
 392		snd_iprintf(buffer, "OSS period frames: %lu\n", (unsigned long)runtime->oss.period_frames);
 393	}
 394#endif
 395}
 396
 397static void snd_pcm_substream_proc_sw_params_read(struct snd_info_entry *entry,
 398						  struct snd_info_buffer *buffer)
 399{
 400	struct snd_pcm_substream *substream = entry->private_data;
 401	struct snd_pcm_runtime *runtime = substream->runtime;
 402	if (!runtime) {
 403		snd_iprintf(buffer, "closed\n");
 404		return;
 405	}
 406	if (runtime->status->state == SNDRV_PCM_STATE_OPEN) {
 407		snd_iprintf(buffer, "no setup\n");
 408		return;
 409	}
 410	snd_iprintf(buffer, "tstamp_mode: %s\n", snd_pcm_tstamp_mode_name(runtime->tstamp_mode));
 411	snd_iprintf(buffer, "period_step: %u\n", runtime->period_step);
 412	snd_iprintf(buffer, "avail_min: %lu\n", runtime->control->avail_min);
 413	snd_iprintf(buffer, "start_threshold: %lu\n", runtime->start_threshold);
 414	snd_iprintf(buffer, "stop_threshold: %lu\n", runtime->stop_threshold);
 415	snd_iprintf(buffer, "silence_threshold: %lu\n", runtime->silence_threshold);
 416	snd_iprintf(buffer, "silence_size: %lu\n", runtime->silence_size);
 417	snd_iprintf(buffer, "boundary: %lu\n", runtime->boundary);
 418}
 419
 420static void snd_pcm_substream_proc_status_read(struct snd_info_entry *entry,
 421					       struct snd_info_buffer *buffer)
 422{
 423	struct snd_pcm_substream *substream = entry->private_data;
 424	struct snd_pcm_runtime *runtime = substream->runtime;
 425	struct snd_pcm_status status;
 426	int err;
 427	if (!runtime) {
 428		snd_iprintf(buffer, "closed\n");
 429		return;
 430	}
 431	memset(&status, 0, sizeof(status));
 432	err = snd_pcm_status(substream, &status);
 433	if (err < 0) {
 434		snd_iprintf(buffer, "error %d\n", err);
 435		return;
 436	}
 437	snd_iprintf(buffer, "state: %s\n", snd_pcm_state_name(status.state));
 438	snd_iprintf(buffer, "owner_pid   : %d\n", pid_vnr(substream->pid));
 439	snd_iprintf(buffer, "trigger_time: %ld.%09ld\n",
 440		status.trigger_tstamp.tv_sec, status.trigger_tstamp.tv_nsec);
 441	snd_iprintf(buffer, "tstamp      : %ld.%09ld\n",
 442		status.tstamp.tv_sec, status.tstamp.tv_nsec);
 443	snd_iprintf(buffer, "delay       : %ld\n", status.delay);
 444	snd_iprintf(buffer, "avail       : %ld\n", status.avail);
 445	snd_iprintf(buffer, "avail_max   : %ld\n", status.avail_max);
 446	snd_iprintf(buffer, "-----\n");
 447	snd_iprintf(buffer, "hw_ptr      : %ld\n", runtime->status->hw_ptr);
 448	snd_iprintf(buffer, "appl_ptr    : %ld\n", runtime->control->appl_ptr);
 449}
 450
 451#ifdef CONFIG_SND_PCM_XRUN_DEBUG
 452static void snd_pcm_xrun_debug_read(struct snd_info_entry *entry,
 453				    struct snd_info_buffer *buffer)
 454{
 455	struct snd_pcm_str *pstr = entry->private_data;
 456	snd_iprintf(buffer, "%d\n", pstr->xrun_debug);
 457}
 458
 459static void snd_pcm_xrun_debug_write(struct snd_info_entry *entry,
 460				     struct snd_info_buffer *buffer)
 461{
 462	struct snd_pcm_str *pstr = entry->private_data;
 463	char line[64];
 464	if (!snd_info_get_line(buffer, line, sizeof(line)))
 465		pstr->xrun_debug = simple_strtoul(line, NULL, 10);
 466}
 467#endif
 468
 469static int snd_pcm_stream_proc_init(struct snd_pcm_str *pstr)
 470{
 471	struct snd_pcm *pcm = pstr->pcm;
 472	struct snd_info_entry *entry;
 473	char name[16];
 474
 475	sprintf(name, "pcm%i%c", pcm->device, 
 476		pstr->stream == SNDRV_PCM_STREAM_PLAYBACK ? 'p' : 'c');
 477	if ((entry = snd_info_create_card_entry(pcm->card, name, pcm->card->proc_root)) == NULL)
 478		return -ENOMEM;
 479	entry->mode = S_IFDIR | S_IRUGO | S_IXUGO;
 480	if (snd_info_register(entry) < 0) {
 481		snd_info_free_entry(entry);
 482		return -ENOMEM;
 483	}
 484	pstr->proc_root = entry;
 485
 486	if ((entry = snd_info_create_card_entry(pcm->card, "info", pstr->proc_root)) != NULL) {
 487		snd_info_set_text_ops(entry, pstr, snd_pcm_stream_proc_info_read);
 488		if (snd_info_register(entry) < 0) {
 489			snd_info_free_entry(entry);
 490			entry = NULL;
 491		}
 492	}
 493	pstr->proc_info_entry = entry;
 494
 495#ifdef CONFIG_SND_PCM_XRUN_DEBUG
 496	if ((entry = snd_info_create_card_entry(pcm->card, "xrun_debug",
 497						pstr->proc_root)) != NULL) {
 498		entry->c.text.read = snd_pcm_xrun_debug_read;
 499		entry->c.text.write = snd_pcm_xrun_debug_write;
 500		entry->mode |= S_IWUSR;
 501		entry->private_data = pstr;
 502		if (snd_info_register(entry) < 0) {
 503			snd_info_free_entry(entry);
 504			entry = NULL;
 505		}
 506	}
 507	pstr->proc_xrun_debug_entry = entry;
 508#endif
 509	return 0;
 510}
 511
 512static int snd_pcm_stream_proc_done(struct snd_pcm_str *pstr)
 513{
 514#ifdef CONFIG_SND_PCM_XRUN_DEBUG
 515	snd_info_free_entry(pstr->proc_xrun_debug_entry);
 516	pstr->proc_xrun_debug_entry = NULL;
 517#endif
 518	snd_info_free_entry(pstr->proc_info_entry);
 519	pstr->proc_info_entry = NULL;
 520	snd_info_free_entry(pstr->proc_root);
 521	pstr->proc_root = NULL;
 522	return 0;
 523}
 524
 525static int snd_pcm_substream_proc_init(struct snd_pcm_substream *substream)
 526{
 527	struct snd_info_entry *entry;
 528	struct snd_card *card;
 529	char name[16];
 530
 531	card = substream->pcm->card;
 532
 533	sprintf(name, "sub%i", substream->number);
 534	if ((entry = snd_info_create_card_entry(card, name, substream->pstr->proc_root)) == NULL)
 535		return -ENOMEM;
 536	entry->mode = S_IFDIR | S_IRUGO | S_IXUGO;
 537	if (snd_info_register(entry) < 0) {
 538		snd_info_free_entry(entry);
 539		return -ENOMEM;
 540	}
 541	substream->proc_root = entry;
 542
 543	if ((entry = snd_info_create_card_entry(card, "info", substream->proc_root)) != NULL) {
 544		snd_info_set_text_ops(entry, substream,
 545				      snd_pcm_substream_proc_info_read);
 546		if (snd_info_register(entry) < 0) {
 547			snd_info_free_entry(entry);
 548			entry = NULL;
 549		}
 550	}
 551	substream->proc_info_entry = entry;
 552
 553	if ((entry = snd_info_create_card_entry(card, "hw_params", substream->proc_root)) != NULL) {
 554		snd_info_set_text_ops(entry, substream,
 555				      snd_pcm_substream_proc_hw_params_read);
 556		if (snd_info_register(entry) < 0) {
 557			snd_info_free_entry(entry);
 558			entry = NULL;
 559		}
 560	}
 561	substream->proc_hw_params_entry = entry;
 562
 563	if ((entry = snd_info_create_card_entry(card, "sw_params", substream->proc_root)) != NULL) {
 564		snd_info_set_text_ops(entry, substream,
 565				      snd_pcm_substream_proc_sw_params_read);
 566		if (snd_info_register(entry) < 0) {
 567			snd_info_free_entry(entry);
 568			entry = NULL;
 569		}
 570	}
 571	substream->proc_sw_params_entry = entry;
 572
 573	if ((entry = snd_info_create_card_entry(card, "status", substream->proc_root)) != NULL) {
 574		snd_info_set_text_ops(entry, substream,
 575				      snd_pcm_substream_proc_status_read);
 576		if (snd_info_register(entry) < 0) {
 577			snd_info_free_entry(entry);
 578			entry = NULL;
 579		}
 580	}
 581	substream->proc_status_entry = entry;
 582
 583	return 0;
 584}
 585
 586static int snd_pcm_substream_proc_done(struct snd_pcm_substream *substream)
 587{
 588	snd_info_free_entry(substream->proc_info_entry);
 589	substream->proc_info_entry = NULL;
 590	snd_info_free_entry(substream->proc_hw_params_entry);
 591	substream->proc_hw_params_entry = NULL;
 592	snd_info_free_entry(substream->proc_sw_params_entry);
 593	substream->proc_sw_params_entry = NULL;
 594	snd_info_free_entry(substream->proc_status_entry);
 595	substream->proc_status_entry = NULL;
 596	snd_info_free_entry(substream->proc_root);
 597	substream->proc_root = NULL;
 598	return 0;
 599}
 600#else /* !CONFIG_SND_VERBOSE_PROCFS */
 601static inline int snd_pcm_stream_proc_init(struct snd_pcm_str *pstr) { return 0; }
 602static inline int snd_pcm_stream_proc_done(struct snd_pcm_str *pstr) { return 0; }
 603static inline int snd_pcm_substream_proc_init(struct snd_pcm_substream *substream) { return 0; }
 604static inline int snd_pcm_substream_proc_done(struct snd_pcm_substream *substream) { return 0; }
 605#endif /* CONFIG_SND_VERBOSE_PROCFS */
 606
 607/**
 608 * snd_pcm_new_stream - create a new PCM stream
 609 * @pcm: the pcm instance
 610 * @stream: the stream direction, SNDRV_PCM_STREAM_XXX
 611 * @substream_count: the number of substreams
 612 *
 613 * Creates a new stream for the pcm.
 614 * The corresponding stream on the pcm must have been empty before
 615 * calling this, i.e. zero must be given to the argument of
 616 * snd_pcm_new().
 617 *
 618 * Returns zero if successful, or a negative error code on failure.
 619 */
 620int snd_pcm_new_stream(struct snd_pcm *pcm, int stream, int substream_count)
 621{
 622	int idx, err;
 623	struct snd_pcm_str *pstr = &pcm->streams[stream];
 624	struct snd_pcm_substream *substream, *prev;
 625
 626#if defined(CONFIG_SND_PCM_OSS) || defined(CONFIG_SND_PCM_OSS_MODULE)
 627	mutex_init(&pstr->oss.setup_mutex);
 628#endif
 629	pstr->stream = stream;
 630	pstr->pcm = pcm;
 631	pstr->substream_count = substream_count;
 632	if (substream_count > 0) {
 633		err = snd_pcm_stream_proc_init(pstr);
 634		if (err < 0) {
 635			snd_printk(KERN_ERR "Error in snd_pcm_stream_proc_init\n");
 636			return err;
 637		}
 638	}
 639	prev = NULL;
 640	for (idx = 0, prev = NULL; idx < substream_count; idx++) {
 641		substream = kzalloc(sizeof(*substream), GFP_KERNEL);
 642		if (substream == NULL) {
 643			snd_printk(KERN_ERR "Cannot allocate PCM substream\n");
 644			return -ENOMEM;
 645		}
 646		substream->pcm = pcm;
 647		substream->pstr = pstr;
 648		substream->number = idx;
 649		substream->stream = stream;
 650		sprintf(substream->name, "subdevice #%i", idx);
 651		snprintf(substream->latency_id, sizeof(substream->latency_id),
 652			 "ALSA-PCM%d-%d%c%d", pcm->card->number, pcm->device,
 653			 (stream ? 'c' : 'p'), idx);
 654		substream->buffer_bytes_max = UINT_MAX;
 655		if (prev == NULL)
 656			pstr->substream = substream;
 657		else
 658			prev->next = substream;
 659		err = snd_pcm_substream_proc_init(substream);
 660		if (err < 0) {
 661			snd_printk(KERN_ERR "Error in snd_pcm_stream_proc_init\n");
 662			if (prev == NULL)
 663				pstr->substream = NULL;
 664			else
 665				prev->next = NULL;
 666			kfree(substream);
 667			return err;
 668		}
 669		substream->group = &substream->self_group;
 670		spin_lock_init(&substream->self_group.lock);
 671		INIT_LIST_HEAD(&substream->self_group.substreams);
 672		list_add_tail(&substream->link_list, &substream->self_group.substreams);
 673		atomic_set(&substream->mmap_count, 0);
 674		prev = substream;
 675	}
 676	return 0;
 677}				
 678
 679EXPORT_SYMBOL(snd_pcm_new_stream);
 680
 681/**
 682 * snd_pcm_new - create a new PCM instance
 683 * @card: the card instance
 684 * @id: the id string
 685 * @device: the device index (zero based)
 686 * @playback_count: the number of substreams for playback
 687 * @capture_count: the number of substreams for capture
 688 * @rpcm: the pointer to store the new pcm instance
 689 *
 690 * Creates a new PCM instance.
 691 *
 692 * The pcm operators have to be set afterwards to the new instance
 693 * via snd_pcm_set_ops().
 694 *
 695 * Returns zero if successful, or a negative error code on failure.
 696 */
 697int snd_pcm_new(struct snd_card *card, const char *id, int device,
 698		int playback_count, int capture_count,
 699	        struct snd_pcm ** rpcm)
 700{
 701	struct snd_pcm *pcm;
 702	int err;
 703	static struct snd_device_ops ops = {
 704		.dev_free = snd_pcm_dev_free,
 705		.dev_register =	snd_pcm_dev_register,
 706		.dev_disconnect = snd_pcm_dev_disconnect,
 707	};
 708
 709	if (snd_BUG_ON(!card))
 710		return -ENXIO;
 711	if (rpcm)
 712		*rpcm = NULL;
 713	pcm = kzalloc(sizeof(*pcm), GFP_KERNEL);
 714	if (pcm == NULL) {
 715		snd_printk(KERN_ERR "Cannot allocate PCM\n");
 716		return -ENOMEM;
 717	}
 718	pcm->card = card;
 719	pcm->device = device;
 720	if (id)
 721		strlcpy(pcm->id, id, sizeof(pcm->id));
 722	if ((err = snd_pcm_new_stream(pcm, SNDRV_PCM_STREAM_PLAYBACK, playback_count)) < 0) {
 723		snd_pcm_free(pcm);
 724		return err;
 725	}
 726	if ((err = snd_pcm_new_stream(pcm, SNDRV_PCM_STREAM_CAPTURE, capture_count)) < 0) {
 727		snd_pcm_free(pcm);
 728		return err;
 729	}
 730	mutex_init(&pcm->open_mutex);
 731	init_waitqueue_head(&pcm->open_wait);
 732	if ((err = snd_device_new(card, SNDRV_DEV_PCM, pcm, &ops)) < 0) {
 733		snd_pcm_free(pcm);
 734		return err;
 735	}
 736	if (rpcm)
 737		*rpcm = pcm;
 738	return 0;
 739}
 740
 741EXPORT_SYMBOL(snd_pcm_new);
 742
 743static void snd_pcm_free_stream(struct snd_pcm_str * pstr)
 744{
 745	struct snd_pcm_substream *substream, *substream_next;
 746#if defined(CONFIG_SND_PCM_OSS) || defined(CONFIG_SND_PCM_OSS_MODULE)
 747	struct snd_pcm_oss_setup *setup, *setupn;
 748#endif
 749	substream = pstr->substream;
 750	while (substream) {
 751		substream_next = substream->next;
 752		snd_pcm_timer_done(substream);
 753		snd_pcm_substream_proc_done(substream);
 754		kfree(substream);
 755		substream = substream_next;
 756	}
 757	snd_pcm_stream_proc_done(pstr);
 758#if defined(CONFIG_SND_PCM_OSS) || defined(CONFIG_SND_PCM_OSS_MODULE)
 759	for (setup = pstr->oss.setup_list; setup; setup = setupn) {
 760		setupn = setup->next;
 761		kfree(setup->task_name);
 762		kfree(setup);
 763	}
 764#endif
 765}
 766
 767static int snd_pcm_free(struct snd_pcm *pcm)
 768{
 769	struct snd_pcm_notify *notify;
 770
 771	if (!pcm)
 772		return 0;
 773	list_for_each_entry(notify, &snd_pcm_notify_list, list) {
 774		notify->n_unregister(pcm);
 775	}
 776	if (pcm->private_free)
 777		pcm->private_free(pcm);
 778	snd_pcm_lib_preallocate_free_for_all(pcm);
 779	snd_pcm_free_stream(&pcm->streams[SNDRV_PCM_STREAM_PLAYBACK]);
 780	snd_pcm_free_stream(&pcm->streams[SNDRV_PCM_STREAM_CAPTURE]);
 781	kfree(pcm);
 782	return 0;
 783}
 784
 785static int snd_pcm_dev_free(struct snd_device *device)
 786{
 787	struct snd_pcm *pcm = device->device_data;
 788	return snd_pcm_free(pcm);
 789}
 790
 791int snd_pcm_attach_substream(struct snd_pcm *pcm, int stream,
 792			     struct file *file,
 793			     struct snd_pcm_substream **rsubstream)
 794{
 795	struct snd_pcm_str * pstr;
 796	struct snd_pcm_substream *substream;
 797	struct snd_pcm_runtime *runtime;
 798	struct snd_ctl_file *kctl;
 799	struct snd_card *card;
 800	int prefer_subdevice = -1;
 801	size_t size;
 802
 803	if (snd_BUG_ON(!pcm || !rsubstream))
 804		return -ENXIO;
 805	*rsubstream = NULL;
 806	pstr = &pcm->streams[stream];
 807	if (pstr->substream == NULL || pstr->substream_count == 0)
 808		return -ENODEV;
 809
 810	card = pcm->card;
 811	read_lock(&card->ctl_files_rwlock);
 812	list_for_each_entry(kctl, &card->ctl_files, list) {
 813		if (kctl->pid == task_pid(current)) {
 814			prefer_subdevice = kctl->prefer_pcm_subdevice;
 815			if (prefer_subdevice != -1)
 816				break;
 817		}
 818	}
 819	read_unlock(&card->ctl_files_rwlock);
 820
 821	switch (stream) {
 822	case SNDRV_PCM_STREAM_PLAYBACK:
 823		if (pcm->info_flags & SNDRV_PCM_INFO_HALF_DUPLEX) {
 824			for (substream = pcm->streams[SNDRV_PCM_STREAM_CAPTURE].substream; substream; substream = substream->next) {
 825				if (SUBSTREAM_BUSY(substream))
 826					return -EAGAIN;
 827			}
 828		}
 829		break;
 830	case SNDRV_PCM_STREAM_CAPTURE:
 831		if (pcm->info_flags & SNDRV_PCM_INFO_HALF_DUPLEX) {
 832			for (substream = pcm->streams[SNDRV_PCM_STREAM_PLAYBACK].substream; substream; substream = substream->next) {
 833				if (SUBSTREAM_BUSY(substream))
 834					return -EAGAIN;
 835			}
 836		}
 837		break;
 838	default:
 839		return -EINVAL;
 840	}
 841
 842	if (file->f_flags & O_APPEND) {
 843		if (prefer_subdevice < 0) {
 844			if (pstr->substream_count > 1)
 845				return -EINVAL; /* must be unique */
 846			substream = pstr->substream;
 847		} else {
 848			for (substream = pstr->substream; substream;
 849			     substream = substream->next)
 850				if (substream->number == prefer_subdevice)
 851					break;
 852		}
 853		if (! substream)
 854			return -ENODEV;
 855		if (! SUBSTREAM_BUSY(substream))
 856			return -EBADFD;
 857		substream->ref_count++;
 858		*rsubstream = substream;
 859		return 0;
 860	}
 861
 862	if (prefer_subdevice >= 0) {
 863		for (substream = pstr->substream; substream; substream = substream->next)
 864			if (!SUBSTREAM_BUSY(substream) && substream->number == prefer_subdevice)
 865				goto __ok;
 866	}
 867	for (substream = pstr->substream; substream; substream = substream->next)
 868		if (!SUBSTREAM_BUSY(substream))
 869			break;
 870      __ok:
 871	if (substream == NULL)
 872		return -EAGAIN;
 873
 874	runtime = kzalloc(sizeof(*runtime), GFP_KERNEL);
 875	if (runtime == NULL)
 876		return -ENOMEM;
 877
 878	size = PAGE_ALIGN(sizeof(struct snd_pcm_mmap_status));
 879	runtime->status = snd_malloc_pages(size, GFP_KERNEL);
 880	if (runtime->status == NULL) {
 881		kfree(runtime);
 882		return -ENOMEM;
 883	}
 884	memset((void*)runtime->status, 0, size);
 885
 886	size = PAGE_ALIGN(sizeof(struct snd_pcm_mmap_control));
 887	runtime->control = snd_malloc_pages(size, GFP_KERNEL);
 888	if (runtime->control == NULL) {
 889		snd_free_pages((void*)runtime->status,
 890			       PAGE_ALIGN(sizeof(struct snd_pcm_mmap_status)));
 891		kfree(runtime);
 892		return -ENOMEM;
 893	}
 894	memset((void*)runtime->control, 0, size);
 895
 896	init_waitqueue_head(&runtime->sleep);
 897	init_waitqueue_head(&runtime->tsleep);
 898
 899	runtime->status->state = SNDRV_PCM_STATE_OPEN;
 900
 901	substream->runtime = runtime;
 902	substream->private_data = pcm->private_data;
 903	substream->ref_count = 1;
 904	substream->f_flags = file->f_flags;
 905	substream->pid = get_pid(task_pid(current));
 906	pstr->substream_opened++;
 907	*rsubstream = substream;
 908	return 0;
 909}
 910
 911void snd_pcm_detach_substream(struct snd_pcm_substream *substream)
 912{
 913	struct snd_pcm_runtime *runtime;
 914
 915	if (PCM_RUNTIME_CHECK(substream))
 916		return;
 917	runtime = substream->runtime;
 918	if (runtime->private_free != NULL)
 919		runtime->private_free(runtime);
 920	snd_free_pages((void*)runtime->status,
 921		       PAGE_ALIGN(sizeof(struct snd_pcm_mmap_status)));
 922	snd_free_pages((void*)runtime->control,
 923		       PAGE_ALIGN(sizeof(struct snd_pcm_mmap_control)));
 924	kfree(runtime->hw_constraints.rules);
 925#ifdef CONFIG_SND_PCM_XRUN_DEBUG
 926	if (runtime->hwptr_log)
 927		kfree(runtime->hwptr_log);
 928#endif
 929	kfree(runtime);
 930	substream->runtime = NULL;
 931	put_pid(substream->pid);
 932	substream->pid = NULL;
 933	substream->pstr->substream_opened--;
 934}
 935
 936static ssize_t show_pcm_class(struct device *dev,
 937			      struct device_attribute *attr, char *buf)
 938{
 939	struct snd_pcm *pcm;
 940	const char *str;
 941	static const char *strs[SNDRV_PCM_CLASS_LAST + 1] = {
 942		[SNDRV_PCM_CLASS_GENERIC] = "generic",
 943		[SNDRV_PCM_CLASS_MULTI] = "multi",
 944		[SNDRV_PCM_CLASS_MODEM] = "modem",
 945		[SNDRV_PCM_CLASS_DIGITIZER] = "digitizer",
 946	};
 947
 948	if (! (pcm = dev_get_drvdata(dev)) ||
 949	    pcm->dev_class > SNDRV_PCM_CLASS_LAST)
 950		str = "none";
 951	else
 952		str = strs[pcm->dev_class];
 953        return snprintf(buf, PAGE_SIZE, "%s\n", str);
 954}
 955
 956static struct device_attribute pcm_attrs =
 957	__ATTR(pcm_class, S_IRUGO, show_pcm_class, NULL);
 958
 959static int snd_pcm_dev_register(struct snd_device *device)
 960{
 961	int cidx, err;
 962	struct snd_pcm_substream *substream;
 963	struct snd_pcm_notify *notify;
 964	char str[16];
 965	struct snd_pcm *pcm;
 966	struct device *dev;
 967
 968	if (snd_BUG_ON(!device || !device->device_data))
 969		return -ENXIO;
 970	pcm = device->device_data;
 971	mutex_lock(&register_mutex);
 972	err = snd_pcm_add(pcm);
 973	if (err) {
 974		mutex_unlock(&register_mutex);
 975		return err;
 976	}
 977	for (cidx = 0; cidx < 2; cidx++) {
 978		int devtype = -1;
 979		if (pcm->streams[cidx].substream == NULL)
 980			continue;
 981		switch (cidx) {
 982		case SNDRV_PCM_STREAM_PLAYBACK:
 983			sprintf(str, "pcmC%iD%ip", pcm->card->number, pcm->device);
 984			devtype = SNDRV_DEVICE_TYPE_PCM_PLAYBACK;
 985			break;
 986		case SNDRV_PCM_STREAM_CAPTURE:
 987			sprintf(str, "pcmC%iD%ic", pcm->card->number, pcm->device);
 988			devtype = SNDRV_DEVICE_TYPE_PCM_CAPTURE;
 989			break;
 990		}
 991		/* device pointer to use, pcm->dev takes precedence if
 992		 * it is assigned, otherwise fall back to card's device
 993		 * if possible */
 994		dev = pcm->dev;
 995		if (!dev)
 996			dev = snd_card_get_device_link(pcm->card);
 997		/* register pcm */
 998		err = snd_register_device_for_dev(devtype, pcm->card,
 999						  pcm->device,
1000						  &snd_pcm_f_ops[cidx],
1001						  pcm, str, dev);
1002		if (err < 0) {
1003			list_del(&pcm->list);
1004			mutex_unlock(&register_mutex);
1005			return err;
1006		}
1007		snd_add_device_sysfs_file(devtype, pcm->card, pcm->device,
1008					  &pcm_attrs);
1009		for (substream = pcm->streams[cidx].substream; substream; substream = substream->next)
1010			snd_pcm_timer_init(substream);
1011	}
1012
1013	list_for_each_entry(notify, &snd_pcm_notify_list, list)
1014		notify->n_register(pcm);
1015
1016	mutex_unlock(&register_mutex);
1017	return 0;
1018}
1019
1020static int snd_pcm_dev_disconnect(struct snd_device *device)
1021{
1022	struct snd_pcm *pcm = device->device_data;
1023	struct snd_pcm_notify *notify;
1024	struct snd_pcm_substream *substream;
1025	int cidx, devtype;
1026
1027	mutex_lock(&register_mutex);
1028	if (list_empty(&pcm->list))
1029		goto unlock;
1030
1031	list_del_init(&pcm->list);
1032	for (cidx = 0; cidx < 2; cidx++)
1033		for (substream = pcm->streams[cidx].substream; substream; substream = substream->next)
1034			if (substream->runtime)
1035				substream->runtime->status->state = SNDRV_PCM_STATE_DISCONNECTED;
1036	list_for_each_entry(notify, &snd_pcm_notify_list, list) {
1037		notify->n_disconnect(pcm);
1038	}
1039	for (cidx = 0; cidx < 2; cidx++) {
1040		devtype = -1;
1041		switch (cidx) {
1042		case SNDRV_PCM_STREAM_PLAYBACK:
1043			devtype = SNDRV_DEVICE_TYPE_PCM_PLAYBACK;
1044			break;
1045		case SNDRV_PCM_STREAM_CAPTURE:
1046			devtype = SNDRV_DEVICE_TYPE_PCM_CAPTURE;
1047			break;
1048		}
1049		snd_unregister_device(devtype, pcm->card, pcm->device);
1050	}
1051 unlock:
1052	mutex_unlock(&register_mutex);
1053	return 0;
1054}
1055
1056int snd_pcm_notify(struct snd_pcm_notify *notify, int nfree)
1057{
1058	struct snd_pcm *pcm;
1059
1060	if (snd_BUG_ON(!notify ||
1061		       !notify->n_register ||
1062		       !notify->n_unregister ||
1063		       !notify->n_disconnect))
1064		return -EINVAL;
1065	mutex_lock(&register_mutex);
1066	if (nfree) {
1067		list_del(&notify->list);
1068		list_for_each_entry(pcm, &snd_pcm_devices, list)
1069			notify->n_unregister(pcm);
1070	} else {
1071		list_add_tail(&notify->list, &snd_pcm_notify_list);
1072		list_for_each_entry(pcm, &snd_pcm_devices, list)
1073			notify->n_register(pcm);
1074	}
1075	mutex_unlock(&register_mutex);
1076	return 0;
1077}
1078
1079EXPORT_SYMBOL(snd_pcm_notify);
1080
1081#ifdef CONFIG_PROC_FS
1082/*
1083 *  Info interface
1084 */
1085
1086static void snd_pcm_proc_read(struct snd_info_entry *entry,
1087			      struct snd_info_buffer *buffer)
1088{
1089	struct snd_pcm *pcm;
1090
1091	mutex_lock(&register_mutex);
1092	list_for_each_entry(pcm, &snd_pcm_devices, list) {
1093		snd_iprintf(buffer, "%02i-%02i: %s : %s",
1094			    pcm->card->number, pcm->device, pcm->id, pcm->name);
1095		if (pcm->streams[SNDRV_PCM_STREAM_PLAYBACK].substream)
1096			snd_iprintf(buffer, " : playback %i",
1097				    pcm->streams[SNDRV_PCM_STREAM_PLAYBACK].substream_count);
1098		if (pcm->streams[SNDRV_PCM_STREAM_CAPTURE].substream)
1099			snd_iprintf(buffer, " : capture %i",
1100				    pcm->streams[SNDRV_PCM_STREAM_CAPTURE].substream_count);
1101		snd_iprintf(buffer, "\n");
1102	}
1103	mutex_unlock(&register_mutex);
1104}
1105
1106static struct snd_info_entry *snd_pcm_proc_entry;
1107
1108static void snd_pcm_proc_init(void)
1109{
1110	struct snd_info_entry *entry;
1111
1112	if ((entry = snd_info_create_module_entry(THIS_MODULE, "pcm", NULL)) != NULL) {
1113		snd_info_set_text_ops(entry, NULL, snd_pcm_proc_read);
1114		if (snd_info_register(entry) < 0) {
1115			snd_info_free_entry(entry);
1116			entry = NULL;
1117		}
1118	}
1119	snd_pcm_proc_entry = entry;
1120}
1121
1122static void snd_pcm_proc_done(void)
1123{
1124	snd_info_free_entry(snd_pcm_proc_entry);
1125}
1126
1127#else /* !CONFIG_PROC_FS */
1128#define snd_pcm_proc_init()
1129#define snd_pcm_proc_done()
1130#endif /* CONFIG_PROC_FS */
1131
1132
1133/*
1134 *  ENTRY functions
1135 */
1136
1137static int __init alsa_pcm_init(void)
1138{
1139	snd_ctl_register_ioctl(snd_pcm_control_ioctl);
1140	snd_ctl_register_ioctl_compat(snd_pcm_control_ioctl);
1141	snd_pcm_proc_init();
1142	return 0;
1143}
1144
1145static void __exit alsa_pcm_exit(void)
1146{
1147	snd_ctl_unregister_ioctl(snd_pcm_control_ioctl);
1148	snd_ctl_unregister_ioctl_compat(snd_pcm_control_ioctl);
1149	snd_pcm_proc_done();
1150}
1151
1152module_init(alsa_pcm_init)
1153module_exit(alsa_pcm_exit)