Skip to content

Fix participant ISO recording, isolated audio, and Tiles frame handoff - #261

Merged
iamfatness merged 9 commits into
mainfrom
codex/iso-feed-selection
Sep 15, 2026
Merged

iamfatness merged 9 commits into
mainfrom
codex/iso-feed-selection

Conversation

@iamfatness

@iamfatness iamfatness commented Sep 15, 2026 •

Copy link
Copy Markdown
Owner

Recordings now contain one fixed 1080p MP4 per participant with dedicated isolated AAC audio. Source resolution changes no longer split files, source Mix audio cannot enter an ISO, and recording subscriptions preserve Audience routing. The ISO panel explicitly selects feeds and waits for actual media before opening files. Tiles also preserves its last valid pending pixels when a shared-memory read is rejected.

Validation: Windows build and 72 CTest regressions pass. Real encoded fixtures cover eight NVENC tracks, format changes and gaps, color preservation, and flash/tone alignment within 20 ms. Alternating-speaker files decoded with digital silence during the other speaker's intervals. Final live Zoom soak remains uncompleted and is disclosed in the release notes. Includes v0.1.47 changelog.

Also updates site tooling to remove the vulnerable sharp dependency; npm audit reports zero vulnerabilities and npm run check passes.

Comment thread tests/iso-track-writer-test.cpp Fixed
Comment thread src/iso-track-writer.cpp Fixed
Comment thread src/iso-audio-reader.cpp
@@ -0,0 +1,72 @@
#include "iso-audio-reader.h"
#include <algorithm>
void IsoAudioReader::read(uint32_t bytes, uint32_t generation)
Comment thread src/iso-audio-reader.cpp
const auto len=slot->byte_len, participant=slot->participant_id;
const auto rate=ring->sample_rate; const auto channels=ring->channels;
if (!len || len>ring->slot_bytes) break;
m_pcm.resize(len); std::memcpy(m_pcm.data(),slot+1,len);
Comment thread src/iso-audio-reader.h
IsoAudioReader(std::string uuid, uint32_t participant, Deliver deliver, Now now)
: m_uuid(std::move(uuid)), m_participant(participant), m_deliver(std::move(deliver)), m_now(std::move(now)) {}
~IsoAudioReader() { shm_region_destroy(m_region); }
void read(uint32_t bytes, uint32_t generation);
Comment thread src/iso-av-mux.h
}
inline void string(Bytes &out, uint32_t id, const char *value)
{
element(out, id, Bytes(value, value + std::strlen(value)));
Comment thread src/iso-av-mux.h
string(audio, 0x86, "A_PCM/INT/LIT");
double rate = 48000;
uint64_t bits;
std::memcpy(&bits, &rate, 8);
Comment thread src/iso-track-writer.cpp
Video frame{w, h, ns, std::vector<uint8_t>(size_t(w) * h * 3 / 2)};
auto *dst = frame.pixels.data();
for (uint32_t row = 0; row < h; ++row) {
std::memcpy(dst, y + size_t(row) * sy, w);
Comment thread src/iso-track-writer.cpp
}
for (auto *plane : {u, v})
for (uint32_t row = 0; row < h / 2; ++row) {
std::memcpy(dst, plane + size_t(row) * suv, w / 2);
// A pending frame must remain byte-identical until another valid frame arrives.
template<class Reader>
bool tile_read_frame(std::vector<uint8_t> &pending,
std::vector<uint8_t> &candidate, Reader &&read)
bool tile_read_frame(std::vector<uint8_t> &pending,
std::vector<uint8_t> &candidate, Reader &&read)
{
if (!read(candidate)) return false;
auto *slot=reinterpret_cast<ShmAudioSlot *>(static_cast<char *>(regions[i].ptr)+
shm_audio_slot_offset(*ring,ring->write_index%kAudioRingSlots));
slot->sequence=1; slot->participant_id=speaker; slot->byte_len=960;
std::memcpy(slot+1,audio.data(),960); slot->sequence=2; ++ring->write_index; ring->notify=1;
@iamfatness
iamfatness merged commit 20db49b into main Sep 15, 2026
4 of 11 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants