1// Copyright (c) 2012 The Chromium Authors. All rights reserved.
2// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
5// MediaStreamProvider is used to capture media of the types defined in
6// MediaStreamType. There is only one MediaStreamProvider instance per media
7// type and a MediaStreamProvider instance can have only one registered
8// listener.
9// The MediaStreamManager is expected to be called on Browser::IO thread and
10// the listener will be called on the same thread.
11
12#ifndef CONTENT_BROWSER_RENDERER_HOST_MEDIA_MEDIA_STREAM_PROVIDER_H_
13#define CONTENT_BROWSER_RENDERER_HOST_MEDIA_MEDIA_STREAM_PROVIDER_H_
14
15#include <list>
16#include <string>
17
18#include "base/memory/ref_counted.h"
19#include "content/common/content_export.h"
20#include "content/common/media/media_stream_options.h"
21
22namespace base {
23class SingleThreadTaskRunner;
24}
25
26namespace content {
27
28enum MediaStreamProviderError {
29  kMediaStreamOk = 0,
30  kInvalidMediaStreamType,
31  kInvalidSession,
32  kUnknownSession,
33  kDeviceNotAvailable,
34  kDeviceAlreadyInUse,
35  kUnknownError
36};
37
38enum { kInvalidMediaCaptureSessionId = 0xFFFFFFFF };
39
40// Callback class used by MediaStreamProvider.
41class CONTENT_EXPORT MediaStreamProviderListener {
42 public:
43  // Called by a MediaStreamProvider when a stream has been opened.
44  virtual void Opened(MediaStreamType stream_type, int capture_session_id) = 0;
45
46  // Called by a MediaStreamProvider when a stream has been closed.
47  virtual void Closed(MediaStreamType stream_type, int capture_session_id) = 0;
48
49  // Called by a MediaStreamProvider when available devices has been enumerated.
50  virtual void DevicesEnumerated(MediaStreamType stream_type,
51                                 const StreamDeviceInfoArray& devices) = 0;
52
53  // Called by a MediaStreamProvider when the device has been aborted due to
54  // device error.
55  virtual void Aborted(MediaStreamType stream_type, int capture_session_id) = 0;
56
57 protected:
58  virtual ~MediaStreamProviderListener() {}
59};
60
61// Implemented by a manager class providing captured media.
62class CONTENT_EXPORT MediaStreamProvider
63    : public base::RefCountedThreadSafe<MediaStreamProvider> {
64 public:
65  // Registers a listener and a device message loop.
66  virtual void Register(MediaStreamProviderListener* listener,
67                        const scoped_refptr<base::SingleThreadTaskRunner>&
68                            device_task_runner) = 0;
69
70  // Unregisters the previously registered listener.
71  virtual void Unregister() = 0;
72
73  // Enumerates existing capture devices and calls |DevicesEnumerated|.
74  virtual void EnumerateDevices(MediaStreamType stream_type) = 0;
75
76  // Opens the specified device. The device is not started and it is still
77  // possible for other applications to open the device before the device is
78  // started. |Opened| is called when the device is opened.
79  // kInvalidMediaCaptureSessionId is returned on error.
80  virtual int Open(const StreamDeviceInfo& device) = 0;
81
82  // Closes the specified device and calls |Closed| when done.
83  virtual void Close(int capture_session_id) = 0;
84
85 protected:
86  friend class base::RefCountedThreadSafe<MediaStreamProvider>;
87  virtual ~MediaStreamProvider() {}
88};
89
90}  // namespace content
91
92#endif  // CONTENT_BROWSER_RENDERER_HOST_MEDIA_MEDIA_STREAM_PROVIDER_H_
93