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 663 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
674 bool AudioContext::isAudioThread() const | 674 bool AudioContext::isAudioThread() const |
675 { | 675 { |
676 return currentThread() == m_audioThread; | 676 return currentThread() == m_audioThread; |
677 } | 677 } |
678 | 678 |
679 bool AudioContext::isGraphOwner() const | 679 bool AudioContext::isGraphOwner() const |
680 { | 680 { |
681 return currentThread() == m_graphOwnerThread; | 681 return currentThread() == m_graphOwnerThread; |
682 } | 682 } |
683 | 683 |
| 684 void AudioContext::addDeferredBreakConnection(AudioNode& node) |
| 685 { |
| 686 ASSERT(isAudioThread()); |
| 687 m_deferredBreakConnectionList.append(&node); |
| 688 } |
| 689 |
684 void AudioContext::addDeferredFinishDeref(AudioNode* node) | 690 void AudioContext::addDeferredFinishDeref(AudioNode* node) |
685 { | 691 { |
686 ASSERT(isAudioThread()); | 692 ASSERT(isAudioThread()); |
687 m_deferredFinishDerefList.append(node); | 693 m_deferredFinishDerefList.append(node); |
688 } | 694 } |
689 | 695 |
690 void AudioContext::handlePreRenderTasks() | 696 void AudioContext::handlePreRenderTasks() |
691 { | 697 { |
692 ASSERT(isAudioThread()); | 698 ASSERT(isAudioThread()); |
693 | 699 |
(...skipping 14 matching lines...) Expand all Loading... |
708 | 714 |
709 void AudioContext::handlePostRenderTasks() | 715 void AudioContext::handlePostRenderTasks() |
710 { | 716 { |
711 ASSERT(isAudioThread()); | 717 ASSERT(isAudioThread()); |
712 | 718 |
713 // Must use a tryLock() here too. Don't worry, the lock will very rarely be
contended and this method is called frequently. | 719 // Must use a tryLock() here too. Don't worry, the lock will very rarely be
contended and this method is called frequently. |
714 // 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 | 720 // 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 |
715 // from the render graph (in which case they'll render silence). | 721 // from the render graph (in which case they'll render silence). |
716 bool mustReleaseLock; | 722 bool mustReleaseLock; |
717 if (tryLock(mustReleaseLock)) { | 723 if (tryLock(mustReleaseLock)) { |
718 // Take care of finishing any derefs where the tryLock() failed previous
ly. | 724 // Take care of AudioNode tasks where the tryLock() failed previously. |
719 handleDeferredFinishDerefs(); | 725 handleDeferredAudioNodeTasks(); |
720 | 726 |
721 // Dynamically clean up nodes which are no longer needed. | 727 // Dynamically clean up nodes which are no longer needed. |
722 derefFinishedSourceNodes(); | 728 derefFinishedSourceNodes(); |
723 | 729 |
724 // Don't delete in the real-time thread. Let the main thread do it. | 730 // Don't delete in the real-time thread. Let the main thread do it. |
725 // Ref-counted objects held by certain AudioNodes may not be thread-safe
. | 731 // Ref-counted objects held by certain AudioNodes may not be thread-safe
. |
726 scheduleNodeDeletion(); | 732 scheduleNodeDeletion(); |
727 | 733 |
728 // Fixup the state of any dirty AudioSummingJunctions and AudioNodeOutpu
ts. | 734 // Fixup the state of any dirty AudioSummingJunctions and AudioNodeOutpu
ts. |
729 handleDirtyAudioSummingJunctions(); | 735 handleDirtyAudioSummingJunctions(); |
730 handleDirtyAudioNodeOutputs(); | 736 handleDirtyAudioNodeOutputs(); |
731 | 737 |
732 updateAutomaticPullNodes(); | 738 updateAutomaticPullNodes(); |
733 | 739 |
734 if (mustReleaseLock) | 740 if (mustReleaseLock) |
735 unlock(); | 741 unlock(); |
736 } | 742 } |
737 } | 743 } |
738 | 744 |
739 void AudioContext::handleDeferredFinishDerefs() | 745 void AudioContext::handleDeferredAudioNodeTasks() |
740 { | 746 { |
741 ASSERT(isAudioThread() && isGraphOwner()); | 747 ASSERT(isAudioThread() && isGraphOwner()); |
742 for (unsigned i = 0; i < m_deferredFinishDerefList.size(); ++i) { | |
743 AudioNode* node = m_deferredFinishDerefList[i]; | |
744 node->finishDeref(); | |
745 } | |
746 | 748 |
| 749 for (unsigned i = 0; i < m_deferredBreakConnectionList.size(); ++i) |
| 750 m_deferredBreakConnectionList[i]->breakConnectionWithLock(); |
| 751 m_deferredBreakConnectionList.clear(); |
| 752 |
| 753 for (unsigned i = 0; i < m_deferredFinishDerefList.size(); ++i) |
| 754 m_deferredFinishDerefList[i]->finishDeref(); |
747 m_deferredFinishDerefList.clear(); | 755 m_deferredFinishDerefList.clear(); |
748 } | 756 } |
749 | 757 |
750 void AudioContext::markForDeletion(AudioNode* node) | 758 void AudioContext::markForDeletion(AudioNode* node) |
751 { | 759 { |
752 ASSERT(isGraphOwner()); | 760 ASSERT(isGraphOwner()); |
753 | 761 |
754 if (!isInitialized()) | 762 if (!isInitialized()) |
755 m_nodesToDelete.append(node); | 763 m_nodesToDelete.append(node); |
756 else | 764 else |
(...skipping 197 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
954 visitor->trace(m_renderTarget); | 962 visitor->trace(m_renderTarget); |
955 visitor->trace(m_destinationNode); | 963 visitor->trace(m_destinationNode); |
956 visitor->trace(m_listener); | 964 visitor->trace(m_listener); |
957 visitor->trace(m_dirtySummingJunctions); | 965 visitor->trace(m_dirtySummingJunctions); |
958 EventTargetWithInlineData::trace(visitor); | 966 EventTargetWithInlineData::trace(visitor); |
959 } | 967 } |
960 | 968 |
961 } // namespace WebCore | 969 } // namespace WebCore |
962 | 970 |
963 #endif // ENABLE(WEB_AUDIO) | 971 #endif // ENABLE(WEB_AUDIO) |
OLD | NEW |