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())); }
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()); }
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()); }
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); }
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; }
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); }