Move more logic from AudioDestinationNode to its subclasses
[WebKit-https.git] / Source / WebCore / Modules / webaudio / OfflineAudioDestinationNode.h
1 /*
2  * Copyright (C) 2011, Google Inc. All rights reserved.
3  * Copyright (C) 2020-2021, Apple Inc. All rights reserved.
4  *
5  * Redistribution and use in source and binary forms, with or without
6  * modification, are permitted provided that the following conditions
7  * are met:
8  * 1.  Redistributions of source code must retain the above copyright
9  *    notice, this list of conditions and the following disclaimer.
10  * 2.  Redistributions in binary form must reproduce the above copyright
11  *    notice, this list of conditions and the following disclaimer in the
12  *    documentation and/or other materials provided with the distribution.
13  *
14  * THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS'' AND ANY
15  * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
16  * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
17  * DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS BE LIABLE FOR ANY
18  * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
19  * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
20  * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
21  * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
22  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
23  * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
24  */
25
26 #pragma once
27
28 #include "AudioDestinationNode.h"
29 #include <wtf/RefPtr.h>
30 #include <wtf/Threading.h>
31
32 namespace WebCore {
33
34 class AudioBuffer;
35 class AudioBus;
36 class OfflineAudioContext;
37     
38 class OfflineAudioDestinationNode final : public AudioDestinationNode {
39     WTF_MAKE_ISO_ALLOCATED(OfflineAudioDestinationNode);
40 public:
41     OfflineAudioDestinationNode(OfflineAudioContext&, unsigned numberOfChannels, float sampleRate, RefPtr<AudioBuffer>&& renderTarget);
42     ~OfflineAudioDestinationNode();
43
44     OfflineAudioContext& context();
45     const OfflineAudioContext& context() const;
46
47     AudioBuffer* renderTarget() const { return m_renderTarget.get(); }
48     
49     // AudioNode   
50     void initialize() final;
51     void uninitialize() final;
52
53     // AudioDestinationNode
54     void enableInput(const String&) final { }
55     void startRendering(CompletionHandler<void(Optional<Exception>&&)>&&) final;
56
57 private:
58     enum class RenderResult { Failure, Suspended, Complete };
59     RenderResult renderOnAudioThread();
60     void notifyOfflineRenderingSuspended();
61
62     bool requiresTailProcessing() const final { return false; }
63
64     unsigned maxChannelCount() const final { return m_numberOfChannels; }
65
66     unsigned m_numberOfChannels;
67
68     // This AudioNode renders into this AudioBuffer.
69     RefPtr<AudioBuffer> m_renderTarget;
70     
71     // Temporary AudioBus for each render quantum.
72     RefPtr<AudioBus> m_renderBus;
73     
74     // Rendering thread.
75     RefPtr<Thread> m_renderThread;
76     size_t m_framesToProcess;
77     size_t m_destinationOffset { 0 };
78     bool m_startedRendering { false };
79 };
80
81 } // namespace WebCore