46 uint8_t
channels()
const {
return SAMPLE_SPEC.channels; }
50 static void contextStateCallback(pa_context* c,
void* userdata);
51 static void serverInfoCallback(pa_context* c,
const pa_server_info* i,
void* userdata);
52 static void moduleLoadedCallback(pa_context* c, uint32_t idx,
void* userdata);
53 static void subscribeCallback(pa_context* c, pa_subscription_event_type_t t, uint32_t idx,
void* userdata);
54 static void sinkInputInfoCallback(pa_context* c,
const pa_sink_input_info* i,
int eol,
void* userdata);
55 static void streamReadCallback(pa_stream* s,
size_t length,
void* userdata);
59 void moveStreamIfNeeded(uint32_t streamIdx, pid_t streamPid, uint32_t ownerModuleIdx,
const char* streamName);
60 void setupModules(
const std::string& default_sink);
61 void startRecordingStream();
62 void unloadModulesAndQuit();
65 std::string uniqueSinkName_;
66 const pa_sample_spec SAMPLE_SPEC = {PA_SAMPLE_S16LE, 48000, 2};
69 pa_threaded_mainloop* mainloop_ =
nullptr;
70 pa_mainloop_api* mainloopApi_ =
nullptr;
71 pa_context* context_ =
nullptr;
72 pa_stream* recordStream_ =
nullptr;
74 std::atomic<bool> running_ {
false};
79 std::string defaultSinkName_;
80 uint32_t nullSinkModuleIdx_ = PA_INVALID_INDEX;
81 uint32_t loopbackModuleIdx_ = PA_INVALID_INDEX;