Receive works correctly with keying. Audio start() and stop() seems to work
authorbruceperens <bruceperens@01035d8c-6547-0410-b346-abe4f91aad63>
Tue, 22 Apr 2014 04:12:40 +0000 (04:12 +0000)
committerbruceperens <bruceperens@01035d8c-6547-0410-b346-abe4f91aad63>
Tue, 22 Apr 2014 04:12:40 +0000 (04:12 +0000)
correctly so far.

git-svn-id: https://svn.code.sf.net/p/freetel/code@1545 01035d8c-6547-0410-b346-abe4f91aad63

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

index b5af2f3e4d3fe40f6266ec39abfa736419bbfcec..76de58f614a74db0632f583a491c655a988e85ce 100644 (file)
@@ -201,6 +201,7 @@ namespace FreeDV {
   void
   AudioInALSA::start()
   {
+    std::cerr << "Input start " << parameters << std::endl;
     snd_pcm_drop(handle);
     snd_pcm_prepare(handle);
     snd_pcm_start(handle);
@@ -210,7 +211,11 @@ namespace FreeDV {
   void
   AudioInALSA::stop()
   {
+    std::cerr << "Input stop " << parameters << std::endl;
     snd_pcm_drop(handle);
+    snd_pcm_prepare(handle);
+    snd_pcm_pause(handle, 1);
+    started = false;
   }
 
   static bool
index 3589f154ced95f0bad64b2b00fb2982f99947100..f061e9f4363ff4fde18b6fcf4bee01db01cc3a30 100644 (file)
@@ -210,13 +210,16 @@ namespace FreeDV {
   {
     snd_pcm_drop(handle);
     snd_pcm_prepare(handle);
-    started = true;
+    snd_pcm_pause(handle, 1);
   }
 
   void
   AudioOutALSA::stop()
   {
     snd_pcm_drop(handle);
+    snd_pcm_prepare(handle);
+    snd_pcm_pause(handle, 1);
+    started = false;
   }
 
   static bool
index 89fc8284a8c180068ae9654c849648afdd034642..dd663570532ca4f14b08296d33e6e598795bfffe 100644 (file)
@@ -199,6 +199,7 @@ namespace FreeDV {
   {
     if ( length >= 0 ) {
       array[0].fd = fd;
+      array[0].events = POLLIN|POLLERR|POLLNVAL;
       return 1;
     }
     else
index 8b8bc787362e0f44ca11c032d7422e8adc1a4249..49e92798f4337e04685bd3c500f99bff9f131826 100644 (file)
@@ -5,10 +5,11 @@
 ///
 
 #include "drivers.h"
+#include <string.h>
+#include <time.h>
 #include <iostream>
 #include <sstream>
 #include <stdexcept>
-#include <string.h>
 
 // Start of Transmit:
 // Make the delay at start of transmit and end of transmit adjustable.
@@ -129,29 +130,13 @@ namespace FreeDV {
   bool
   Run::drain_digital()
   {
-    static bool        done = false;
-    if ( !done ) {
-      done = true;
-      return false;
-    }
-    else {
-      done = false;
-      return true;
-    }
+    return true;
   }
 
   bool
   Run::drain_ssb()
   {
-    static bool        done = false;
-    if ( !done ) {
-      done = true;
-      return false;
-    }
-    else {
-      done = false;
-      return true;
-    }
+    return true;
   }
 
   void
@@ -298,16 +283,26 @@ namespace FreeDV {
     // we'll catch up.
     un_key();
     start_receive();
+    i->receiver->start();
+    i->loudspeaker->start();
     if ( !add_poll_device(i->receiver) )
       add_poll_device(i->loudspeaker);
 
     for ( ; ; ) {
       for ( int j = 0; j < poll_fd_count; j++ ) {
         poll_fds[j].revents = 0;
-        poll_fds[j].events = POLLIN;
       }
       
-      const int result = IODevice::poll(poll_fds, poll_fd_count, 1000);
+      int result = 0;
+
+      if ( poll_fd_count > poll_fd_base )
+        result = IODevice::poll(poll_fds, poll_fd_count, 1000);
+      else {
+        struct timespec        request;
+        request.tv_sec = 0;
+        request.tv_nsec = AudioFrameDuration * 100000;
+        nanosleep(&request, 0);
+      }
 
       if ( result < 0 )
         do_throw(result, "Poll");
@@ -388,6 +383,14 @@ namespace FreeDV {
         break;
       case UnKey:
         if ( ptt_digital || ptt_ssb ) {
+         // Reset polling from the Drain operation.
+          poll_fd_count = poll_fd_base;
+
+          i->microphone->start();
+          // Start polling the transmitter devices.
+          if ( !add_poll_device(i->microphone) )
+            add_poll_device(i->transmitter);
+
           if ( ptt_digital ) {
             state = TransmitDigital;
             start_transmit_digital();
@@ -411,7 +414,6 @@ namespace FreeDV {
          // Start polling the receiver devices.
           if ( !add_poll_device(i->receiver) )
             add_poll_device(i->loudspeaker);
-
         }
         break;
       }