• Takashi Sakamoto's avatar
    Revert "ALSA: echoaudio: purge contradictions between dimension matrix members... · 51db452d
    Takashi Sakamoto authored
    Revert "ALSA: echoaudio: purge contradictions between dimension matrix members and total number of members"
    
    This reverts commit 275353bb to fix a regression which can abort
    'alsactl' program in alsa-utils due to assertion in alsa-lib.
    
    alsactl: control.c:2513: snd_ctl_elem_value_get_integer: Assertion `idx < sizeof(obj->value.integer.value) / sizeof(obj->value.integer.value[0])' failed.
    
    alsactl: control.c:2976: snd_ctl_elem_value_get_integer: Assertion `idx < ARRAY_SIZE(obj->value.integer.value)' failed.
    
    This commit is a band-aid. In a point of usage of ALSA control interface,
    the drivers still bring an issue that they prevent userspace applications
    to have a consistent way to parse each levels of the dimension information
    via ALSA control interface.
    
    Let me investigate this issue. Current implementation of the drivers
    have three control element sets with dimension information:
     * 'Monitor Mixer Volume' (type: integer)
     * 'VMixer Volume' (type: integer)
     * 'VU-meters' (type: boolean)
    
    Although the number of elements named as 'Monitor Mixer Volume' differs
    depending on drivers in this group, it can be calculated by macros
    defined by each driver (= (BX_NUM - BX_ANALOG_IN) * BX_ANALOG_IN). Each
    of the elements has one member for value and has dimension information
    with 2 levels (= BX_ANALOG_IN * (BX_NUM - BX_ANALOG_IN)). For these
    elements, userspace applications are expected to handle the dimension
    information so that all of the elements construct a matrix where the
    number of rows and columns are represented by the dimension information.
    
    The same way is applied to elements named as 'VMixer Volume'. The number
    of these elements can also be calculated by macros defined by each
    drivers (= PX_ANALOG_IN * BX_ANALOG_IN). Each of the element has one
    member for value and has dimension information with 2 levels
    (= BX_ANALOG_IN * PX_ANALOG_IN). All of the elements construct a matrix
    with the dimension information.
    
    An element named as 'VU-meters' gets a different way in a point of
    dimension information. The element includes 96 members for value. The
    element has dimension information with 3 levels (= 3 or 2 * 16 * 2). For
    this element, userspace applications are expected to handle the dimension
    information so that all of the members for value construct a matrix
    where the number of rows and columns are represented by the dimension
    information. This is different from the way for the former.
    
    As a summary, the drivers were not designed to produce a consistent way to
    parse the dimension information. This makes it hard for general userspace
    applications such as amixer to parse the information by a consistent way,
    and actually no userspace applications except for 'echomixer' utilize the
    dimension information. Additionally, no drivers excluding this group use
    the information.
    
    The reverted commit was written based on the latter way. A commit
    860c1994 ('ALSA: control: add dimension validator for userspace
    elements') is written based on the latter way, too. The patch should be
    reconsider too in the same time to re-define a consistent way to parse the
    dimension information.
    Reported-by: default avatarMark Hills <mark@xwax.org>
    Reported-by: default avatarS. Christian Collins <s.chriscollins@gmail.com>
    Fixes: 275353bb ('ALSA: echoaudio: purge contradictions between dimension matrix members and total number of members')
    Cc: <stable@vger.kernel.org> # v4.8+
    Signed-off-by: default avatarTakashi Sakamoto <o-takashi@sakamocchi.jp>
    Signed-off-by: default avatarTakashi Iwai <tiwai@suse.de>
    51db452d
echoaudio.c 61.4 KB