]> git.alsa-project.org Git - alsa-plugins.git/commitdiff
a52 - Add slavepcm option
authorTakashi Iwai <tiwai@suse.de>
Wed, 24 May 2006 10:02:00 +0000 (12:02 +0200)
committerTakashi Iwai <tiwai@suse.de>
Wed, 24 May 2006 10:02:00 +0000 (12:02 +0200)
- Added slavepcm option to specify the slave PCM string explicitly
- Don't use plug but linear plugin for default slave.
  We need only the linear format conversion, and the channel/rate
  conversion should be avoided.

a52/pcm_a52.c
doc/a52.txt

index 84706fed8685e5f0f6039c7b271490c0f1b2c350..4549eda30d91597a679c535c7e5f522a874f9126 100644 (file)
@@ -24,6 +24,7 @@
 #include <unistd.h>
 #include <alsa/asoundlib.h>
 #include <alsa/pcm_external.h>
+#include <alsa/pcm_plugin.h>
 #include <ffmpeg/avcodec.h>
 
 struct a52_ctx {
@@ -562,6 +563,7 @@ SND_PCM_PLUGIN_DEFINE_FUNC(a52)
        snd_config_iterator_t i, next;
        int err;
        const char *card = NULL;
+       const char *pcm_string = NULL;
        unsigned int rate = 48000;
        unsigned int bitrate = 448;
        unsigned int channels = 6;
@@ -594,6 +596,13 @@ SND_PCM_PLUGIN_DEFINE_FUNC(a52)
                        }
                        continue;
                }
+               if (strcmp(id, "slavepcm") == 0) {
+                       if (snd_config_get_string(n, &pcm_string) < 0) {
+                               SNDERR("a52 slavepcm must be a string");
+                               return -EINVAL;
+                       }
+                       continue;
+               }
                if (strcmp(id, "rate") == 0) {
                        long val;
                        if (snd_config_get_integer(n, &val) < 0) {
@@ -675,18 +684,28 @@ SND_PCM_PLUGIN_DEFINE_FUNC(a52)
                goto error;
        }
 
-       snprintf(devstr, sizeof(devstr),
-                "plug:iec958:{AES0 0x%x AES1 0x%x AES2 0x%x AES3 0x%x %s%s}",
-                IEC958_AES0_CON_EMPHASIS_NONE | IEC958_AES0_NONAUDIO |
-                IEC958_AES0_CON_NOT_COPYRIGHT,
-                IEC958_AES1_CON_ORIGINAL | IEC958_AES1_CON_PCM_CODER,
-                0, rate == 48000 ? IEC958_AES3_CON_FS_48000 : IEC958_AES3_CON_FS_44100,
-                card ? " CARD " : "",
-                card ? card : "");
-
-       err = snd_pcm_open(&rec->slave, devstr, stream, mode);
-       if (err < 0)
-               goto error;
+       if (! pcm_string) {
+               snprintf(devstr, sizeof(devstr),
+                        "iec958:{AES0 0x%x AES1 0x%x AES2 0x%x AES3 0x%x %s%s}",
+                        IEC958_AES0_CON_EMPHASIS_NONE | IEC958_AES0_NONAUDIO |
+                        IEC958_AES0_CON_NOT_COPYRIGHT,
+                        IEC958_AES1_CON_ORIGINAL | IEC958_AES1_CON_PCM_CODER,
+                        0, rate == 48000 ? IEC958_AES3_CON_FS_48000 : IEC958_AES3_CON_FS_44100,
+                        card ? " CARD " : "",
+                        card ? card : "");
+               err = snd_pcm_open(&rec->slave, devstr, stream, mode);
+               if (err < 0)
+                       goto error;
+               /* in case the slave doesn't support S16 format */
+               err = snd_pcm_linear_open(&rec->slave, NULL, SND_PCM_FORMAT_S16,
+                                         rec->slave, 1);
+               if (err < 0)
+                       goto error;
+       } else {
+               err = snd_pcm_open(&rec->slave, pcm_string, stream, mode);
+               if (err < 0)
+                       goto error;
+       }
 
        rec->io.version = SND_PCM_IOPLUG_VERSION;
        rec->io.name = "A52 Output Plugin";
index 236e64aefcd0866da09abc15d8dd1201e91142c2..ce7ee33769048b42368ee847db4a4a71cea3d3d6 100644 (file)
@@ -17,6 +17,11 @@ In addition, the following options are available:
   The output PCM becomes "iec958:{CARD=$CARD}" with extra AESx
   settings.  When omitted, the default card is used.
 
+- The "slavepcm" option specifies a string of the slave PCM
+  explicitly.  This is useful if a device has no proper SPDIF
+  configuration (e.g. usb-audio), or if you want to pass your own PCM
+  definition.  This option is exclusive with "card" option.
+
 - The "rate" option specifies the input/output sample rate in HZ.
   The accepted rate is either 44100 or 48000.
   When omitted, 48000 is used.
@@ -43,6 +48,18 @@ bitrate 256kbps and output format S16_BE looks like below:
                format S16_BE
        }
 
+For using slavepcm option,
+
+       pcm.mypcm {
+               card 1
+               device 2
+       }
+
+       pcm.myout {
+               type a52
+               slavepcm "mypcm"
+       }
+
 
 The plugin reads always S16 format (i.e. native-endian) as input, so
 you'd need plug layer appropriately to covert it.