[Mac] Add classes to manage audio samples
[WebKit-https.git] / Source / WebCore / platform / audio / mac / AudioSampleDataSource.h
1 /*
2  * Copyright (C) 2017 Apple 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. ``AS IS'' AND ANY
14  * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
15  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
16  * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE INC. OR
17  * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
18  * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
19  * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
20  * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
21  * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
22  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
23  * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
24  */
25
26 #pragma once
27
28 #if ENABLE(MEDIA_STREAM)
29
30 #include "AudioSampleBufferList.h"
31 #include <CoreAudio/CoreAudioTypes.h>
32 #include <wtf/Lock.h>
33 #include <wtf/MediaTime.h>
34 #include <wtf/RefCounted.h>
35 #include <wtf/RefPtr.h>
36 #include <wtf/text/WTFString.h>
37
38 typedef const struct opaqueCMFormatDescription *CMFormatDescriptionRef;
39 typedef struct opaqueCMSampleBuffer *CMSampleBufferRef;
40
41 namespace WebCore {
42
43 class CAAudioStreamDescription;
44 class CARingBuffer;
45
46 class AudioSampleDataSource : public RefCounted<AudioSampleDataSource> {
47 public:
48     static Ref<AudioSampleDataSource> create(size_t);
49
50     ~AudioSampleDataSource();
51
52     OSStatus setInputFormat(const CAAudioStreamDescription&);
53     OSStatus setOutputFormat(const CAAudioStreamDescription&);
54
55     void pushSamples(const AudioStreamBasicDescription&, const MediaTime&, void*, size_t);
56     void pushSamples(const AudioStreamBasicDescription&, CMSampleBufferRef);
57
58     enum PullMode { Copy, Mix };
59     bool pullSamples(AudioSampleBufferList&, size_t, uint64_t, double, PullMode);
60     bool pullSamples(AudioBufferList&, size_t, uint64_t, double, PullMode);
61
62     void setPaused(bool);
63
64     void setVolume(float volume) { m_volume = volume; }
65     float volume() const { return m_volume; }
66
67     void setMuted(bool muted) { m_muted = muted; }
68     bool muted() const { return m_muted; }
69
70 protected:
71     AudioSampleDataSource(size_t);
72
73     OSStatus setupConverter();
74     bool pullSamplesInternal(AudioBufferList&, size_t&, uint64_t, double, PullMode);
75
76     void pushSamplesInternal(AudioBufferList&, const MediaTime&, size_t frameCount);
77
78     std::unique_ptr<CAAudioStreamDescription> m_inputDescription;
79     std::unique_ptr<CAAudioStreamDescription> m_outputDescription;
80
81     MediaTime hostTime() const;
82
83     uint64_t m_timeStamp { 0 };
84     double m_hostTime { -1 };
85
86     MediaTime m_inputSampleOffset;
87     uint64_t m_outputSampleOffset { 0 };
88
89     AudioConverterRef m_converter;
90     RefPtr<AudioSampleBufferList> m_scratchBuffer;
91
92     std::unique_ptr<CARingBuffer> m_ringBuffer;
93     size_t m_maximumSampleCount { 0 };
94
95     Lock m_lock;
96     float m_volume { 1.0 };
97     bool m_muted { false };
98     bool m_paused { true };
99     bool m_transitioningFromPaused { true };
100 };
101
102 } // namespace WebCore
103
104 #endif // ENABLE(MEDIA_STREAM)