lkml.org 
[lkml]   [2023]   [May]   [19]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 30/36] ALSA: seq: Allow suppressing UMP conversions
    Date
    A sequencer client like seq_dummy rather doesn't want to convert UMP
    events but receives / sends as is. Add a new event filter flag to
    suppress the automatic UMP conversion and applies accordingly.

    Signed-off-by: Takashi Iwai <tiwai@suse.de>
    ---
    include/uapi/sound/asequencer.h | 1 +
    sound/core/seq/seq_clientmgr.c | 18 ++++++++++--------
    sound/core/seq/seq_dummy.c | 8 ++++++++
    3 files changed, 19 insertions(+), 8 deletions(-)

    diff --git a/include/uapi/sound/asequencer.h b/include/uapi/sound/asequencer.h
    index 2470eaa5edc5..c4632bd9d3a0 100644
    --- a/include/uapi/sound/asequencer.h
    +++ b/include/uapi/sound/asequencer.h
    @@ -347,6 +347,7 @@ typedef int __bitwise snd_seq_client_type_t;
    #define SNDRV_SEQ_FILTER_BROADCAST (1U<<0) /* accept broadcast messages */
    #define SNDRV_SEQ_FILTER_MULTICAST (1U<<1) /* accept multicast messages */
    #define SNDRV_SEQ_FILTER_BOUNCE (1U<<2) /* accept bounce event in error */
    +#define SNDRV_SEQ_FILTER_NO_CONVERT (1U<<30) /* don't convert UMP events */
    #define SNDRV_SEQ_FILTER_USE_EVENT (1U<<31) /* use event filter */

    struct snd_seq_client_info {
    diff --git a/sound/core/seq/seq_clientmgr.c b/sound/core/seq/seq_clientmgr.c
    index 07b090f76b5f..3b1adcb1ccdd 100644
    --- a/sound/core/seq/seq_clientmgr.c
    +++ b/sound/core/seq/seq_clientmgr.c
    @@ -671,14 +671,16 @@ static int snd_seq_deliver_single_event(struct snd_seq_client *client,
    dest_port->time_real);

    #if IS_ENABLED(CONFIG_SND_SEQ_UMP)
    - if (snd_seq_ev_is_ump(event)) {
    - result = snd_seq_deliver_from_ump(client, dest, dest_port,
    - event, atomic, hop);
    - goto __skip;
    - } else if (snd_seq_client_is_ump(dest)) {
    - result = snd_seq_deliver_to_ump(client, dest, dest_port,
    - event, atomic, hop);
    - goto __skip;
    + if (!(dest->filter & SNDRV_SEQ_FILTER_NO_CONVERT)) {
    + if (snd_seq_ev_is_ump(event)) {
    + result = snd_seq_deliver_from_ump(client, dest, dest_port,
    + event, atomic, hop);
    + goto __skip;
    + } else if (snd_seq_client_is_ump(dest)) {
    + result = snd_seq_deliver_to_ump(client, dest, dest_port,
    + event, atomic, hop);
    + goto __skip;
    + }
    }
    #endif /* CONFIG_SND_SEQ_UMP */

    diff --git a/sound/core/seq/seq_dummy.c b/sound/core/seq/seq_dummy.c
    index 2e8844ee32ed..9308194b2d9a 100644
    --- a/sound/core/seq/seq_dummy.c
    +++ b/sound/core/seq/seq_dummy.c
    @@ -152,6 +152,7 @@ static int __init
    register_client(void)
    {
    struct snd_seq_dummy_port *rec1, *rec2;
    + struct snd_seq_client *client;
    int i;

    if (ports < 1) {
    @@ -165,6 +166,13 @@ register_client(void)
    if (my_client < 0)
    return my_client;

    + /* don't convert events but just pass-through */
    + client = snd_seq_kernel_client_get(my_client);
    + if (!client)
    + return -EINVAL;
    + client->filter = SNDRV_SEQ_FILTER_NO_CONVERT;
    + snd_seq_kernel_client_put(client);
    +
    /* create ports */
    for (i = 0; i < ports; i++) {
    rec1 = create_port(i, 0);
    --
    2.35.3
    \
     
     \ /
      Last update: 2023-05-19 11:34    [W:4.086 / U:0.216 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site