audio_qt_capturer.h 1.7 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879
  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 "iaudiocapturer.h"
  10. class AudioInfo : public QIODevice
  11. {
  12. Q_OBJECT
  13. public:
  14. AudioInfo(const QAudioFormat& format);
  15. void start();
  16. void stop();
  17. qreal level() const { return m_level; }
  18. qint64 readData(char* data, qint64 maxlen) override;
  19. qint64 writeData(const char* data, qint64 len) override;
  20. private:
  21. const QAudioFormat m_format;
  22. quint32 m_maxAmplitude = 0;
  23. qreal m_level = 0.0; // 0.0 <= m_level <= 1.0
  24. signals:
  25. void update();
  26. };
  27. class QtAudioCapturer : public QObject, public IAudioCapturer
  28. {
  29. Q_OBJECT
  30. public:
  31. explicit QtAudioCapturer(QObject* parent = nullptr);
  32. ~QtAudioCapturer() override;
  33. // IAudioCapturer接口实现
  34. bool Init(Type deviceType, CallBack callback, void* userInfo = nullptr) override;
  35. bool Start() override;
  36. void Stop() override;
  37. const AudioFormat& GetFormat() const override;
  38. private slots:
  39. void handleReadyRead();
  40. void processAudioData();
  41. void onAudioNotify();
  42. private:
  43. bool initMicrophone();
  44. bool initSpeaker();
  45. void setupAudioFormat();
  46. float calculateVolume(const QByteArray& data);
  47. private:
  48. Type m_deviceType;
  49. CallBack m_callback;
  50. void* m_userInfo;
  51. AudioFormat m_audioFormat;
  52. bool m_isRunning;
  53. // Qt音频相关
  54. QAudioFormat m_qtAudioFormat;
  55. QScopedPointer<AudioInfo> m_audioInfo;
  56. std::unique_ptr<QAudioInput> m_audioInput;
  57. QIODevice* m_audioDevice;
  58. QBuffer m_buffer;
  59. QTimer m_processTimer;
  60. static constexpr int PROCESS_INTERVAL_MS = 20; // 处理间隔,20ms
  61. };
  62. #endif // AUDIO_QT_CAPTURER_H