Drop delayed samples rather than reading them.
authorbruceperens <bruceperens@01035d8c-6547-0410-b346-abe4f91aad63>
Wed, 12 Mar 2014 21:35:20 +0000 (21:35 +0000)
committerbruceperens <bruceperens@01035d8c-6547-0410-b346-abe4f91aad63>
Wed, 12 Mar 2014 21:35:20 +0000 (21:35 +0000)
git-svn-id: https://svn.code.sf.net/p/freetel/code@1431 01035d8c-6547-0410-b346-abe4f91aad63

freedv-server/source/platform/linux/audio_in_alsa.cpp
freedv-server/source/platform/linux/audio_out_alsa.cpp

index 4421031762f476e9802599b5b16d9e5b52fb457b..64d1de5416caaeb2825ae8dac3fa2ae0c7ad4a7e 100644 (file)
@@ -99,7 +99,7 @@ namespace FreeDV {
     if ( result == -EPIPE ) {
       snd_pcm_recover(handle, result, 1);
       result = snd_pcm_readi(handle, array, length);
-      std::cerr << "ALSA read underrun." << std::endl;
+      std::cerr << "ALSA input: read underrun." << std::endl;
       if ( result == -EPIPE )
         return 0;
     }
@@ -139,28 +139,19 @@ namespace FreeDV {
     if ( delay >= overlong_delay && available > 0 ) {
       int dropped = 0;
 
-      while ( delay > delay_goal ) {
-        std::int16_t   buffer[1000];
-
-        int            samples = min(available, delay - delay_goal);
-        const int      length = min(sizeof(buffer) / sizeof(*buffer),
-                        samples);
-
-       if ( snd_pcm_readi(handle, buffer, length) < 0 )
-          break;
-        dropped += length;
-        if ( snd_pcm_avail_delay(handle, &available, &delay) < 0 )
-          break;
-      }
-      std::cerr << "ALSA input: long delay, dropped "
-       << dropped << " queued audio samples." << std::endl;
+      snd_pcm_drop(handle);
+      snd_pcm_prepare(handle);
+      snd_pcm_start(handle);
 
+      const double seconds = (double)delay / (double)SampleRate;
+      std::cerr << "ALSA input: program paused, dropped "
+       << seconds << " seconds of queued audio samples." << std::endl;
     }
 
     if ( error == -EPIPE ) {
       snd_pcm_recover(handle, error, 1);
       available = snd_pcm_avail_delay(handle, &available, &delay);
-      std::cerr << "ALSA read underrun." << std::endl;
+      std::cerr << "ALSA input: read underrun." << std::endl;
     }
 
     if ( error >= 0 )
index 5b19696e769eba91e2f90358a6d58d0fcb6d0937..62b41c67dcd1076e55bdb57c338e824c60f11b95 100644 (file)
@@ -94,7 +94,7 @@ namespace FreeDV {
     if ( result == -EPIPE ) {
       snd_pcm_recover(handle, result, 1);
       result = snd_pcm_writei(handle, array, length);
-      std::cerr << "ALSA write underrun." << std::endl;
+      std::cerr << "ALSA output: write underrun." << std::endl;
       if ( result == -EPIPE )
         return 0;
     }
@@ -129,7 +129,7 @@ namespace FreeDV {
     if ( error == -EPIPE ) {
       snd_pcm_recover(handle, error, 1);
       available = snd_pcm_avail_delay(handle, &available, &delay);
-      std::cerr << "ALSA write underrun." << std::endl;
+      std::cerr << "ALSA output: write underrun." << std::endl;
     }
     if ( error == 0 )
       return available;