/*
 * Copyright (C) 2017-2018 Apple Inc. All rights reserved.
 *
 * Redistribution and use in source and binary forms, with or without
 * modification, are permitted provided that the following conditions
 * are met:
 * 1. Redistributions of source code must retain the above copyright
 *    notice, this list of conditions and the following disclaimer.
 * 2. Redistributions in binary form must reproduce the above copyright
 *    notice, this list of conditions and the following disclaimer in the
 *    documentation and/or other materials provided with the distribution.
 *
 * THIS SOFTWARE IS PROVIDED BY APPLE INC. ``AS IS'' AND ANY
 * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
 * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE INC. OR
 * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
 * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
 * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
 * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
 * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 */

#pragma once

#if ENABLE(MEDIA_STREAM) && PLATFORM(MAC)

#include "CaptureDeviceManager.h"
#include <CoreAudio/CoreAudio.h>
#include <wtf/text/WTFString.h>

namespace WebCore {

class CoreAudioCaptureDevice;

class CoreAudioCaptureDeviceManager final : public CaptureDeviceManager {
    friend class NeverDestroyed<CoreAudioCaptureDeviceManager>;
public:
    WEBCORE_EXPORT static CoreAudioCaptureDeviceManager& singleton();

    const Vector<CaptureDevice>& captureDevices() final;
    std::optional<CaptureDevice> captureDeviceWithPersistentID(CaptureDevice::DeviceType, const String&);

    std::optional<CoreAudioCaptureDevice> coreAudioDeviceWithUID(const String&);
    const Vector<CaptureDevice>& speakerDevices() const { return m_speakerDevices; }

    void setFilterTapEnabledDevices(bool doFiltering) { m_filterTapEnabledDevices = doFiltering; }

private:
    CoreAudioCaptureDeviceManager() = default;
    ~CoreAudioCaptureDeviceManager() = default;
    
    Vector<CoreAudioCaptureDevice>& coreAudioCaptureDevices();

    enum class NotifyIfDevicesHaveChanged { Notify, DoNotNotify };
    void refreshAudioCaptureDevices(NotifyIfDevicesHaveChanged);
    void scheduleUpdateCaptureDevices();

    Vector<CaptureDevice> m_captureDevices;
    Vector<CaptureDevice> m_speakerDevices;
    Vector<CoreAudioCaptureDevice> m_coreAudioCaptureDevices;
    bool m_wasRefreshAudioCaptureDevicesScheduled { false };
    bool m_filterTapEnabledDevices { false };
};

} // namespace WebCore

#endif // ENABLE(MEDIA_STREAM) && PLATFORM(MAC)
