Re: latency.c and delay related questions

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

 



On Tue, 2006-06-20 at 12:10 +0200, Christophe Osuna wrote:
> Hi,
> 
> I am trying to get small delays with my application and I have been
> playing with "latency" from alsa-lib/test.
> 

Can you please not post HTML to this list?

Lee

> The current delay with "latency" is equal to a minimum (that depends
> on the sound card) plus *two* times the period time.  If I disable
> manual change of sound card state as described in the patch below the
> delay becomes equal to a minimum *higher than the previous* plus *one*
> time the period time.
> 
> The delay has been measured with an external box plugged on the sound
> card.
> 
> I would like to mix both settings to get a delay of the lowest minimum
> plus one time the period time. But for this I need to understand what
> is happening, and more precisely:
> 
> * why is snd_pcm_link() mandatory? (no sound otherwise)
> * why two buffers of silence and not just one?
> * why is there no snd_pcm_start() for the playback device?
> * why is the minimum delay lower with manual handling of the sound 
> card state?
> 
> Help is welcome :-)
> 
> Thanxs in advance.
> 
> 
> 
> --- latency.c.orig      2006-06-20 10:21:57.000000000 +0200
> +++ latency.c   2006-06-20 11:06:10.000000000 +0200
> @@ -148,11 +148,11 @@
>                 printf("Unable to determine current swparams for %s: %
> s\n", id, snd_strerror(err
> ));
>                 return err;
>         }
> -       err = snd_pcm_sw_params_set_start_threshold(handle, swparams,
> 0x7fffffff);
> -       if (err < 0) {
> -               printf("Unable to set start threshold mode for %s: %s
> \n", id, snd_strerror(err))
> ;
> -               return err;
> -       }
> +/*     err = snd_pcm_sw_params_set_start_threshold(handle, swparams,
> 0x7fffffff); */
> +/*     if (err < 0) { */
> +/*             printf("Unable to set start threshold mode for %s: %s
> \n", id, snd_strerror(err))
> ; */
> +/*             return err; */
> +/*     } */
>         tick_time_ok = 0;
>         if (tick_time > 0) {
>                 unsigned int time, ttime;
> @@ -273,10 +273,10 @@
>                 exit(0);
>         }
> 
> -       if ((err = snd_pcm_prepare(phandle)) < 0) {
> -               printf("Prepare error: %s\n", snd_strerror(err));
> -               exit(0);
> -       }
> +/*     if ((err = snd_pcm_prepare(phandle)) < 0) { */
> +/*             printf("Prepare error: %s\n", snd_strerror(err)); */
> +/*             exit(0); */
> +/*     } */
> 
>         snd_pcm_dump(phandle, output);
>         snd_pcm_dump(chandle, output);
> @@ -646,27 +646,27 @@
>                 showlatency(latency);
>                 if (tick_time_ok)
>                         printf("Using tick time %ius\n",
> tick_time_ok);
> -               if ((err = snd_pcm_link(chandle, phandle)) < 0) {
> -                       printf("Streams link error: %s\n",
> snd_strerror(err));
> -                       exit(0);
> -               }
> -               if (snd_pcm_format_set_silence(format, buffer,
> latency*channels) < 0) {
> -                       fprintf(stderr, "silence error\n");
> -                       break;
> -               }
> -               if (writebuf(phandle, buffer, latency, &frames_out) <
> 0) {
> -                       fprintf(stderr, "write error\n");
> -                       break;
> -               }
> -               if (writebuf(phandle, buffer, latency, &frames_out) <
> 0) {
> -                       fprintf(stderr, "write error\n");
> -                       break;
> -               }
> -
> -               if ((err = snd_pcm_start(chandle)) < 0) {
> -                       printf("Go error: %s\n", snd_strerror(err));
> -                       exit(0);
> -               }
> +/*             if ((err = snd_pcm_link(chandle, phandle)) < 0) { */
> +/*                     printf("Streams link error: %s\n",
> snd_strerror(err)); */
> +/*                     exit(0); */
> +/*             } */
> +/*             if (snd_pcm_format_set_silence(format, buffer,
> latency*channels) < 0) { */
> +/*                     fprintf(stderr, "silence error\n"); */
> +/*                     break; */
> +/*             } */
> +/*             if (writebuf(phandle, buffer, latency, &frames_out) <
> 0) { */
> +/*                     fprintf(stderr, "write error\n"); */
> +/*                     break; */
> +/*             } */
> +/*             if (writebuf(phandle, buffer, latency, &frames_out) <
> 0) { */
> +/*                     fprintf(stderr, "write error\n"); */
> +/*                     break; */
> +/*             } */
> +
> +/*             if ((err = snd_pcm_start(chandle)) < 0) { */
> +/*                     printf("Go error: %s\n", snd_strerror(err));
> */
> +/*                     exit(0); */
> +/*             } */
>                 gettimestamp(phandle, &p_tstamp);
>                 gettimestamp(chandle, &c_tstamp);
>  #if 0
> 
> _______________________________________________
> Alsa-devel mailing list
> Alsa-devel@xxxxxxxxxxxxxxxxxxxxx
> https://lists.sourceforge.net/lists/listinfo/alsa-devel



_______________________________________________
Alsa-devel mailing list
Alsa-devel@xxxxxxxxxxxxxxxxxxxxx
https://lists.sourceforge.net/lists/listinfo/alsa-devel

[Index of Archives]     [ALSA User]     [Linux Audio Users]     [Kernel Archive]     [Asterisk PBX]     [Photo Sharing]     [Linux Sound]     [Video 4 Linux]     [Gimp]     [Yosemite News]

  Powered by Linux