Home | History | Annotate | Download | only in webaudio
      1 /*
      2  * Copyright (C) 2012, Google Inc. All rights reserved.
      3  *
      4  * Redistribution and use in source and binary forms, with or without
      5  * modification, are permitted provided that the following conditions
      6  * are met:
      7  * 1.  Redistributions of source code must retain the above copyright
      8  *    notice, this list of conditions and the following disclaimer.
      9  * 2.  Redistributions in binary form must reproduce the above copyright
     10  *    notice, this list of conditions and the following disclaimer in the
     11  *    documentation and/or other materials provided with the distribution.
     12  *
     13  * THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS'' AND ANY
     14  * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
     15  * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
     16  * DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS BE LIABLE FOR ANY
     17  * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
     18  * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
     19  * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
     20  * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
     21  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
     22  * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
     23  */
     24 
     25 #include "config.h"
     26 
     27 #if ENABLE(WEB_AUDIO)
     28 
     29 #include "modules/webaudio/AudioSummingJunction.h"
     30 
     31 #include "modules/webaudio/AudioContext.h"
     32 #include "modules/webaudio/AudioNodeOutput.h"
     33 #include <algorithm>
     34 
     35 namespace blink {
     36 
     37 AudioSummingJunction::AudioSummingJunction(AudioContext* context)
     38     : m_context(context)
     39     , m_renderingStateNeedUpdating(false)
     40     , m_didCallDispose(false)
     41 {
     42     ASSERT(context);
     43     m_context->registerLiveAudioSummingJunction(*this);
     44 }
     45 
     46 void AudioSummingJunction::dispose()
     47 {
     48     m_didCallDispose = true;
     49     m_context->removeMarkedSummingJunction(this);
     50 }
     51 
     52 AudioSummingJunction::~AudioSummingJunction()
     53 {
     54 }
     55 
     56 void AudioSummingJunction::trace(Visitor* visitor)
     57 {
     58     visitor->trace(m_context);
     59 }
     60 
     61 void AudioSummingJunction::changedOutputs()
     62 {
     63     ASSERT(context()->isGraphOwner());
     64     if (!m_renderingStateNeedUpdating && !m_didCallDispose) {
     65         context()->markSummingJunctionDirty(this);
     66         m_renderingStateNeedUpdating = true;
     67     }
     68 }
     69 
     70 void AudioSummingJunction::updateRenderingState()
     71 {
     72     ASSERT(context()->isAudioThread() && context()->isGraphOwner());
     73     if (m_renderingStateNeedUpdating) {
     74         // Copy from m_outputs to m_renderingOutputs.
     75         m_renderingOutputs.resize(m_outputs.size());
     76         unsigned j = 0;
     77         for (HashSet<AudioNodeOutput*>::iterator i = m_outputs.begin(); i != m_outputs.end(); ++i, ++j) {
     78             AudioNodeOutput* output = *i;
     79             m_renderingOutputs[j] = output;
     80             output->updateRenderingState();
     81         }
     82 
     83         didUpdate();
     84 
     85         m_renderingStateNeedUpdating = false;
     86     }
     87 }
     88 
     89 } // namespace blink
     90 
     91 #endif // ENABLE(WEB_AUDIO)
     92