audio_qt_capturer.h 1.8 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980
  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 handleReadyRead();
  42. void processAudioData();
  43. void onAudioNotify();
  44. private:
  45. bool initMicrophone();
  46. bool initSpeaker();
  47. void setupAudioFormat();
  48. float calculateVolume(const QByteArray& data);
  49. private:
  50. Type m_deviceType;
  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. QByteArray m_dataBuffer;
  61. QMutex m_mutex;
  62. static constexpr int PROCESS_INTERVAL_MS = 20; // 处理间隔,20ms
  63. };
  64. #endif // AUDIO_QT_CAPTURER_H