[PATCH 3/6] winealsa: Introduce a helper to retrieve the card name.

Andrew Eikum aeikum at codeweavers.com
Tue Feb 15 14:00:52 CST 2022


Signed-off-by: Andrew Eikum <aeikum at codeweavers.com>

On Tue, Feb 15, 2022 at 01:09:50PM +0000, Huw Davies wrote:
> This is primarily to simplify the code.  It does however add name
> collision detection if there are two unknown cards.
> 
> Signed-off-by: Huw Davies <huw at codeweavers.com>
> ---
>  dlls/winealsa.drv/mmdevdrv.c | 86 ++++++++++++++++++++----------------
>  1 file changed, 48 insertions(+), 38 deletions(-)
> 
> diff --git a/dlls/winealsa.drv/mmdevdrv.c b/dlls/winealsa.drv/mmdevdrv.c
> index 6accd1bab4f..534667040a2 100644
> --- a/dlls/winealsa.drv/mmdevdrv.c
> +++ b/dlls/winealsa.drv/mmdevdrv.c
> @@ -266,6 +266,19 @@ int WINAPI AUDDRV_GetPriority(void)
>      return Priority_Neutral;
>  }
>  
> +static WCHAR *strdupAtoW(const char *str)
> +{
> +    unsigned int len;
> +    WCHAR *ret;
> +
> +    if(!str) return NULL;
> +
> +    len = MultiByteToWideChar(CP_UNIXCP, 0, str, -1, NULL, 0);
> +    ret = malloc(len * sizeof(WCHAR));
> +    if(ret) MultiByteToWideChar(CP_UNIXCP, 0, str, -1, ret, len);
> +    return ret;
> +}
> +
>  static void set_device_guid(EDataFlow flow, HKEY drv_key, const WCHAR *key_name,
>          GUID *guid)
>  {
> @@ -553,6 +566,36 @@ static BOOL need_card_number(int card, const char *string)
>      return FALSE;
>  }
>  
> +static WCHAR *alsa_get_card_name(int card)
> +{
> +    char *cardname;
> +    WCHAR *ret;
> +    int err;
> +
> +    if((err = snd_card_get_name(card, &cardname)) < 0){
> +        /* FIXME: Should be localized */
> +        WARN("Unable to get card name for ALSA device %d: %d (%s)\n", card, err, snd_strerror(err));
> +        cardname = strdup("Unknown soundcard");
> +    }
> +
> +    if(need_card_number(card, cardname)){
> +        char *cardnameN;
> +        /*
> +         * For identical card names, second and subsequent instances get
> +         * card number prefix to distinguish them (like Windows).
> +         */
> +        if(asprintf(&cardnameN, "%u-%s", card, cardname) > 0){
> +            free(cardname);
> +            cardname = cardnameN;
> +        }
> +    }
> +
> +    ret = strdupAtoW(cardname);
> +    free(cardname);
> +
> +    return ret;
> +}
> +
>  static HRESULT alsa_enum_devices(EDataFlow flow, WCHAR ***ids, GUID **guids,
>          UINT *num)
>  {
> @@ -571,13 +614,10 @@ static HRESULT alsa_enum_devices(EDataFlow flow, WCHAR ***ids, GUID **guids,
>  
>      get_reg_devices(flow, ids, guids, num);
>  
> -    for(err = snd_card_next(&card); card != -1 && err >= 0;
> -            err = snd_card_next(&card)){
> +    for(err = snd_card_next(&card); card != -1 && err >= 0; err = snd_card_next(&card)){
>          char cardpath[64];
> -        char *cardname;
> -        WCHAR *cardnameW;
> +        WCHAR *cardname;
>          snd_ctl_t *ctl;
> -        DWORD len;
>  
>          sprintf(cardpath, "hw:%u", card);
>  
> @@ -587,39 +627,9 @@ static HRESULT alsa_enum_devices(EDataFlow flow, WCHAR ***ids, GUID **guids,
>              continue;
>          }
>  
> -        if(snd_card_get_name(card, &cardname) < 0) {
> -            /* FIXME: Should be localized */
> -            static const WCHAR nameW[] = {'U','n','k','n','o','w','n',' ','s','o','u','n','d','c','a','r','d',0};
> -            WARN("Unable to get card name for ALSA device %s: %d (%s)\n",
> -                    cardpath, err, snd_strerror(err));
> -            alsa_get_card_devices(flow, ids, guids, num, ctl, card, nameW);
> -        }else{
> -            if(need_card_number(card, cardname)){
> -                char *cardnameN;
> -                /*
> -                 * For identical card names, second and subsequent instances get
> -                 * card number prefix to distinguish them (like Windows).
> -                 */
> -                if(asprintf(&cardnameN, "%u-%s", card, cardname) > 0){
> -                    free(cardname);
> -                    cardname = cardnameN;
> -                }
> -            }
> -            len = MultiByteToWideChar(CP_UNIXCP, 0, cardname, -1, NULL, 0);
> -            cardnameW = HeapAlloc(GetProcessHeap(), 0, len * sizeof(WCHAR));
> -
> -            if(!cardnameW){
> -                free(cardname);
> -                snd_ctl_close(ctl);
> -                return E_OUTOFMEMORY;
> -            }
> -            MultiByteToWideChar(CP_UNIXCP, 0, cardname, -1, cardnameW, len);
> -
> -            alsa_get_card_devices(flow, ids, guids, num, ctl, card, cardnameW);
> -
> -            HeapFree(GetProcessHeap(), 0, cardnameW);
> -            free(cardname);
> -        }
> +        cardname = alsa_get_card_name(card);
> +        alsa_get_card_devices(flow, ids, guids, num, ctl, card, cardname);
> +        free(cardname);
>  
>          snd_ctl_close(ctl);
>      }
> -- 
> 2.25.1
> 
> 



More information about the wine-devel mailing list