ALSA: hda: hda_component: Add pre and post playback hooks to hda_component
authorStefan Binding <sbinding@opensource.cirrus.com>
Fri, 21 Jul 2023 15:18:12 +0000 (16:18 +0100)
committerTakashi Iwai <tiwai@suse.de>
Mon, 24 Jul 2023 09:00:02 +0000 (11:00 +0200)
These hooks can be used to add callbacks that would be run before and after
the main playback hooks. These hooks would be called for all amps, before
moving on to the next hook, i.e. pre_playback_hook would be called for
all amps, before the playback_hook is called for all amps, then finally
the post_playback_hook is called for all amps.

Signed-off-by: Stefan Binding <sbinding@opensource.cirrus.com>
Link: https://lore.kernel.org/r/20230721151816.2080453-8-sbinding@opensource.cirrus.com
Signed-off-by: Takashi Iwai <tiwai@suse.de>
sound/pci/hda/hda_component.h
sound/pci/hda/patch_realtek.c

index 534e845b9cd1da5deb9b3d0ad96410f37dbb057c..f170aec967c18ce349fd5bb72a85349d199fd14f 100644 (file)
@@ -15,5 +15,7 @@ struct hda_component {
        struct device *dev;
        char name[HDA_MAX_NAME_SIZE];
        struct hda_codec *codec;
+       void (*pre_playback_hook)(struct device *dev, int action);
        void (*playback_hook)(struct device *dev, int action);
+       void (*post_playback_hook)(struct device *dev, int action);
 };
index e2f8b608de82b55e04357b6dcdbae114f2dd5fc6..7d14f9dbe95e94d0930227219fca700516c6c4c8 100644 (file)
@@ -6700,9 +6700,17 @@ static void comp_generic_playback_hook(struct hda_pcm_stream *hinfo, struct hda_
        int i;
 
        for (i = 0; i < HDA_MAX_COMPONENTS; i++) {
-               if (spec->comps[i].dev)
+               if (spec->comps[i].dev && spec->comps[i].pre_playback_hook)
+                       spec->comps[i].pre_playback_hook(spec->comps[i].dev, action);
+       }
+       for (i = 0; i < HDA_MAX_COMPONENTS; i++) {
+               if (spec->comps[i].dev && spec->comps[i].playback_hook)
                        spec->comps[i].playback_hook(spec->comps[i].dev, action);
        }
+       for (i = 0; i < HDA_MAX_COMPONENTS; i++) {
+               if (spec->comps[i].dev && spec->comps[i].post_playback_hook)
+                       spec->comps[i].post_playback_hook(spec->comps[i].dev, action);
+       }
 }
 
 struct cs35l41_dev_name {