Source-Changes-HG archive

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]

[src/trunk]: src/lib/libossaudio ossaudio(3): nested switch statements are ha...



details:   https://anonhg.NetBSD.org/src/rev/13ae7ce7df30
branches:  trunk
changeset: 379578:13ae7ce7df30
user:      nia <nia%NetBSD.org@localhost>
date:      Tue Jun 08 19:26:48 2021 +0000

description:
ossaudio(3): nested switch statements are hard to read, refactor

diffstat:

 lib/libossaudio/oss_dsp.c |  340 +++++++++++++++++++++------------------------
 1 files changed, 157 insertions(+), 183 deletions(-)

diffs (truncated from 401 to 300 lines):

diff -r 48014d679c70 -r 13ae7ce7df30 lib/libossaudio/oss_dsp.c
--- a/lib/libossaudio/oss_dsp.c Tue Jun 08 18:43:54 2021 +0000
+++ b/lib/libossaudio/oss_dsp.c Tue Jun 08 19:26:48 2021 +0000
@@ -1,4 +1,4 @@
-/*     $NetBSD: oss_dsp.c,v 1.1 2021/06/08 18:43:54 nia Exp $  */
+/*     $NetBSD: oss_dsp.c,v 1.2 2021/06/08 19:26:48 nia Exp $  */
 
 /*-
  * Copyright (c) 1997-2021 The NetBSD Foundation, Inc.
@@ -27,7 +27,7 @@
  */
 
 #include <sys/cdefs.h>
-__RCSID("$NetBSD: oss_dsp.c,v 1.1 2021/06/08 18:43:54 nia Exp $");
+__RCSID("$NetBSD: oss_dsp.c,v 1.2 2021/06/08 19:26:48 nia Exp $");
 
 #include <sys/audioio.h>
 #include <stdbool.h>
@@ -38,6 +38,9 @@
        (((info)->mode == AUMODE_RECORD) \
            ? (info)->record.name : (info)->play.name)
 
+static int encoding_to_format(u_int, u_int);
+static int format_to_encoding(int, struct audio_info *);
+
 static int get_vol(u_int, u_char);
 static void set_vol(int, int, bool);
 
@@ -54,8 +57,6 @@ oss_private int
        struct count_info cntinfo;
        struct audio_encoding tmpenc;
        u_int u;
-       u_int encoding;
-       u_int precision;
        int perrors, rerrors;
        static int totalperrors = 0;
        static int totalrerrors = 0;
@@ -173,82 +174,8 @@ oss_private int
                break;
        case SNDCTL_DSP_SETFMT:
                AUDIO_INITINFO(&tmpinfo);
-               switch (INTARG) {
-               case AFMT_MU_LAW:
-                       tmpinfo.play.precision =
-                       tmpinfo.record.precision = 8;
-                       tmpinfo.play.encoding =
-                       tmpinfo.record.encoding = AUDIO_ENCODING_ULAW;
-                       break;
-               case AFMT_A_LAW:
-                       tmpinfo.play.precision =
-                       tmpinfo.record.precision = 8;
-                       tmpinfo.play.encoding =
-                       tmpinfo.record.encoding = AUDIO_ENCODING_ALAW;
-                       break;
-               case AFMT_U8:
-                       tmpinfo.play.precision =
-                       tmpinfo.record.precision = 8;
-                       tmpinfo.play.encoding =
-                       tmpinfo.record.encoding = AUDIO_ENCODING_ULINEAR;
-                       break;
-               case AFMT_S8:
-                       tmpinfo.play.precision =
-                       tmpinfo.record.precision = 8;
-                       tmpinfo.play.encoding =
-                       tmpinfo.record.encoding = AUDIO_ENCODING_SLINEAR;
-                       break;
-               case AFMT_S16_LE:
-                       tmpinfo.play.precision =
-                       tmpinfo.record.precision = 16;
-                       tmpinfo.play.encoding =
-                       tmpinfo.record.encoding = AUDIO_ENCODING_SLINEAR_LE;
-                       break;
-               case AFMT_S16_BE:
-                       tmpinfo.play.precision =
-                       tmpinfo.record.precision = 16;
-                       tmpinfo.play.encoding =
-                       tmpinfo.record.encoding = AUDIO_ENCODING_SLINEAR_BE;
-                       break;
-               case AFMT_U16_LE:
-                       tmpinfo.play.precision =
-                       tmpinfo.record.precision = 16;
-                       tmpinfo.play.encoding =
-                       tmpinfo.record.encoding = AUDIO_ENCODING_ULINEAR_LE;
-                       break;
-               case AFMT_U16_BE:
-                       tmpinfo.play.precision =
-                       tmpinfo.record.precision = 16;
-                       tmpinfo.play.encoding =
-                       tmpinfo.record.encoding = AUDIO_ENCODING_ULINEAR_BE;
-                       break;
-               /*
-                * XXX: When the kernel supports 24-bit LPCM by default,
-                * the 24-bit formats should be handled properly instead
-                * of falling back to 32 bits.
-                */
-               case AFMT_S24_PACKED:
-               case AFMT_S24_LE:
-               case AFMT_S32_LE:
-                       tmpinfo.play.precision =
-                       tmpinfo.record.precision = 32;
-                       tmpinfo.play.encoding =
-                       tmpinfo.record.encoding = AUDIO_ENCODING_SLINEAR_LE;
-                       break;
-               case AFMT_S24_BE:
-               case AFMT_S32_BE:
-                       tmpinfo.play.precision =
-                       tmpinfo.record.precision = 32;
-                       tmpinfo.play.encoding =
-                       tmpinfo.record.encoding = AUDIO_ENCODING_SLINEAR_BE;
-                       break;
-               case AFMT_AC3:
-                       tmpinfo.play.precision =
-                       tmpinfo.record.precision = 16;
-                       tmpinfo.play.encoding =
-                       tmpinfo.record.encoding = AUDIO_ENCODING_AC3;
-                       break;
-               default:
+               retval = format_to_encoding(INTARG, &tmpinfo);
+               if (retval < 0) {
                        /*
                         * OSSv4 specifies that if an invalid format is chosen
                         * by an application then a sensible format supported
@@ -270,7 +197,6 @@ oss_private int
                        tmpinfo.record.precision =
                            (tmpinfo.mode == AUMODE_RECORD) ?
                            hwfmt.record.precision : hwfmt.play.precision ;
-                       break;
                }
                /*
                 * In the post-kernel-mixer world, assume that any error means
@@ -284,55 +210,17 @@ oss_private int
                retval = ioctl(fd, AUDIO_GETBUFINFO, &tmpinfo);
                if (retval < 0)
                        return retval;
-               encoding = GETPRINFO(&tmpinfo, encoding);
-               precision = GETPRINFO(&tmpinfo, precision);
-               switch (encoding) {
-               case AUDIO_ENCODING_ULAW:
-                       idat = AFMT_MU_LAW;
-                       break;
-               case AUDIO_ENCODING_ALAW:
-                       idat = AFMT_A_LAW;
-                       break;
-               case AUDIO_ENCODING_SLINEAR_LE:
-                       if (precision == 32)
-                               idat = AFMT_S32_LE;
-                       else if (precision == 24)
-                               idat = AFMT_S24_LE;
-                       else if (precision == 16)
-                               idat = AFMT_S16_LE;
-                       else
-                               idat = AFMT_S8;
-                       break;
-               case AUDIO_ENCODING_SLINEAR_BE:
-                       if (precision == 32)
-                               idat = AFMT_S32_BE;
-                       else if (precision == 24)
-                               idat = AFMT_S24_BE;
-                       else if (precision == 16)
-                               idat = AFMT_S16_BE;
-                       else
-                               idat = AFMT_S8;
-                       break;
-               case AUDIO_ENCODING_ULINEAR_LE:
-                       if (precision == 16)
-                               idat = AFMT_U16_LE;
-                       else
-                               idat = AFMT_U8;
-                       break;
-               case AUDIO_ENCODING_ULINEAR_BE:
-                       if (precision == 16)
-                               idat = AFMT_U16_BE;
-                       else
-                               idat = AFMT_U8;
-                       break;
-               case AUDIO_ENCODING_ADPCM:
-                       idat = AFMT_IMA_ADPCM;
-                       break;
-               case AUDIO_ENCODING_AC3:
-                       idat = AFMT_AC3;
-                       break;
+               if (tmpinfo.mode == AUMODE_RECORD)
+                       retval = encoding_to_format(tmpinfo.record.encoding,
+                           tmpinfo.record.precision);
+               else
+                       retval = encoding_to_format(tmpinfo.play.encoding,
+                           tmpinfo.play.precision);
+               if (retval < 0) {
+                       errno = EINVAL;
+                       return retval;
                }
-               INTARG = idat;
+               INTARG = retval;
                break;
        case SNDCTL_DSP_CHANNELS:
                retval = ioctl(fd, AUDIO_GETBUFINFO, &tmpinfo);
@@ -386,60 +274,10 @@ oss_private int
                for(idat = 0, tmpenc.index = 0;
                    ioctl(fd, AUDIO_GETENC, &tmpenc) == 0;
                    tmpenc.index++) {
-                       switch(tmpenc.encoding) {
-                       case AUDIO_ENCODING_ULAW:
-                               idat |= AFMT_MU_LAW;
-                               break;
-                       case AUDIO_ENCODING_ALAW:
-                               idat |= AFMT_A_LAW;
-                               break;
-                       case AUDIO_ENCODING_SLINEAR:
-                               idat |= AFMT_S8;
-                               break;
-                       case AUDIO_ENCODING_SLINEAR_LE:
-                               if (tmpenc.precision == 32)
-                                       idat |= AFMT_S32_LE;
-                               else if (tmpenc.precision == 24)
-                                       idat |= AFMT_S24_LE;
-                               else if (tmpenc.precision == 16)
-                                       idat |= AFMT_S16_LE;
-                               else
-                                       idat |= AFMT_S8;
-                               break;
-                       case AUDIO_ENCODING_SLINEAR_BE:
-                               if (tmpenc.precision == 32)
-                                       idat |= AFMT_S32_BE;
-                               else if (tmpenc.precision == 24)
-                                       idat |= AFMT_S24_BE;
-                               else if (tmpenc.precision == 16)
-                                       idat |= AFMT_S16_BE;
-                               else
-                                       idat |= AFMT_S8;
-                               break;
-                       case AUDIO_ENCODING_ULINEAR:
-                               idat |= AFMT_U8;
-                               break;
-                       case AUDIO_ENCODING_ULINEAR_LE:
-                               if (tmpenc.precision == 16)
-                                       idat |= AFMT_U16_LE;
-                               else
-                                       idat |= AFMT_U8;
-                               break;
-                       case AUDIO_ENCODING_ULINEAR_BE:
-                               if (tmpenc.precision == 16)
-                                       idat |= AFMT_U16_BE;
-                               else
-                                       idat |= AFMT_U8;
-                               break;
-                       case AUDIO_ENCODING_ADPCM:
-                               idat |= AFMT_IMA_ADPCM;
-                               break;
-                       case AUDIO_ENCODING_AC3:
-                               idat |= AFMT_AC3;
-                               break;
-                       default:
-                               break;
-                       }
+                       retval = encoding_to_format(tmpenc.encoding,
+                           tmpenc.precision);
+                       if (retval != -1)
+                               idat |= retval;
                }
                INTARG = idat;
                break;
@@ -709,3 +547,139 @@ set_channels(int fd, int mode, int nchan
                }
        }
 }
+
+/* Convert a NetBSD "encoding" to a OSS "format". */
+static int
+encoding_to_format(u_int encoding, u_int precision)
+{
+       switch(encoding) {
+       case AUDIO_ENCODING_ULAW:
+               return AFMT_MU_LAW;
+       case AUDIO_ENCODING_ALAW:
+               return AFMT_A_LAW;
+       case AUDIO_ENCODING_SLINEAR:
+               if (precision == 32)
+                       return AFMT_S32_NE;
+               else if (precision == 24)
+                       return AFMT_S24_NE;
+               else if (precision == 16)
+                       return AFMT_S16_NE;
+               return AFMT_S8;
+       case AUDIO_ENCODING_SLINEAR_LE:
+               if (precision == 32)
+                       return AFMT_S32_LE;
+               else if (precision == 24)
+                       return AFMT_S24_LE;
+               else if (precision == 16)
+                       return AFMT_S16_LE;
+               return AFMT_S8;
+       case AUDIO_ENCODING_SLINEAR_BE:
+               if (precision == 32)
+                       return AFMT_S32_BE;
+               else if (precision == 24)
+                       return AFMT_S24_BE;
+               else if (precision == 16)
+                       return AFMT_S16_BE;
+               return AFMT_S8;
+       case AUDIO_ENCODING_ULINEAR:



Home | Main Index | Thread Index | Old Index