📄 avstreams_i.cpp
字号:
MMDevice_Map_Hash_Key::~MMDevice_Map_Hash_Key (void)
{
CORBA::release (this->mmdevice_);
}
int
MMDevice_Map_Hash_Key::operator == (const MMDevice_Map_Hash_Key &hash_key) const
{
CORBA::Boolean result = 0;
ACE_DECLARE_NEW_CORBA_ENV;
ACE_TRY
{
result =
this->mmdevice_->_is_equivalent (hash_key.mmdevice_ ACE_ENV_ARG_PARAMETER);
ACE_TRY_CHECK;
}
ACE_CATCHANY
{
ACE_PRINT_EXCEPTION (ACE_ANY_EXCEPTION, "MMDevice_Map_Hash_Key::operator == ");
return 0;
}
ACE_ENDTRY;
ACE_CHECK_RETURN (0);
return result;
}
int
operator < (const MMDevice_Map_Hash_Key &left,
const MMDevice_Map_Hash_Key &right)
{
int result = 0;
ACE_DECLARE_NEW_CORBA_ENV;
ACE_TRY
{
CORBA::ULong left_hash = left.mmdevice_->_hash (left.hash_maximum_
ACE_ENV_ARG_PARAMETER);
ACE_TRY_CHECK;
CORBA::ULong right_hash = right.mmdevice_->_hash (right.hash_maximum_
ACE_ENV_ARG_PARAMETER);
ACE_TRY_CHECK;
result = left_hash < right_hash;
}
ACE_CATCHANY
{
ACE_PRINT_EXCEPTION (ACE_ANY_EXCEPTION, "operator < for MMDevice_Map_Hash_Key");
return 0;
}
ACE_ENDTRY;
ACE_CHECK_RETURN (0);
return result;
}
u_long
MMDevice_Map_Hash_Key::hash (void) const
{
u_long result = 0;
ACE_DECLARE_NEW_CORBA_ENV;
ACE_TRY
{
result = this->mmdevice_->_hash (this->hash_maximum_
ACE_ENV_ARG_PARAMETER);
ACE_TRY_CHECK;
}
ACE_CATCHANY
{
ACE_PRINT_EXCEPTION (ACE_ANY_EXCEPTION, "MMDevice_Map_Hash_Key::hash");
return 0;
}
ACE_ENDTRY;
ACE_CHECK_RETURN (0);
return result;
}
// ----------------------------------------------------------------------
// TAO_StreamCtrl
// ----------------------------------------------------------------------
TAO_StreamCtrl::TAO_StreamCtrl (void)
:mcastconfigif_ (0)
{
ACE_DECLARE_NEW_CORBA_ENV;
ACE_TRY
{
this->streamctrl_ = this->_this (ACE_ENV_SINGLE_ARG_PARAMETER);
ACE_TRY_CHECK;
char buf [BUFSIZ];
int result = ACE_OS::hostname (buf, BUFSIZ);
unsigned long ipaddr = 0;
if (result == 0)
ipaddr = ACE_OS::inet_addr (buf);
this->source_id_ = TAO_AV_RTCP::alloc_srcid (ipaddr);
}
ACE_CATCHANY
{
ACE_PRINT_EXCEPTION (ACE_ANY_EXCEPTION, "TAO_StreamCtrl::TAO_StreamCtrl");
}
ACE_ENDTRY;
ACE_CHECK;
}
TAO_StreamCtrl::~TAO_StreamCtrl (void)
{
delete this->mcastconfigif_;
}
// Stop the transfer of data of the stream
// Empty the_spec means apply operation to all flows
void
TAO_StreamCtrl::stop (const AVStreams::flowSpec &flow_spec
ACE_ENV_ARG_DECL)
ACE_THROW_SPEC ((CORBA::SystemException,
AVStreams::noSuchFlow))
{
ACE_TRY
{
TAO_Basic_StreamCtrl::stop (flow_spec ACE_ENV_ARG_PARAMETER);
ACE_TRY_CHECK;
if (this->flow_connection_map_.current_size () > 0)
return;
MMDevice_Map_Iterator a_iterator (this->mmdevice_a_map_);
MMDevice_Map::ENTRY *entry = 0;
for (;a_iterator.next (entry)!= 0;a_iterator.advance ())
{
entry->int_id_.sep_->stop (flow_spec ACE_ENV_ARG_PARAMETER);
ACE_TRY_CHECK;
}
MMDevice_Map_Iterator b_iterator (this->mmdevice_b_map_);
for (;b_iterator.next (entry)!= 0;b_iterator.advance ())
{
entry->int_id_.sep_->stop (flow_spec ACE_ENV_ARG_PARAMETER);
ACE_TRY_CHECK;
}
}
ACE_CATCHANY
{
ACE_PRINT_EXCEPTION (ACE_ANY_EXCEPTION, "TAO_Basic_StreamCtrl::stop");
return;
}
ACE_ENDTRY;
ACE_CHECK;
}
// Start the transfer of data in the stream.
// Empty the_spec means apply operation to all flows
void
TAO_StreamCtrl::start (const AVStreams::flowSpec &flow_spec
ACE_ENV_ARG_DECL)
ACE_THROW_SPEC ((CORBA::SystemException,
AVStreams::noSuchFlow))
{
ACE_TRY
{
TAO_Basic_StreamCtrl::start (flow_spec ACE_ENV_ARG_PARAMETER);
ACE_TRY_CHECK;
if (this->flow_connection_map_.current_size () > 0)
return;
MMDevice_Map_Iterator a_iterator (this->mmdevice_a_map_);
MMDevice_Map::ENTRY *entry = 0;
for (;a_iterator.next (entry)!= 0;a_iterator.advance ())
{
entry->int_id_.sep_->start (flow_spec ACE_ENV_ARG_PARAMETER);
ACE_TRY_CHECK;
}
MMDevice_Map_Iterator b_iterator (this->mmdevice_b_map_);
for (;b_iterator.next (entry)!= 0;b_iterator.advance ())
{
entry->int_id_.sep_->start (flow_spec ACE_ENV_ARG_PARAMETER);
ACE_TRY_CHECK;
}
}
ACE_CATCHANY
{
ACE_PRINT_EXCEPTION (ACE_ANY_EXCEPTION, "TAO_StreamCtrl::start");
return;
}
ACE_ENDTRY;
ACE_CHECK;
}
// Tears down the stream. This will close the connection, and delete
// the streamendpoint and vdev associated with this stream
// Empty the_spec means apply operation to all flows
void
TAO_StreamCtrl::destroy (const AVStreams::flowSpec &flow_spec
ACE_ENV_ARG_DECL)
ACE_THROW_SPEC ((CORBA::SystemException,
AVStreams::noSuchFlow))
{
ACE_TRY
{
TAO_Basic_StreamCtrl::destroy (flow_spec ACE_ENV_ARG_PARAMETER);
ACE_TRY_CHECK;
if (this->flow_connection_map_.current_size () > 0)
return;
MMDevice_Map_Iterator a_iterator (this->mmdevice_a_map_);
MMDevice_Map::ENTRY *entry = 0;
for (;a_iterator.next (entry)!= 0;a_iterator.advance ())
{
entry->int_id_.sep_->destroy (flow_spec ACE_ENV_ARG_PARAMETER);
ACE_TRY_CHECK;
}
MMDevice_Map_Iterator b_iterator (this->mmdevice_b_map_);
for (;b_iterator.next (entry)!= 0;b_iterator.advance ())
{
entry->int_id_.sep_->destroy (flow_spec ACE_ENV_ARG_PARAMETER);
ACE_TRY_CHECK;
}
}
ACE_CATCHANY
{
ACE_PRINT_EXCEPTION (ACE_ANY_EXCEPTION, "TAO_StreamCtrl::destroy");
return;
}
ACE_ENDTRY;
ACE_CHECK;
int result = TAO_AV_Core::deactivate_servant (this);
if (result < 0)
if (TAO_debug_level > 0) ACE_DEBUG ((LM_DEBUG, "TAO_StreamCtrl::destroy failed\n"));
}
// request the two MMDevices to create vdev and stream endpoints. save
// the references returned.
// The interaction diagram for this method is on page 13 of the spec
CORBA::Boolean
TAO_StreamCtrl::bind_devs (AVStreams::MMDevice_ptr a_party,
AVStreams::MMDevice_ptr b_party,
AVStreams::streamQoS &the_qos,
const AVStreams::flowSpec &the_flows
ACE_ENV_ARG_DECL)
ACE_THROW_SPEC ((CORBA::SystemException,
AVStreams::streamOpFailed,
AVStreams::noSuchFlow,
AVStreams::QoSRequestFailed))
{
ACE_TRY
{
if (CORBA::is_nil (a_party) && CORBA::is_nil (b_party))
ACE_ERROR_RETURN ((LM_ERROR, "Both parties are nil\n"), 0);
// Check to see if we have non-nil parties to bind!
if (TAO_debug_level > 0)
if (CORBA::is_nil (a_party) ||
CORBA::is_nil (b_party))
if (TAO_debug_level > 0)
ACE_DEBUG ((LM_DEBUG,
"(%P|%t) TAO_StreamCtrl::bind_devs: "
"a_party or b_party is null"
"Multicast mode\n"));
// Request a_party to create the endpoint and vdev
CORBA::Boolean met_qos;
CORBA::String_var named_vdev;
if (!CORBA::is_nil (a_party))
{
MMDevice_Map_Hash_Key find_key (a_party);
MMDevice_Map_Entry find_entry;
int result =
this->mmdevice_a_map_.find (find_key, find_entry);
if (result == 0)
{
if (TAO_debug_level > 0)
{
// Already in the map.
if (TAO_debug_level > 0)
ACE_DEBUG ((LM_DEBUG, "mmdevice a_party is already bound\n"));
}
return 1;
}
else
{
this->sep_a_ =
a_party-> create_A (this->streamctrl_.in (),
this->vdev_a_.out (),
the_qos,
met_qos,
named_vdev.inout (),
the_flows
ACE_ENV_ARG_PARAMETER);
ACE_TRY_CHECK;
if (TAO_debug_level > 0)
ACE_DEBUG ((LM_DEBUG, "(%P|%t) TAO_StreamCtrl::create_A: succeeded\n"));
// Define ourselves as the related_streamctrl property of the sep.
CORBA::Any streamctrl_any;
streamctrl_any <<= this->streamctrl_.in ();
this->sep_a_->define_property ("Related_StreamCtrl",
streamctrl_any
ACE_ENV_ARG_PARAMETER);
ACE_TRY_CHECK;
CORBA::Any vdev_a_any;
vdev_a_any <<= this->vdev_a_.in ();
this->sep_a_->define_property ("Related_VDev",
vdev_a_any
ACE_ENV_ARG_PARAMETER);
ACE_TRY_CHECK;
CORBA::Any streamendpoint_a_any;
streamendpoint_a_any <<= this->sep_a_.in ();
this->vdev_a_->define_property ("Related_StreamEndpoint",
streamendpoint_a_any
ACE_ENV_ARG_PARAMETER);
ACE_TRY_CHECK;
CORBA::Any mmdevice_a_any;
mmdevice_a_any <<= a_party;
this->vdev_a_->define_property ("Related_MMDevice",
mmdevice_a_any
ACE_ENV_ARG_PARAMETER);
ACE_TRY_CHECK;
// add the mmdevice, sep and vdev to the map.
MMDevice_Map_Entry map_entry;
MMDevice_Map_Hash_Key key (a_party);
map_entry.sep_ = AVStreams::StreamEndPoint_A::_duplicate (this->sep_a_.in ());
map_entry.vdev_ = AVStreams::VDev::_duplicate (this->vdev_a_.in ());
map_entry.flowspec_ = the_flows;
map_entry.qos_ = the_qos;
result =
this->mmdevice_a_map_.bind (key, map_entry);
if (result < 0)
if (TAO_debug_level > 0)
ACE_DEBUG ((LM_DEBUG, "Error binding mmdevice entry in the a_map"));
}
}
// Request b_party to create the endpoint and vdev
if (!CORBA::is_nil (b_party))
{
MMDevice_Map_Hash_Key find_key (b_party);
MMDevice_Map_Entry find_entry;
int result =
this->mmdevice_b_map_.find (find_key, find_entry);
if (result == 0)
{
// Already in the map.
if (TAO_debug_level > 0) ACE_DEBUG ((LM_DEBUG, "mmdevice b_party is already bound\n"));
return 1;
}
else
{
this->sep_b_ =
b_party-> create_B (this->streamctrl_.in (),
this->vdev_b_.out (),
the_qos,
met_qos,
named_vdev.inout (),
the_flows
ACE_ENV_ARG_PARAMETER);
ACE_TRY_CHECK;
if (TAO_debug_level > 0) ACE_DEBUG ((LM_DEBUG, "(%P|%t) TAO_StreamCtrl::create_B: succeeded\n"));
if (TAO_debug_level > 0) ACE_DEBUG ((LM_DEBUG,
"\n(%P|%t)stream_endpoint_b_ = %s",
TAO_ORB_Core_instance ()->orb ()->object_to_string (this->sep_b_.in ()
ACE_ENV_ARG_PARAMETER)));
ACE_TRY_CHECK;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -