128040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu/*
228040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu * Copyright (C) 2010, Google Inc. All rights reserved.
328040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu *
428040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu * Redistribution and use in source and binary forms, with or without
528040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu * modification, are permitted provided that the following conditions
628040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu * are met:
728040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu * 1.  Redistributions of source code must retain the above copyright
828040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu *    notice, this list of conditions and the following disclaimer.
928040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu * 2.  Redistributions in binary form must reproduce the above copyright
1028040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu *    notice, this list of conditions and the following disclaimer in the
1128040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu *    documentation and/or other materials provided with the distribution.
1228040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu *
1328040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu * THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS'' AND ANY
1428040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
1528040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
1628040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu * DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS BE LIABLE FOR ANY
1728040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
1828040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
1928040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
2028040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
2128040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
2228040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
2328040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu */
2428040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu
2528040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu#ifndef ConvolverNode_h
2628040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu#define ConvolverNode_h
2728040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu
2828040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu#include "AudioNode.h"
2928040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu#include <wtf/OwnPtr.h>
3028040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu#include <wtf/RefPtr.h>
3128040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu#include <wtf/Threading.h>
3228040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu
3328040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhunamespace WebCore {
3428040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu
3528040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhuclass AudioBuffer;
3628040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhuclass Reverb;
3728040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu
3828040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhuclass ConvolverNode : public AudioNode {
3928040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhupublic:
4028040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu    static PassRefPtr<ConvolverNode> create(AudioContext* context, double sampleRate)
4128040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu    {
4228040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu        return adoptRef(new ConvolverNode(context, sampleRate));
4328040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu    }
4428040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu
4528040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu    virtual ~ConvolverNode();
4628040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu
4728040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu    // AudioNode
4828040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu    virtual void process(size_t framesToProcess);
4928040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu    virtual void reset();
5028040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu    virtual void initialize();
5128040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu    virtual void uninitialize();
5228040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu
5328040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu    // Impulse responses
5428040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu    void setBuffer(AudioBuffer*);
5528040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu    AudioBuffer* buffer();
5628040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu
5728040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhuprivate:
5828040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu    ConvolverNode(AudioContext*, double sampleRate);
5928040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu
6028040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu    OwnPtr<Reverb> m_reverb;
6128040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu    RefPtr<AudioBuffer> m_buffer;
6228040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu
6328040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu    // This synchronizes dynamic changes to the convolution impulse response with process().
6428040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu    mutable Mutex m_processLock;
6528040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu};
6628040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu
6728040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu} // namespace WebCore
6828040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu
6928040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu#endif // ConvolverNode_h
70