OLD | NEW |
1 /* | 1 /* |
2 * Copyright (C) 2010, Google Inc. All rights reserved. | 2 * Copyright (C) 2010, Google Inc. All rights reserved. |
3 * | 3 * |
4 * Redistribution and use in source and binary forms, with or without | 4 * Redistribution and use in source and binary forms, with or without |
5 * modification, are permitted provided that the following conditions | 5 * modification, are permitted provided that the following conditions |
6 * are met: | 6 * are met: |
7 * 1. Redistributions of source code must retain the above copyright | 7 * 1. Redistributions of source code must retain the above copyright |
8 * notice, this list of conditions and the following disclaimer. | 8 * notice, this list of conditions and the following disclaimer. |
9 * 2. Redistributions in binary form must reproduce the above copyright | 9 * 2. Redistributions in binary form must reproduce the above copyright |
10 * notice, this list of conditions and the following disclaimer in the | 10 * notice, this list of conditions and the following disclaimer in the |
(...skipping 23 matching lines...) Expand all Loading... |
34 #include "wtf/PassRefPtr.h" | 34 #include "wtf/PassRefPtr.h" |
35 #include "wtf/RefPtr.h" | 35 #include "wtf/RefPtr.h" |
36 #include "wtf/Threading.h" | 36 #include "wtf/Threading.h" |
37 #include <memory> | 37 #include <memory> |
38 | 38 |
39 namespace blink { | 39 namespace blink { |
40 | 40 |
41 class AudioBufferSourceOptions; | 41 class AudioBufferSourceOptions; |
42 class BaseAudioContext; | 42 class BaseAudioContext; |
43 | 43 |
44 // AudioBufferSourceNode is an AudioNode representing an audio source from an in
-memory audio asset represented by an AudioBuffer. | 44 // AudioBufferSourceNode is an AudioNode representing an audio source from an |
45 // It generally will be used for short sounds which require a high degree of sch
eduling flexibility (can playback in rhythmically perfect ways). | 45 // in-memory audio asset represented by an AudioBuffer. It generally will be |
| 46 // used for short sounds which require a high degree of scheduling flexibility |
| 47 // (can playback in rhythmically perfect ways). |
46 | 48 |
47 class AudioBufferSourceHandler final : public AudioScheduledSourceHandler { | 49 class AudioBufferSourceHandler final : public AudioScheduledSourceHandler { |
48 public: | 50 public: |
49 static PassRefPtr<AudioBufferSourceHandler> create( | 51 static PassRefPtr<AudioBufferSourceHandler> create( |
50 AudioNode&, | 52 AudioNode&, |
51 float sampleRate, | 53 float sampleRate, |
52 AudioParamHandler& playbackRate, | 54 AudioParamHandler& playbackRate, |
53 AudioParamHandler& detune); | 55 AudioParamHandler& detune); |
54 ~AudioBufferSourceHandler() override; | 56 ~AudioBufferSourceHandler() override; |
55 | 57 |
56 // AudioHandler | 58 // AudioHandler |
57 void process(size_t framesToProcess) override; | 59 void process(size_t framesToProcess) override; |
58 | 60 |
59 // setBuffer() is called on the main thread. This is the buffer we use for pla
yback. | 61 // setBuffer() is called on the main thread. This is the buffer we use for |
| 62 // playback. |
60 void setBuffer(AudioBuffer*, ExceptionState&); | 63 void setBuffer(AudioBuffer*, ExceptionState&); |
61 AudioBuffer* buffer() { return m_buffer.get(); } | 64 AudioBuffer* buffer() { return m_buffer.get(); } |
62 | 65 |
63 // numberOfChannels() returns the number of output channels. This value equal
s the number of channels from the buffer. | 66 // numberOfChannels() returns the number of output channels. This value |
64 // If a new buffer is set with a different number of channels, then this value
will dynamically change. | 67 // equals the number of channels from the buffer. If a new buffer is set with |
| 68 // a different number of channels, then this value will dynamically change. |
65 unsigned numberOfChannels(); | 69 unsigned numberOfChannels(); |
66 | 70 |
67 // Play-state | 71 // Play-state |
68 void start(double when, ExceptionState&); | 72 void start(double when, ExceptionState&); |
69 void start(double when, double grainOffset, ExceptionState&); | 73 void start(double when, double grainOffset, ExceptionState&); |
70 void start(double when, | 74 void start(double when, |
71 double grainOffset, | 75 double grainOffset, |
72 double grainDuration, | 76 double grainDuration, |
73 ExceptionState&); | 77 ExceptionState&); |
74 | 78 |
75 // Note: the attribute was originally exposed as .looping, but to be more cons
istent in naming with <audio> | 79 // Note: the attribute was originally exposed as |.looping|, but to be more |
76 // and with how it's described in the specification, the proper attribute name
is .loop | 80 // consistent in naming with <audio> and with how it's described in the |
77 // The old attribute is kept for backwards compatibility. | 81 // specification, the proper attribute name is |.loop|. The old attribute is |
| 82 // kept for backwards compatibility. |
78 bool loop() const { return m_isLooping; } | 83 bool loop() const { return m_isLooping; } |
79 void setLoop(bool looping) { | 84 void setLoop(bool looping) { |
80 m_isLooping = looping; | 85 m_isLooping = looping; |
81 m_didSetLooping = m_didSetLooping || looping; | 86 m_didSetLooping = m_didSetLooping || looping; |
82 } | 87 } |
83 | 88 |
84 // Loop times in seconds. | 89 // Loop times in seconds. |
85 double loopStart() const { return m_loopStart; } | 90 double loopStart() const { return m_loopStart; } |
86 double loopEnd() const { return m_loopEnd; } | 91 double loopEnd() const { return m_loopEnd; } |
87 void setLoopStart(double loopStart) { m_loopStart = loopStart; } | 92 void setLoopStart(double loopStart) { m_loopStart = loopStart; } |
(...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
121 // AudioBufferSourceNode. | 126 // AudioBufferSourceNode. |
122 Persistent<AudioBuffer> m_buffer; | 127 Persistent<AudioBuffer> m_buffer; |
123 | 128 |
124 // Pointers for the buffer and destination. | 129 // Pointers for the buffer and destination. |
125 std::unique_ptr<const float* []> m_sourceChannels; | 130 std::unique_ptr<const float* []> m_sourceChannels; |
126 std::unique_ptr<float* []> m_destinationChannels; | 131 std::unique_ptr<float* []> m_destinationChannels; |
127 | 132 |
128 RefPtr<AudioParamHandler> m_playbackRate; | 133 RefPtr<AudioParamHandler> m_playbackRate; |
129 RefPtr<AudioParamHandler> m_detune; | 134 RefPtr<AudioParamHandler> m_detune; |
130 | 135 |
131 // If m_isLooping is false, then this node will be done playing and become ina
ctive after it reaches the end of the sample data in the buffer. | 136 // If m_isLooping is false, then this node will be done playing and become |
132 // If true, it will wrap around to the start of the buffer each time it reache
s the end. | 137 // inactive after it reaches the end of the sample data in the buffer. If |
| 138 // true, it will wrap around to the start of the buffer each time it reaches |
| 139 // the end. |
133 bool m_isLooping; | 140 bool m_isLooping; |
134 | 141 |
135 // True if the source .loop attribute was ever set. | 142 // True if the source .loop attribute was ever set. |
136 bool m_didSetLooping; | 143 bool m_didSetLooping; |
137 | 144 |
138 double m_loopStart; | 145 double m_loopStart; |
139 double m_loopEnd; | 146 double m_loopEnd; |
140 | 147 |
141 // m_virtualReadIndex is a sample-frame index into our buffer representing the
current playback position. | 148 // m_virtualReadIndex is a sample-frame index into our buffer representing the |
142 // Since it's floating-point, it has sub-sample accuracy. | 149 // current playback position. Since it's floating-point, it has sub-sample |
| 150 // accuracy. |
143 double m_virtualReadIndex; | 151 double m_virtualReadIndex; |
144 | 152 |
145 // Granular playback | 153 // Granular playback |
146 bool m_isGrain; | 154 bool m_isGrain; |
147 double m_grainOffset; // in seconds | 155 double m_grainOffset; // in seconds |
148 double m_grainDuration; // in seconds | 156 double m_grainDuration; // in seconds |
149 // True if grainDuration is given explicitly (via 3 arg start method). | 157 // True if grainDuration is given explicitly (via 3 arg start method). |
150 bool m_isDurationGiven; | 158 bool m_isDurationGiven; |
151 | 159 |
152 // Compute playback rate (k-rate) by incorporating the sample rate | 160 // Compute playback rate (k-rate) by incorporating the sample rate |
(...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
190 private: | 198 private: |
191 AudioBufferSourceNode(BaseAudioContext&); | 199 AudioBufferSourceNode(BaseAudioContext&); |
192 | 200 |
193 Member<AudioParam> m_playbackRate; | 201 Member<AudioParam> m_playbackRate; |
194 Member<AudioParam> m_detune; | 202 Member<AudioParam> m_detune; |
195 }; | 203 }; |
196 | 204 |
197 } // namespace blink | 205 } // namespace blink |
198 | 206 |
199 #endif // AudioBufferSourceNode_h | 207 #endif // AudioBufferSourceNode_h |
OLD | NEW |