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 91 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
102 , m_isStopScheduled(false) | 102 , m_isStopScheduled(false) |
103 , m_isCleared(false) | 103 , m_isCleared(false) |
104 , m_isInitialized(false) | 104 , m_isInitialized(false) |
105 , m_destinationNode(nullptr) | 105 , m_destinationNode(nullptr) |
106 , m_isResolvingResumePromises(false) | 106 , m_isResolvingResumePromises(false) |
107 , m_automaticPullNodesNeedUpdating(false) | 107 , m_automaticPullNodesNeedUpdating(false) |
108 , m_connectionCount(0) | 108 , m_connectionCount(0) |
109 , m_audioThread(0) | 109 , m_audioThread(0) |
110 , m_isOfflineContext(false) | 110 , m_isOfflineContext(false) |
111 , m_contextState(Suspended) | 111 , m_contextState(Suspended) |
| 112 , m_shadowCurrentSampleFrame(0) |
112 { | 113 { |
113 m_referencedNodes = new HeapVector<Member<AudioNode>>(); | 114 m_referencedNodes = new HeapVector<Member<AudioNode>>(); |
114 m_destinationNode = DefaultAudioDestinationNode::create(this); | 115 m_destinationNode = DefaultAudioDestinationNode::create(this); |
115 | 116 |
116 initialize(); | 117 initialize(); |
117 #if DEBUG_AUDIONODE_REFERENCES | 118 #if DEBUG_AUDIONODE_REFERENCES |
118 fprintf(stderr, "%p: AudioContext::AudioContext() #%u\n", this, AudioContext
::s_hardwareContextCount); | 119 fprintf(stderr, "%p: AudioContext::AudioContext() #%u\n", this, AudioContext
::s_hardwareContextCount); |
119 #endif | 120 #endif |
120 } | 121 } |
121 | 122 |
122 // Constructor for offline (non-realtime) rendering. | 123 // Constructor for offline (non-realtime) rendering. |
123 AudioContext::AudioContext(Document* document, unsigned numberOfChannels, size_t
numberOfFrames, float sampleRate) | 124 AudioContext::AudioContext(Document* document, unsigned numberOfChannels, size_t
numberOfFrames, float sampleRate) |
124 : ActiveDOMObject(document) | 125 : ActiveDOMObject(document) |
125 , m_isStopScheduled(false) | 126 , m_isStopScheduled(false) |
126 , m_isCleared(false) | 127 , m_isCleared(false) |
127 , m_isInitialized(false) | 128 , m_isInitialized(false) |
128 , m_destinationNode(nullptr) | 129 , m_destinationNode(nullptr) |
129 , m_isResolvingResumePromises(false) | 130 , m_isResolvingResumePromises(false) |
130 , m_automaticPullNodesNeedUpdating(false) | 131 , m_automaticPullNodesNeedUpdating(false) |
131 , m_connectionCount(0) | 132 , m_connectionCount(0) |
132 , m_audioThread(0) | 133 , m_audioThread(0) |
133 , m_isOfflineContext(true) | 134 , m_isOfflineContext(true) |
134 , m_contextState(Suspended) | 135 , m_contextState(Suspended) |
| 136 , m_shadowCurrentSampleFrame(0) |
135 { | 137 { |
136 m_referencedNodes = new HeapVector<Member<AudioNode>>(); | 138 m_referencedNodes = new HeapVector<Member<AudioNode>>(); |
137 // Create a new destination for offline rendering. | 139 // Create a new destination for offline rendering. |
138 m_renderTarget = AudioBuffer::create(numberOfChannels, numberOfFrames, sampl
eRate); | 140 m_renderTarget = AudioBuffer::create(numberOfChannels, numberOfFrames, sampl
eRate); |
139 if (m_renderTarget.get()) | 141 if (m_renderTarget.get()) |
140 m_destinationNode = OfflineAudioDestinationNode::create(this, m_renderTa
rget.get()); | 142 m_destinationNode = OfflineAudioDestinationNode::create(this, m_renderTa
rget.get()); |
141 | 143 |
142 initialize(); | 144 initialize(); |
143 } | 145 } |
144 | 146 |
(...skipping 401 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
546 exceptionState.throwDOMException( | 548 exceptionState.throwDOMException( |
547 IndexSizeError, | 549 IndexSizeError, |
548 "length of imaginary array (" + String::number(imag->length()) | 550 "length of imaginary array (" + String::number(imag->length()) |
549 + ") exceeds allowed maximum of 4096"); | 551 + ") exceeds allowed maximum of 4096"); |
550 return 0; | 552 return 0; |
551 } | 553 } |
552 | 554 |
553 return PeriodicWave::create(sampleRate(), real, imag); | 555 return PeriodicWave::create(sampleRate(), real, imag); |
554 } | 556 } |
555 | 557 |
| 558 size_t AudioContext::sampleFrame() const |
| 559 { |
| 560 ASSERT(isMainThread()); |
| 561 |
| 562 return m_shadowCurrentSampleFrame; |
| 563 } |
| 564 |
556 String AudioContext::state() const | 565 String AudioContext::state() const |
557 { | 566 { |
558 // These strings had better match the strings for AudioContextState in Audio
Context.idl. | 567 // These strings had better match the strings for AudioContextState in Audio
Context.idl. |
559 switch (m_contextState) { | 568 switch (m_contextState) { |
560 case Suspended: | 569 case Suspended: |
561 return "suspended"; | 570 return "suspended"; |
562 case Running: | 571 case Running: |
563 return "running"; | 572 return "running"; |
564 case Closed: | 573 case Closed: |
565 return "closed"; | 574 return "closed"; |
(...skipping 192 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
758 // Update the channel count mode. | 767 // Update the channel count mode. |
759 updateChangedChannelCountMode(); | 768 updateChangedChannelCountMode(); |
760 | 769 |
761 // Fixup the state of any dirty AudioSummingJunctions and AudioNodeOutpu
ts. | 770 // Fixup the state of any dirty AudioSummingJunctions and AudioNodeOutpu
ts. |
762 handleDirtyAudioSummingJunctions(); | 771 handleDirtyAudioSummingJunctions(); |
763 handleDirtyAudioNodeOutputs(); | 772 handleDirtyAudioNodeOutputs(); |
764 | 773 |
765 updateAutomaticPullNodes(); | 774 updateAutomaticPullNodes(); |
766 resolvePromisesForResume(); | 775 resolvePromisesForResume(); |
767 | 776 |
| 777 // Update the shadow frame value. |
| 778 m_shadowCurrentSampleFrame = currentSampleFrame(); |
| 779 |
768 unlock(); | 780 unlock(); |
769 } | 781 } |
770 } | 782 } |
771 | 783 |
772 void AudioContext::handlePostRenderTasks() | 784 void AudioContext::handlePostRenderTasks() |
773 { | 785 { |
774 ASSERT(isAudioThread()); | 786 ASSERT(isAudioThread()); |
775 | 787 |
776 // Must use a tryLock() here too. Don't worry, the lock will very rarely be
contended and this method is called frequently. | 788 // Must use a tryLock() here too. Don't worry, the lock will very rarely be
contended and this method is called frequently. |
777 // The worst that can happen is that there will be some nodes which will tak
e slightly longer than usual to be deleted or removed | 789 // The worst that can happen is that there will be some nodes which will tak
e slightly longer than usual to be deleted or removed |
(...skipping 332 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1110 | 1122 |
1111 for (HashSet<AudioNode*>::iterator k = m_deferredCountModeChange.begin(); k
!= m_deferredCountModeChange.end(); ++k) | 1123 for (HashSet<AudioNode*>::iterator k = m_deferredCountModeChange.begin(); k
!= m_deferredCountModeChange.end(); ++k) |
1112 (*k)->updateChannelCountMode(); | 1124 (*k)->updateChannelCountMode(); |
1113 | 1125 |
1114 m_deferredCountModeChange.clear(); | 1126 m_deferredCountModeChange.clear(); |
1115 } | 1127 } |
1116 | 1128 |
1117 } // namespace blink | 1129 } // namespace blink |
1118 | 1130 |
1119 #endif // ENABLE(WEB_AUDIO) | 1131 #endif // ENABLE(WEB_AUDIO) |
OLD | NEW |