At Tue, 23 May 2006 17:47:47 +0100,
Christoph Burger-Scheidlin wrote:
>
> Hi
>
> I am trying to get the a52 plugin to work with my Soundblaster Extigy. The
> Extigy has a second device that accepts an S/PDIF formatted AC3 stream. If I
> set the speaker arrangement in xine to passthrough and this device (hw:2,2
> Extigy is card 2) I get proper surround sound.
>
> As far as I understand it, the a52 plugin takes its input and produces an
> appropriate stream. Unfortunately, it seems that the output is predetermined
> to be iec958:{CARD=$CARD}, but if try to use the device, like
>
> pcm.myout {
> type a52
> card 2
> }
>
> then I get the following error:
> ALSA lib confmisc.c:1105:(snd_func_refer) Unable to find
> definition 'cards.USB-Audio.pcm.iec958.0:CARD=2,AES0=6,AES1=130,AES2=0,AES3=2'
> ALSA lib conf.c:3479:(_snd_config_evaluate) function snd_func_refer returned
> error: No such file or directory
> ALSA lib conf.c:3947:(snd_config_expand) Evaluate error: No such file or
> directory
> ALSA lib pcm.c:2146:(snd_pcm_open_noupdate) Unknown PCM iec958:{AES0 0x6 AES1
> 0x82 AES2 0x0 AES3 0x2 CARD 2}
> aplay: main:547: audio open error: No such file or directory
>
> Does anyone know how I can get the output of the a52 plugin redirected to
> hw:2,2?
Not quite easy for usb-audio since no default SPDIF setting is
defined.
You can give an explicit slave PCM string by the patch below.
Use like
pcm.myout {
type a52
slavepcm "hw:2,2"
}
Takashi
diff -r 7f6ce705ff68 a52/pcm_a52.c
--- a/a52/pcm_a52.c Fri May 12 15:35:23 2006 +0200
+++ b/a52/pcm_a52.c Tue May 23 19:51:08 2006 +0200
@@ -562,6 +562,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 +595,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,16 +683,19 @@ 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 (! pcm_string) {
+ 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 : "");
+ pcm_string = devstr;
+ }
+
+ err = snd_pcm_open(&rec->slave, pcm_string, stream, mode);
if (err < 0)
goto error;