Chromium Code Reviews| Index: Source/WebCore/Modules/mediastream/MediaStream.cpp |
| diff --git a/Source/WebCore/Modules/mediastream/MediaStream.cpp b/Source/WebCore/Modules/mediastream/MediaStream.cpp |
| index 5c388abaf3adef1737c2da3991627241004c40e7..471764716e49e2f7554b0f504b6de79dbc897a87 100644 |
| --- a/Source/WebCore/Modules/mediastream/MediaStream.cpp |
| +++ b/Source/WebCore/Modules/mediastream/MediaStream.cpp |
| @@ -115,17 +115,23 @@ MediaStream::MediaStream(ScriptExecutionContext* context, PassRefPtr<MediaStream |
| size_t numberOfAudioTracks = m_descriptor->numberOfAudioComponents(); |
| m_audioTracks.reserveCapacity(numberOfAudioTracks); |
| for (size_t i = 0; i < numberOfAudioTracks; i++) |
| - m_audioTracks.append(MediaStreamTrack::create(context, m_descriptor->audioComponent(i))); |
| + m_audioTracks.append(MediaStreamTrack::create(context, m_descriptor->audioComponent(i), this)); |
| size_t numberOfVideoTracks = m_descriptor->numberOfVideoComponents(); |
| m_videoTracks.reserveCapacity(numberOfVideoTracks); |
| for (size_t i = 0; i < numberOfVideoTracks; i++) |
| - m_videoTracks.append(MediaStreamTrack::create(context, m_descriptor->videoComponent(i))); |
| + m_videoTracks.append(MediaStreamTrack::create(context, m_descriptor->videoComponent(i), this)); |
| } |
| MediaStream::~MediaStream() |
| { |
| m_descriptor->setClient(0); |
| + |
| + for (size_t i = 0; i < m_audioTracks.size(); ++i) |
| + m_audioTracks[i]->clearStream(); |
| + |
| + for (size_t i = 0; i < m_videoTracks.size(); ++i) |
| + m_videoTracks[i]->clearStream(); |
| } |
| bool MediaStream::ended() const |
| @@ -151,7 +157,7 @@ void MediaStream::addTrack(PassRefPtr<MediaStreamTrack> prpTrack, ExceptionCode& |
| return; |
| RefPtr<MediaStreamComponent> component = MediaStreamComponent::create(m_descriptor.get(), track->component()->source()); |
| - RefPtr<MediaStreamTrack> newTrack = MediaStreamTrack::create(scriptExecutionContext(), component.get()); |
| + RefPtr<MediaStreamTrack> newTrack = MediaStreamTrack::create(scriptExecutionContext(), component.get(), this); |
| switch (component->source()->type()) { |
| case MediaStreamSource::TypeAudio: |
| @@ -186,6 +192,7 @@ void MediaStream::removeTrack(PassRefPtr<MediaStreamTrack> prpTrack , ExceptionC |
| size_t pos = m_audioTracks.find(track); |
| if (pos != notFound) { |
| m_audioTracks.remove(pos); |
| + track->clearStream(); |
| m_descriptor->removeAudioComponent(track->component()); |
| } |
| break; |
| @@ -194,6 +201,7 @@ void MediaStream::removeTrack(PassRefPtr<MediaStreamTrack> prpTrack , ExceptionC |
| size_t pos = m_videoTracks.find(track); |
| if (pos != notFound) { |
| m_videoTracks.remove(pos); |
| + track->clearStream(); |
| m_descriptor->removeVideoComponent(track->component()); |
| } |
| break; |
| @@ -264,7 +272,7 @@ void MediaStream::addRemoteTrack(MediaStreamComponent* component) |
| component->setStream(descriptor()); |
| - RefPtr<MediaStreamTrack> track = MediaStreamTrack::create(scriptExecutionContext(), component); |
| + RefPtr<MediaStreamTrack> track = MediaStreamTrack::create(scriptExecutionContext(), component, this); |
| switch (component->source()->type()) { |
| case MediaStreamSource::TypeAudio: |
| m_audioTracks.append(track); |
| @@ -304,6 +312,7 @@ void MediaStream::removeRemoteTrack(MediaStreamComponent* component) |
| RefPtr<MediaStreamTrack> track = (*tracks)[index]; |
| tracks->remove(index); |
| + track->clearStream(); |
| scheduleDispatchEvent(MediaStreamTrackEvent::create(eventNames().removetrackEvent, false, false, track)); |
| } |
| @@ -330,6 +339,18 @@ void MediaStream::scheduledEventTimerFired(Timer<MediaStream>*) |
| events.clear(); |
| } |
| +void MediaStream::didEndTrack() |
|
eseidel
2013/04/09 06:42:25
If this dispatches synchronous javascript events,
Li Yin
2013/04/09 07:38:33
didEndTrack is only checking whether the event sho
|
| +{ |
| + for (size_t i = 0; i < m_audioTracks.size(); ++i) |
| + if (!m_audioTracks[i]->ended()) |
| + return; |
| + |
| + for (size_t i = 0; i < m_videoTracks.size(); ++i) |
| + if (!m_videoTracks[i]->ended()) |
| + return; |
| + |
| + streamEnded(); |
| +} |
| } // namespace WebCore |
| #endif // ENABLE(MEDIA_STREAM) |