/****************************************************************************
**
** Copyright (C) 2016 The Qt Company Ltd.
** Contact: https://www.qt.io/licensing/
**
** This file is part of the plugins of the Qt Toolkit.
**
** $QT_BEGIN_LICENSE:LGPL$
** Commercial License Usage
** Licensees holding valid commercial Qt licenses may use this file in
** accordance with the commercial license agreement provided with the
** Software or, alternatively, in accordance with the terms contained in
** a written agreement between you and The Qt Company. For licensing terms
** and conditions see https://www.qt.io/terms-conditions. For further
** information use the contact form at https://www.qt.io/contact-us.
**
** GNU Lesser General Public License Usage
** Alternatively, this file may be used under the terms of the GNU Lesser
** General Public License version 3 as published by the Free Software
** Foundation and appearing in the file LICENSE.LGPL3 included in the
** packaging of this file. Please review the following information to
** ensure the GNU Lesser General Public License version 3 requirements
** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
**
** GNU General Public License Usage
** Alternatively, this file may be used under the terms of the GNU
** General Public License version 2.0 or (at your option) the GNU General
** Public license version 3 or any later version approved by the KDE Free
** Qt Foundation. The licenses are as published by the Free Software
** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
** included in the packaging of this file. Please review the following
** information to ensure the GNU General Public License requirements will
** be met: https://www.gnu.org/licenses/gpl-2.0.html and
** https://www.gnu.org/licenses/gpl-3.0.html.
**
** $QT_END_LICENSE$
**
****************************************************************************/

#include "qdeclarativemultimediaglobal_p.h"

#include <qcamerainfo.h>
#include <qjsengine.h>

QT_BEGIN_NAMESPACE

/*!
\qmltype QtMultimedia
\inqmlmodule QtMultimedia
\ingroup multimedia_qml
\since 5.4
\brief Provides a global object with useful functions from Qt Multimedia.

The \c QtMultimedia object is a global object with utility functions and properties.

It is not instantiable; to use it, call the members of the global \c QtMultimedia object directly.
For example:

\qml
Camera {
    deviceId: QtMultimedia.defaultCamera.deviceId
}
\endqml

*/

/*!
    \qmlproperty object QtMultimedia::QtMultimedia::defaultCamera
    \readonly

    The \c defaultCamera object provides information about the default camera on the system.

    Its properties are \c deviceId, \c displayName, \c position and \c orientation. See
    \l{QtMultimedia::QtMultimedia::availableCameras}{availableCameras} for a description of each
    of them.

    If there is no default camera, \c defaultCamera.deviceId will contain an empty string.

    \note This property is static; it is not updated if the system's default camera changes after the
    application started.
*/

/*!
    \qmlproperty list<object> QtMultimedia::QtMultimedia::availableCameras
    \readonly

    This property provides information about the cameras available on the system.

    Each object in the list has the following properties:

    \table
    \row
    \li \c deviceId
    \li
    This read-only property holds the unique identifier of the camera.

    You can choose which device to use with a \l Camera object by setting its
    \l{Camera::deviceId}{deviceId} property to this value.

    \row
    \li \c displayName
    \li
    This read-only property holds the human-readable name of the camera.
    You can use this property to display the name of the camera in a user interface.

    \row
    \li \c position
    \li
    This read-only property holds the physical position of the camera on the hardware system.
    Please see \l{Camera::position}{Camera.position} for more information.

    \row
    \li \c orientation
    \li
    This read-only property holds the physical orientation of the camera sensor.
    Please see \l{Camera::orientation}{Camera.orientation} for more information.

    \endtable

    \note This property is static; it is not updated when cameras are added or removed from
    the system, like USB cameras on a desktop platform.

    The following example shows how to display a list of available cameras. The user can change
    the active camera by selecting one of the items in the list.

    \qml
    Item {

        Camera {
            id: camera
        }

        VideoOutput {
            anchors.fill: parent
            source: camera
        }

        ListView {
            anchors.fill: parent

            model: QtMultimedia.availableCameras
            delegate: Text {
                text: modelData.displayName

                MouseArea {
                    anchors.fill: parent
                    onClicked: camera.deviceId = modelData.deviceId
                }
            }
        }
    }

    \endqml
*/

static QJSValue cameraInfoToJSValue(QJSEngine *jsEngine, const QCameraInfo &camera)
{
    QJSValue o = jsEngine->newObject();
    o.setProperty(QStringLiteral("deviceId"), camera.deviceName());
    o.setProperty(QStringLiteral("displayName"), camera.description());
    o.setProperty(QStringLiteral("position"), int(camera.position()));
    o.setProperty(QStringLiteral("orientation"), camera.orientation());
    return o;
}

QDeclarativeMultimediaGlobal::QDeclarativeMultimediaGlobal(QJSEngine *engine, QObject *parent)
    : QObject(parent)
    , m_engine(engine)
{
}

QJSValue QDeclarativeMultimediaGlobal::defaultCamera() const
{
    return cameraInfoToJSValue(m_engine, QCameraInfo::defaultCamera());
}

QJSValue QDeclarativeMultimediaGlobal::availableCameras() const
{
    QList<QCameraInfo> cameras = QCameraInfo::availableCameras();
    QJSValue availableCameras = m_engine->newArray(cameras.count());
    for (int i = 0; i < cameras.count(); ++i)
        availableCameras.setProperty(i, cameraInfoToJSValue(m_engine, cameras.at(i)));
    return availableCameras;
}

/*!
    \qmlmethod real QtMultimedia::QtMultimedia::convertVolume(real volume, VolumeScale from, VolumeScale to)

    Converts an audio \a volume \a from a volume scale \a to another, and returns the result.

    Depending on the context, different scales are used to represent audio volume. All Qt Multimedia
    classes that have an audio volume use a linear scale, the reason is that the loudness of a
    speaker is controlled by modulating its voltage on a linear scale. The human ear on the other
    hand, perceives loudness in a logarithmic way. Using a logarithmic scale for volume controls
    is therefore appropriate in most applications. The decibel scale is logarithmic by nature and
    is commonly used to define sound levels, it is usually used for UI volume controls in
    professional audio applications. The cubic scale is a computationally cheap approximation of a
    logarithmic scale, it provides more control over lower volume levels.

    Valid values for \a from and \a to are:
    \list
    \li QtMultimedia.LinearVolumeScale - Linear scale. \c 0.0 (0%) is silence and \c 1.0 (100%) is
        full volume. All Qt Multimedia types that have an audio volume use a linear scale.
    \li QtMultimedia.CubicVolumeScale - Cubic scale. \c 0.0 (0%) is silence and \c 1.0 (100%) is full
        volume.
    \li QtMultimedia.LogarithmicVolumeScale - Logarithmic scale. \c 0.0 (0%) is silence and \c 1.0
        (100%) is full volume. UI volume controls should usually use a logarithmic scale.
    \li QtMultimedia.DecibelVolumeScale - Decibel (dB, amplitude) logarithmic scale. \c -200 is
        silence and \c 0 is full volume.
    \endlist

    The following example shows how the volume value from a UI volume control can be converted so
    that the perceived increase in loudness is the same when increasing the volume control from 0.2
    to 0.3 as it is from 0.5 to 0.6:

    \code
    Slider {
        id: volumeSlider

        property real volume: QtMultimedia.convertVolume(volumeSlider.value,
                                                         QtMultimedia.LogarithmicVolumeScale,
                                                         QtMultimedia.LinearVolumeScale)
    }

    MediaPlayer {
        volume: volumeSlider.volume
    }
    \endcode

    \since 5.8
*/
qreal QDeclarativeMultimediaGlobal::convertVolume(qreal volume,
                                                  QDeclarativeMultimediaGlobal::VolumeScale from,
                                                  QDeclarativeMultimediaGlobal::VolumeScale to) const
{
    return QAudio::convertVolume(volume, QAudio::VolumeScale(from), QAudio::VolumeScale(to));
}

QT_END_NAMESPACE
