| OLD | NEW |
| 1 /* | 1 /* |
| 2 * Copyright (C) 2011 Google Inc. All rights reserved. | 2 * Copyright (C) 2011 Google Inc. All rights reserved. |
| 3 * Copyright (C) 2011, 2012 Ericsson AB. All rights reserved. | 3 * Copyright (C) 2011, 2012 Ericsson AB. All rights reserved. |
| 4 * | 4 * |
| 5 * Redistribution and use in source and binary forms, with or without | 5 * Redistribution and use in source and binary forms, with or without |
| 6 * modification, are permitted provided that the following conditions | 6 * modification, are permitted provided that the following conditions |
| 7 * are met: | 7 * are met: |
| 8 * 1. Redistributions of source code must retain the above copyright | 8 * 1. Redistributions of source code must retain the above copyright |
| 9 * notice, this list of conditions and the following disclaimer. | 9 * notice, this list of conditions and the following disclaimer. |
| 10 * 2. Redistributions in binary form must reproduce the above copyright | 10 * 2. Redistributions in binary form must reproduce the above copyright |
| (...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 48 static void processTrack(MediaStreamTrack* track, MediaStreamTrackVector& trackV
ector) | 48 static void processTrack(MediaStreamTrack* track, MediaStreamTrackVector& trackV
ector) |
| 49 { | 49 { |
| 50 if (track->ended()) | 50 if (track->ended()) |
| 51 return; | 51 return; |
| 52 | 52 |
| 53 MediaStreamSource* source = track->component()->source(); | 53 MediaStreamSource* source = track->component()->source(); |
| 54 if (!containsSource(trackVector, source)) | 54 if (!containsSource(trackVector, source)) |
| 55 trackVector.append(track); | 55 trackVector.append(track); |
| 56 } | 56 } |
| 57 | 57 |
| 58 PassRefPtr<MediaStream> MediaStream::create(ExecutionContext* context) | 58 PassRefPtrWillBeRawPtr<MediaStream> MediaStream::create(ExecutionContext* contex
t) |
| 59 { | 59 { |
| 60 MediaStreamTrackVector audioTracks; | 60 MediaStreamTrackVector audioTracks; |
| 61 MediaStreamTrackVector videoTracks; | 61 MediaStreamTrackVector videoTracks; |
| 62 | 62 |
| 63 return adoptRef(new MediaStream(context, audioTracks, videoTracks)); | 63 return adoptRefWillBeRefCountedGarbageCollected(new MediaStream(context, aud
ioTracks, videoTracks)); |
| 64 } | 64 } |
| 65 | 65 |
| 66 PassRefPtr<MediaStream> MediaStream::create(ExecutionContext* context, PassRefPt
r<MediaStream> stream) | 66 PassRefPtrWillBeRawPtr<MediaStream> MediaStream::create(ExecutionContext* contex
t, PassRefPtrWillBeRawPtr<MediaStream> stream) |
| 67 { | 67 { |
| 68 ASSERT(stream); | 68 ASSERT(stream); |
| 69 | 69 |
| 70 MediaStreamTrackVector audioTracks; | 70 MediaStreamTrackVector audioTracks; |
| 71 MediaStreamTrackVector videoTracks; | 71 MediaStreamTrackVector videoTracks; |
| 72 | 72 |
| 73 for (size_t i = 0; i < stream->m_audioTracks.size(); ++i) | 73 for (size_t i = 0; i < stream->m_audioTracks.size(); ++i) |
| 74 processTrack(stream->m_audioTracks[i].get(), audioTracks); | 74 processTrack(stream->m_audioTracks[i].get(), audioTracks); |
| 75 | 75 |
| 76 for (size_t i = 0; i < stream->m_videoTracks.size(); ++i) | 76 for (size_t i = 0; i < stream->m_videoTracks.size(); ++i) |
| 77 processTrack(stream->m_videoTracks[i].get(), videoTracks); | 77 processTrack(stream->m_videoTracks[i].get(), videoTracks); |
| 78 | 78 |
| 79 return adoptRef(new MediaStream(context, audioTracks, videoTracks)); | 79 return adoptRefWillBeRefCountedGarbageCollected(new MediaStream(context, aud
ioTracks, videoTracks)); |
| 80 } | 80 } |
| 81 | 81 |
| 82 PassRefPtr<MediaStream> MediaStream::create(ExecutionContext* context, const Med
iaStreamTrackVector& tracks) | 82 PassRefPtrWillBeRawPtr<MediaStream> MediaStream::create(ExecutionContext* contex
t, const MediaStreamTrackVector& tracks) |
| 83 { | 83 { |
| 84 MediaStreamTrackVector audioTracks; | 84 MediaStreamTrackVector audioTracks; |
| 85 MediaStreamTrackVector videoTracks; | 85 MediaStreamTrackVector videoTracks; |
| 86 | 86 |
| 87 for (size_t i = 0; i < tracks.size(); ++i) | 87 for (size_t i = 0; i < tracks.size(); ++i) |
| 88 processTrack(tracks[i].get(), tracks[i]->kind() == "audio" ? audioTracks
: videoTracks); | 88 processTrack(tracks[i].get(), tracks[i]->kind() == "audio" ? audioTracks
: videoTracks); |
| 89 | 89 |
| 90 return adoptRef(new MediaStream(context, audioTracks, videoTracks)); | 90 return adoptRefWillBeRefCountedGarbageCollected(new MediaStream(context, aud
ioTracks, videoTracks)); |
| 91 } | 91 } |
| 92 | 92 |
| 93 PassRefPtr<MediaStream> MediaStream::create(ExecutionContext* context, PassRefPt
r<MediaStreamDescriptor> streamDescriptor) | 93 PassRefPtrWillBeRawPtr<MediaStream> MediaStream::create(ExecutionContext* contex
t, PassRefPtr<MediaStreamDescriptor> streamDescriptor) |
| 94 { | 94 { |
| 95 return adoptRef(new MediaStream(context, streamDescriptor)); | 95 return adoptRefWillBeRefCountedGarbageCollected(new MediaStream(context, str
eamDescriptor)); |
| 96 } | 96 } |
| 97 | 97 |
| 98 MediaStream::MediaStream(ExecutionContext* context, PassRefPtr<MediaStreamDescri
ptor> streamDescriptor) | 98 MediaStream::MediaStream(ExecutionContext* context, PassRefPtr<MediaStreamDescri
ptor> streamDescriptor) |
| 99 : ContextLifecycleObserver(context) | 99 : ContextLifecycleObserver(context) |
| 100 , m_stopped(false) | 100 , m_stopped(false) |
| 101 , m_descriptor(streamDescriptor) | 101 , m_descriptor(streamDescriptor) |
| 102 , m_scheduledEventTimer(this, &MediaStream::scheduledEventTimerFired) | 102 , m_scheduledEventTimer(this, &MediaStream::scheduledEventTimerFired) |
| 103 { | 103 { |
| 104 ScriptWrappable::init(this); | 104 ScriptWrappable::init(this); |
| 105 m_descriptor->setClient(this); | 105 m_descriptor->setClient(this); |
| 106 | 106 |
| 107 size_t numberOfAudioTracks = m_descriptor->numberOfAudioComponents(); | 107 size_t numberOfAudioTracks = m_descriptor->numberOfAudioComponents(); |
| 108 m_audioTracks.reserveCapacity(numberOfAudioTracks); | 108 m_audioTracks.reserveCapacity(numberOfAudioTracks); |
| 109 for (size_t i = 0; i < numberOfAudioTracks; i++) { | 109 for (size_t i = 0; i < numberOfAudioTracks; i++) { |
| 110 RefPtr<MediaStreamTrack> newTrack = MediaStreamTrack::create(context, m_
descriptor->audioComponent(i)); | 110 RefPtrWillBeRawPtr<MediaStreamTrack> newTrack = MediaStreamTrack::create
(context, m_descriptor->audioComponent(i)); |
| 111 newTrack->addObserver(this); | 111 newTrack->registerMediaStream(this); |
| 112 m_audioTracks.append(newTrack.release()); | 112 m_audioTracks.append(newTrack.release()); |
| 113 } | 113 } |
| 114 | 114 |
| 115 size_t numberOfVideoTracks = m_descriptor->numberOfVideoComponents(); | 115 size_t numberOfVideoTracks = m_descriptor->numberOfVideoComponents(); |
| 116 m_videoTracks.reserveCapacity(numberOfVideoTracks); | 116 m_videoTracks.reserveCapacity(numberOfVideoTracks); |
| 117 for (size_t i = 0; i < numberOfVideoTracks; i++) { | 117 for (size_t i = 0; i < numberOfVideoTracks; i++) { |
| 118 RefPtr<MediaStreamTrack> newTrack = MediaStreamTrack::create(context, m_
descriptor->videoComponent(i)); | 118 RefPtrWillBeRawPtr<MediaStreamTrack> newTrack = MediaStreamTrack::create
(context, m_descriptor->videoComponent(i)); |
| 119 newTrack->addObserver(this); | 119 newTrack->registerMediaStream(this); |
| 120 m_videoTracks.append(newTrack.release()); | 120 m_videoTracks.append(newTrack.release()); |
| 121 } | 121 } |
| 122 } | 122 } |
| 123 | 123 |
| 124 MediaStream::MediaStream(ExecutionContext* context, const MediaStreamTrackVector
& audioTracks, const MediaStreamTrackVector& videoTracks) | 124 MediaStream::MediaStream(ExecutionContext* context, const MediaStreamTrackVector
& audioTracks, const MediaStreamTrackVector& videoTracks) |
| 125 : ContextLifecycleObserver(context) | 125 : ContextLifecycleObserver(context) |
| 126 , m_stopped(false) | 126 , m_stopped(false) |
| 127 , m_scheduledEventTimer(this, &MediaStream::scheduledEventTimerFired) | 127 , m_scheduledEventTimer(this, &MediaStream::scheduledEventTimerFired) |
| 128 { | 128 { |
| 129 ScriptWrappable::init(this); | 129 ScriptWrappable::init(this); |
| 130 | 130 |
| 131 MediaStreamComponentVector audioComponents; | 131 MediaStreamComponentVector audioComponents; |
| 132 MediaStreamComponentVector videoComponents; | 132 MediaStreamComponentVector videoComponents; |
| 133 | 133 |
| 134 MediaStreamTrackVector::const_iterator iter; | 134 MediaStreamTrackVector::const_iterator iter; |
| 135 for (iter = audioTracks.begin(); iter != audioTracks.end(); ++iter) { | 135 for (iter = audioTracks.begin(); iter != audioTracks.end(); ++iter) { |
| 136 (*iter)->addObserver(this); | 136 (*iter)->registerMediaStream(this); |
| 137 audioComponents.append((*iter)->component()); | 137 audioComponents.append((*iter)->component()); |
| 138 } | 138 } |
| 139 for (iter = videoTracks.begin(); iter != videoTracks.end(); ++iter) { | 139 for (iter = videoTracks.begin(); iter != videoTracks.end(); ++iter) { |
| 140 (*iter)->addObserver(this); | 140 (*iter)->registerMediaStream(this); |
| 141 videoComponents.append((*iter)->component()); | 141 videoComponents.append((*iter)->component()); |
| 142 } | 142 } |
| 143 | 143 |
| 144 m_descriptor = MediaStreamDescriptor::create(audioComponents, videoComponent
s); | 144 m_descriptor = MediaStreamDescriptor::create(audioComponents, videoComponent
s); |
| 145 m_descriptor->setClient(this); | 145 m_descriptor->setClient(this); |
| 146 MediaStreamCenter::instance().didCreateMediaStream(m_descriptor.get()); | 146 MediaStreamCenter::instance().didCreateMediaStream(m_descriptor.get()); |
| 147 | 147 |
| 148 m_audioTracks = audioTracks; | 148 m_audioTracks = audioTracks; |
| 149 m_videoTracks = videoTracks; | 149 m_videoTracks = videoTracks; |
| 150 } | 150 } |
| 151 | 151 |
| 152 MediaStream::~MediaStream() | 152 MediaStream::~MediaStream() |
| 153 { | 153 { |
| 154 #if !ENABLE(OILPAN) |
| 154 for (MediaStreamTrackVector::iterator iter = m_audioTracks.begin(); iter !=
m_audioTracks.end(); ++iter) | 155 for (MediaStreamTrackVector::iterator iter = m_audioTracks.begin(); iter !=
m_audioTracks.end(); ++iter) |
| 155 (*iter)->removeObserver(this); | 156 (*iter)->unregisterMediaStream(this); |
| 156 | 157 |
| 157 for (MediaStreamTrackVector::iterator iter = m_videoTracks.begin(); iter !=
m_videoTracks.end(); ++iter) | 158 for (MediaStreamTrackVector::iterator iter = m_videoTracks.begin(); iter !=
m_videoTracks.end(); ++iter) |
| 158 (*iter)->removeObserver(this); | 159 (*iter)->unregisterMediaStream(this); |
| 160 #endif |
| 159 | 161 |
| 160 m_descriptor->setClient(0); | 162 m_descriptor->setClient(0); |
| 161 } | 163 } |
| 162 | 164 |
| 163 bool MediaStream::ended() const | 165 bool MediaStream::ended() const |
| 164 { | 166 { |
| 165 return m_stopped || m_descriptor->ended(); | 167 return m_stopped || m_descriptor->ended(); |
| 166 } | 168 } |
| 167 | 169 |
| 168 void MediaStream::addTrack(PassRefPtr<MediaStreamTrack> prpTrack, ExceptionState
& exceptionState) | 170 void MediaStream::addTrack(PassRefPtrWillBeRawPtr<MediaStreamTrack> prpTrack, Ex
ceptionState& exceptionState) |
| 169 { | 171 { |
| 170 if (ended()) { | 172 if (ended()) { |
| 171 exceptionState.throwDOMException(InvalidStateError, "The MediaStream is
finished."); | 173 exceptionState.throwDOMException(InvalidStateError, "The MediaStream is
finished."); |
| 172 return; | 174 return; |
| 173 } | 175 } |
| 174 | 176 |
| 175 if (!prpTrack) { | 177 if (!prpTrack) { |
| 176 exceptionState.throwDOMException(TypeMismatchError, "The MediaStreamTrac
k provided is invalid."); | 178 exceptionState.throwDOMException(TypeMismatchError, "The MediaStreamTrac
k provided is invalid."); |
| 177 return; | 179 return; |
| 178 } | 180 } |
| 179 | 181 |
| 180 RefPtr<MediaStreamTrack> track = prpTrack; | 182 RefPtrWillBeRawPtr<MediaStreamTrack> track = prpTrack; |
| 181 | 183 |
| 182 if (getTrackById(track->id())) | 184 if (getTrackById(track->id())) |
| 183 return; | 185 return; |
| 184 | 186 |
| 185 switch (track->component()->source()->type()) { | 187 switch (track->component()->source()->type()) { |
| 186 case MediaStreamSource::TypeAudio: | 188 case MediaStreamSource::TypeAudio: |
| 187 m_audioTracks.append(track); | 189 m_audioTracks.append(track); |
| 188 break; | 190 break; |
| 189 case MediaStreamSource::TypeVideo: | 191 case MediaStreamSource::TypeVideo: |
| 190 m_videoTracks.append(track); | 192 m_videoTracks.append(track); |
| 191 break; | 193 break; |
| 192 } | 194 } |
| 193 track->addObserver(this); | 195 track->registerMediaStream(this); |
| 194 m_descriptor->addComponent(track->component()); | 196 m_descriptor->addComponent(track->component()); |
| 195 MediaStreamCenter::instance().didAddMediaStreamTrack(m_descriptor.get(), tra
ck->component()); | 197 MediaStreamCenter::instance().didAddMediaStreamTrack(m_descriptor.get(), tra
ck->component()); |
| 196 } | 198 } |
| 197 | 199 |
| 198 void MediaStream::removeTrack(PassRefPtr<MediaStreamTrack> prpTrack, ExceptionSt
ate& exceptionState) | 200 void MediaStream::removeTrack(PassRefPtrWillBeRawPtr<MediaStreamTrack> prpTrack,
ExceptionState& exceptionState) |
| 199 { | 201 { |
| 200 if (ended()) { | 202 if (ended()) { |
| 201 exceptionState.throwDOMException(InvalidStateError, "The MediaStream is
finished."); | 203 exceptionState.throwDOMException(InvalidStateError, "The MediaStream is
finished."); |
| 202 return; | 204 return; |
| 203 } | 205 } |
| 204 | 206 |
| 205 if (!prpTrack) { | 207 if (!prpTrack) { |
| 206 exceptionState.throwDOMException(TypeMismatchError, "The MediaStreamTrac
k provided is invalid."); | 208 exceptionState.throwDOMException(TypeMismatchError, "The MediaStreamTrac
k provided is invalid."); |
| 207 return; | 209 return; |
| 208 } | 210 } |
| 209 | 211 |
| 210 RefPtr<MediaStreamTrack> track = prpTrack; | 212 RefPtrWillBeRawPtr<MediaStreamTrack> track = prpTrack; |
| 211 | 213 |
| 212 size_t pos = kNotFound; | 214 size_t pos = kNotFound; |
| 213 switch (track->component()->source()->type()) { | 215 switch (track->component()->source()->type()) { |
| 214 case MediaStreamSource::TypeAudio: | 216 case MediaStreamSource::TypeAudio: |
| 215 pos = m_audioTracks.find(track); | 217 pos = m_audioTracks.find(track); |
| 216 if (pos != kNotFound) | 218 if (pos != kNotFound) |
| 217 m_audioTracks.remove(pos); | 219 m_audioTracks.remove(pos); |
| 218 break; | 220 break; |
| 219 case MediaStreamSource::TypeVideo: | 221 case MediaStreamSource::TypeVideo: |
| 220 pos = m_videoTracks.find(track); | 222 pos = m_videoTracks.find(track); |
| 221 if (pos != kNotFound) | 223 if (pos != kNotFound) |
| 222 m_videoTracks.remove(pos); | 224 m_videoTracks.remove(pos); |
| 223 break; | 225 break; |
| 224 } | 226 } |
| 225 | 227 |
| 226 if (pos == kNotFound) | 228 if (pos == kNotFound) |
| 227 return; | 229 return; |
| 228 | 230 track->unregisterMediaStream(this); |
| 229 track->removeObserver(this); | |
| 230 m_descriptor->removeComponent(track->component()); | 231 m_descriptor->removeComponent(track->component()); |
| 231 | 232 |
| 232 if (!m_audioTracks.size() && !m_videoTracks.size()) | 233 if (!m_audioTracks.size() && !m_videoTracks.size()) |
| 233 m_descriptor->setEnded(); | 234 m_descriptor->setEnded(); |
| 234 | 235 |
| 235 MediaStreamCenter::instance().didRemoveMediaStreamTrack(m_descriptor.get(),
track->component()); | 236 MediaStreamCenter::instance().didRemoveMediaStreamTrack(m_descriptor.get(),
track->component()); |
| 236 } | 237 } |
| 237 | 238 |
| 238 MediaStreamTrack* MediaStream::getTrackById(String id) | 239 MediaStreamTrack* MediaStream::getTrackById(String id) |
| 239 { | 240 { |
| 240 for (MediaStreamTrackVector::iterator iter = m_audioTracks.begin(); iter !=
m_audioTracks.end(); ++iter) { | 241 for (MediaStreamTrackVector::iterator iter = m_audioTracks.begin(); iter !=
m_audioTracks.end(); ++iter) { |
| 241 if ((*iter)->id() == id) | 242 if ((*iter)->id() == id) |
| 242 return iter->get(); | 243 return iter->get(); |
| 243 } | 244 } |
| 244 | 245 |
| 245 for (MediaStreamTrackVector::iterator iter = m_videoTracks.begin(); iter !=
m_videoTracks.end(); ++iter) { | 246 for (MediaStreamTrackVector::iterator iter = m_videoTracks.begin(); iter !=
m_videoTracks.end(); ++iter) { |
| 246 if ((*iter)->id() == id) | 247 if ((*iter)->id() == id) |
| 247 return iter->get(); | 248 return iter->get(); |
| 248 } | 249 } |
| 249 | 250 |
| 250 return 0; | 251 return 0; |
| 251 } | 252 } |
| 252 | 253 |
| 253 PassRefPtr<MediaStream> MediaStream::clone(ExecutionContext* context) | 254 PassRefPtrWillBeRawPtr<MediaStream> MediaStream::clone(ExecutionContext* context
) |
| 254 { | 255 { |
| 255 MediaStreamTrackVector tracks; | 256 MediaStreamTrackVector tracks; |
| 256 for (MediaStreamTrackVector::iterator iter = m_audioTracks.begin(); iter !=
m_audioTracks.end(); ++iter) | 257 for (MediaStreamTrackVector::iterator iter = m_audioTracks.begin(); iter !=
m_audioTracks.end(); ++iter) |
| 257 tracks.append((*iter)->clone(context)); | 258 tracks.append((*iter)->clone(context)); |
| 258 for (MediaStreamTrackVector::iterator iter = m_videoTracks.begin(); iter !=
m_videoTracks.end(); ++iter) | 259 for (MediaStreamTrackVector::iterator iter = m_videoTracks.begin(); iter !=
m_videoTracks.end(); ++iter) |
| 259 tracks.append((*iter)->clone(context)); | 260 tracks.append((*iter)->clone(context)); |
| 260 RefPtr<MediaStream> clonedStream = MediaStream::create(context, tracks); | 261 return MediaStream::create(context, tracks); |
| 261 return clonedStream.release(); | |
| 262 } | 262 } |
| 263 | 263 |
| 264 void MediaStream::stop() | 264 void MediaStream::stop() |
| 265 { | 265 { |
| 266 if (ended()) | 266 if (ended()) |
| 267 return; | 267 return; |
| 268 | 268 |
| 269 MediaStreamCenter::instance().didStopLocalMediaStream(descriptor()); | 269 MediaStreamCenter::instance().didStopLocalMediaStream(descriptor()); |
| 270 | 270 |
| 271 streamEnded(); | 271 streamEnded(); |
| (...skipping 38 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 310 { | 310 { |
| 311 return ContextLifecycleObserver::executionContext(); | 311 return ContextLifecycleObserver::executionContext(); |
| 312 } | 312 } |
| 313 | 313 |
| 314 void MediaStream::addRemoteTrack(MediaStreamComponent* component) | 314 void MediaStream::addRemoteTrack(MediaStreamComponent* component) |
| 315 { | 315 { |
| 316 ASSERT(component); | 316 ASSERT(component); |
| 317 if (ended()) | 317 if (ended()) |
| 318 return; | 318 return; |
| 319 | 319 |
| 320 RefPtr<MediaStreamTrack> track = MediaStreamTrack::create(executionContext()
, component); | 320 RefPtrWillBeRawPtr<MediaStreamTrack> track = MediaStreamTrack::create(execut
ionContext(), component); |
| 321 switch (component->source()->type()) { | 321 switch (component->source()->type()) { |
| 322 case MediaStreamSource::TypeAudio: | 322 case MediaStreamSource::TypeAudio: |
| 323 m_audioTracks.append(track); | 323 m_audioTracks.append(track); |
| 324 break; | 324 break; |
| 325 case MediaStreamSource::TypeVideo: | 325 case MediaStreamSource::TypeVideo: |
| 326 m_videoTracks.append(track); | 326 m_videoTracks.append(track); |
| 327 break; | 327 break; |
| 328 } | 328 } |
| 329 track->addObserver(this); | 329 track->registerMediaStream(this); |
| 330 m_descriptor->addComponent(component); | 330 m_descriptor->addComponent(component); |
| 331 | 331 |
| 332 scheduleDispatchEvent(MediaStreamTrackEvent::create(EventTypeNames::addtrack
, false, false, track)); | 332 scheduleDispatchEvent(MediaStreamTrackEvent::create(EventTypeNames::addtrack
, false, false, track)); |
| 333 } | 333 } |
| 334 | 334 |
| 335 void MediaStream::removeRemoteTrack(MediaStreamComponent* component) | 335 void MediaStream::removeRemoteTrack(MediaStreamComponent* component) |
| 336 { | 336 { |
| 337 if (ended()) | 337 if (ended()) |
| 338 return; | 338 return; |
| 339 | 339 |
| (...skipping 12 matching lines...) Expand all Loading... |
| 352 if ((*tracks)[i]->component() == component) { | 352 if ((*tracks)[i]->component() == component) { |
| 353 index = i; | 353 index = i; |
| 354 break; | 354 break; |
| 355 } | 355 } |
| 356 } | 356 } |
| 357 if (index == kNotFound) | 357 if (index == kNotFound) |
| 358 return; | 358 return; |
| 359 | 359 |
| 360 m_descriptor->removeComponent(component); | 360 m_descriptor->removeComponent(component); |
| 361 | 361 |
| 362 RefPtr<MediaStreamTrack> track = (*tracks)[index]; | 362 RefPtrWillBeRawPtr<MediaStreamTrack> track = (*tracks)[index]; |
| 363 track->removeObserver(this); | 363 track->unregisterMediaStream(this); |
| 364 tracks->remove(index); | 364 tracks->remove(index); |
| 365 scheduleDispatchEvent(MediaStreamTrackEvent::create(EventTypeNames::removetr
ack, false, false, track)); | 365 scheduleDispatchEvent(MediaStreamTrackEvent::create(EventTypeNames::removetr
ack, false, false, track)); |
| 366 } | 366 } |
| 367 | 367 |
| 368 void MediaStream::scheduleDispatchEvent(PassRefPtrWillBeRawPtr<Event> event) | 368 void MediaStream::scheduleDispatchEvent(PassRefPtrWillBeRawPtr<Event> event) |
| 369 { | 369 { |
| 370 m_scheduledEvents.append(event); | 370 m_scheduledEvents.append(event); |
| 371 | 371 |
| 372 if (!m_scheduledEventTimer.isActive()) | 372 if (!m_scheduledEventTimer.isActive()) |
| 373 m_scheduledEventTimer.startOneShot(0, FROM_HERE); | 373 m_scheduledEventTimer.startOneShot(0, FROM_HERE); |
| (...skipping 12 matching lines...) Expand all Loading... |
| 386 dispatchEvent((*it).release()); | 386 dispatchEvent((*it).release()); |
| 387 | 387 |
| 388 events.clear(); | 388 events.clear(); |
| 389 } | 389 } |
| 390 | 390 |
| 391 URLRegistry& MediaStream::registry() const | 391 URLRegistry& MediaStream::registry() const |
| 392 { | 392 { |
| 393 return MediaStreamRegistry::registry(); | 393 return MediaStreamRegistry::registry(); |
| 394 } | 394 } |
| 395 | 395 |
| 396 void MediaStream::trace(Visitor* visitor) |
| 397 { |
| 398 visitor->trace(m_audioTracks); |
| 399 visitor->trace(m_videoTracks); |
| 400 visitor->trace(m_scheduledEvents); |
| 401 } |
| 402 |
| 396 } // namespace WebCore | 403 } // namespace WebCore |
| OLD | NEW |