*参照元 [#n8f15bb9] #backlinks *説明 [#v34900da] -パス: [[linux-2.6.33/sound/soc/soc-core.c]] -FIXME: これは何? --説明 **引数 [#fed1c69c] -struct snd_soc_device *socdev -- --[[linux-2.6.33/snd_soc_device]] -struct snd_soc_dai_link *dai_link -- --[[linux-2.6.33/snd_soc_dai_link]] -int num -- **返り値 [#k3325db7] -int -- **参考 [#e7e4f01c] *実装 [#o5e4904a] /* create a new pcm */ static int soc_new_pcm(struct snd_soc_device *socdev, struct snd_soc_dai_link *dai_link, int num) { struct snd_soc_card *card = socdev->card; struct snd_soc_codec *codec = card->codec; struct snd_soc_platform *platform = card->platform; struct snd_soc_dai *codec_dai = dai_link->codec_dai; struct snd_soc_dai *cpu_dai = dai_link->cpu_dai; struct snd_soc_pcm_runtime *rtd; struct snd_pcm *pcm; char new_name[64]; int ret = 0, playback = 0, capture = 0; - --[[linux-2.6.33/snd_soc_card]] - --[[linux-2.6.33/snd_soc_codec]] - --[[linux-2.6.33/snd_soc_platform]] - --[[linux-2.6.33/snd_soc_dai]] - --[[linux-2.6.33/snd_soc_pcm_runtime]] - --[[linux-2.6.33/snd_pcm]] rtd = kzalloc(sizeof(struct snd_soc_pcm_runtime), GFP_KERNEL); if (rtd == NULL) return -ENOMEM; - --[[linux-2.6.33/kzalloc()]] - --[[linux-2.6.33/GFP_KERNEL]] rtd->dai = dai_link; rtd->socdev = socdev; codec_dai->codec = card->codec; /* check client and interface hw capabilities */ sprintf(new_name, "%s %s-%d", dai_link->stream_name, codec_dai->name, num); if (codec_dai->playback.channels_min) playback = 1; if (codec_dai->capture.channels_min) capture = 1; ret = snd_pcm_new(codec->card, new_name, codec->pcm_devs++, playback, capture, &pcm); if (ret < 0) { printk(KERN_ERR "asoc: can't create pcm for codec %s\n", codec->name); kfree(rtd); return ret; } - --[[linux-2.6.33/snd_pcm_new()]] dai_link->pcm = pcm; pcm->private_data = rtd; soc_pcm_ops.mmap = platform->pcm_ops->mmap; soc_pcm_ops.pointer = platform->pcm_ops->pointer; soc_pcm_ops.ioctl = platform->pcm_ops->ioctl; soc_pcm_ops.copy = platform->pcm_ops->copy; soc_pcm_ops.silence = platform->pcm_ops->silence; soc_pcm_ops.ack = platform->pcm_ops->ack; soc_pcm_ops.page = platform->pcm_ops->page; - --[[linux-2.6.33/soc_pcm_ops(global()]] if (playback) snd_pcm_set_ops(pcm, SNDRV_PCM_STREAM_PLAYBACK, &soc_pcm_ops); if (capture) snd_pcm_set_ops(pcm, SNDRV_PCM_STREAM_CAPTURE, &soc_pcm_ops); - --[[linux-2.6.33/snd_pcm_set_ops()]] - --[[linux-2.6.33/SNDRV_PCM_STREAM_PLAYBACK]] - --[[linux-2.6.33/SNDRV_PCM_STREAM_CAPTURE]] ret = platform->pcm_new(codec->card, codec_dai, pcm); if (ret < 0) { printk(KERN_ERR "asoc: platform pcm constructor failed\n"); kfree(rtd); return ret; } - --[[linux-2.6.33/printk()]] - --[[linux-2.6.33/kfree()]] pcm->private_free = platform->pcm_free; printk(KERN_INFO "asoc: %s <-> %s mapping ok\n", codec_dai->name, cpu_dai->name); return ret; } *コメント [#z7028369]