audio_qt_capturer.h 1.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475
  1. #ifndef AUDIO_QT_CAPTURER_H
  2. #define AUDIO_QT_CAPTURER_H
  3. #include <QAudioInput>
  4. #include <QAudioOutput>
  5. #include <QBuffer>
  6. #include <QObject>
  7. #include <QTimer>
  8. #include <memory>
  9. #include <QMutex>
  10. #include "iaudiocapturer.h"
  11. class AudioInfo : public QIODevice
  12. {
  13. Q_OBJECT
  14. public:
  15. AudioInfo(const QAudioFormat& format);
  16. void start();
  17. void stop();
  18. qreal level() const { return m_level; }
  19. qint64 readData(char* data, qint64 maxlen) override;
  20. qint64 writeData(const char* data, qint64 len) override;
  21. private:
  22. const QAudioFormat m_format;
  23. quint32 m_maxAmplitude = 0;
  24. qreal m_level = 0.0; // 0.0 <= m_level <= 1.0
  25. signals:
  26. void update();
  27. };
  28. class QtAudioCapturer : public QObject, public IAudioCapturer
  29. {
  30. Q_OBJECT
  31. public:
  32. explicit QtAudioCapturer(QObject* parent = nullptr);
  33. ~QtAudioCapturer() override;
  34. // IAudioCapturer接口实现
  35. bool Init(Type deviceType) override;
  36. bool Start() override;
  37. void Stop() override;
  38. const AudioFormat& GetFormat() const override;
  39. int readAudioData(char* buf, int maxLen) override;
  40. private slots:
  41. void processAudioData();
  42. private:
  43. bool initMicrophone();
  44. bool initSpeaker();
  45. float calculateVolume(const QByteArray& data);
  46. private:
  47. Type m_deviceType;
  48. AudioFormat m_audioFormat;
  49. bool m_isRunning;
  50. // Qt音频相关
  51. QAudioFormat m_qtAudioFormat;
  52. QScopedPointer<AudioInfo> m_audioInfo;
  53. std::unique_ptr<QAudioInput> m_audioInput;
  54. QBuffer m_buffer;
  55. QTimer m_processTimer;
  56. QByteArray m_dataBuffer;
  57. QMutex m_mutex;
  58. };
  59. #endif // AUDIO_QT_CAPTURER_H