File indexing completed on 2025-02-09 07:08:06
0001 /* 0002 * SPDX-FileCopyrightText: 2020 Jonah BrĂ¼chert <jbb@kaidan.im> 0003 * SPDX-FileCopyrightText: 2020 Devin Lin <espidev@gmail.com> 0004 * 0005 * SPDX-License-Identifier: GPL-3.0-or-later 0006 */ 0007 0008 #pragma once 0009 0010 #include <QAudioInput> 0011 #include <QMediaCaptureSession> 0012 #include <QMediaFormat> 0013 #include <QMediaRecorder> 0014 0015 #include "audioprober.h" 0016 0017 class AudioRecorder : public QMediaRecorder 0018 { 0019 Q_OBJECT 0020 Q_PROPERTY(QString audioInput READ audioInput NOTIFY audioInputChanged) 0021 Q_PROPERTY(QStringList supportedAudioCodecs READ supportedAudioCodecs CONSTANT) 0022 Q_PROPERTY(QStringList supportedContainers READ supportedContainers CONSTANT) 0023 Q_PROPERTY(QString audioCodec READ audioCodec WRITE setAudioCodec NOTIFY audioCodecChanged) 0024 Q_PROPERTY(int audioQuality READ audioQuality WRITE setAudioQuality NOTIFY audioQualityChanged) 0025 Q_PROPERTY(QString containerFormat READ containerFormat WRITE setContainerFormat) 0026 Q_PROPERTY(AudioProber* prober READ prober CONSTANT) 0027 Q_PROPERTY(QString storageFolder READ storageFolder CONSTANT) 0028 0029 private: 0030 explicit AudioRecorder(QObject *parent = nullptr); 0031 void handleStateChange(QMediaRecorder::RecorderState state); 0032 void updateFormats(QMediaFormat::FileFormat fileFormat = QMediaFormat::FileFormat::UnspecifiedFormat, QMediaFormat::AudioCodec audioCodec = QMediaFormat::AudioCodec::Unspecified); 0033 void updateAudioInputs(); 0034 0035 QMediaFormat *m_mediaFormat; 0036 QMediaCaptureSession *m_mediaCaptureSession; 0037 QAudioInput *m_audioInput; 0038 0039 AudioProber *m_audioProbe; 0040 0041 QString m_recordingName = {}; // rename recording after recording finishes 0042 QString m_savedPath = {}; // updated after the audio file is renamed 0043 int m_cachedDuration = 0; // cache duration (since it is set to zero when the recorder is in StoppedState) 0044 bool m_resetRequest = false; 0045 0046 QString m_containerFormat; 0047 0048 QStringList m_supportedAudioCodecs; 0049 QStringList m_supportedContainers; 0050 0051 bool m_updatingFormats = false; 0052 0053 public: 0054 static AudioRecorder* instance(); 0055 0056 AudioProber* prober(); 0057 0058 QString audioInput(); 0059 Q_INVOKABLE void setAudioInput(QAudioDevice device); 0060 0061 QString audioCodec(); 0062 void setAudioCodec(const QString &codec); 0063 0064 int audioQuality(); 0065 void setAudioQuality(int quality); 0066 0067 QString storageFolder() const; 0068 0069 Q_INVOKABLE void reset(); 0070 0071 Q_INVOKABLE void saveRecording(); 0072 0073 void renameCurrentRecording(); 0074 Q_INVOKABLE void setRecordingName(const QString &rName); 0075 0076 QString containerFormat() const; 0077 void setContainerFormat(const QString &newContainerFormat); 0078 0079 QStringList supportedAudioCodecs() const; 0080 QStringList supportedContainers() const; 0081 0082 Q_SIGNALS: 0083 void audioInputChanged(); 0084 void audioCodecChanged(); 0085 void audioQualityChanged(); 0086 };