File indexing completed on 2024-05-12 17:21:22

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 };