\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
// スレッドを終了する\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
// 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
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
{
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;
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)