diff --git a/src/MediaRecorder.h b/src/MediaRecorder.h
index 39c34d6..ea99d75 100644
--- a/src/MediaRecorder.h
+++ b/src/MediaRecorder.h
@@ -1,279 +1,279 @@
/*
* Kaidan - A user-friendly XMPP client for every device!
*
* Copyright (C) 2016-2020 Kaidan developers and contributors
* (see the LICENSE file for a full list of copyright authors)
*
* Kaidan is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* In addition, as a special exception, the author of Kaidan gives
* permission to link the code of its release with the OpenSSL
* project's "OpenSSL" library (or with modified versions of it that
* use the same license as the "OpenSSL" library), and distribute the
* linked executables. You must obey the GNU General Public License in
* all respects for all of the code used other than "OpenSSL". If you
* modify this file, you may extend this exception to your version of
* the file, but you are not obligated to do so. If you do not wish to
* do so, delete this exception statement from your version.
*
* Kaidan is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with Kaidan. If not, see .
*/
#pragma once
#include "CameraModel.h"
#include "AudioDeviceModel.h"
#include "MediaSettings.h"
#include "MediaSettingModel.h"
#include "CameraImageCapture.h"
#include
class MediaSettingsContainerModel;
class MediaSettingsQualityModel;
class MediaSettingsResolutionModel;
class MediaSettingsImageCodecModel;
class MediaSettingsAudioCodecModel;
class MediaSettingsAudioSampleRateModel;
class MediaSettingsVideoCodecModel;
class MediaSettingsVideoFrameRateModel;
class MediaRecorder : public QObject, public QMediaBindableInterface
{
friend MediaSettingsContainerModel;
friend MediaSettingsQualityModel;
friend MediaSettingsResolutionModel;
friend MediaSettingsImageCodecModel;
friend MediaSettingsAudioCodecModel;
friend MediaSettingsAudioSampleRateModel;
friend MediaSettingsVideoCodecModel;
friend MediaSettingsVideoFrameRateModel;
Q_OBJECT
Q_INTERFACES(QMediaBindableInterface)
Q_PROPERTY(MediaRecorder::Type type READ type WRITE setType NOTIFY typeChanged)
Q_PROPERTY(QMediaObject *mediaObject READ mediaObject NOTIFY typeChanged)
Q_PROPERTY(QString currentSettingsKey READ currentSettingsKey NOTIFY typeChanged)
Q_PROPERTY(MediaRecorder::AvailabilityStatus availabilityStatus READ availabilityStatus NOTIFY availabilityStatusChanged)
Q_PROPERTY(MediaRecorder::State state READ state NOTIFY stateChanged)
Q_PROPERTY(MediaRecorder::Status status READ status NOTIFY statusChanged)
Q_PROPERTY(bool isAvailable READ isAvailable NOTIFY availabilityStatusChanged)
Q_PROPERTY(bool isReady READ isReady NOTIFY readyChanged)
Q_PROPERTY(MediaRecorder::Error error READ error NOTIFY errorChanged)
Q_PROPERTY(QString errorString READ errorString NOTIFY errorChanged)
Q_PROPERTY(QUrl actualLocation READ actualLocation NOTIFY actualLocationChanged)
Q_PROPERTY(qint64 duration READ duration NOTIFY durationChanged)
Q_PROPERTY(bool muted READ isMuted WRITE setMuted NOTIFY mutedChanged)
Q_PROPERTY(qreal volume READ volume WRITE setVolume NOTIFY volumeChanged)
Q_PROPERTY(MediaSettings mediaSettings READ mediaSettings WRITE setMediaSettings NOTIFY mediaSettingsChanged)
Q_PROPERTY(CameraModel *cameraModel MEMBER m_cameraModel CONSTANT)
Q_PROPERTY(AudioDeviceModel *audioDeviceModel MEMBER m_audioDeviceModel CONSTANT)
Q_PROPERTY(MediaSettingsContainerModel *containerModel MEMBER m_containerModel CONSTANT)
Q_PROPERTY(ImageEncoderSettings imageEncoderSettings READ imageEncoderSettings WRITE setImageEncoderSettings NOTIFY imageEncoderSettingsChanged)
Q_PROPERTY(MediaSettingsImageCodecModel *imageCodecModel MEMBER m_imageCodecModel CONSTANT)
Q_PROPERTY(MediaSettingsResolutionModel *imageResolutionModel MEMBER m_imageResolutionModel CONSTANT)
Q_PROPERTY(MediaSettingsQualityModel *imageQualityModel MEMBER m_imageQualityModel CONSTANT)
Q_PROPERTY(AudioEncoderSettings audioEncoderSettings READ audioEncoderSettings WRITE setAudioEncoderSettings NOTIFY audioEncoderSettingsChanged)
Q_PROPERTY(MediaSettingsAudioCodecModel *audioCodecModel MEMBER m_audioCodecModel CONSTANT)
Q_PROPERTY(MediaSettingsAudioSampleRateModel *audioSampleRateModel MEMBER m_audioSampleRateModel CONSTANT)
Q_PROPERTY(MediaSettingsQualityModel *audioQualityModel MEMBER m_audioQualityModel CONSTANT)
Q_PROPERTY(VideoEncoderSettings videoEncoderSettings READ videoEncoderSettings WRITE setVideoEncoderSettings NOTIFY videoEncoderSettingsChanged)
Q_PROPERTY(MediaSettingsVideoCodecModel *videoCodecModel MEMBER m_videoCodecModel CONSTANT)
Q_PROPERTY(MediaSettingsResolutionModel *videoResolutionModel MEMBER m_videoResolutionModel CONSTANT)
Q_PROPERTY(MediaSettingsVideoFrameRateModel *videoFrameRateModel MEMBER m_videoFrameRateModel CONSTANT)
Q_PROPERTY(MediaSettingsQualityModel *videoQualityModel MEMBER m_videoQualityModel CONSTANT)
public:
enum class Type {
Invalid,
Image,
Audio,
Video
};
Q_ENUM(Type)
enum class AvailabilityStatus {
Available = QMultimedia::Available,
ServiceMissing = QMultimedia::ServiceMissing,
Busy = QMultimedia::Busy,
- ResourceError = QMultimedia::ResourceError
+ AvailabilityResourceError = QMultimedia::ResourceError
};
Q_ENUM(AvailabilityStatus)
enum class State {
StoppedState = QMediaRecorder::StoppedState,
RecordingState = QMediaRecorder::RecordingState,
PausedState = QMediaRecorder::PausedState
};
Q_ENUM(State)
enum class Status {
UnavailableStatus = QMediaRecorder::UnavailableStatus,
UnloadedStatus = QMediaRecorder::UnloadedStatus,
LoadingStatus = QMediaRecorder::LoadingStatus,
LoadedStatus = QMediaRecorder::LoadedStatus,
StartingStatus = QMediaRecorder::StartingStatus,
RecordingStatus = QMediaRecorder::RecordingStatus,
PausedStatus = QMediaRecorder::PausedStatus,
FinalizingStatus = QMediaRecorder::FinalizingStatus
};
Q_ENUM(Status)
enum class Error {
NoError = QCameraImageCapture::NoError,
NotReadyError = QCameraImageCapture::NotReadyError,
ResourceError = QCameraImageCapture::ResourceError,
OutOfSpaceError = QCameraImageCapture::OutOfSpaceError,
NotSupportedFeatureError = QCameraImageCapture::NotSupportedFeatureError,
FormatError = QCameraImageCapture::FormatError
};
Q_ENUM(Error)
explicit MediaRecorder(QObject *parent = nullptr);
~MediaRecorder() override;
MediaRecorder::Type type() const;
void setType(MediaRecorder::Type type);
QMediaObject *mediaObject() const override;
QString currentSettingsKey() const;
MediaRecorder::AvailabilityStatus availabilityStatus() const;
MediaRecorder::State state() const;
MediaRecorder::Status status() const;
bool isAvailable() const;
bool isReady() const;
MediaRecorder::Error error() const;
QString errorString() const;
QUrl actualLocation() const;
qint64 duration() const;
bool isMuted() const;
void setMuted(bool isMuted);
qreal volume() const;
void setVolume(qreal volume);
MediaSettings mediaSettings() const;
void setMediaSettings(const MediaSettings &settings);
ImageEncoderSettings imageEncoderSettings() const;
void setImageEncoderSettings(const ImageEncoderSettings &settings);
AudioEncoderSettings audioEncoderSettings() const;
void setAudioEncoderSettings(const AudioEncoderSettings &settings);
VideoEncoderSettings videoEncoderSettings() const;
void setVideoEncoderSettings(const VideoEncoderSettings &settings);
// Reset to system default
Q_INVOKABLE void resetSettingsToDefaults();
// Reset to user default
Q_INVOKABLE void resetUserSettings();
// Save user default
Q_INVOKABLE void saveUserSettings();
public slots:
void record();
void pause();
void stop();
void cancel();
signals:
void typeChanged();
void availabilityStatusChanged();
void stateChanged();
void statusChanged();
void readyChanged();
void errorChanged();
void actualLocationChanged();
void durationChanged();
void mutedChanged();
void volumeChanged();
void mediaSettingsChanged();
void imageEncoderSettingsChanged();
void audioEncoderSettingsChanged();
void videoEncoderSettingsChanged();
protected:
bool setMediaObject(QMediaObject *object) override;
QString settingsKey(MediaRecorder::Type type, const QString &deviceName) const;
CameraInfo userDefaultCamera() const;
AudioDeviceInfo userDefaultAudioInput() const;
void resetSettings(const CameraInfo &camera, const AudioDeviceInfo &audioInput);
void setupCamera();
void setupCapturer();
void setupAudioRecorder();
void setupVideoRecorder();
void setupRecorder(MediaRecorder::Type type);
void deleteActualLocation();
static QString encoderContainer(const QString &container, const void *userData);
static QString encoderResolution(const QSize &size, const void *userData);
static QString encoderQuality(const CommonEncoderSettings::EncodingQuality quality, const void *userData);
static QString imageEncoderCodec(const QString &codec, const void *userData);
static QString audioEncoderCodec(const QString &codec, const void *userData);
static QString audioEncoderSampleRate(const int sampleRate, const void *userData);
static QString videoEncoderCodec(const QString &codec, const void *userData);
static QString videoEncoderFrameRate(const qreal frameRate, const void *userData);
private:
MediaRecorder::Type m_type = MediaRecorder::Type::Invalid;
bool m_initializing = false;
QCamera *m_camera = nullptr;
CameraImageCapture *m_imageCapturer = nullptr;
QAudioRecorder *m_audioRecorder = nullptr;
QMediaRecorder *m_videoRecorder = nullptr;
MediaSettings m_mediaSettings;
CameraModel *m_cameraModel = nullptr;
AudioDeviceModel *m_audioDeviceModel = nullptr;
MediaSettingsContainerModel *m_containerModel = nullptr;
ImageEncoderSettings m_imageEncoderSettings;
MediaSettingsImageCodecModel *m_imageCodecModel = nullptr;
MediaSettingsResolutionModel *m_imageResolutionModel = nullptr;
MediaSettingsQualityModel *m_imageQualityModel = nullptr;
AudioEncoderSettings m_audioEncoderSettings;
MediaSettingsAudioCodecModel *m_audioCodecModel = nullptr;
MediaSettingsAudioSampleRateModel *m_audioSampleRateModel = nullptr;
MediaSettingsQualityModel *m_audioQualityModel = nullptr;
VideoEncoderSettings m_videoEncoderSettings;
MediaSettingsVideoCodecModel *m_videoCodecModel = nullptr;
MediaSettingsResolutionModel *m_videoResolutionModel = nullptr;
MediaSettingsVideoFrameRateModel *m_videoFrameRateModel = nullptr;
MediaSettingsQualityModel *m_videoQualityModel = nullptr;
};
DECL_MEDIA_SETTING_MODEL(Container, QString, MediaRecorder::encoderContainer);
DECL_MEDIA_SETTING_MODEL(Quality, CommonEncoderSettings::EncodingQuality, MediaRecorder::encoderQuality);
DECL_MEDIA_SETTING_MODEL(Resolution, QSize, MediaRecorder::encoderResolution);
DECL_MEDIA_SETTING_MODEL(ImageCodec, QString, MediaRecorder::imageEncoderCodec);
DECL_MEDIA_SETTING_MODEL(AudioCodec, QString, MediaRecorder::audioEncoderCodec);
DECL_MEDIA_SETTING_MODEL(AudioSampleRate, int, MediaRecorder::audioEncoderSampleRate);
DECL_MEDIA_SETTING_MODEL(VideoCodec, QString, MediaRecorder::videoEncoderCodec);
DECL_MEDIA_SETTING_MODEL(VideoFrameRate, qreal, MediaRecorder::videoEncoderFrameRate);