Сохрани накопленные исправления аудио, async и диагностики

This commit is contained in:
evgeny committed 2026-10-02 01:49:32 +03:00
1 parent b1e3193899
commit bdcf8b5634
59 files changed
+4611 -1441

No files matched your search

+17 -24
View File
@@ -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;
};