OSDN Git Service

キャプチャ部分のバグ修正。 master
authorsfpg <sfpg@users.sourceforge.jp>
Thu, 15 Nov 2012 08:26:37 +0000 (17:26 +0900)
committersfpg <sfpg@users.sourceforge.jp>
Thu, 15 Nov 2012 08:26:37 +0000 (17:26 +0900)
wasapi2/agent_base.h
wasapi2/application.cpp
wasapi2/input_agent.cpp
wasapi2/input_agent.h

index d4ff3e8..d16b48b 100644 (file)
@@ -69,6 +69,7 @@ namespace sf
     void wait_event()
     {
       event_.wait();
+      event_.reset();
     }
 
     void change_and_wait(int value,int wait_value,std::memory_order o = std::memory_order_seq_cst)
index eab4b8b..d4cffea 100644 (file)
@@ -125,15 +125,15 @@ namespace sf {
 \r
     //   bool a = reader_ringbuffer_.is_lock_free();\r
     ///    wdout << ( ? L"**** true ****":L"---- false ----") << std::endl;\r
-   //  mixer スレッドの起動\r
-    \r
-    mixer_agent_.start();\r
+   //  mixerエージェントの起動\r
+   // mixer_agent_.start();\r
     //  ファイルリーダーエージェントの起動\r
     reader_agent_.start();\r
     // キャプチャエージェントの起動\r
     input_agent_.start();\r
     // wasapi入力スレッドの起動\r
-    input_agent_.wait_status(input_agent_t::status_device_config_ok);\r
+    input_agent_.wait_event();\r
+    //input_agent_.wait_status(input_agent_t::status_device_config_ok);\r
 \r
     // デフォルトの入出力デバイスをセットする\r
     try {\r
@@ -156,11 +156,12 @@ namespace sf {
     // スレッドを終了する\r
     reader_agent_.change_status(reader_agent_t::status_exit);\r
     input_agent_.change_status(input_agent_t::status_exit);\r
-    mixer_agent_.change_status(mixer_agent_t::status_exit);\r
//   mixer_agent_.change_status(mixer_agent_t::status_exit);\r
     output_agent_.change_status(output_agent_t::status_exit);\r
 \r
    //  スレッド終了待ち\r
-    std::array<Concurrency::agent*,4> agents = {&mixer_agent_,&reader_agent_,&output_agent_,&input_agent_};\r
+    std::array<Concurrency::agent*,3> agents = {/*&mixer_agent_,*/&reader_agent_,&output_agent_,&input_agent_};\r
+\r
     Concurrency::agent::wait_for_all(agents.size(),&agents[0]);\r
 //    mixer_agent_.wait(&mixer_agent_);\r
 //    reader_agent_.wait(&reader_agent_);\r
@@ -234,8 +235,11 @@ namespace sf {
     // mixer_agent_.change_and_wait(mixer_agent_t::status_config,mixer_agent_t::status_config_ok);\r
 \r
     int input_status = input_agent_.status();\r
-    input_agent_.change_and_wait(input_agent_t::status_pause,input_agent_t::status_pause_ok);\r
-\r
+    if(input_status != input_agent_t::status_nodevice)\r
+    {\r
+      input_agent_.change_and_wait(input_agent_t::status_pause,input_agent_t::status_pause_ok);\r
+    }\r
+    \r
     // 出力の変更\r
     output_agent_.apply_config(device_index,params);\r
 \r
@@ -245,11 +249,14 @@ namespace sf {
     reader_agent_.init_buffer();\r
     reader_agent_.change_and_wait(reader_agent_t::status_ready,reader_agent_t::status_ready_ok);\r
 \r
-    input_agent_.init_buffer();\r
-    //input_agent_.apply_config(\r
-    //wasapi_device_manager::instance()->current_input_device_index(),\r
-    //wasapi_device_manager::instance()->current_input_device().params);\r
-    input_agent_.change_and_wait(input_status - 1,input_status);\r
+    if(input_status != input_agent_t::status_nodevice)\r
+    {\r
+      input_agent_.init_buffer();\r
+      //input_agent_.apply_config(\r
+      //wasapi_device_manager::instance()->current_input_device_index(),\r
+      //wasapi_device_manager::instance()->current_input_device().params);\r
+      input_agent_.change_and_wait(input_status - 1,input_status);\r
+    }\r
 \r
   }\r
 \r
index f8d06f6..483e7ec 100644 (file)
@@ -78,56 +78,63 @@ namespace sf {
         {
           wasapi_input_->stop();
           dest_counter = 0;
+          change_status(status_device_config_ok);
+        } else {
+          change_status(status_nodevice);
         }
-        change_status(status_device_config_ok);
         break;
       case status_process:
+        if(wasapi_input_){
         if(!wasapi_input_->is_start()){
           wasapi_input_->start();
         }
         change_status(status_processing);
+        }
+        break;
       case status_processing:
+
         {
+          assert(wasapi_input_ != nullptr);
           wasapi_input_->wait();// 入力待ち
-          //try{
-          //  get_buffer g(*wasapi_input_);// キャプチャバッファの取得
-          //  if(g.size() && g != 0)
-          //  {
-          //    source_counter = 0;
-          //    while(source_counter != g.size())
-          //    {
-          //      BYTE * src = g + source_counter * wasapi_input_->get_frame_size();
-          //      int size_byte_src = g.size_byte() - source_counter * wasapi_input_->get_frame_size();
-          //      int size_src = g.size() - source_counter;
-
-          //      BYTE * dest = buffer_[index_].get() + dest_counter * app.output_device().get_frame_size();
-          //      int size_byte_dest = app.output_device().get_buffer_byte_size() - dest_counter * app.output_device().get_frame_size();
-          //      int size_dest = app.output_device().get_buffer_size() - dest_counter;
-
-          //      if(size_src <= size_dest)
-          //      {
-          //        ::CopyMemory(dest,src,size_byte_src);
-          //        source_counter += size_src;
-          //        dest_counter += size_src;
-          //      } else if(size_src > size_dest)
-          //      {
-          //        ::CopyMemory(dest,src,size_byte_dest);
-          //        source_counter += size_dest;
-          //        dest_counter += size_dest;
-          //      }
-          //      if(dest_counter == app.output_device().get_buffer_size())
-          //      {
-          //        if(ringbuffer_.enqueue(buffer_[index_].get()))
-          //        {
-          //          index_ = (index_ + 1) & (buffer_.size() - 1);
-          //        }
-          //        dest_counter = 0;
-          //      }
-          //    }
-          //  }
-          //} catch (...) {
-          //  ;
-          //}
+          try{
+            get_buffer g(*wasapi_input_);// キャプチャバッファの取得
+            if(g.size() && g != 0)
+            {
+              source_counter = 0;
+              while(source_counter != g.size())
+              {
+                BYTE * src = g + source_counter * wasapi_input_->get_frame_size();
+                int size_byte_src = g.size_byte() - source_counter * wasapi_input_->get_frame_size();
+                int size_src = g.size() - source_counter;
+
+                BYTE * dest = buffer_[index_].get() + dest_counter * app.output_device().get_frame_size();
+                int size_byte_dest = app.output_device().get_buffer_byte_size() - dest_counter * app.output_device().get_frame_size();
+                int size_dest = app.output_device().get_buffer_size() - dest_counter;
+
+                if(size_src <= size_dest)
+                {
+                  ::CopyMemory(dest,src,size_byte_src);
+                  source_counter += size_src;
+                  dest_counter += size_src;
+                } else if(size_src > size_dest)
+                {
+                  ::CopyMemory(dest,src,size_byte_dest);
+                  source_counter += size_dest;
+                  dest_counter += size_dest;
+                }
+                if(dest_counter == app.output_device().get_buffer_size())
+                {
+                  if(ringbuffer_.enqueue(buffer_[index_].get()))
+                  {
+                    index_ = (index_ + 1) & (buffer_.size() - 1);
+                  }
+                  dest_counter = 0;
+                }
+              }
+            }
+          } catch (...) {
+            ;
+          }
         }
 
         break;
@@ -150,20 +157,29 @@ loop_end:
     if(wasapi_input_ && wasapi_input_->is_start())
     {
       wasapi_input_->stop();
+      wasapi_input_.reset();
     }
-    wasapi_input_.reset();
 
     agent::done();
   };
 
   void input_agent_t::apply_config(int device_index,wasapi_device_manager::device_info::params_t& params)
   {
-    if(status() != status_device_config_ok){
+    if(status() != status_device_config_ok && status() != status_nodevice)
+    {
       change_and_wait(status_device_config,status_device_config_ok);
     }
+
     apply_config_(device_index,params);
-    init_buffer();
-    change_and_wait(status_process,status_processing);
+    if(wasapi_input_)
+    {
+      change_and_wait(status_device_config,status_device_config_ok);
+    }
+    if(status() != status_nodevice)
+    {
+      init_buffer();
+      change_and_wait(status_process,status_processing);
+    }
   }
 
   void input_agent_t::apply_config_(int device_index,wasapi_device_manager::device_info::params_t& params)
index bac16fd..e8ae511 100644 (file)
@@ -42,6 +42,7 @@ struct input_agent_t : public agent_base
     status_pause,
     status_pause_ok,
     status_exit,
+    status_nodevice,
     status_error = STATUS_ERROR
   };