예제 #1
0
void MediaStream::addTrack(PassRefPtr<MediaStreamTrack> prpTrack, ExceptionCode& ec)
{
    if (ended()) {
        ec = INVALID_STATE_ERR;
        return;
    }

    if (!prpTrack) {
        ec = TYPE_MISMATCH_ERR;
        return;
    }

    RefPtr<MediaStreamTrack> track = prpTrack;

    if (getTrackById(track->id()))
        return;

    RefPtr<MediaStreamComponent> component = MediaStreamComponent::create(m_descriptor.get(), track->component()->source());
    RefPtr<MediaStreamTrack> newTrack = MediaStreamTrack::create(scriptExecutionContext(), component.get());

    switch (component->source()->type()) {
    case MediaStreamSource::TypeAudio:
        m_descriptor->addAudioComponent(component.release());
        m_audioTracks.append(newTrack);
        break;
    case MediaStreamSource::TypeVideo:
        m_descriptor->addVideoComponent(component.release());
        m_videoTracks.append(newTrack);
        break;
    }

    MediaStreamCenter::instance().didAddMediaStreamTrack(m_descriptor.get(), newTrack->component());
    scheduleDispatchEvent(MediaStreamTrackEvent::create(eventNames().addtrackEvent, false, false, newTrack.release()));
}
예제 #2
0
void MediaStream::addTrack(MediaStreamTrack* track,
                           ExceptionState& exceptionState) {
  if (!track) {
    exceptionState.throwDOMException(
        TypeMismatchError, "The MediaStreamTrack provided is invalid.");
    return;
  }

  if (getTrackById(track->id()))
    return;

  switch (track->component()->source()->type()) {
    case MediaStreamSource::TypeAudio:
      m_audioTracks.append(track);
      break;
    case MediaStreamSource::TypeVideo:
      m_videoTracks.append(track);
      break;
  }
  track->registerMediaStream(this);
  m_descriptor->addComponent(track->component());

  if (!active() && !track->ended()) {
    m_descriptor->setActive(true);
    scheduleDispatchEvent(Event::create(EventTypeNames::active));
  }

  MediaStreamCenter::instance().didAddMediaStreamTrack(m_descriptor,
                                                       track->component());
}
예제 #3
0
void MediaStream::addTrack(PassRefPtr<MediaStreamTrack> prpTrack, ExceptionCode& ec)
{
    if (ended()) {
        ec = INVALID_STATE_ERR;
        return;
    }

    if (!prpTrack) {
        ec = TYPE_MISMATCH_ERR;
        return;
    }

    RefPtr<MediaStreamTrack> track = prpTrack;
    if (getTrackById(track->id()))
        return;

    switch (track->source()->type()) {
    case MediaStreamSource::Audio:
        m_audioTracks.append(track);
        break;
    case MediaStreamSource::Video:
        m_videoTracks.append(track);
        break;
    }

    MediaStreamCenter::shared().didAddMediaStreamTrack(track->source());
}
예제 #4
0
void MediaStream::addTrack(PassRefPtr<MediaStreamTrack> prpTrack, ExceptionState& es)
{
    if (ended()) {
        es.throwUninformativeAndGenericDOMException(InvalidStateError);
        return;
    }

    if (!prpTrack) {
        es.throwUninformativeAndGenericDOMException(TypeMismatchError);
        return;
    }

    RefPtr<MediaStreamTrack> track = prpTrack;

    if (getTrackById(track->id()))
        return;

    RefPtr<MediaStreamComponent> component = MediaStreamComponent::create(m_descriptor.get(), track->component()->source());
    RefPtr<MediaStreamTrack> newTrack = MediaStreamTrack::create(executionContext(), component.get());

    switch (component->source()->type()) {
    case MediaStreamSource::TypeAudio:
        m_audioTracks.append(newTrack);
        break;
    case MediaStreamSource::TypeVideo:
        m_videoTracks.append(newTrack);
        break;
    }

    m_descriptor->addComponent(component.release());

    MediaStreamCenter::instance().didAddMediaStreamTrack(m_descriptor.get(), newTrack->component());
}
void MediaStream::didAddTrack(MediaStreamTrackPrivate& trackPrivate)
{
    ScriptExecutionContext* context = scriptExecutionContext();
    if (!context)
        return;

    if (!getTrackById(trackPrivate.id()))
        internalAddTrack(MediaStreamTrack::create(*context, trackPrivate), StreamModifier::Platform);
}
예제 #6
0
void MediaStream::removeRemoteTrack(MediaStreamTrackPrivate* privateTrack)
{
    ASSERT(privateTrack);
    if (!active())
        return;

    RefPtr<MediaStreamTrack> track = getTrackById(privateTrack->id());
    if (removeTrack(track))
        scheduleDispatchEvent(MediaStreamTrackEvent::create(eventNames().removetrackEvent, false, false, track.release()));
}
bool MediaStream::internalAddTrack(RefPtr<MediaStreamTrack>&& track, StreamModifier streamModifier)
{
    if (getTrackById(track->id()))
        return false;

    m_trackSet.add(track->id(), track);
    track->addObserver(this);

    if (streamModifier == StreamModifier::DomAPI)
        m_private->addTrack(&track->privateTrack(), MediaStreamPrivate::NotifyClientOption::DontNotify);
    else
        dispatchEvent(MediaStreamTrackEvent::create(eventNames().addtrackEvent, false, false, WTF::move(track)));

    return true;
}
예제 #8
0
bool MediaStream::addTrack(PassRefPtr<MediaStreamTrack> prpTrack)
{
    // This is a common part used by addTrack called by JavaScript
    // and addRemoteTrack and only addRemoteTrack must fire addtrack event
    RefPtr<MediaStreamTrack> track = prpTrack;
    if (getTrackById(track->id()))
        return false;

    Vector<RefPtr<MediaStreamTrack>>* tracks = trackVectorForType(track->source()->type());

    tracks->append(track);
    track->addObserver(this);
    m_private->addTrack(&track->privateTrack());
    setActive(true);
    return true;
}
void MediaStream::didRemoveTrack(MediaStreamTrackPrivate& trackPrivate)
{
    RefPtr<MediaStreamTrack> track = getTrackById(trackPrivate.id());
    ASSERT(track);
    internalRemoveTrack(WTF::move(track), StreamModifier::Platform);
}