Line data Source code
1 : /* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
2 : /* vim:set ts=2 sw=2 sts=2 et cindent: */
3 : /* This Source Code Form is subject to the terms of the Mozilla Public
4 : * License, v. 2.0. If a copy of the MPL was not distributed with this
5 : * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
6 :
7 : #ifndef MediaStreamAudioSourceNode_h_
8 : #define MediaStreamAudioSourceNode_h_
9 :
10 : #include "AudioNode.h"
11 : #include "DOMMediaStream.h"
12 : #include "AudioNodeEngine.h"
13 :
14 : namespace mozilla {
15 :
16 : namespace dom {
17 :
18 : class AudioContext;
19 : struct MediaStreamAudioSourceOptions;
20 :
21 0 : class MediaStreamAudioSourceNodeEngine final : public AudioNodeEngine
22 : {
23 : public:
24 0 : explicit MediaStreamAudioSourceNodeEngine(AudioNode* aNode)
25 0 : : AudioNodeEngine(aNode), mEnabled(false) {}
26 :
27 0 : bool IsEnabled() const { return mEnabled; }
28 : enum Parameters {
29 : ENABLE
30 : };
31 0 : void SetInt32Parameter(uint32_t aIndex, int32_t aValue) override
32 : {
33 0 : switch (aIndex) {
34 : case ENABLE:
35 0 : mEnabled = !!aValue;
36 0 : break;
37 : default:
38 0 : NS_ERROR("MediaStreamAudioSourceNodeEngine bad parameter index");
39 : }
40 0 : }
41 :
42 : private:
43 : bool mEnabled;
44 : };
45 :
46 : class MediaStreamAudioSourceNode : public AudioNode,
47 : public DOMMediaStream::TrackListener,
48 : public PrincipalChangeObserver<MediaStreamTrack>
49 : {
50 : public:
51 : static already_AddRefed<MediaStreamAudioSourceNode>
52 : Create(AudioContext& aContext, const MediaStreamAudioSourceOptions& aOptions,
53 : ErrorResult& aRv);
54 :
55 : NS_DECL_ISUPPORTS_INHERITED
56 0 : NS_DECL_CYCLE_COLLECTION_CLASS_INHERITED(MediaStreamAudioSourceNode, AudioNode)
57 :
58 : static already_AddRefed<MediaStreamAudioSourceNode>
59 0 : Constructor(const GlobalObject& aGlobal, AudioContext& aAudioContext,
60 : const MediaStreamAudioSourceOptions& aOptions, ErrorResult& aRv)
61 : {
62 0 : return Create(aAudioContext, aOptions, aRv);
63 : }
64 :
65 : JSObject* WrapObject(JSContext* aCx, JS::Handle<JSObject*> aGivenProto) override;
66 :
67 : void DestroyMediaStream() override;
68 :
69 0 : uint16_t NumberOfInputs() const override { return 0; }
70 :
71 0 : const char* NodeType() const override
72 : {
73 0 : return "MediaStreamAudioSourceNode";
74 : }
75 :
76 0 : virtual const char* CrossOriginErrorString() const
77 : {
78 0 : return "MediaStreamAudioSourceNodeCrossOrigin";
79 : }
80 :
81 : size_t SizeOfExcludingThis(MallocSizeOf aMallocSizeOf) const override;
82 : size_t SizeOfIncludingThis(MallocSizeOf aMallocSizeOf) const override;
83 :
84 : // Attaches to aTrack so that its audio content will be used as input.
85 : void AttachToTrack(const RefPtr<MediaStreamTrack>& aTrack);
86 :
87 : // Detaches from the currently attached track if there is one.
88 : void DetachFromTrack();
89 :
90 : // Attaches to the first available audio track in aMediaStream.
91 : void AttachToFirstTrack(const RefPtr<DOMMediaStream>& aMediaStream);
92 :
93 : // From DOMMediaStream::TrackListener.
94 : void NotifyTrackAdded(const RefPtr<MediaStreamTrack>& aTrack) override;
95 : void NotifyTrackRemoved(const RefPtr<MediaStreamTrack>& aTrack) override;
96 :
97 : // From PrincipalChangeObserver<MediaStreamTrack>.
98 : void PrincipalChanged(MediaStreamTrack* aMediaStreamTrack) override;
99 :
100 : protected:
101 : explicit MediaStreamAudioSourceNode(AudioContext* aContext);
102 : void Init(DOMMediaStream* aMediaStream, ErrorResult& aRv);
103 : void Destroy();
104 : virtual ~MediaStreamAudioSourceNode();
105 :
106 : private:
107 : RefPtr<MediaInputPort> mInputPort;
108 : RefPtr<DOMMediaStream> mInputStream;
109 :
110 : // On construction we set this to the first audio track of mInputStream.
111 : RefPtr<MediaStreamTrack> mInputTrack;
112 : };
113 :
114 : } // namespace dom
115 : } // namespace mozilla
116 :
117 : #endif
|