Chromium Code Reviews| 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 173 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 184 m_destinationNode->startRendering(); | 184 m_destinationNode->startRendering(); |
| 185 ++s_hardwareContextCount; | 185 ++s_hardwareContextCount; |
| 186 } | 186 } |
| 187 | 187 |
| 188 m_isInitialized = true; | 188 m_isInitialized = true; |
| 189 } | 189 } |
| 190 } | 190 } |
| 191 | 191 |
| 192 void AudioContext::clear() | 192 void AudioContext::clear() |
| 193 { | 193 { |
| 194 #if ENABLE(OILPAN) | |
| 195 // We need to run disposers before destructing m_contextGraphMutex. | |
| 196 m_liveAudioSummingJunctions.clear(); | |
| 197 #endif | |
| 198 | |
| 194 // We have to release our reference to the destination node before the conte xt will ever be deleted since the destination node holds a reference to the cont ext. | 199 // We have to release our reference to the destination node before the conte xt will ever be deleted since the destination node holds a reference to the cont ext. |
| 195 if (m_destinationNode) | 200 if (m_destinationNode) |
| 196 m_destinationNode.clear(); | 201 m_destinationNode.clear(); |
| 197 | 202 |
| 198 // Audio thread is dead. Nobody will schedule node deletion action. Let's do it ourselves. | 203 // Audio thread is dead. Nobody will schedule node deletion action. Let's do it ourselves. |
| 199 do { | 204 do { |
| 200 m_nodesToDelete.appendVector(m_nodesMarkedForDeletion); | 205 m_nodesToDelete.appendVector(m_nodesMarkedForDeletion); |
| 201 m_nodesMarkedForDeletion.clear(); | 206 m_nodesMarkedForDeletion.clear(); |
| 202 deleteMarkedNodes(); | 207 deleteMarkedNodes(); |
| 203 } while (m_nodesToDelete.size()); | 208 } while (m_nodesToDelete.size()); |
| (...skipping 545 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 749 | 754 |
| 750 for (unsigned i = 0; i < m_deferredBreakConnectionList.size(); ++i) | 755 for (unsigned i = 0; i < m_deferredBreakConnectionList.size(); ++i) |
| 751 m_deferredBreakConnectionList[i]->breakConnectionWithLock(); | 756 m_deferredBreakConnectionList[i]->breakConnectionWithLock(); |
| 752 m_deferredBreakConnectionList.clear(); | 757 m_deferredBreakConnectionList.clear(); |
| 753 | 758 |
| 754 for (unsigned i = 0; i < m_deferredFinishDerefList.size(); ++i) | 759 for (unsigned i = 0; i < m_deferredFinishDerefList.size(); ++i) |
| 755 m_deferredFinishDerefList[i]->finishDeref(); | 760 m_deferredFinishDerefList[i]->finishDeref(); |
| 756 m_deferredFinishDerefList.clear(); | 761 m_deferredFinishDerefList.clear(); |
| 757 } | 762 } |
| 758 | 763 |
| 764 #if ENABLE(OILPAN) | |
| 765 void AudioContext::registerLiveAudioSummingJunction(AudioSummingJunction& juncti on) | |
| 766 { | |
| 767 ASSERT(isMainThread()); | |
| 768 m_liveAudioSummingJunctions.add(&junction, adoptPtr(new AudioSummingJunction Disposer(junction))); | |
| 769 } | |
| 770 | |
| 771 AudioContext::AudioSummingJunctionDisposer::~AudioSummingJunctionDisposer() | |
| 772 { | |
| 773 ASSERT(isMainThread()); | |
| 774 AudioContext::AutoLocker locker(m_junction.context()); | |
|
haraken
2014/07/18 09:49:30
Won't this cause a dead lock? removeMarkedSummingJ
tkent
2014/07/18 09:52:16
No. AutoLocker supports reentrancy. If the curre
tkent
2014/07/18 09:54:22
Anyway, this AutoLocker is redundant and unnecessa
haraken
2014/07/18 10:01:01
Makes sense. However, I think you can just drop th
tkent
2014/07/18 13:43:09
Indeed.
| |
| 775 m_junction.context()->removeMarkedSummingJunction(&m_junction); | |
| 776 } | |
| 777 #endif | |
| 778 | |
| 759 void AudioContext::markForDeletion(AudioNode* node) | 779 void AudioContext::markForDeletion(AudioNode* node) |
| 760 { | 780 { |
| 761 ASSERT(isGraphOwner()); | 781 ASSERT(isGraphOwner()); |
| 762 | 782 |
| 763 if (!isInitialized()) | 783 if (!isInitialized()) |
| 764 m_nodesToDelete.append(node); | 784 m_nodesToDelete.append(node); |
| 765 else | 785 else |
| 766 m_nodesMarkedForDeletion.append(node); | 786 m_nodesMarkedForDeletion.append(node); |
| 767 | 787 |
| 768 // This is probably the best time for us to remove the node from automatic p ull list, | 788 // This is probably the best time for us to remove the node from automatic p ull list, |
| (...skipping 41 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 810 | 830 |
| 811 // Protect this object from being deleted before we release the mutex locked by AutoLocker. | 831 // Protect this object from being deleted before we release the mutex locked by AutoLocker. |
| 812 RefPtrWillBeRawPtr<AudioContext> protect(this); | 832 RefPtrWillBeRawPtr<AudioContext> protect(this); |
| 813 { | 833 { |
| 814 AutoLocker locker(this); | 834 AutoLocker locker(this); |
| 815 | 835 |
| 816 while (size_t n = m_nodesToDelete.size()) { | 836 while (size_t n = m_nodesToDelete.size()) { |
| 817 AudioNode* node = m_nodesToDelete[n - 1]; | 837 AudioNode* node = m_nodesToDelete[n - 1]; |
| 818 m_nodesToDelete.removeLast(); | 838 m_nodesToDelete.removeLast(); |
| 819 | 839 |
| 840 #if !ENABLE(OILPAN) | |
|
haraken
2014/07/18 10:01:00
Probably can we keep this code? In terms of perfor
tkent
2014/07/18 13:43:08
Yeah, It's ok to keep this.
| |
| 820 // Before deleting the node, clear out any AudioNodeInputs from m_di rtySummingJunctions. | 841 // Before deleting the node, clear out any AudioNodeInputs from m_di rtySummingJunctions. |
| 821 unsigned numberOfInputs = node->numberOfInputs(); | 842 unsigned numberOfInputs = node->numberOfInputs(); |
| 822 for (unsigned i = 0; i < numberOfInputs; ++i) | 843 for (unsigned i = 0; i < numberOfInputs; ++i) |
| 823 m_dirtySummingJunctions.remove(node->input(i)); | 844 m_dirtySummingJunctions.remove(node->input(i)); |
| 845 #endif | |
| 824 | 846 |
| 825 // Before deleting the node, clear out any AudioNodeOutputs from m_d irtyAudioNodeOutputs. | 847 // Before deleting the node, clear out any AudioNodeOutputs from m_d irtyAudioNodeOutputs. |
| 826 unsigned numberOfOutputs = node->numberOfOutputs(); | 848 unsigned numberOfOutputs = node->numberOfOutputs(); |
| 827 for (unsigned i = 0; i < numberOfOutputs; ++i) | 849 for (unsigned i = 0; i < numberOfOutputs; ++i) |
| 828 m_dirtyAudioNodeOutputs.remove(node->output(i)); | 850 m_dirtyAudioNodeOutputs.remove(node->output(i)); |
| 829 | 851 |
| 830 #if ENABLE(OILPAN) | 852 #if ENABLE(OILPAN) |
| 831 // Finally, clear the keep alive handle that keeps this | 853 // Finally, clear the keep alive handle that keeps this |
| 832 // object from being collected. | 854 // object from being collected. |
| 833 node->clearKeepAlive(); | 855 node->clearKeepAlive(); |
| (...skipping 124 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 958 // Call the offline rendering completion event listener. | 980 // Call the offline rendering completion event listener. |
| 959 dispatchEvent(OfflineAudioCompletionEvent::create(renderedBuffer)); | 981 dispatchEvent(OfflineAudioCompletionEvent::create(renderedBuffer)); |
| 960 } | 982 } |
| 961 } | 983 } |
| 962 | 984 |
| 963 void AudioContext::trace(Visitor* visitor) | 985 void AudioContext::trace(Visitor* visitor) |
| 964 { | 986 { |
| 965 visitor->trace(m_renderTarget); | 987 visitor->trace(m_renderTarget); |
| 966 visitor->trace(m_destinationNode); | 988 visitor->trace(m_destinationNode); |
| 967 visitor->trace(m_listener); | 989 visitor->trace(m_listener); |
| 990 #if ENABLE(OILPAN) | |
| 991 visitor->trace(m_liveAudioSummingJunctions); | |
| 992 #endif | |
| 968 EventTargetWithInlineData::trace(visitor); | 993 EventTargetWithInlineData::trace(visitor); |
| 969 } | 994 } |
| 970 | 995 |
| 971 } // namespace WebCore | 996 } // namespace WebCore |
| 972 | 997 |
| 973 #endif // ENABLE(WEB_AUDIO) | 998 #endif // ENABLE(WEB_AUDIO) |
| OLD | NEW |