]> git.alsa-project.org Git - alsa-utils.git/commitdiff
Updated the S/PDIF test code.
authorJaroslav Kysela <perex@perex.cz>
Fri, 22 Dec 2000 14:03:15 +0000 (14:03 +0000)
committerJaroslav Kysela <perex@perex.cz>
Fri, 22 Dec 2000 14:03:15 +0000 (14:03 +0000)
aplay/aplay.c

index fe9b1afc97302e299c0032c8b348754262e91234..92dcdc452facacd77adce0dd8e3e371f533134d9 100644 (file)
@@ -86,6 +86,8 @@ static int verbose = 0;
 static int buffer_pos = 0;
 static size_t bits_per_sample, bits_per_frame;
 static size_t buffer_bytes;
+static int digtype = SND_CONTROL_TYPE_NONE;
+static snd_digital_audio_t diga;
 
 static int count;
 static int vocmajor, vocminor;
@@ -303,6 +305,7 @@ int main(int argc, char *argv[])
        rhwparams.format = SND_PCM_FORMAT_U8;
        rhwparams.rate = DEFAULT_SPEED;
        rhwparams.channels = 1;
+       memset(&diga, 0, sizeof(diga));
 
        while ((c = getopt_long(argc, argv, short_options, long_options, &option_index)) != -1) {
                switch (c) {
@@ -403,10 +406,24 @@ int main(int argc, char *argv[])
                        interleaved = 0;
                        break;
                case 'C':
-                       // digital = SND_PCM_DIG_AES_IEC958C;
+                       digtype = SND_CONTROL_TYPE_IEC958;
+                       diga.aes.status[0] = SND_PCM_AES0_NONAUDIO |
+                                            SND_PCM_AES0_CON_EMPHASIS_NONE;
+                       diga.aes.status[1] = SND_PCM_AES1_CON_ORIGINAL |
+                                            SND_PCM_AES1_CON_PCM_CODER;
+                       diga.aes.status[2] = 0;
+                       diga.aes.status[3] = SND_PCM_AES3_CON_FS_48000;
                        break;
                case 'P':
-                       // digital = SND_PCM_DIG_AES_IEC958P;
+                       digtype = SND_CONTROL_TYPE_IEC958;
+                       diga.aes.status[0] = SND_PCM_AES0_PROFESSIONAL |
+                                            SND_PCM_AES0_NONAUDIO |
+                                            SND_PCM_AES0_PRO_EMPHASIS_NONE |
+                                            SND_PCM_AES0_PRO_FS_48000;
+                       diga.aes.status[1] = SND_PCM_AES1_PRO_MODE_NOTID |
+                                            SND_PCM_AES1_PRO_USERBITS_NOTID;
+                       diga.aes.status[2] = SND_PCM_AES2_PRO_WORDLEN_NOTID;
+                       diga.aes.status[3] = 0;
                        break;
                default:
                        fprintf(stderr, "Try `%s --help' for more information.\n", command);
@@ -420,32 +437,40 @@ int main(int argc, char *argv[])
                return 1;
        }
 
-#if 1
-#warning "The S/PDIF code needs to be recoded.."
-#else
-       if (digital != SND_PCM_DIG_NONE) {
-               snd_pcm_dig_params_t dig;
-               memset(&dig, 0, sizeof(dig));
-               dig.group = 0;
-               dig.val.aes.status[0] = SND_PCM_AES0_NONAUDIO;
-               dig.type = digital;
-               switch (digital) {
-               case SND_PCM_DIG_AES_IEC958P:
-                       dig.val.aes.status[0] |= SND_PCM_AES0_PROFESSIONAL;
-                       dig.val.aes.status[0] |= SND_PCM_AES0_PRO_FS_48000;
-                       break;
-               case SND_PCM_DIG_AES_IEC958C:
-                       dig.type = SND_PCM_DIG_AES_IEC958C;
-                       dig.val.aes.status[3] |= SND_PCM_AES3_CON_FS_48000;
-                       break;
+       memset(&info, 0, sizeof(info));
+       if ((err = snd_pcm_info(handle, &info)) < 0) {
+               error("info error: %s", snd_strerror(err));
+               return 1;
+       }
+
+       if (digtype != SND_CONTROL_TYPE_NONE) {
+               snd_control_t ctl;
+               snd_ctl_t *ctl_handle;
+               char ctl_name[12];
+               int ctl_card;
+               memset(&ctl, 0, sizeof(ctl));
+               ctl.id.numid = 0;
+               ctl.id.iface = SND_CONTROL_IFACE_PCM;
+               ctl.id.device = info.device;
+               ctl.id.subdevice = info.subdevice;
+               strcpy(ctl.id.name, "IEC958 (S/PDIF) Stream");
+               ctl_card = snd_pcm_card(handle);
+               if (ctl_card < 0) {
+                       error("Unable to setup the IEC958 (S/PDIF) interface - PCM has no assigned card");
+                       goto __diga_end;
                }
-               err = snd_pcm_dig_params(handle, &dig);
-               if (err < 0) {
-                       error("dig_params setting error: %s", snd_strerror(err));
-                       return 1;
+               sprintf(ctl_name, "hw:%d", ctl_card);
+               if ((err = snd_ctl_open(&ctl_handle, ctl_name)) < 0) {
+                       error("Unable to open the control interface '%s': %s", ctl_name, snd_strerror(err));
+                       goto __diga_end;
+               }
+               if ((err = snd_ctl_cwrite(ctl_handle, &ctl)) < 0) {
+                       error("Unable to update the IEC958 control: %s", snd_strerror(err));
+                       goto __diga_end;
                }
+               snd_ctl_close(ctl_handle);
+             __diga_end:
        }
-#endif
 
        if (nonblock) {
                err = snd_pcm_nonblock(handle, 1);
@@ -454,11 +479,6 @@ int main(int argc, char *argv[])
                        return 1;
                }
        }
-       memset(&info, 0, sizeof(info));
-       if ((err = snd_pcm_info(handle, &info)) < 0) {
-               error("info error: %s", snd_strerror(err));
-               return 1;
-       }
 
        buffer_size = 1024;
        hwparams = rhwparams;