From 28780ccebed7e420394de590fc878f3d7b079070 Mon Sep 17 00:00:00 2001 From: Dave Behnke <916775+dbehnke@users.noreply.github.com> Date: Sun, 28 Dec 2025 23:38:37 -0500 Subject: [PATCH] feat: Add audio recording data path and logging --- reflector/AudioRecorder.cpp | 26 +++++++++----------------- reflector/AudioRecorder.h | 2 ++ reflector/CodecStream.cpp | 7 +++++++ 3 files changed, 18 insertions(+), 17 deletions(-) diff --git a/reflector/AudioRecorder.cpp b/reflector/AudioRecorder.cpp index 78c50c8..4c09bcd 100644 --- a/reflector/AudioRecorder.cpp +++ b/reflector/AudioRecorder.cpp @@ -70,7 +70,11 @@ std::string CAudioRecorder::Start(const std::string& directory) InitOpus(); InitOgg(); + m_StartTime = std::time(nullptr); + m_TotalBytes = 0; m_IsRecording = true; + + std::cout << "AudioRecorder: Started recording to " << m_Filename << std::endl; return m_Filename; } @@ -164,6 +168,7 @@ void CAudioRecorder::WriteOggPage(bool flush) if (result == 0) break; m_File.write((const char*)m_OggPage.header, m_OggPage.header_len); m_File.write((const char*)m_OggPage.body, m_OggPage.body_len); + m_TotalBytes += m_OggPage.header_len + m_OggPage.body_len; } } @@ -205,25 +210,12 @@ void CAudioRecorder::Stop() std::lock_guard lock(m_Mutex); if (!m_IsRecording) return; - // Flush remaining standard logic or just close - // In strict Opus, we might want to pad and finish, but for voice logging, truncation of <60ms is acceptable. - // Set EOS on last packet if we had one? - // Hard to do retroactively. Simpler is just to write a empty packet with EOS. - - /* - unsigned char dummy[1] = {0}; - ogg_packet packet; - packet.packet = dummy; - packet.bytes = 0; // Empty - packet.b_o_s = 0; - packet.e_o_s = 1; - packet.granulepos = m_GranulePos; - packet.packetno = m_PacketCount++; - ogg_stream_packetin(&m_OggStream, &packet); - */ - // Actually, just flushing logic WriteOggPage(true); + double duration = std::difftime(std::time(nullptr), m_StartTime); + std::cout << "AudioRecorder: Stopped recording " << m_Filename + << ". Duration: " << duration << "s. Size: " << m_TotalBytes << " bytes." << std::endl; + Cleanup(); } diff --git a/reflector/AudioRecorder.h b/reflector/AudioRecorder.h index 1d0f5b1..7963ce1 100644 --- a/reflector/AudioRecorder.h +++ b/reflector/AudioRecorder.h @@ -39,6 +39,8 @@ private: std::ofstream m_File; std::string m_Filename; std::string m_FullPath; + std::time_t m_StartTime; + size_t m_TotalBytes; std::mutex m_Mutex; // Opus state diff --git a/reflector/CodecStream.cpp b/reflector/CodecStream.cpp index b22a0fa..6b4d8f6 100644 --- a/reflector/CodecStream.cpp +++ b/reflector/CodecStream.cpp @@ -160,6 +160,13 @@ void CCodecStream::Task(void) // update content with transcoded data Packet->SetCodecData(&pack); + + // Write audio to recorder if active + if (m_Recorder.IsRecording()) + { + m_Recorder.Write(pack.usrp, 160); + } + // mark the DStar sync frames if the source isn't dstar if (ECodecType::dstar!=Packet->GetCodecIn() && 0==Packet->GetPacketId()%21) {