void
MediaElementImpl::connect (std::shared_ptr<MediaElement> sink)
{
  std::shared_ptr<MediaElementImpl> sinkImpl =
    std::dynamic_pointer_cast<MediaElementImpl> (sink);

  std::shared_ptr<MediaSource> audio_src = getOrCreateAudioMediaSrc();
  std::shared_ptr<MediaSink> audio_sink = sinkImpl->getOrCreateAudioMediaSink();

  std::shared_ptr<MediaSource> video_src = getOrCreateVideoMediaSrc();
  std::shared_ptr<MediaSink> video_sink = sinkImpl->getOrCreateVideoMediaSink();

  audio_src->connect (audio_sink);

  try {
    video_src->connect (video_sink);
  } catch (...) {
    try {
      audio_sink->disconnect (audio_src);
    } catch (...) {
    }

    throw;
  }
}
std::vector<std::shared_ptr<MediaSource>>
                                       MediaElementImpl::getMediaSrcs ()
{
  std::vector<std::shared_ptr<MediaSource>> srcs;

  srcs.push_back (getOrCreateAudioMediaSrc() );
  srcs.push_back (getOrCreateVideoMediaSrc() );

  return srcs;
}
std::vector < std::shared_ptr<MediaSrc> > *
MediaElement::getMediaSrcs ()
{
  std::vector < std::shared_ptr<MediaSrc> > *mediaSrcs = new std::vector< std::shared_ptr<MediaSrc> >();

  mediaSrcs->push_back (getOrCreateAudioMediaSrc() );
  mediaSrcs->push_back (getOrCreateVideoMediaSrc() );

  return mediaSrcs;
}
std::vector < std::shared_ptr<MediaSrc> > *
MediaElement::getMediaSrcsByMediaType (const MediaType::type mediaType)
{
  std::vector < std::shared_ptr<MediaSrc> > *mediaSrcs = new std::vector< std::shared_ptr<MediaSrc> >();

  if (mediaType == MediaType::type::AUDIO)
    mediaSrcs->push_back (getOrCreateAudioMediaSrc() );
  else if (mediaType == MediaType::type::VIDEO)
    mediaSrcs->push_back (getOrCreateVideoMediaSrc() );

  return mediaSrcs;
}
std::vector<std::shared_ptr<MediaSource>>
                                       MediaElementImpl::getMediaSrcs (std::shared_ptr<MediaType> mediaType)
{
  std::vector<std::shared_ptr<MediaSource>> srcs;

  if (mediaType->getValue() == MediaType::AUDIO) {
    srcs.push_back (getOrCreateAudioMediaSrc() );
  } else if (mediaType->getValue() == MediaType::VIDEO) {
    srcs.push_back (getOrCreateVideoMediaSrc() );
  }

  return srcs;
}
void
MediaElementImpl::connect (std::shared_ptr< MediaElement > sink,
                           std::shared_ptr< MediaType > mediaType)
{
  std::shared_ptr<MediaElementImpl> sinkImpl =
    std::dynamic_pointer_cast<MediaElementImpl> (sink);

  if (mediaType->getValue() == MediaType::AUDIO) {
    std::shared_ptr<MediaSource> audio_src = getOrCreateAudioMediaSrc();
    std::shared_ptr<MediaSink> audio_sink = sinkImpl->getOrCreateAudioMediaSink();

    audio_src->connect (audio_sink);
  } else if (mediaType->getValue() == MediaType::VIDEO) {
    std::shared_ptr<MediaSource> video_src = getOrCreateVideoMediaSrc();
    std::shared_ptr<MediaSink> video_sink = sinkImpl->getOrCreateVideoMediaSink();

    video_src->connect (video_sink);
  }
}