Сохрани накопленные исправления аудио, async и диагностики
This commit is contained in:
1 parent
b1e3193899
commit
bdcf8b5634
59 files changed
+4611
-1441
No files matched your search
@@ -4,6 +4,8 @@
|
||||
#include <atomic>
|
||||
#include <cstdint>
|
||||
#include <vector>
|
||||
#include <QTimer>
|
||||
#include "audio_device.h"
|
||||
|
||||
struct ma_device;
|
||||
|
||||
@@ -12,8 +14,7 @@ struct ma_device;
|
||||
* слое src/call/call_audio.c; сюда приходит/отсюда уходит финальный PCM.
|
||||
*
|
||||
* Потоки:
|
||||
* - аудио-поток (miniaudio callback): capture → call_audio_feed_pcm,
|
||||
* call_audio_pull_pcm → playback;
|
||||
* - независимые callbacks capture → call_audio_feed_pcm и call_audio_pull_pcm → playback;
|
||||
* - GUI-поток: start()/beginEnd()/stop() по ACCEPTED/ENDED. */
|
||||
class CallAudioEngine : public QObject {
|
||||
Q_OBJECT
|
||||
@@ -36,40 +37,32 @@ public:
|
||||
void setMuted(bool muted);
|
||||
bool isMuted() const { return m_muted.load(); }
|
||||
|
||||
/* Устройство вывода звонка (-1 = default). Смена на лету пересоздаёт ma_device. */
|
||||
void setPlaybackDeviceIndex(int index);
|
||||
int playbackDeviceIndex() const { return m_playbackDeviceIndex; }
|
||||
/* Backend ID (пустой = default). Смена пересоздаёт только соответствующее устройство. */
|
||||
void setPlaybackDevice(const QString& id);
|
||||
QString playbackDevice() const { return m_playbackId; }
|
||||
void setCaptureDevice(const QString& id);
|
||||
|
||||
/* аудио-поток: miniaudio data callback (захват + воспроизведение) */
|
||||
void dataCallback(const void* in, void* out, unsigned int frames);
|
||||
|
||||
private:
|
||||
CallAudioEngine() = default;
|
||||
void teardownDevice();
|
||||
int initDevice();
|
||||
CallAudioEngine();
|
||||
bool openDevice(bool playback);
|
||||
void recoverDevices();
|
||||
void pauseDevices();
|
||||
|
||||
std::atomic<bool> m_active{false};
|
||||
std::atomic<uint64_t> m_callId{0};
|
||||
std::atomic<bool> m_muted{false};
|
||||
|
||||
int m_playbackDeviceIndex = -1; /* только GUI-поток */
|
||||
QString m_playbackId; /* только GUI-поток */
|
||||
|
||||
ma_device* m_device = nullptr;
|
||||
bool m_deviceStarted = false;
|
||||
QString m_captureId;
|
||||
AudioDevice m_capture, m_playback;
|
||||
QTimer m_recoveryTimer;
|
||||
uint64_t m_generation = 0;
|
||||
bool m_ending = false;
|
||||
|
||||
std::vector<int16_t> m_captureBuf; /* 960 samples, аудио-поток */
|
||||
int m_capturePos = 0;
|
||||
|
||||
/* Только аудио-поток; сброс до ma_device_start. Время в 0.1мс. */
|
||||
struct {
|
||||
unsigned int frames = 0;
|
||||
uint32_t callbacks = 0;
|
||||
uint64_t captureFrames = 0;
|
||||
uint64_t playbackFrames = 0;
|
||||
uint64_t lastReportTb = 0;
|
||||
uint64_t lastEndTb = 0;
|
||||
uint64_t maxIdleTb = 0;
|
||||
uint64_t maxCaptureTb = 0;
|
||||
uint64_t maxPlaybackTb = 0;
|
||||
} m_dbg;
|
||||
};
|
||||
Reference in new issue
Block a user