Implemented boundary check for voice decoding. Issue 107
diff --git a/grc/decoding/gsm_tch_f_decoder.xml b/grc/decoding/gsm_tch_f_decoder.xml
index 59ac97d..632162f 100644
--- a/grc/decoding/gsm_tch_f_decoder.xml
+++ b/grc/decoding/gsm_tch_f_decoder.xml
@@ -3,7 +3,7 @@
   <name>TCH/F decoder</name>
   <key>gsm_tch_f_decoder</key>
   <import>import grgsm</import>
-  <make>grgsm.tch_f_decoder($mode, $file)</make>
+  <make>grgsm.tch_f_decoder($mode, $file, $boundary_check)</make>
 
   <param>
     <name>TCH coding mode</name>
@@ -56,7 +56,21 @@
     <value>/tmp/speech.gsm</value>
     <type>file_open</type>
   </param>
-
+  <param>
+    <name>Voice boundary detection</name>
+    <key>boundary_check</key>
+    <value>True</value>
+    <type>bool</type>
+    <option>
+      <name>False</name>
+      <key>False</key>
+    </option>
+    <option>
+      <name>True</name>
+      <key>True</key>
+    </option>
+  </param>
+  
   <sink>
     <name>bursts</name>
     <type>message</type>
@@ -66,4 +80,12 @@
     <type>message</type>
     <optional>1</optional>
   </source>
+  
+  <doc>
+If "Voice boundary detection" is enabled, then only bursts are decoded as voice where
+
+- the framenumber is greater then the framenumber of a received "Connect" or "Connect Acknowlegde" message, and 
+- the framenumber is less then the framenumber of a "Release" message 
+  </doc>
+  
 </block>
diff --git a/include/grgsm/decoding/tch_f_decoder.h b/include/grgsm/decoding/tch_f_decoder.h
index efe082c..8dbf68b 100644
--- a/include/grgsm/decoding/tch_f_decoder.h
+++ b/include/grgsm/decoding/tch_f_decoder.h
@@ -62,7 +62,7 @@
        * class. gsm::tch_f_decoder::make is the public interface for
        * creating new instances.
        */
-      static sptr make(tch_mode mode, const std::string &file);
+      static sptr make(tch_mode mode, const std::string &file, bool boundary_check=true);
 
     };
 
diff --git a/lib/decoding/tch_f_decoder_impl.cc b/lib/decoding/tch_f_decoder_impl.cc
index a3b09fb..f3099fd 100644
--- a/lib/decoding/tch_f_decoder_impl.cc
+++ b/lib/decoding/tch_f_decoder_impl.cc
@@ -35,21 +35,23 @@
   namespace gsm {
 
     tch_f_decoder::sptr
-    tch_f_decoder::make(tch_mode mode, const std::string &file)
+    tch_f_decoder::make(tch_mode mode, const std::string &file, bool boundary_check)
     {
       return gnuradio::get_initial_sptr
-        (new tch_f_decoder_impl(mode, file));
+        (new tch_f_decoder_impl(mode, file, boundary_check));
     }
 
     /*
      * Constructor
      */
-    tch_f_decoder_impl::tch_f_decoder_impl(tch_mode mode, const std::string &file)
+    tch_f_decoder_impl::tch_f_decoder_impl(tch_mode mode, const std::string &file, bool boundary_check)
       : gr::block("tch_f_decoder",
               gr::io_signature::make(0, 0, 0),
               gr::io_signature::make(0, 0, 0)),
       d_tch_mode(mode),
       d_collected_bursts_num(0),
+      d_boundary_check(boundary_check),
+      d_boundary_decode(!boundary_check),
       mBlockCoder(0x10004820009ULL, 40, 224),
       mU(228),
       mP(mU.segment(184,40)),
@@ -163,6 +165,32 @@
                     pmt::pmt_t msg_out = pmt::cons(pmt::PMT_NIL, msg_binary_blob);
 
                     message_port_pub(pmt::mp("msgs"), msg_out);
+                    
+                    // if d_boundary_check is enabled, we set d_boundary_decode to true, when a 
+                    // "Connect" or "Connect Acknowledge" message is received, and
+                    // we set d_boundary_decode back to false, when "Release" message is received
+                    if (d_boundary_check)
+                    {
+                        // check if this is a call control message
+                        if ((outmsg[3] & 0x0f) == 0x03)
+                        {
+                            // Connect specified in GSM 04.08, 9.3.5
+                            if ((outmsg[4] & 0x3f) == 0x07)
+                            {
+                                d_boundary_decode = true;
+                            }
+                            // Connect Acknowledge specified in GSM 04.08, 9.3.6
+                            else if ((outmsg[4] & 0x3f) == 0x0f)
+                            {
+                                d_boundary_decode = true;
+                            }
+                            // Release specified in GSM 04.08, 9.3.18
+                            else if ((outmsg[4] & 0x3f) == 0x2d)
+                            {
+                                d_boundary_decode = false;
+                            }
+                        }
+                    }
 
                     // if we are in an AMR-mode and we receive a channel mode modify message,
                     // we set the mode according to the multirate configuration from the message
@@ -215,6 +243,12 @@
                     }
                 }
             }
+            
+            // if boundary_check is enabled and d_boundary_decode is false, we are done
+            if (d_boundary_check && !d_boundary_decode)
+            {
+                return;
+            }
 
             // Decode voice frames and write to file
             if (d_tch_mode == TCH_FS || d_tch_mode == TCH_EFR)
diff --git a/lib/decoding/tch_f_decoder_impl.h b/lib/decoding/tch_f_decoder_impl.h
index f6d054b..3e8c79a 100644
--- a/lib/decoding/tch_f_decoder_impl.h
+++ b/lib/decoding/tch_f_decoder_impl.h
@@ -54,6 +54,8 @@
                 pmt::pmt_t d_bursts[8];
                 FILE * d_speech_file;
                 enum tch_mode d_tch_mode;
+                bool d_boundary_check;
+                bool d_boundary_decode;
 
                 BitVector mU;
                 BitVector mP;
@@ -87,7 +89,7 @@
                 void decode(pmt::pmt_t msg);
                 void setCodingMode(tch_mode mode);
             public:
-                tch_f_decoder_impl(tch_mode mode, const std::string &file);
+                tch_f_decoder_impl(tch_mode mode, const std::string &file, bool boundary_check=true);
                 ~tch_f_decoder_impl();
         };