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/. */
7 #ifndef AudioBufferSourceNode_h_
8 #define AudioBufferSourceNode_h_
10 #include "AudioNode.h"
11 #include "AudioBuffer.h"
12 #include "AudioParam.h"
13 #include "mozilla/dom/BindingUtils.h"
18 class AudioBufferSourceNode
: public AudioNode
,
19 public MainThreadMediaStreamListener
22 explicit AudioBufferSourceNode(AudioContext
* aContext
);
23 virtual ~AudioBufferSourceNode();
25 virtual void DestroyMediaStream() MOZ_OVERRIDE
28 mStream
->RemoveMainThreadListener(this);
30 AudioNode::DestroyMediaStream();
32 virtual uint32_t NumberOfInputs() const MOZ_FINAL MOZ_OVERRIDE
36 virtual AudioBufferSourceNode
* AsAudioBufferSourceNode() MOZ_OVERRIDE
40 NS_DECL_ISUPPORTS_INHERITED
41 NS_DECL_CYCLE_COLLECTION_CLASS_INHERITED(AudioBufferSourceNode
, AudioNode
)
43 virtual JSObject
* WrapObject(JSContext
* aCx
,
44 JS::Handle
<JSObject
*> aScope
) MOZ_OVERRIDE
;
46 void Start(double aWhen
, double aOffset
,
47 const Optional
<double>& aDuration
, ErrorResult
& aRv
);
48 void NoteOn(double aWhen
, ErrorResult
& aRv
)
50 Start(aWhen
, 0.0, Optional
<double>(), aRv
);
52 void NoteGrainOn(double aWhen
, double aOffset
,
53 double aDuration
, ErrorResult
& aRv
)
55 Optional
<double> duration
;
56 duration
.Construct(aDuration
);
57 Start(aWhen
, aOffset
, duration
, aRv
);
59 void Stop(double aWhen
, ErrorResult
& aRv
);
60 void NoteOff(double aWhen
, ErrorResult
& aRv
)
65 AudioBuffer
* GetBuffer(JSContext
* aCx
) const
69 void SetBuffer(JSContext
* aCx
, AudioBuffer
* aBuffer
)
72 SendBufferParameterToStream(aCx
);
73 SendLoopParametersToStream();
75 AudioParam
* PlaybackRate() const
83 void SetLoop(bool aLoop
)
86 SendLoopParametersToStream();
88 double LoopStart() const
92 void SetLoopStart(double aStart
)
95 SendLoopParametersToStream();
97 double LoopEnd() const
101 void SetLoopEnd(double aEnd
)
104 SendLoopParametersToStream();
106 void SendDopplerShiftToStream(double aDopplerShift
);
108 virtual void NotifyMainThreadStateChanged() MOZ_OVERRIDE
;
111 friend class AudioBufferSourceNodeEngine
;
112 // START, OFFSET and DURATION are always set by start() (along with setting
113 // mBuffer to something non-null).
114 // STOP is set by stop().
115 enum EngineParameters
{
128 void SendLoopParametersToStream();
129 void SendBufferParameterToStream(JSContext
* aCx
);
130 void SendOffsetAndDurationParametersToStream(AudioNodeStream
* aStream
,
133 static void SendPlaybackRateToStream(AudioNode
* aNode
);
140 nsRefPtr
<AudioBuffer
> mBuffer
;
141 nsRefPtr
<AudioParam
> mPlaybackRate
;
142 SelfReference
<AudioBufferSourceNode
> mPlayingRef
; // a reference to self while playing
145 bool mOffsetAndDurationRemembered
;