Diff
Modified: trunk/Source/WebCore/ChangeLog (88340 => 88341)
--- trunk/Source/WebCore/ChangeLog 2011-06-08 13:06:24 UTC (rev 88340)
+++ trunk/Source/WebCore/ChangeLog 2011-06-08 13:08:11 UTC (rev 88341)
@@ -1,3 +1,64 @@
+2011-06-08 Tommy Widenflycht <tom...@google.com>
+
+ Reviewed by Tony Gentilcore.
+
+ Media Stream API: integrate the Track List objects into the existing code.
+ https://bugs.webkit.org/show_bug.cgi?id=60205
+
+ Tests for the Media Stream API will be provided by the bug 56587.
+
+ * dom/ExclusiveTrackList.cpp:
+ (WebCore::ExclusiveTrackList::select):
+ (WebCore::ExclusiveTrackList::trackFailed):
+ * dom/ExclusiveTrackList.h:
+ * dom/GeneratedStream.cpp:
+ (WebCore::GeneratedStream::create):
+ (WebCore::GeneratedStream::GeneratedStream):
+ (WebCore::GeneratedStream::streamEnded):
+ (WebCore::GeneratedStream::audioTracks):
+ (WebCore::GeneratedStream::videoTracks):
+ (WebCore::GeneratedStream::stop):
+ * dom/GeneratedStream.h:
+ * dom/GeneratedStream.idl:
+ * dom/MultipleTrackList.cpp:
+ (WebCore::MultipleTrackList::trackFailed):
+ (WebCore::MultipleTrackList::enable):
+ (WebCore::MultipleTrackList::disable):
+ * dom/MultipleTrackList.h:
+ * dom/Stream.h:
+ * dom/TrackList.cpp:
+ (WebCore::TrackList::clear):
+ (WebCore::TrackList::associateStream):
+ (WebCore::TrackList::associatedStreamLabel):
+ (WebCore::TrackList::trackFailed):
+ (WebCore::TrackList::scriptExecutionContext):
+ * dom/TrackList.h:
+ * page/MediaStreamClient.h:
+ * page/MediaStreamController.cpp:
+ (WebCore::MediaStreamController::enableAudioTrack):
+ (WebCore::MediaStreamController::disableAudioTrack):
+ (WebCore::MediaStreamController::selectVideoTrack):
+ (WebCore::MediaStreamController::streamGenerated):
+ (WebCore::MediaStreamController::audioTrackFailed):
+ (WebCore::MediaStreamController::videoTrackFailed):
+ * page/MediaStreamController.h:
+ * page/MediaStreamFrameController.cpp:
+ (WebCore::MediaStreamFrameController::unregister):
+ (WebCore::MediaStreamFrameController::enterDetachedState):
+ (WebCore::MediaStreamFrameController::disconnectFrame):
+ (WebCore::MediaStreamFrameController::enableAudioTrack):
+ (WebCore::MediaStreamFrameController::disableAudioTrack):
+ (WebCore::MediaStreamFrameController::selectVideoTrack):
+ (WebCore::MediaStreamFrameController::streamGenerated):
+ (WebCore::MediaStreamFrameController::audioTrackFailed):
+ (WebCore::MediaStreamFrameController::videoTrackFailed):
+ * page/MediaStreamFrameController.h:
+ (WebCore::MediaStreamFrameController::ClientBase::isGenericClient):
+ (WebCore::MediaStreamFrameController::GenericClient::GenericClient):
+ (WebCore::MediaStreamFrameController::GenericClient::~GenericClient):
+ (WebCore::MediaStreamFrameController::GenericClient::isGenericClient):
+ (WebCore::MediaStreamFrameController::GenericClient::unregister):
+
2011-06-08 Pavel Podivilov <podivi...@chromium.org>
Reviewed by Yury Semikhatsky.
Modified: trunk/Source/WebCore/dom/ExclusiveTrackList.cpp (88340 => 88341)
--- trunk/Source/WebCore/dom/ExclusiveTrackList.cpp 2011-06-08 13:06:24 UTC (rev 88340)
+++ trunk/Source/WebCore/dom/ExclusiveTrackList.cpp 2011-06-08 13:08:11 UTC (rev 88341)
@@ -60,9 +60,25 @@
return;
m_selectedIndex = index;
+
+#if ENABLE(MEDIA_STREAM)
+ if (mediaStreamFrameController())
+ mediaStreamFrameController()->selectVideoTrack(associatedStreamLabel(), index);
+#endif
+
postChangeEvent();
}
+#if ENABLE(MEDIA_STREAM)
+void ExclusiveTrackList::trackFailed(unsigned long index)
+{
+ if (m_selectedIndex == static_cast<long>(index))
+ m_selectedIndex = NoSelection;
+
+ TrackList::trackFailed(index);
+}
+#endif
+
ExclusiveTrackList* ExclusiveTrackList::toExclusiveTrackList()
{
return this;
Modified: trunk/Source/WebCore/dom/ExclusiveTrackList.h (88340 => 88341)
--- trunk/Source/WebCore/dom/ExclusiveTrackList.h 2011-06-08 13:06:24 UTC (rev 88340)
+++ trunk/Source/WebCore/dom/ExclusiveTrackList.h 2011-06-08 13:08:11 UTC (rev 88341)
@@ -44,6 +44,10 @@
virtual void clear();
+#if ENABLE(MEDIA_STREAM)
+ virtual void trackFailed(unsigned long index);
+#endif
+
// EventTarget implementation.
virtual ExclusiveTrackList* toExclusiveTrackList();
Modified: trunk/Source/WebCore/dom/GeneratedStream.cpp (88340 => 88341)
--- trunk/Source/WebCore/dom/GeneratedStream.cpp 2011-06-08 13:06:24 UTC (rev 88340)
+++ trunk/Source/WebCore/dom/GeneratedStream.cpp 2011-06-08 13:08:11 UTC (rev 88341)
@@ -29,7 +29,9 @@
#include "Event.h"
#include "EventNames.h"
+#include "ExclusiveTrackList.h"
#include "MediaStreamFrameController.h"
+#include "MultipleTrackList.h"
#include "ScriptExecutionContext.h"
namespace WebCore {
@@ -57,14 +59,20 @@
Callback m_callback;
};
-PassRefPtr<GeneratedStream> GeneratedStream::create(MediaStreamFrameController* frameController, const String& label)
+PassRefPtr<GeneratedStream> GeneratedStream::create(MediaStreamFrameController* frameController, const String& label, PassRefPtr<MultipleTrackList> audioTracks, PassRefPtr<ExclusiveTrackList> videoTracks)
{
- return adoptRef(new GeneratedStream(frameController, label));
+ return adoptRef(new GeneratedStream(frameController, label, audioTracks, videoTracks));
}
-GeneratedStream::GeneratedStream(MediaStreamFrameController* frameController, const String& label)
+GeneratedStream::GeneratedStream(MediaStreamFrameController* frameController, const String& label, PassRefPtr<MultipleTrackList> audioTracks, PassRefPtr<ExclusiveTrackList> videoTracks)
: Stream(frameController, label, true)
+ , m_audioTracks(audioTracks)
+ , m_videoTracks(videoTracks)
{
+ ASSERT(m_audioTracks);
+ ASSERT(m_videoTracks);
+ m_audioTracks->associateStream(label);
+ m_videoTracks->associateStream(label);
}
GeneratedStream::~GeneratedStream()
@@ -84,12 +92,32 @@
Stream::detachEmbedder();
}
+void GeneratedStream::streamEnded()
+{
+ m_audioTracks->clear();
+ m_videoTracks->clear();
+
+ Stream::streamEnded();
+}
+
+PassRefPtr<MultipleTrackList> GeneratedStream::audioTracks() const
+{
+ return m_audioTracks;
+}
+
+PassRefPtr<ExclusiveTrackList> GeneratedStream::videoTracks() const
+{
+ return m_videoTracks;
+}
+
void GeneratedStream::stop()
{
if (!mediaStreamFrameController() || m_readyState == ENDED)
return;
mediaStreamFrameController()->stopGeneratedStream(label());
+ m_audioTracks->clear();
+ m_videoTracks->clear();
m_readyState = ENDED;
Modified: trunk/Source/WebCore/dom/GeneratedStream.h (88340 => 88341)
--- trunk/Source/WebCore/dom/GeneratedStream.h 2011-06-08 13:06:24 UTC (rev 88340)
+++ trunk/Source/WebCore/dom/GeneratedStream.h 2011-06-08 13:08:11 UTC (rev 88341)
@@ -32,26 +32,35 @@
namespace WebCore {
+class ExclusiveTrackList;
+class MultipleTrackList;
+
class GeneratedStream : public Stream {
public:
- // FIXME: add audio and video tracks when available.
- static PassRefPtr<GeneratedStream> create(MediaStreamFrameController*, const String& label);
+ static PassRefPtr<GeneratedStream> create(MediaStreamFrameController*, const String& label, PassRefPtr<MultipleTrackList> audioTracks, PassRefPtr<ExclusiveTrackList> videoTracks);
virtual ~GeneratedStream();
void stop();
+ PassRefPtr<MultipleTrackList> audioTracks() const;
+ PassRefPtr<ExclusiveTrackList> videoTracks() const;
+
// MediaStreamFrameController::StreamClient implementation.
virtual void detachEmbedder();
+ virtual void streamEnded();
// EventTarget.
virtual GeneratedStream* toGeneratedStream();
private:
- GeneratedStream(MediaStreamFrameController*, const String& label);
+ GeneratedStream(MediaStreamFrameController*, const String& label, PassRefPtr<MultipleTrackList> audioTracks, PassRefPtr<ExclusiveTrackList> videoTracks);
class DispatchUpdateTask;
friend class DispatchUpdateTask;
void onStop();
+
+ RefPtr<MultipleTrackList> m_audioTracks;
+ RefPtr<ExclusiveTrackList> m_videoTracks;
};
} // namespace WebCore
Modified: trunk/Source/WebCore/dom/GeneratedStream.idl (88340 => 88341)
--- trunk/Source/WebCore/dom/GeneratedStream.idl 2011-06-08 13:06:24 UTC (rev 88340)
+++ trunk/Source/WebCore/dom/GeneratedStream.idl 2011-06-08 13:08:11 UTC (rev 88341)
@@ -30,7 +30,9 @@
] GeneratedStream : Stream {
void stop();
- // FIXME: implement audio and video tracks when available.
+ // Track control.
+ readonly attribute MultipleTrackList audioTracks;
+ readonly attribute ExclusiveTrackList videoTracks;
};
}
Modified: trunk/Source/WebCore/dom/MultipleTrackList.cpp (88340 => 88341)
--- trunk/Source/WebCore/dom/MultipleTrackList.cpp 2011-06-08 13:06:24 UTC (rev 88340)
+++ trunk/Source/WebCore/dom/MultipleTrackList.cpp 2011-06-08 13:08:11 UTC (rev 88341)
@@ -54,6 +54,14 @@
TrackList::clear();
}
+#if ENABLE(MEDIA_STREAM)
+void MultipleTrackList::trackFailed(unsigned long index)
+{
+ TrackList::trackFailed(index);
+ m_isEnabled.remove(index);
+}
+#endif
+
bool MultipleTrackList::isEnabled(unsigned long index, ExceptionCode& ec) const
{
return checkIndex(index, ec) ? m_isEnabled[index] : false;
@@ -65,6 +73,12 @@
return;
m_isEnabled[index] = true;
+
+#if ENABLE(MEDIA_STREAM)
+ if (mediaStreamFrameController())
+ mediaStreamFrameController()->enableAudioTrack(associatedStreamLabel(), index);
+#endif
+
postChangeEvent();
}
@@ -74,6 +88,12 @@
return;
m_isEnabled[index] = false;
+
+#if ENABLE(MEDIA_STREAM)
+ if (mediaStreamFrameController())
+ mediaStreamFrameController()->disableAudioTrack(associatedStreamLabel(), index);
+#endif
+
postChangeEvent();
}
Modified: trunk/Source/WebCore/dom/MultipleTrackList.h (88340 => 88341)
--- trunk/Source/WebCore/dom/MultipleTrackList.h 2011-06-08 13:06:24 UTC (rev 88340)
+++ trunk/Source/WebCore/dom/MultipleTrackList.h 2011-06-08 13:08:11 UTC (rev 88341)
@@ -45,6 +45,10 @@
virtual void clear();
+#if ENABLE(MEDIA_STREAM)
+ virtual void trackFailed(unsigned long index);
+#endif
+
// EventTarget implementation.
virtual MultipleTrackList* toMultipleTrackList();
Modified: trunk/Source/WebCore/dom/Stream.h (88340 => 88341)
--- trunk/Source/WebCore/dom/Stream.h 2011-06-08 13:06:24 UTC (rev 88340)
+++ trunk/Source/WebCore/dom/Stream.h 2011-06-08 13:08:11 UTC (rev 88341)
@@ -52,7 +52,6 @@
// FIXME: implement the record method when StreamRecorder is available.
- DEFINE_ATTRIBUTE_EVENT_LISTENER(readystatechange);
DEFINE_ATTRIBUTE_EVENT_LISTENER(ended);
unsigned short readyState() const { return m_readyState; }
Modified: trunk/Source/WebCore/dom/TrackList.cpp (88340 => 88341)
--- trunk/Source/WebCore/dom/TrackList.cpp 2011-06-08 13:06:24 UTC (rev 88340)
+++ trunk/Source/WebCore/dom/TrackList.cpp 2011-06-08 13:08:11 UTC (rev 88341)
@@ -103,7 +103,15 @@
void TrackList::clear()
{
+#if ENABLE(MEDIA_STREAM)
+ m_associatedStreamLabel = String();
+#endif
+
+ if (m_tracks.isEmpty())
+ return;
+
m_tracks.clear();
+
postChangeEvent();
}
@@ -123,6 +131,26 @@
dispatchEvent(Event::create(eventNames().changeEvent, false, false));
}
+#if ENABLE(MEDIA_STREAM)
+void TrackList::associateStream(const String& label)
+{
+ ASSERT(m_associatedStreamLabel.isNull());
+ m_associatedStreamLabel = label;
+}
+
+const String& TrackList::associatedStreamLabel() const
+{
+ return m_associatedStreamLabel;
+}
+
+void TrackList::trackFailed(unsigned long index)
+{
+ ASSERT(index < length());
+ m_tracks.remove(index);
+ postChangeEvent();
+}
+#endif
+
TrackList* TrackList::toTrackList()
{
return this;
@@ -130,9 +158,13 @@
ScriptExecutionContext* TrackList::scriptExecutionContext() const
{
- // FIXME: provide an script execution context for HTML Media Element and MediaStream API use cases.
- // For the MediaStream API: https://bugs.webkit.org/show_bug.cgi?id=60205
- // For the HTML Media Element: https://bugs.webkit.org/show_bug.cgi?id=61127
+#if ENABLE(MEDIA_STREAM)
+ if (mediaStreamFrameController())
+ return mediaStreamFrameController()->scriptExecutionContext();
+#endif
+
+ // FIXME: provide an script execution context for HTML Media Element use case.
+ // https://bugs.webkit.org/show_bug.cgi?id=61127
return 0;
}
Modified: trunk/Source/WebCore/dom/TrackList.h (88340 => 88341)
--- trunk/Source/WebCore/dom/TrackList.h 2011-06-08 13:06:24 UTC (rev 88340)
+++ trunk/Source/WebCore/dom/TrackList.h 2011-06-08 13:08:11 UTC (rev 88341)
@@ -58,6 +58,9 @@
typedef Vector<RefPtr<Track> > TrackVector;
class TrackList : public RefCounted<TrackList>,
+#if ENABLE(MEDIA_STREAM)
+ public MediaStreamFrameController::GenericClient,
+#endif
public EventTarget {
public:
static PassRefPtr<TrackList> create(const TrackVector&);
@@ -73,6 +76,12 @@
virtual void clear();
+#if ENABLE(MEDIA_STREAM)
+ void associateStream(const String& streamLabel);
+ const String& associatedStreamLabel() const;
+ virtual void trackFailed(unsigned long index);
+#endif
+
// EventTarget implementation.
virtual TrackList* toTrackList();
virtual ScriptExecutionContext* scriptExecutionContext() const;
@@ -124,6 +133,10 @@
EventTargetData m_eventTargetData;
TrackVector m_tracks;
+
+#if ENABLE(MEDIA_STREAM)
+ String m_associatedStreamLabel;
+#endif
};
} // namespace WebCore
Modified: trunk/Source/WebCore/page/MediaStreamClient.h (88340 => 88341)
--- trunk/Source/WebCore/page/MediaStreamClient.h 2011-06-08 13:06:24 UTC (rev 88340)
+++ trunk/Source/WebCore/page/MediaStreamClient.h 2011-06-08 13:08:11 UTC (rev 88341)
@@ -52,6 +52,13 @@
// Stop a generated stream.
virtual void stopGeneratedStream(const String& streamLabel) = 0;
+ // Enable/disable an audio track in a generated stream.
+ virtual void enableAudioTrack(const String& streamLabel, unsigned long index) = 0;
+ virtual void disableAudioTrack(const String& streamLabel, unsigned long index) = 0;
+
+ // Select a video track in a generated stream.
+ virtual void selectVideoTrack(const String& streamLabel, long index) = 0;
+
protected:
virtual ~MediaStreamClient() { }
};
Modified: trunk/Source/WebCore/page/MediaStreamController.cpp (88340 => 88341)
--- trunk/Source/WebCore/page/MediaStreamController.cpp 2011-06-08 13:06:24 UTC (rev 88340)
+++ trunk/Source/WebCore/page/MediaStreamController.cpp 2011-06-08 13:08:11 UTC (rev 88341)
@@ -27,7 +27,9 @@
#if ENABLE(MEDIA_STREAM)
+#include "ExclusiveTrackList.h"
#include "MediaStreamFrameController.h"
+#include "MultipleTrackList.h"
#include "SecurityOrigin.h"
#include <wtf/Vector.h>
@@ -117,15 +119,30 @@
m_client->stopGeneratedStream(streamLabel);
}
-void MediaStreamController::streamGenerated(int controllerRequestId, const String& streamLabel)
+void MediaStreamController::enableAudioTrack(const String& streamLabel, unsigned long index)
{
+ m_client->enableAudioTrack(streamLabel, index);
+}
+
+void MediaStreamController::disableAudioTrack(const String& streamLabel, unsigned long index)
+{
+ m_client->disableAudioTrack(streamLabel, index);
+}
+
+void MediaStreamController::selectVideoTrack(const String& streamLabel, long index)
+{
+ m_client->selectVideoTrack(streamLabel, index);
+}
+
+void MediaStreamController::streamGenerated(int controllerRequestId, const String& streamLabel, PassRefPtr<MultipleTrackList> audioTracks, PassRefPtr<ExclusiveTrackList> videoTracks)
+{
// Don't assert since the frame controller can have been destroyed while the request reply was coming back.
if (m_requests.contains(controllerRequestId)) {
const Request& request = m_requests.get(controllerRequestId);
registerStream(streamLabel, request.frameController());
m_requests.remove(controllerRequestId);
ASSERT(request.frameController());
- request.frameController()->streamGenerated(request.localId(), streamLabel);
+ request.frameController()->streamGenerated(request.localId(), streamLabel, audioTracks, videoTracks);
}
}
@@ -146,6 +163,20 @@
m_streams.get(streamLabel)->streamFailed(streamLabel);
}
+void MediaStreamController::audioTrackFailed(const String& streamLabel, unsigned long index)
+{
+ // Don't assert since the frame controller can have been destroyed by the time this is called.
+ if (m_streams.contains(streamLabel))
+ m_streams.get(streamLabel)->audioTrackFailed(streamLabel, index);
+}
+
+void MediaStreamController::videoTrackFailed(const String& streamLabel, unsigned long index)
+{
+ // Don't assert since the frame controller can have been destroyed by the time this is called.
+ if (m_streams.contains(streamLabel))
+ m_streams.get(streamLabel)->videoTrackFailed(streamLabel, index);
+}
+
} // namespace WebCore
#endif // ENABLE(MEDIA_STREAM)
Modified: trunk/Source/WebCore/page/MediaStreamController.h (88340 => 88341)
--- trunk/Source/WebCore/page/MediaStreamController.h 2011-06-08 13:06:24 UTC (rev 88340)
+++ trunk/Source/WebCore/page/MediaStreamController.h 2011-06-08 13:08:11 UTC (rev 88341)
@@ -36,8 +36,10 @@
namespace WebCore {
+class ExclusiveTrackList;
class MediaStreamClient;
class MediaStreamFrameController;
+class MultipleTrackList;
class SecurityOrigin;
class MediaStreamController {
@@ -51,10 +53,15 @@
void generateStream(MediaStreamFrameController*, int requestId, GenerateStreamOptionFlags, PassRefPtr<SecurityOrigin>);
void stopGeneratedStream(const String& streamLabel);
+ void enableAudioTrack(const String& streamLabel, unsigned long index);
+ void disableAudioTrack(const String& streamLabel, unsigned long index);
+ void selectVideoTrack(const String& streamLabel, long index);
- void streamGenerated(int requestId, const String& streamLabel);
+ void streamGenerated(int requestId, const String& streamLabel, PassRefPtr<MultipleTrackList> audioTracks, PassRefPtr<ExclusiveTrackList> videoTracks);
void streamGenerationFailed(int requestId, NavigatorUserMediaError::ErrorCode);
void streamFailed(const String& streamLabel);
+ void audioTrackFailed(const String& streamLabel, unsigned long index);
+ void videoTrackFailed(const String& streamLabel, unsigned long index);
private:
int registerRequest(int localRequestId, MediaStreamFrameController*);
Modified: trunk/Source/WebCore/page/MediaStreamFrameController.cpp (88340 => 88341)
--- trunk/Source/WebCore/page/MediaStreamFrameController.cpp 2011-06-08 13:06:24 UTC (rev 88340)
+++ trunk/Source/WebCore/page/MediaStreamFrameController.cpp 2011-06-08 13:08:11 UTC (rev 88341)
@@ -29,9 +29,11 @@
#include "DOMWindow.h"
#include "Document.h"
+#include "ExclusiveTrackList.h"
#include "Frame.h"
#include "GeneratedStream.h"
#include "MediaStreamController.h"
+#include "MultipleTrackList.h"
#include "NavigatorUserMediaErrorCallback.h"
#include "NavigatorUserMediaSuccessCallback.h"
#include "Page.h"
@@ -172,6 +174,12 @@
m_streams.remove(client->clientId());
}
+void MediaStreamFrameController::unregister(GenericClient* client)
+{
+ ASSERT(m_clients.contains(client->clientId()));
+ m_clients.remove(client->clientId());
+}
+
Stream* MediaStreamFrameController::getStreamFromLabel(const String& label) const
{
ASSERT(m_streams.contains(label));
@@ -188,6 +196,7 @@
m_requests.abortAll();
m_streams.detachEmbedder();
+ m_clients.detachEmbedder();
m_isInDetachedState = true;
}
@@ -216,6 +225,7 @@
ASSERT(m_requests.isEmpty());
m_streams.unregisterAll();
+ m_clients.unregisterAll();
m_frame = 0;
}
@@ -297,17 +307,60 @@
pageController()->stopGeneratedStream(streamLabel);
}
-void MediaStreamFrameController::streamGenerated(int requestId, const String& label)
+void MediaStreamFrameController::enableAudioTrack(const String& streamLabel, unsigned long index)
{
+ // Don't assert since the audio tracks don't necessarily keep alive their associated generated stream object.
+ if (!m_streams.contains(streamLabel))
+ return;
+
+ if (isClientAvailable())
+ pageController()->enableAudioTrack(streamLabel, index);
+}
+
+void MediaStreamFrameController::disableAudioTrack(const String& streamLabel, unsigned long index)
+{
+ // Don't assert since the audio tracks don't necessarily keep alive their associated generated stream object.
+ if (!m_streams.contains(streamLabel))
+ return;
+
+ if (isClientAvailable())
+ pageController()->disableAudioTrack(streamLabel, index);
+}
+
+void MediaStreamFrameController::selectVideoTrack(const String& streamLabel, long index)
+{
+ // Don't assert since the audio tracks don't necessarily keep alive their associated generated stream object.
+ if (!m_streams.contains(streamLabel))
+ return;
+
+ if (isClientAvailable())
+ pageController()->selectVideoTrack(streamLabel, index);
+}
+
+void MediaStreamFrameController::streamGenerated(int requestId, const String& label, PassRefPtr<MultipleTrackList> audioTracksParam, PassRefPtr<ExclusiveTrackList> videoTracksParam)
+{
// Don't assert since the request can have been aborted as a result of embedder detachment.
if (!m_requests.contains(requestId))
return;
ASSERT(m_requests.get(requestId)->isGenerateStreamRequest());
ASSERT(!label.isNull());
+ ASSERT(audioTracksParam);
+ ASSERT(videoTracksParam);
+ RefPtr<MultipleTrackList> audioTracks = audioTracksParam;
+ RefPtr<ExclusiveTrackList> videoTracks = videoTracksParam;
+
+ int audioTracksClientId = m_clients.getNextId();
+ audioTracks->associateFrameController(this, audioTracksClientId);
+ m_clients.add(audioTracksClientId, audioTracks.get());
+
+ int videoTracksClientId = m_clients.getNextId();
+ videoTracks->associateFrameController(this, videoTracksClientId);
+ m_clients.add(videoTracksClientId, videoTracks.get());
+
RefPtr<GenerateStreamRequest> streamRequest = static_cast<GenerateStreamRequest*>(m_requests.get(requestId).get());
- RefPtr<GeneratedStream> generatedStream = GeneratedStream::create(this, label);
+ RefPtr<GeneratedStream> generatedStream = GeneratedStream::create(this, label, audioTracks.release(), videoTracks.release());
m_streams.add(label, generatedStream.get());
m_requests.remove(requestId);
streamRequest->successCallback()->handleEvent(generatedStream.get());
@@ -335,7 +388,20 @@
getStreamFromLabel(label)->streamEnded();
}
+void MediaStreamFrameController::audioTrackFailed(const String& label, unsigned long index)
+{
+ Stream* stream = getStreamFromLabel(label);
+ ASSERT(stream->isGeneratedStream());
+ static_cast<GeneratedStream*>(stream)->audioTracks()->trackFailed(index);
+}
+void MediaStreamFrameController::videoTrackFailed(const String& label, unsigned long index)
+{
+ Stream* stream = getStreamFromLabel(label);
+ ASSERT(stream->isGeneratedStream());
+ static_cast<GeneratedStream*>(stream)->videoTracks()->trackFailed(index);
+}
+
} // namespace WebCore
#endif // ENABLE(MEDIA_STREAM)
Modified: trunk/Source/WebCore/page/MediaStreamFrameController.h (88340 => 88341)
--- trunk/Source/WebCore/page/MediaStreamFrameController.h 2011-06-08 13:06:24 UTC (rev 88340)
+++ trunk/Source/WebCore/page/MediaStreamFrameController.h 2011-06-08 13:08:11 UTC (rev 88341)
@@ -37,9 +37,11 @@
namespace WebCore {
+class ExclusiveTrackList;
class Frame;
class GeneratedStream;
class MediaStreamController;
+class MultipleTrackList;
class NavigatorUserMediaErrorCallback;
class NavigatorUserMediaSuccessCallback;
class Page;
@@ -67,6 +69,7 @@
virtual bool isStream() const { return false; }
virtual bool isGeneratedStream() const { return false; }
+ virtual bool isGenericClient() const { return false; }
// Called when the frame controller is being disconnected to the MediaStreamClient embedder.
// Clients should override this to send any required shutdown messages.
@@ -122,6 +125,19 @@
bool m_isGeneratedStream;
};
+ // Generic clients are objects that require access to the frame controller but don't have a global id (like streams do)
+ // or need to receive any messages from the embedder client.
+ class GenericClient : public ClientBase<int> {
+ public:
+ GenericClient() { }
+ GenericClient(MediaStreamFrameController* frameController, int id) : ClientBase<int>(frameController, id) { }
+ virtual ~GenericClient() { unregister(); }
+ virtual bool isGenericClient() { return true; }
+
+ private:
+ virtual void unregister() { unregisterClient(this); }
+ };
+
MediaStreamFrameController(Frame*);
virtual ~MediaStreamFrameController();
@@ -142,10 +158,17 @@
// Stop a generated stream.
void stopGeneratedStream(const String& streamLabel);
+ // Enable/disable an audio track in a generated stream.
+ void enableAudioTrack(const String& streamLabel, unsigned long index);
+ void disableAudioTrack(const String& streamLabel, unsigned long index);
+
+ // Select a video track in a generated stream.
+ void selectVideoTrack(const String& streamLabel, long index);
+
// --- Calls coming back from the controller. --- //
// Report the generation of a new local stream.
- void streamGenerated(int requestId, const String& streamLabel);
+ void streamGenerated(int requestId, const String& streamLabel, PassRefPtr<MultipleTrackList> audioTracks, PassRefPtr<ExclusiveTrackList> videoTracks);
// Report a failure in the generation of a new stream.
void streamGenerationFailed(int requestId, NavigatorUserMediaError::ErrorCode);
@@ -153,6 +176,10 @@
// Report the end of a stream for external reasons.
void streamFailed(const String& streamLabel);
+ // Report the unexpected unavailability of a live media track.
+ void audioTrackFailed(const String& streamLabel, unsigned long index);
+ void videoTrackFailed(const String& streamLabel, unsigned long index);
+
private:
class Request;
class GenerateStreamRequest;
@@ -187,14 +214,19 @@
// Streams are a special class of clients since they are identified by a global label string instead of an id.
typedef ClientMapBase<String> StreamMap;
+ // All other types of clients use autogenerated integer ids.
+ class ClientMap : public IdGenerator, public ClientMapBase<int> { };
+
// Detached from a page, and hence from a embedder client.
void enterDetachedState();
void unregister(StreamClient*);
+ void unregister(GenericClient*);
MediaStreamController* pageController() const;
Stream* getStreamFromLabel(const String&) const;
RequestMap m_requests;
+ ClientMap m_clients;
StreamMap m_streams;
Frame* m_frame;