From e423837602e5cdc11a0912f4bd27904d4e0c6946 Mon Sep 17 00:00:00 2001 From: Mark Farrugia Date: Fri, 4 Jan 2019 18:22:35 +1100 Subject: Create PCM devices as soon as the AVIRT map is set We no longer need to wait until the card is sealed to create the PCM device. We can create it right away. Signed-off-by: Mark Farrugia --- configfs.c | 5 +++++ core.c | 17 +++++------------ core.h | 2 ++ 3 files changed, 12 insertions(+), 12 deletions(-) diff --git a/configfs.c b/configfs.c index 12e95a5..c19c2b5 100644 --- a/configfs.c +++ b/configfs.c @@ -49,6 +49,11 @@ static ssize_t cfg_snd_avirt_stream_map_store(struct config_item *item, split = strsep((char **)&page, "\n"); memcpy(stream->map, (char *)split, count); + /* Create the PCM device now */ + stream->pcm = snd_avirt_pcm_create(stream); + if (IS_ERROR_NULL(stream->pcm)) + return 0; + return count; } CONFIGFS_ATTR(cfg_snd_avirt_stream_, map); diff --git a/core.c b/core.c index 2fd416e..e431402 100644 --- a/core.c +++ b/core.c @@ -220,7 +220,7 @@ static void pcm_private_data_free(struct snd_pcm *pcm) kfree(pcm->private_data); } -static struct snd_pcm *pcm_create(struct snd_avirt_stream *stream) +struct snd_pcm *snd_avirt_pcm_create(struct snd_avirt_stream *stream) { struct snd_avirt_private_data *avirt_private_data; struct snd_avirt_audiopath *audiopath; @@ -270,8 +270,11 @@ static struct snd_pcm *pcm_create(struct snd_avirt_stream *stream) err = snd_pcm_new(core.card, stream->name, stream->device, playback, capture, &pcm); - if (err < 0) + if (err < 0) { + D_ERRORK("Failed to create PCM device for stream: '%s'", + stream->name); return ERR_PTR(err); + } /** Register driver callbacks */ if (playback) @@ -441,16 +444,6 @@ int snd_avirt_streams_seal(void) return -1; } - list_for_each(entry, &core.stream_group->cg_children) { - item = container_of(entry, struct config_item, ci_entry); - stream = snd_avirt_stream_from_config_item(item); - if (!stream) - return -EFAULT; - stream->pcm = pcm_create(stream); - if (IS_ERR_OR_NULL(stream->pcm)) - return (PTR_ERR(stream->pcm)); - } - list_for_each_entry(ap_obj, &audiopath_list, list) { D_INFOK("configure() AP uid: %s", ap_obj->path->uid); for (i = 0; i < MAX_STREAMS; i++) diff --git a/core.h b/core.h index 40252e6..5ea78cd 100644 --- a/core.h +++ b/core.h @@ -69,6 +69,8 @@ struct snd_avirt_stream *snd_avirt_stream_find_by_device(unsigned int device); struct snd_avirt_stream *snd_avirt_stream_create(const char *name, int direction); +struct snd_pcm *snd_avirt_pcm_create(struct snd_avirt_stream *stream); + /** * snd_avirt_audiopath_get - retrieves the Audio Path by it's UID * @uid: Unique ID for the Audio Path -- cgit 1.2.3-korg