| 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_connectionCount(0) | 107 , m_connectionCount(0) |
| 108 , m_didInitializeContextGraphMutex(false) | 108 , m_didInitializeContextGraphMutex(false) |
| 109 , m_deferredTaskHandler(DeferredTaskHandler::create()) | 109 , m_deferredTaskHandler(DeferredTaskHandler::create()) |
| 110 , m_isOfflineContext(false) | 110 , m_isOfflineContext(false) |
| 111 , m_contextState(Suspended) | 111 , m_contextState(Suspended) |
| 112 , m_cachedSampleFrame(0) | |
| 113 { | 112 { |
| 114 m_didInitializeContextGraphMutex = true; | 113 m_didInitializeContextGraphMutex = true; |
| 115 m_destinationNode = DefaultAudioDestinationNode::create(this); | 114 m_destinationNode = DefaultAudioDestinationNode::create(this); |
| 116 | 115 |
| 117 initialize(); | 116 initialize(); |
| 118 } | 117 } |
| 119 | 118 |
| 120 // Constructor for offline (non-realtime) rendering. | 119 // Constructor for offline (non-realtime) rendering. |
| 121 AudioContext::AudioContext(Document* document, unsigned numberOfChannels, size_t
numberOfFrames, float sampleRate) | 120 AudioContext::AudioContext(Document* document, unsigned numberOfChannels, size_t
numberOfFrames, float sampleRate) |
| 122 : ActiveDOMObject(document) | 121 : ActiveDOMObject(document) |
| 123 , m_isStopScheduled(false) | 122 , m_isStopScheduled(false) |
| 124 , m_isCleared(false) | 123 , m_isCleared(false) |
| 125 , m_isInitialized(false) | 124 , m_isInitialized(false) |
| 126 , m_destinationNode(nullptr) | 125 , m_destinationNode(nullptr) |
| 127 , m_isResolvingResumePromises(false) | 126 , m_isResolvingResumePromises(false) |
| 128 , m_connectionCount(0) | 127 , m_connectionCount(0) |
| 129 , m_didInitializeContextGraphMutex(false) | 128 , m_didInitializeContextGraphMutex(false) |
| 130 , m_deferredTaskHandler(DeferredTaskHandler::create()) | 129 , m_deferredTaskHandler(DeferredTaskHandler::create()) |
| 131 , m_isOfflineContext(true) | 130 , m_isOfflineContext(true) |
| 132 , m_contextState(Suspended) | 131 , m_contextState(Suspended) |
| 133 , m_cachedSampleFrame(0) | |
| 134 { | 132 { |
| 135 m_didInitializeContextGraphMutex = true; | 133 m_didInitializeContextGraphMutex = true; |
| 136 // Create a new destination for offline rendering. | 134 // Create a new destination for offline rendering. |
| 137 m_renderTarget = AudioBuffer::create(numberOfChannels, numberOfFrames, sampl
eRate); | 135 m_renderTarget = AudioBuffer::create(numberOfChannels, numberOfFrames, sampl
eRate); |
| 138 if (m_renderTarget.get()) | 136 if (m_renderTarget.get()) |
| 139 m_destinationNode = OfflineAudioDestinationNode::create(this, m_renderTa
rget.get()); | 137 m_destinationNode = OfflineAudioDestinationNode::create(this, m_renderTa
rget.get()); |
| 140 | 138 |
| 141 initialize(); | 139 initialize(); |
| 142 } | 140 } |
| 143 | 141 |
| (...skipping 528 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 672 IndexSizeError, | 670 IndexSizeError, |
| 673 "length of real array (" + String::number(real->length()) | 671 "length of real array (" + String::number(real->length()) |
| 674 + ") and length of imaginary array (" + String::number(imag->length
()) | 672 + ") and length of imaginary array (" + String::number(imag->length
()) |
| 675 + ") must match."); | 673 + ") must match."); |
| 676 return nullptr; | 674 return nullptr; |
| 677 } | 675 } |
| 678 | 676 |
| 679 return PeriodicWave::create(sampleRate(), real, imag); | 677 return PeriodicWave::create(sampleRate(), real, imag); |
| 680 } | 678 } |
| 681 | 679 |
| 682 size_t AudioContext::currentSampleFrame() const | |
| 683 { | |
| 684 if (isAudioThread()) | |
| 685 return m_destinationNode ? m_destinationNode->audioDestinationHandler().
currentSampleFrame() : 0; | |
| 686 | |
| 687 return m_cachedSampleFrame; | |
| 688 } | |
| 689 | |
| 690 double AudioContext::currentTime() const | |
| 691 { | |
| 692 if (isAudioThread()) | |
| 693 return m_destinationNode ? m_destinationNode->audioDestinationHandler().
currentTime() : 0; | |
| 694 | |
| 695 return m_cachedSampleFrame / static_cast<double>(sampleRate()); | |
| 696 } | |
| 697 | |
| 698 String AudioContext::state() const | 680 String AudioContext::state() const |
| 699 { | 681 { |
| 700 // These strings had better match the strings for AudioContextState in Audio
Context.idl. | 682 // These strings had better match the strings for AudioContextState in Audio
Context.idl. |
| 701 switch (m_contextState) { | 683 switch (m_contextState) { |
| 702 case Suspended: | 684 case Suspended: |
| 703 return "suspended"; | 685 return "suspended"; |
| 704 case Running: | 686 case Running: |
| 705 return "running"; | 687 return "running"; |
| 706 case Closed: | 688 case Closed: |
| 707 return "closed"; | 689 return "closed"; |
| (...skipping 165 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 873 // At the beginning of every render quantum, try to update the internal rend
ering graph state (from main thread changes). | 855 // At the beginning of every render quantum, try to update the internal rend
ering graph state (from main thread changes). |
| 874 // It's OK if the tryLock() fails, we'll just take slightly longer to pick u
p the changes. | 856 // It's OK if the tryLock() fails, we'll just take slightly longer to pick u
p the changes. |
| 875 if (tryLock()) { | 857 if (tryLock()) { |
| 876 deferredTaskHandler().handleDeferredTasks(); | 858 deferredTaskHandler().handleDeferredTasks(); |
| 877 | 859 |
| 878 resolvePromisesForResume(); | 860 resolvePromisesForResume(); |
| 879 | 861 |
| 880 // Check to see if source nodes can be stopped because the end time has
passed. | 862 // Check to see if source nodes can be stopped because the end time has
passed. |
| 881 handleStoppableSourceNodes(); | 863 handleStoppableSourceNodes(); |
| 882 | 864 |
| 883 // Update the cached sample frame value. | |
| 884 m_cachedSampleFrame = currentSampleFrame(); | |
| 885 | |
| 886 unlock(); | 865 unlock(); |
| 887 } | 866 } |
| 888 } | 867 } |
| 889 | 868 |
| 890 void AudioContext::handlePostRenderTasks() | 869 void AudioContext::handlePostRenderTasks() |
| 891 { | 870 { |
| 892 ASSERT(isAudioThread()); | 871 ASSERT(isAudioThread()); |
| 893 | 872 |
| 894 // Must use a tryLock() here too. Don't worry, the lock will very rarely be
contended and this method is called frequently. | 873 // Must use a tryLock() here too. Don't worry, the lock will very rarely be
contended and this method is called frequently. |
| 895 // 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 | 874 // 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 170 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1066 // the destination node can GCed if JS has no references. stop() will also r
esolve the Promise | 1045 // the destination node can GCed if JS has no references. stop() will also r
esolve the Promise |
| 1067 // created here. | 1046 // created here. |
| 1068 stop(); | 1047 stop(); |
| 1069 | 1048 |
| 1070 return promise; | 1049 return promise; |
| 1071 } | 1050 } |
| 1072 | 1051 |
| 1073 } // namespace blink | 1052 } // namespace blink |
| 1074 | 1053 |
| 1075 #endif // ENABLE(WEB_AUDIO) | 1054 #endif // ENABLE(WEB_AUDIO) |
| OLD | NEW |