Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(849)

Side by Side Diff: Source/modules/webaudio/AudioContext.cpp

Issue 773273002: Update the current frame count in a safe place (Closed) Base URL: svn://svn.chromium.org/blink/trunk
Patch Set: Modify test to allow 1 block delay. Created 6 years ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
« no previous file with comments | « Source/modules/webaudio/AudioContext.h ('k') | Source/modules/webaudio/ScriptProcessorNode.cpp » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
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 92 matching lines...) Expand 10 before | Expand all | Expand 10 after
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_didInitializeContextGraphMutex(false) 109 , m_didInitializeContextGraphMutex(false)
110 , m_audioThread(0) 110 , m_audioThread(0)
111 , m_isOfflineContext(false) 111 , m_isOfflineContext(false)
112 , m_contextState(Suspended) 112 , m_contextState(Suspended)
113 , m_cachedSampleFrame(0)
113 { 114 {
114 m_didInitializeContextGraphMutex = true; 115 m_didInitializeContextGraphMutex = true;
115 m_destinationNode = DefaultAudioDestinationNode::create(this); 116 m_destinationNode = DefaultAudioDestinationNode::create(this);
116 117
117 initialize(); 118 initialize();
118 #if DEBUG_AUDIONODE_REFERENCES 119 #if DEBUG_AUDIONODE_REFERENCES
119 fprintf(stderr, "%p: AudioContext::AudioContext() #%u\n", this, AudioContext ::s_hardwareContextCount); 120 fprintf(stderr, "%p: AudioContext::AudioContext() #%u\n", this, AudioContext ::s_hardwareContextCount);
120 #endif 121 #endif
121 } 122 }
122 123
123 // Constructor for offline (non-realtime) rendering. 124 // Constructor for offline (non-realtime) rendering.
124 AudioContext::AudioContext(Document* document, unsigned numberOfChannels, size_t numberOfFrames, float sampleRate) 125 AudioContext::AudioContext(Document* document, unsigned numberOfChannels, size_t numberOfFrames, float sampleRate)
125 : ActiveDOMObject(document) 126 : ActiveDOMObject(document)
126 , m_isStopScheduled(false) 127 , m_isStopScheduled(false)
127 , m_isCleared(false) 128 , m_isCleared(false)
128 , m_isInitialized(false) 129 , m_isInitialized(false)
129 , m_destinationNode(nullptr) 130 , m_destinationNode(nullptr)
130 , m_isResolvingResumePromises(false) 131 , m_isResolvingResumePromises(false)
131 , m_automaticPullNodesNeedUpdating(false) 132 , m_automaticPullNodesNeedUpdating(false)
132 , m_connectionCount(0) 133 , m_connectionCount(0)
133 , m_didInitializeContextGraphMutex(false) 134 , m_didInitializeContextGraphMutex(false)
134 , m_audioThread(0) 135 , m_audioThread(0)
135 , m_isOfflineContext(true) 136 , m_isOfflineContext(true)
136 , m_contextState(Suspended) 137 , m_contextState(Suspended)
138 , m_cachedSampleFrame(0)
137 { 139 {
138 m_didInitializeContextGraphMutex = true; 140 m_didInitializeContextGraphMutex = true;
139 // Create a new destination for offline rendering. 141 // Create a new destination for offline rendering.
140 m_renderTarget = AudioBuffer::create(numberOfChannels, numberOfFrames, sampl eRate); 142 m_renderTarget = AudioBuffer::create(numberOfChannels, numberOfFrames, sampl eRate);
141 if (m_renderTarget.get()) 143 if (m_renderTarget.get())
142 m_destinationNode = OfflineAudioDestinationNode::create(this, m_renderTa rget.get()); 144 m_destinationNode = OfflineAudioDestinationNode::create(this, m_renderTa rget.get());
143 145
144 initialize(); 146 initialize();
145 } 147 }
146 148
(...skipping 402 matching lines...) Expand 10 before | Expand all | Expand 10 after
549 exceptionState.throwDOMException( 551 exceptionState.throwDOMException(
550 IndexSizeError, 552 IndexSizeError,
551 "length of imaginary array (" + String::number(imag->length()) 553 "length of imaginary array (" + String::number(imag->length())
552 + ") exceeds allowed maximum of 4096"); 554 + ") exceeds allowed maximum of 4096");
553 return 0; 555 return 0;
554 } 556 }
555 557
556 return PeriodicWave::create(sampleRate(), real, imag); 558 return PeriodicWave::create(sampleRate(), real, imag);
557 } 559 }
558 560
561 size_t AudioContext::cachedSampleFrame() const
562 {
563 ASSERT(isMainThread());
564
565 return m_cachedSampleFrame;
566 }
567
559 String AudioContext::state() const 568 String AudioContext::state() const
560 { 569 {
561 // These strings had better match the strings for AudioContextState in Audio Context.idl. 570 // These strings had better match the strings for AudioContextState in Audio Context.idl.
562 switch (m_contextState) { 571 switch (m_contextState) {
563 case Suspended: 572 case Suspended:
564 return "suspended"; 573 return "suspended";
565 case Running: 574 case Running:
566 return "running"; 575 return "running";
567 case Closed: 576 case Closed:
568 return "closed"; 577 return "closed";
(...skipping 192 matching lines...) Expand 10 before | Expand all | Expand 10 after
761 // Update the channel count mode. 770 // Update the channel count mode.
762 updateChangedChannelCountMode(); 771 updateChangedChannelCountMode();
763 772
764 // Fixup the state of any dirty AudioSummingJunctions and AudioNodeOutpu ts. 773 // Fixup the state of any dirty AudioSummingJunctions and AudioNodeOutpu ts.
765 handleDirtyAudioSummingJunctions(); 774 handleDirtyAudioSummingJunctions();
766 handleDirtyAudioNodeOutputs(); 775 handleDirtyAudioNodeOutputs();
767 776
768 updateAutomaticPullNodes(); 777 updateAutomaticPullNodes();
769 resolvePromisesForResume(); 778 resolvePromisesForResume();
770 779
780 // Update the cached sample frame value.
781 m_cachedSampleFrame = currentSampleFrame();
782
771 unlock(); 783 unlock();
772 } 784 }
773 } 785 }
774 786
775 void AudioContext::handlePostRenderTasks() 787 void AudioContext::handlePostRenderTasks()
776 { 788 {
777 ASSERT(isAudioThread()); 789 ASSERT(isAudioThread());
778 790
779 // Must use a tryLock() here too. Don't worry, the lock will very rarely be contended and this method is called frequently. 791 // Must use a tryLock() here too. Don't worry, the lock will very rarely be contended and this method is called frequently.
780 // 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 792 // 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
1113 1125
1114 for (HashSet<AudioNode*>::iterator k = m_deferredCountModeChange.begin(); k != m_deferredCountModeChange.end(); ++k) 1126 for (HashSet<AudioNode*>::iterator k = m_deferredCountModeChange.begin(); k != m_deferredCountModeChange.end(); ++k)
1115 (*k)->updateChannelCountMode(); 1127 (*k)->updateChannelCountMode();
1116 1128
1117 m_deferredCountModeChange.clear(); 1129 m_deferredCountModeChange.clear();
1118 } 1130 }
1119 1131
1120 } // namespace blink 1132 } // namespace blink
1121 1133
1122 #endif // ENABLE(WEB_AUDIO) 1134 #endif // ENABLE(WEB_AUDIO)
OLDNEW
« no previous file with comments | « Source/modules/webaudio/AudioContext.h ('k') | Source/modules/webaudio/ScriptProcessorNode.cpp » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698